Ptidej-v5.2-master/PADL Serialiser DB4O Tests/rsc/JHotDraw v5.1/src/CH/ifa/draw/contrib/TriangleRotationHandle.java
/*
 * Sun Mar  2 19:15:28 1997  Doug Lea  (dl at gee)
 * Based on RadiusHandle
 */

package CH.ifa.draw.contrib;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;

import CH.ifa.draw.framework.Drawing;
import CH.ifa.draw.standard.AbstractHandle;
import CH.ifa.draw.util.Geom;


/**
 * A Handle to rotate a TriangleFigure
 */
class TriangleRotationHandle extends AbstractHandle {

  private Point fOrigin = null;
  private Point fCenter = null;

  public TriangleRotationHandle(TriangleFigure owner) {
	super(owner);
 } 

  public void invokeStart(int  x, int  y, Drawing drawing) {
	fCenter = owner().center();
	fOrigin = getOrigin();
  }  

  public void invokeStep (int dx, int dy, Drawing drawing) {
	double angle = Math.atan2(fOrigin.y + dy - fCenter.y,
							  fOrigin.x + dx - fCenter.x);
	((TriangleFigure)(owner())).rotate(angle);
  }  

  public void invokeEnd  (int dx, int dy, Drawing drawing) {
	fOrigin = null;
	fCenter = null;
  }  

  public Point locate() {
	return getOrigin();
  }  

  Point getOrigin() { // find a nice place to put handle
	// almost same code as PolygonScaleHandle
	Polygon p = ((TriangleFigure)(owner())).polygon();
	Point first = new Point(p.xpoints[0], p.ypoints[0]);
	Point ctr = owner().center();
	double len = Geom.length(first.x, first.y, ctr.x, ctr.y);
	if (len == 0) // best we can do?
	  return new Point(first.x - HANDLESIZE/2, first.y + HANDLESIZE/2);

	double u = HANDLESIZE / len;
	if (u > 1.0) // best we can do?
	  return new Point((first.x * 3 + ctr.x)/4, (first.y * 3 + ctr.y)/4);
	else
	  return new Point((int)(first.x * (1.0 - u) + ctr.x * u),
					   (int)(first.y * (1.0 - u) + ctr.y * u));
  }  

  public void draw(Graphics g) {
	Rectangle r = displayBox();

	g.setColor(Color.yellow);
	g.fillOval(r.x, r.y, r.width, r.height);

	g.setColor(Color.black);
	g.drawOval(r.x, r.y, r.width, r.height);
  }  
}

