/*
 * Created on Apr 21, 2003
 *
 * To change this generated comment go to 
 * Window>Preferences>Java>Code Generation>Code Template
 */
package jdraw.std;

import java.awt.event.*;
import java.awt.*;
import jdraw.framework.*;

/**
 * @author Christoph
 */
public abstract class StdHandle implements FigureHandle {
	protected static final int WIDTH  = 6;
	protected static final int HEIGHT = 6;

	protected Point anchor;
	
	protected final Figure owner;
	
	public StdHandle(Figure owner) {
		this.owner = owner;
	}
	
	public Figure getOwner(){
		return owner;
	}
	
	/* (non-Javadoc)
	 * @see jdraw.framework.Handle#draw(java.awt.Graphics)
	 */
	public void draw(Graphics g) {
		java.awt.Rectangle h = getBounds();
		Color tmp = g.getColor();
		g.setColor(Color.WHITE);
		g.fillRect(h.x, h.y, h.width, h.height);
		g.setColor(Color.BLACK);
		g.drawRect(h.x, h.y, h.width, h.height);
	}

	/* (non-Javadoc)
	 * @see jdraw.framework.Handle#getCursor()
	 */
	public Cursor getCursor() {
		return Cursor.getDefaultCursor();
	}

	/* (non-Javadoc)
	 * @see jdraw.framework.Handle#contains(int, int)
	 */
	public boolean contains(int x, int y) {
		return getBounds().contains(x, y);
	}
	
	protected abstract Point getAnchor(java.awt.Rectangle r);

	/* (non-Javadoc)
	 * @see jdraw.framework.Handle#startInteraction(int, int, java.awt.event.MouseEvent, jdraw.framework.DrawView)
	 */
	public void startInteraction(int x, int y, MouseEvent e, DrawView v) {
		java.awt.Rectangle r = getOwner().getBounds();
		anchor = getAnchor(r);
		showStatus(e, v);
	}

	/* (non-Javadoc)
	 * @see jdraw.framework.Handle#dragInteraction(int, int, java.awt.event.MouseEvent, jdraw.framework.DrawView)
	 */
	public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
		showStatus(e, v);
	}

	/* (non-Javadoc)
	 * @see jdraw.framework.Handle#stopInteraction(int, int, java.awt.event.MouseEvent, jdraw.framework.DrawView)
	 */
	public void stopInteraction(int x, int y, MouseEvent e, DrawView v){
		v.getEditor().showStatus("");
	}

	private void showStatus(MouseEvent e, DrawView v) {
		v.getEditor().showStatus("w = " + owner.getBounds().width + " h = " + owner.getBounds().height);
	}
	
	/**
	 * North Handle
	 */
	public static class North extends StdHandle {
		private int width; 	// at anchor point

		public North(Figure owner) {
			super(owner);
		}
	
		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x+b.width/2-WIDTH/2, b.y-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
			owner.setBounds(new Point(anchor.x-width/2, anchor.y),
											new Point(anchor.x+width/2, y));
			super.dragInteraction(x,y,e,v);
		}
		
		protected Point getAnchor(java.awt.Rectangle r) {
			width = r.width;
			return new Point(r.x + r.width/2, r.y + r.height);
		}
		
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);
		}

	}

	/**
	 * South Handle
	 */
	public static class South extends StdHandle {
		private int width; 	// at anchor point

		public South(Figure owner) {
			super(owner);
		}
	
		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x+b.width/2-WIDTH/2, b.y+b.height-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
			owner.setBounds(new Point(anchor.x-width/2, anchor.y),
											new Point(anchor.x+width/2, y));
			super.dragInteraction(x,y,e,v);
		}
		
		protected Point getAnchor(java.awt.Rectangle r) {
			width = r.width;
			return new Point(r.x + r.width/2, r.y);
		}
		
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);
		}

	}

	/**
	 * West Handle
	 */
	public static class West extends StdHandle {
		private int height; 	// at anchor point

		public West(Figure owner) {
			super(owner);
		}
	
		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x-WIDTH/2, b.y+b.height/2-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
			owner.setBounds(new Point(anchor.x, anchor.y-height/2),
											new Point(x, anchor.y+height/2));
			super.dragInteraction(x,y,e,v);
		}
		
		protected Point getAnchor(java.awt.Rectangle r) {
			height = r.height;
			return new Point(r.x + r.width, r.y+r.height/2);
		}
		
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
		}
	}

	/**
	 * East Handle
	 */
	public static class East extends StdHandle {
		private int height; 	// at anchor point

		public East(Figure owner) {
			super(owner);
		}

		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x+b.width-WIDTH/2, b.y+b.height/2-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
			owner.setBounds(new Point(anchor.x, anchor.y-height/2),
											new Point(x, anchor.y+height/2));
			super.dragInteraction(x,y,e,v);
		}
	
		protected Point getAnchor(java.awt.Rectangle r) {
			height = r.height;
			return new Point(r.x, r.y+r.height/2);
		}
	
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
		}
	}

	/**
	 * NorthEast Handle
	 */
	public static class NorthEast extends StdHandle {

		public NorthEast(Figure owner) {
			super(owner);
		}
	
		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x+b.width-WIDTH/2, b.y-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
			owner.setBounds(anchor, e.getPoint());
			super.dragInteraction(x,y,e,v);
		}
		
		protected Point getAnchor(java.awt.Rectangle r) {
			return new Point(r.x, r.y + r.height);
		}
		
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR);
		}

	}

	/**
	 * NorthWest Handle
	 */
	public static class NorthWest extends StdHandle {

		public NorthWest(Figure owner) {
			super(owner);
		}
	
		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x-WIDTH/2, b.y-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
				owner.setBounds(anchor, e.getPoint());
			super.dragInteraction(x,y,e,v);
		}
		
		protected Point getAnchor(java.awt.Rectangle r) {
			return new Point(r.x + r.width, r.y + r.height);
		}
		
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR);
		}

	}

	/**
	 * SouthWest Handle
	 */
	public static class SouthWest extends StdHandle {

		public SouthWest(Figure owner) {
			super(owner);
		}
	
		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x-WIDTH/2, b.y+b.height-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
			owner.setBounds(anchor, e.getPoint());
			super.dragInteraction(x,y,e,v);
		}
		
		protected Point getAnchor(java.awt.Rectangle r) {
			return new Point(r.x + r.width, r.y);
		}
		
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR);
		}

	}

	/**
	 * SouthEast Handle
	 */
	public static class SouthEast extends StdHandle {

		public SouthEast(Figure owner) {
			super(owner);
		}
	
		public java.awt.Rectangle getBounds() {
			java.awt.Rectangle b = owner.getBounds();
			return new java.awt.Rectangle(b.x+b.width-WIDTH/2, b.y+b.height-HEIGHT/2, WIDTH, HEIGHT);
		}

		public void dragInteraction(int x, int y, MouseEvent e, DrawView v) {
			java.awt.Rectangle r = owner.getBounds();
			owner.setBounds(anchor, e.getPoint());
			super.dragInteraction(x,y,e,v);
		}
		
		protected Point getAnchor(java.awt.Rectangle r) {
			return new Point(r.x, r.y);
		}
		
		public Cursor getCursor() {
			return Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR);
		}

	}

}