Ptidej-v5.2-master/PADL Serialiser DB4O Tests/rsc/JHotDraw v5.1/src/CH/ifa/draw/contrib/TriangleFigure.java
/*
 * Hacked together by Doug lea
 * Tue Feb 25 17:30:58 1997  Doug Lea  (dl at gee)
 *
 */

package CH.ifa.draw.contrib;

import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.io.IOException;
import java.util.Vector;

import CH.ifa.draw.figures.RectangleFigure;
import CH.ifa.draw.util.StorableInput;
import CH.ifa.draw.util.StorableOutput;

/**
 * A triangle with same dimensions as its enclosing rectangle,
 * and apex at any of 8 places
 */
public  class TriangleFigure extends RectangleFigure {

  static double[] rotations = {
	-Math.PI/2, -Math.PI/4,
	0.0, Math.PI/4,
	Math.PI/2, Math.PI * 3/4,
	Math.PI,  -Math.PI * 3/4
  };

  protected int fRotation = 0;

  public TriangleFigure() {
	super(new Point(0,0), new Point(0,0));
  }  

  public TriangleFigure(Point origin, Point corner) {
	super(origin, corner);
  }  

  public Vector handles() {
	Vector h = super.handles();
	h.addElement(new TriangleRotationHandle(this));
	return h;
  }  

  public void rotate(double angle) {
	willChange();
	//System.out.println("a:"+angle);
	double dist = Double.MAX_VALUE;
	int best = 0;
	for (int i = 0; i < rotations.length; ++i) {
	  double d = Math.abs(angle - rotations[i]);
	  if (d < dist) {
		dist = d;
		best = i;
	  }
	}
	fRotation = best;
	changed();
  }  

  /** Return the polygon describing the triangle **/
  public Polygon polygon() {
	Rectangle r = displayBox();
	Polygon p = new Polygon();
	switch (fRotation) {
	case 0:
	  p.addPoint(r.x+r.width/2, r.y);
	  p.addPoint(r.x+r.width, r.y+r.height);
	  p.addPoint(r.x, r.y+r.height);
	  break;
	case 1:
	  p.addPoint(r.x + r.width, r.y);
	  p.addPoint(r.x+r.width, r.y+r.height);
	  p.addPoint(r.x, r.y);
	  break;
	case 2:
	  p.addPoint(r.x + r.width, r.y+r.height/2);
	  p.addPoint(r.x, r.y+r.height);
	  p.addPoint(r.x, r.y);
	  break;
	case 3:
	  p.addPoint(r.x+r.width, r.y+r.height);
	  p.addPoint(r.x, r.y+r.height);
	  p.addPoint(r.x + r.width, r.y);
	  break;
	case 4:
	  p.addPoint(r.x+r.width/2, r.y+r.height);
	  p.addPoint(r.x, r.y);
	  p.addPoint(r.x + r.width, r.y);
	  break;
	case 5:
	  p.addPoint(r.x, r.y+r.height);
	  p.addPoint(r.x, r.y);
	  p.addPoint(r.x+r.width, r.y+r.height);
	  break;
	case 6:
	  p.addPoint(r.x, r.y+r.height/2);
	  p.addPoint(r.x + r.width, r.y);
	  p.addPoint(r.x+r.width, r.y+r.height);
	  break;
	case 7:
	  p.addPoint(r.x, r.y);
	  p.addPoint(r.x + r.width, r.y);
	  p.addPoint(r.x, r.y+r.height);
	  break;
	}
	return p;
  }  


  public void draw(Graphics g) {
	Polygon p = polygon();
	g.setColor(getFillColor());
	g.fillPolygon(p);
	g.setColor(getFrameColor());
	g.drawPolygon(p);
  }  


  public Insets connectionInsets() {
	Rectangle r = displayBox();
	switch(fRotation) {
	case 0:
	  return new Insets(r.height, r.width/2, 0, r.width/2);
	case 1:
	  return new Insets(0, r.width, r.height, 0);
	case 2:
	  return new Insets(r.height/2, 0, r.height/2, r.width);
	case 3:
	  return new Insets(r.height, r.width, 0, 0);
	case 4:
	  return new Insets(0, r.width/2, r.height, r.width/2);
	case 5:
	  return new Insets(r.height, 0, 0, r.width);
	case 6:
	  return new Insets(r.height/2, r.width, r.height/2, 0);
	case 7:
	  return new Insets(0, 0, r.height, r.width);
	default:
	  return null;
	}
  }  

  public boolean containsPoint(int x, int y) {
	return polygon().contains(x, y);
  }  

  public Point center() {
	return PolygonFigure.center(polygon());
  }  

  public Point chop(Point p) {
	return PolygonFigure.chop(polygon(), p);
  }  

  public Object clone() {
	TriangleFigure figure = (TriangleFigure) super.clone();
	figure.fRotation = fRotation;
	return figure;
  }  

	//-- store / load ----------------------------------------------

	public void write(StorableOutput dw) {
	  super.write(dw);
	  dw.writeInt(fRotation);
	}

	public void read(StorableInput dr) throws IOException {
	  super.read(dr);
	  fRotation = dr.readInt();
	}
}
