/*
	GoldenRectangle applet that displays a Golden Rectangle of various sizes
	to help students recogize the ratio in art and achitechture - 
	version 1.0 - 19 Nov 1998 Fr. Chris Thiel <cct@ktb.net>
*/

import java.awt.*;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.*;
import java.lang.Math;

public class GoldenRectangle extends Applet
{
	int rx[];
	int ry[];
	Choice daColor = new Choice();
	int fudge=7; // fudge factor for sensitivity
	boolean moving=false;
	int activeDot=0;
	int deltaX=0;
	int deltaY=40;
	double GR=(1 + Math.sqrt(5))/2; //The Golden Ratio
	int dY=(int)(GR*deltaY);
	int dX=(int)(GR*deltaX);
	Image img = null;
	
	public double distance( int x1, int y1, int x2, int y2) {
  		double result = Math.sqrt( Math.pow((x1-x2),2) + Math.pow((y1-y2),2));
  		return result;
	}
	public void setImage(String imageName) {
	
		img = getImage(getCodeBase(), imageName);
		repaint();
	}
	private void findNewCorners(){
		
		rx[1]=rx[0]+deltaX;
		ry[1]=ry[0]+deltaY;
		rx[2] = rx[1] + dY;
		ry[2] = ry[1] - dX;
		rx[3] = rx[0] + dY;
		ry[3] = ry[0] - dX;
		
	}
	public void init() {
		rx = new int[4];
		ry = new int[4];
		daColor.addItem("black");
		daColor.addItem("red");
		daColor.addItem("magenta");
		daColor.addItem("green");
		daColor.addItem("white");
		daColor.addItem("cyan");
		daColor.addItem("coral");
		add(daColor);
		setBackground(new Color(Integer.parseInt(getParameter("bgcolor"))));
		// set background image
		setImage(getParameter("imageName") );
	    
		rx[0]=10; ry[0]=50;
	
		findNewCorners();
		repaint();
	}
	
	public void paint( Graphics g ) {
		g.drawImage (img, 0,20,null);
		if (!moving){
    	g.setColor(Color.black);
    	g.drawString("Click green dot to change location, Blue dot to change size", 10, size().height-10);
        
        } else {
            g.drawString("Click again to set size and location", 10, size().height-10);
     
        }
		switch (daColor.getSelectedIndex()) {
    		case(0):
    			g.setColor(Color.black);
    		
    			break;
    		case(1):
    			g.setColor(Color.red);
    			
    			break;
        	case(2):
    			g.setColor(Color.magenta);
    			
    			break;
    		case(3):
    			g.setColor(Color.green);
    			
    			break;
    		case(4):
    			g.setColor(Color.white);
    			
    			break;
    		case(5):
    			g.setColor(Color.cyan);
    			
    			break;
    		case(6):
    			g.setColor(new Color(0xF08080));
    			
    			break;
    		
    		default:
    			g.setColor(Color.black);
    		
    			
    	} //switch
    	
        for (int i=0; i<4; i++) g.drawLine(rx[i],ry[i],rx[(i+1)%4],ry[(i+1)%4]);
        g.setColor(Color.blue);
        g.fillOval(rx[1]-3,ry[1]-3, 7,7);
        g.setColor(Color.green);
        g.fillOval(rx[0]-3,ry[0]-3, 7,7);
	} //paint
	
	public boolean action(Event e, Object arg) {
                   if (e.target instanceof Choice) {
                     repaint();
                      return true;
                  } else { return false;}
               
    }
    
    public boolean handleEvent(Event e) {
                  return super.handleEvent(e);
    }
             
    /*
     * Mouse methods
     */
    public boolean mouseDown(java.awt.Event evt, int x, int y) {
      
       
        if (!moving){ /* Find which dot to relocate */
          for ( int i=0; i<2; i++){
            if ( ( x > rx[i]-fudge && x < rx[i]+fudge)  &&
                 ( y > ry[i]-fudge && y < ry[i]+fudge) ) {
                 activeDot = i ;
                 moving=true; 
            }
          }
        } else {  /* Compute distances now that a place was picked */
  			moving=false;
  			//findNewCorners();
  			
		  }

        repaint();
        return true;
    }
	
  	
  	
    public boolean mouseMove(java.awt.Event evt, int x, int y) {
        
        //getAppletContext().showStatus("Location of mouse: (" + x + ", " + y + ")");
        
         if (moving){
         	requestFocus();
         	if (activeDot==0) {
         		rx[ 0] = x;
        		ry[ 0] = y; 
        	} else {
        		deltaX = x - rx[0];
        		deltaY = y - ry[0]; 
        		dY=(int)(GR*deltaY);
        		dX=(int)(GR*deltaX);
        	} 
        	findNewCorners();
        	repaint();
         }
        return true;
    }

    public void mouseEnter() {
        repaint();
    }

    public void mouseExit() {
       
        repaint();
    }

}// of class