// Michael Tartaglia
// TrackDraw: exemplifies KeyListener. The user uses the number pad
//		to draw lines around the applet window, effectually creating
//		a racetrack (complete with distance).

import java.applet.Applet;
import java.awt.event.*;
import java.awt.*;
import java.lang.*;

public class TrackDraw extends Applet
implements MouseListener, KeyListener {
 private int[] x = new int[1000];			// X COORDINATES
 private int[] y = new int[1000];			// Y COORDINATES
 private int i = 0,					// CURRENT POINT #
 				 curX = 0,				// CURRENT X COORDINATE
				 curY = 0;				// CURRENT Y COORDINATE
 private boolean horiz = true,		// HORIZONTAL START LINE BOOLEAN
		           showDist = false;	// SHOW OPTIONAL DISTANCE OF TRACK BOOLEAN
 private double dist = 0.0;			// DISTANCE OF TRACK
 private TextField text;			// ENTRY BOX

 public void init() {
   setBackground(Color.white);
	
	// DRAW LABEL
   Label l = new Label("Use your number pad to move around.");
   add(l);
	
	// ADD TEXT FIELD
   text = new TextField("",2);
   text.addKeyListener(this);
	text.setEditable(false);
	text.setBackground(Color.gray);
   add(text);
	
	// ADD ACTION LISTENERS
   addKeyListener(this);
   addMouseListener(this);
 }


 public void mouseClicked(MouseEvent m) {
   x[i] = curX = m.getX();		// CREATE START LINE POINT (x)
   y[i] = curY = m.getY();		// CREATE START LINE POINT (y)
	text.setEditable(true);		// ENABLE TEXT ENTRY BOX
	text.setBackground(Color.white);	// CHANGE BOX COLOR ACCORDINGLY
   repaint(); i++;				// REPAINT; INCREMENT POINT #
 }
 public void mouseEntered(MouseEvent m) {}
 public void mouseExited(MouseEvent m) {}
 public void mousePressed(MouseEvent m) {}
 public void mouseReleased(MouseEvent m) {}


 public void keyPressed(KeyEvent k) {
   int key = k.getKeyCode();
   if (key == KeyEvent.VK_NUMPAD1) setPoint(-2,2,"SW");			// MOVE SW
   else if (key == KeyEvent.VK_NUMPAD2) setPoint(0,2,"S");		// MOVE S
   else if (key == KeyEvent.VK_NUMPAD3) setPoint(2,2,"SE");		// MOVE SE
   else if (key == KeyEvent.VK_NUMPAD4) setPoint(-2,0,"W");		// MOVE W 
   else if (key == KeyEvent.VK_NUMPAD6) setPoint(2,0,"E");		// MOVE E
   else if (key == KeyEvent.VK_NUMPAD7) setPoint(-2,-2,"NW");	// MOVE NW
   else if (key == KeyEvent.VK_NUMPAD8) setPoint(0,-2,"N");		// MOVE N
   else if (key == KeyEvent.VK_NUMPAD9) setPoint(2,-2,"NE");	// MOVE NE
   else if (key == KeyEvent.VK_NUMPAD0) {
			showDist = (showDist?false:true);	// ENABLE/DISABLE DISTANCE
			text.setText("");
	}
   else if (key == KeyEvent.VK_NUMPAD5) {
			horiz = (horiz?false:true);	// SWITCH START LINE DIRECTION
			text.setText("");
	}
   else if (key == KeyEvent.VK_DELETE) resetCanvas();		// ERASE DRAWING 
   repaint();
 }
 public void keyReleased(KeyEvent k) {}
 public void keyTyped(KeyEvent k) {}

 public void resetCanvas() {
 	text.setEditable(false);			// DISABLE TEXT ENTRY
	text.setText("");						// RESET TEXT BOX
	text.setBackground(Color.gray);	// COLOR BOX ACCORDINGLY
   horiz = true;			// RESET START LINE
   i = 0; dist = 0.0;	// RE INITIALIZE POINT # AND DISTANCE
   showDist = false;		// DISABLE DISTANCE (DEFAULT)
	repaint();
 }

 public void setPoint(int altX, int altY, String dir) {
  curX += altX; curY += altY;			// CURRENT POSITION OF X AND Y CHANGED
  x[i] = curX; y[i] = curY; i++;		// ADD CURRENT COORDINATES TO ARRAYS
  dist += Math.sqrt((altX*altX)+(altY*altY))*3;	// CALCULATE DISTANCE SO FAR
  text.setText(dir);						// DISPLAY DIRECTION IN BOX
 }

 public void paint(Graphics g) {
   g.setColor(Color.black);
   if (i == 0) {		// IF NO TRACK IS DRAWN
      g.drawString("Click somewhere!!!",100,150);
   } else {				// ELSE A TRACK EXISTS
      for (int j = 0; j < i; j++) {	// FOR EVERY POINT IN X/Y INT ARRAYS
         if (j != 0) {
            g.setColor(new Color(180,180,180));	// MAKE GREY CEMENT
            g.fillOval(x[j]-2,y[j]-2,5,5);		// DRAW STREET
         }
      }
      g.setColor(Color.black);	// RESET TO DEFAULT COLOR
      if (horiz) g.fillRect(x[0]-8,y[0]-3,16,6);	// IF HORIZONTAL BAR DESIRED, DRAW AS SUCH
      else g.fillRect(x[0]-3,y[0]-8,6,16);			// ELSE DRAW BAR (AKA "START LINE") VERTICALLY
   }
   if (showDist) {					// IF DISTANCE IS DESIRED TO BE SHOWN
      g.setColor(Color.black);	// RESET COLOR TO DEFAULT
      g.setFont(new Font("Courier",Font.BOLD,10));	// SET FONT
      g.drawString((Math.round(dist*100)/100) + " meters.",x[0]+9,y[0]+3);	// DRAW DISTANCE
   }
 }

}
