package express;

import express.awt.*;
import express.lines.*;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;


public class DrawingProgram extends Applet {

	RedrawingCanvas drawingSurface;
	ColumnOfBoxes columnOfChoiceBoxes;
	int xPos;
	int yPos;
	Color drawingColor = Color.black;
	ColumnOfNumberBoxes columnOfLineBoxes;
	int lineNumber = 1;


	class DrawingListener implements MouseMotionListener, MouseListener{

		public void mouseDragged(MouseEvent e) {
			if (((RedrawableLine)(drawingSurface.v.lastElement())).living()) {
				((RedrawableLine)(drawingSurface.v.lastElement())).addPoint(e.getX(), e.getY(), e.getWhen());
			}
		}
		public void mouseMoved(MouseEvent e) {
		}
		public void mousePressed(MouseEvent e) {

		switch (lineNumber)	{
		case 0:
			drawingSurface.addRedrawableLine(new Line000(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 1:
			drawingSurface.addRedrawableLine(new Line001(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 2:
			drawingSurface.addRedrawableLine(new Line002(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 3:
			drawingSurface.addRedrawableLine(new Line003(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 4:
			drawingSurface.addRedrawableLine(new Line004(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 5:
			drawingSurface.addRedrawableLine(new Line005(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 6:
			drawingSurface.addRedrawableLine(new Line006(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 7:
			drawingSurface.addRedrawableLine(new Line007(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 8:
			drawingSurface.addRedrawableLine(new Line008(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		case 9:
			drawingSurface.addRedrawableLine(new Line009(e.getX(), e.getY(), e.getWhen(), drawingColor));
			break;
		default:
			drawingSurface.addRedrawableLine(new Line002(e.getX(), e.getY(), e.getWhen(), drawingColor));
		}


		}
		public void mouseReleased(MouseEvent e) {
		}
		public void mouseEntered(MouseEvent e) {
		}
		public void mouseExited(MouseEvent e) {
		}
		public void mouseClicked(MouseEvent e) {
		}
	}

	class ChoiceListener implements MouseListener{

		public void mousePressed(MouseEvent e) {
			columnOfChoiceBoxes.getColor(e.getY());
			drawingColor = columnOfChoiceBoxes.theColor;
		}
		public void mouseReleased(MouseEvent e) {
		}
		public void mouseEntered(MouseEvent e) {
		}
		public void mouseExited(MouseEvent e) {
		}
		public void mouseClicked(MouseEvent e) {
		}
	}

	class LineListener implements MouseListener{

		public void mousePressed(MouseEvent e) {
			lineNumber = columnOfLineBoxes.getNumber(e.getX());
			columnOfLineBoxes.repaint();
		}
		public void mouseReleased(MouseEvent e) {
		}
		public void mouseEntered(MouseEvent e) {
		}
		public void mouseExited(MouseEvent e) {
		}
		public void mouseClicked(MouseEvent e) {
		}
	}

	public DrawingProgram() {

		setBackground(Color.black);

		Color[] colors = new Color[20];

	//	for (int i=0; i<20; i++) {
	//		colors[i] = Color.getHSBColor(((float)i/(float)19), 0.5f, 0.85f);
	//	}
		colors[0] = Color.getHSBColor(0.2f, 0.8f, 0.85f);
		colors[1] = Color.getHSBColor(0.25f, 0.65f, 0.65f);
		colors[2] = Color.getHSBColor(0.3f, 0.8f, 0.45f);
		colors[3] = Color.getHSBColor(0.35f, 0.6f, 0.75f);
		colors[4] = Color.getHSBColor(0.4f, 0.45f, 0.55f);

		colors[5] = Color.getHSBColor(0.45f, 0.7f, 0.55f);
		colors[6] = Color.getHSBColor(0.5f, 0.35f, 0.65f);
		colors[7] = Color.getHSBColor(0.55f, 0.65f, 0.75f);
		colors[8] = Color.getHSBColor(0.6f, 0.55f, 0.45f);
		colors[9] = Color.getHSBColor(0.65f, 0.5f, 0.85f);

		colors[10] = Color.getHSBColor(0.7f, 0.9f, 0.75f);
		colors[11] = Color.getHSBColor(0.75f, 0.8f, 0.65f);
		colors[12] = Color.getHSBColor(0.8f, 0.45f, 0.85f);
		colors[13] = Color.getHSBColor(0.85f, 0.6f, 0.75f);
		colors[14] = Color.getHSBColor(0.9f, 0.35f, 0.95f);

		colors[15] = Color.getHSBColor(0.95f, 0.5f, 0.65f);
		colors[16] = Color.getHSBColor(0, 0.75f, 0.85f);
		colors[17] = Color.getHSBColor(0.05f, 0.6f, 0.75f);
		colors[18] = Color.getHSBColor(0.1f, 0.45f, 0.85f);
		colors[19] = Color.getHSBColor(0.15f, 0.8f, 0.75f);

		ChoiceListener chooseL = new ChoiceListener();
		columnOfChoiceBoxes = new ColumnOfBoxes(colors);
		columnOfChoiceBoxes.addMouseListener(chooseL);

		LineListener chooseN = new LineListener();
		columnOfLineBoxes = new ColumnOfNumberBoxes(10);
		columnOfLineBoxes.addMouseListener(chooseN);

		DrawingListener drawL = new DrawingListener();
		drawingSurface = new RedrawingCanvas();
		drawingSurface.addMouseMotionListener(drawL);
		drawingSurface.addMouseListener(drawL);

		GridBagLayout theLayout	= new GridBagLayout();
		this.setLayout(theLayout);

		theLayout.setConstraints(columnOfChoiceBoxes, GBconstraints.constrain( 0, 0, 1, 1, 0.10, 0.90, 1, 10, 0,0,0,0));
		theLayout.setConstraints(     drawingSurface, GBconstraints.constrain( 1, 0, 1, 1, 0.90, 0.90, 1, 10, 0,0,0,0));
		theLayout.setConstraints(  columnOfLineBoxes, GBconstraints.constrain( 1, 1, 1, 1, 0.90, 0.10, 1, 10, 0,0,0,0));

		add(columnOfChoiceBoxes);
		add(drawingSurface);
		add(columnOfLineBoxes);
	}

	public static void main(String[] args) {
		WindowListener l = new WindowAdapter()	{
			public void windowClosing(WindowEvent e) {System.exit(0);}
			};

		Frame f = new Frame("Click");
		f.addWindowListener(l);
		f.add(new DrawingProgram());
		f.setSize(800, 400);
		f.show();
	}

	public String[][] getParameterInfo() {
		return null;
	}

}
