Package com.googlecode.jumpnevolve.editor.arguments

Source Code of com.googlecode.jumpnevolve.editor.arguments.RectangleDimension

package com.googlecode.jumpnevolve.editor.arguments;

import org.newdawn.slick.Color;
import org.newdawn.slick.Input;

import com.googlecode.jumpnevolve.editor.Editor;
import com.googlecode.jumpnevolve.math.Vector;

public class RectangleDimension extends RelativePositionMarker {

  private RelativePositionMarker referenceDirection;
  private Vector lastRefernceDirection = Vector.UP;

  public RectangleDimension(Editor editor, PositionMarker referencePoint,
      String name, Vector startPosition, Color color) {
    super(editor, referencePoint, name, MODUS_BOTH, OUTPUT_MODUS_RELATIVE,
        startPosition, color);
  }

  public RectangleDimension(Editor editor, PositionMarker referencePoint,
      RelativePositionMarker referenceDirection, String name,
      Vector startPosition, Color color) {
    super(editor, referencePoint, name, MODUS_BOTH, OUTPUT_MODUS_RELATIVE,
        startPosition, color);
    this.referenceDirection = referenceDirection;
    this.lastRefernceDirection = this.getReferenceVector();
  }

  @Override
  public void poll(Input input, float secounds) {
    super.poll(input, secounds);
    Vector newDirection = this.getReferenceVector();
    float ang = newDirection.clockWiseAng()
        - this.lastRefernceDirection.clockWiseAng();
    this.calculateNewPosition(ang);
    this.lastRefernceDirection = newDirection;
  }

  private void calculateNewPosition(float ang) {
    this.position = this.position.rotate(ang, this.getParentPosition());
  }

  @Override
  public EditorArgument getClone(Editor editor) {
    return new RectangleDimension(editor, this.getParent(),
        this.referenceDirection, this.getDialogPart().name,
        this.position, color);
  }

  @Override
  public void initialize(String value) {
    Vector dimension = Vector.parseVector(value).rotate(
        this.getReferenceVector().clockWiseAng());
    this.lastRefernceDirection = this.getReferenceVector();
    super.initialize(dimension.toString());
  }

  @Override
  public void setArguments(EditorArgument[] parentArgs) {
    if (parentArgs.length > 1) {
      if (parentArgs[0] instanceof PositionMarker
          && parentArgs[1] instanceof RelativePositionMarker) {
        this.setParent((PositionMarker) parentArgs[0]);
        this.setReferenceDirection((RelativePositionMarker) parentArgs[1]);
      }
      if (parentArgs[1] instanceof PositionMarker
          && parentArgs[0] instanceof RelativePositionMarker) {
        this.setParent((PositionMarker) parentArgs[1]);
        this.setReferenceDirection((RelativePositionMarker) parentArgs[0]);
      }
    }
    if (parentArgs.length > 0) {
      if (parentArgs[0] instanceof PositionMarker) {
        this.setParent((PositionMarker) parentArgs[0]);
      }
      if (parentArgs[0] instanceof RelativePositionMarker) {
        this.setReferenceDirection((RelativePositionMarker) parentArgs[0]);
      }
    }
  }

  private void setReferenceDirection(RelativePositionMarker referenceDirection) {
    this.referenceDirection = referenceDirection;
    this.lastRefernceDirection = this.getReferenceVector();
  }

  @Override
  public String getArgumentPart() {
    // pos: aktuelle Position dieses Markers
    // ref: Richtung nach der das Rechteck ausgerichtet wird
    Vector pos = this.getPosition().sub(this.getParentPosition()), ref = this
        .getReferenceVector(), re = Vector.ZERO;

    // Vektor entsprechend der Ausrichtung berechnen
    re = pos.rotate(-ref.clockWiseAng());

    // Dimensionsangaben sind immer positiv
    // Jedes Rechteck muss über Breite und Höhe verfügen
    re = re.modifyX(Math.max(Math.abs(re.x), 1));
    re = re.modifyY(Math.max(Math.abs(re.y), 1));

    // Vektor als String zurückgeben
    return re.toString();
  }

  private Vector getReferenceVector() {
    if (this.referenceDirection != null) {
      return this.referenceDirection.getRelativePosition().getDirection();
    } else {
      return Vector.UP;
    }
  }

  @Override
  public String toString() {
    // Paketnamen abtrennen
    String superString = super.toString();
    return superString.substring(superString.lastIndexOf('.') + 1);
  }
}
TOP

Related Classes of com.googlecode.jumpnevolve.editor.arguments.RectangleDimension

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.