// ColourSelector box class
// version 0.1d

import java.awt.*;

class SwatchCanvas extends Canvas
{
	private Canvas theCanvas;
	private int id;
	private Color itsColor;

	private static Color selectedColor;

	SwatchCanvas(int idCode, Color color)
	{
		theCanvas = new Canvas();
		id = idCode;
		itsColor = color;
		setBackground(color);
	}

	public void init()
	{
		selectedColor = Color.blue;
	}

	public Color getColor()
	{
		return this.itsColor;
	}

	synchronized public static void setSelectedColor(Color color)
	{
		selectedColor = color;
	}

	synchronized public static Color getSelectedColor()
	{
		return selectedColor;
	}

	public boolean mouseDown(Event e, int x, int y)
	{
		// System.out.println("Clicked on canvas with id: " + Integer.toString(this.id));
		selectedColor = this.itsColor;
		return true;
	}
/*
	public boolean mouseDrag(Event e, int x, int y)
	{
		System.out.println("Dragged on canvas with id: " + Integer.toString(id));
		selectedColor = this.itsColor;
		return true;
	}

	public boolean mouseEnter(Event e, int x, int y)
	{
		System.out.println("Entered canvas with id: " + Integer.toString(id));
		return true;
	}
*/
}

class ColourSelector extends Dialog
{
	final static int numButtons = 18;
	final static Color purple = new Color(0x99, 0x00, 0x99);
	final static Color brown = new Color(0x66, 0x33, 0x00);
	final static Color lightBrown = new Color(0x99, 0x66, 0x33);
	final static Color lightBlue = new Color(0x00, 0x99, 0xFF);
	final static Color darkGreen = new Color(0x33, 0xCC, 0x33);
	final static Color colrArray[] =
		{ Color.black, Color.white, Color.red, darkGreen, Color.blue, Color.yellow,
		  brown, lightBrown, Color.orange, Color.green, lightBlue, Color.magenta,
		  Color.darkGray, Color.gray, Color.lightGray, Color.cyan, Color.pink, purple };

	private Panel panel1, panel2, panel3;
	private Label label;
	private SwatchCanvas colrButton[] = new SwatchCanvas[numButtons];
	private Button okayButton;
	private Canvas selectedCanvas;
	// private Label displayRGB;

	public ColourSelector( String title, String message, boolean modal)
	{
		super( new Frame(), title, modal );

		// SwatchCanvas.setSelectedColor(Color.blue);

		panel1 = new Panel();
		panel1.setBackground(Color.white);

		panel2 = new Panel();
		panel2.setBackground(Color.white);

		panel3 = new Panel();
		panel3.setBackground( new Color(223, 223, 223) );

		label = new Label(message);
		label.setFont(new Font("Helvetica", Font.BOLD, 12));

		panel1.add(label);

		// full palette
/*		int i = 0;
		panel2.setLayout( new GridLayout( 12, 18) );
		for (int red=0xFF; red>=0x00; red-=0x33)
				for (int blue=0xFF; blue>=0x00; blue-=0x33)
			for (int green=0xFF; green>=0x00; green-=0x33)
					panel2.add(new SwatchCanvas(i++, new Color(red,green,blue)));
*/
		// standard palette
		panel2.setLayout( new GridLayout( 3, 6) );
		for (int i=0; i<numButtons; i++)
		{
			colrButton[i] = new SwatchCanvas(i, colrArray[i]);
			panel2.add( colrButton[i] );
		}

		selectedCanvas = new Canvas();
		selectedCanvas.setBackground(SwatchCanvas.getSelectedColor());
		selectedCanvas.resize(60, 20);
		panel3.add(selectedCanvas);

		okayButton = new Button("Okay");
		okayButton.setBackground(new Color(234, 234, 234));
		panel3.add(okayButton);

		// displayRGB = new Label(SwatchCanvas.getSelectedColor().toString());
		// panel3.add(displayRGB);

		add("North", panel1);
		add("Center", panel2);
		add("South", panel3);

		// resize(400, 300); -- for full palette
		resize(200, 120);
		setResizable(false);

		show();
	}

	public boolean handleEvent( Event evt )
	{
		int red = SwatchCanvas.getSelectedColor().getRed();
		int blue = SwatchCanvas.getSelectedColor().getBlue();
		int green = SwatchCanvas.getSelectedColor().getGreen();

		if (evt.id == Event.WINDOW_DESTROY)
		{
			removeDialog();
			return true;
		}

/*		if ( SwatchCanvas.getSelectedColor() == Color.white )
			panel3.setBackground( new Color(240, 240, 240) );
		else
			panel3.setBackground( Color.white );
*/		
		selectedCanvas.setBackground(SwatchCanvas.getSelectedColor());
		selectedCanvas.repaint();
		// displayRGB.setText(SwatchCanvas.getSelectedColor().toString());
		// displayRGB.setText("RGB code: ".concat(Integer.toHexString(red).concat(Integer.toHexString(green).concat(Integer.toHexString(blue)))));
		// displayRGB.setForeground(Color.black);
		// displayRGB.repaint();
		// panel3.repaint();

		return super.handleEvent(evt);
	}


	public boolean action(Event evt, Object arg)
	{
		if (evt.target == okayButton)
			removeDialog();

		return true;
	}

	public void removeDialog()
	{
		hide();
		dispose();
	}
}
