
import java.awt.*;
import java.applet.*;
import java.util.*;

public class ColorTest extends Applet {
	Colorbar red;
	Colorbar green;
	Colorbar blue;
	ColorCanvas color;
	ColorChoice colors;


    public void init() {
		Panel p = new Panel();
		p.setLayout(new BorderLayout());
		p.add("North",new Label("Color"));
		p.add("Center",color = new ColorCanvas());
		p.show();
		setLayout(new FlowLayout());
		add(p);
		add(red   = new Colorbar(Colorbar.RED));
		add(green = new Colorbar(Colorbar.GREEN));
		add(blue  = new Colorbar(Colorbar.BLUE));
	    add(colors = new ColorChoice(color, this));
		show();
	}

	public boolean handleEvent(Event evt) {
		if (evt.target == red || evt.target == green || evt.target == blue) {
			if (evt.id == Event.ACTION_EVENT) {
				color.setBackground(new Color(red.getValue(),green.getValue(),blue.getValue()));
				color.repaint();
		        return true;
		    }
		}
		return false;
	}



}

class ColorCanvas extends Canvas {
	Color color= new Color(255,255,255);

	public void setBackground(Color c) {
		color = c;
		repaint();
	}
	public void paint(Graphics g) {
		Dimension d = size();
		g.setColor(color);
		g.fillRect(1,2,d.width-2,d.height-2);
		g.setColor(getForeground());
		g.drawRect(0,0,d.width-1,d.height-1);
	}
	public Dimension minimumSize() {
		return new Dimension(32,64);
	}
	public Dimension preferredSize() {
		return new Dimension(32,64);
	}
}


class Colorbar extends Panel {
	final static int RED = 0;
	final static int GREEN = 1;
	final static int BLUE = 2;
	int type;// RED, GREEN, or BLUE
	Scrollbar sb;
	TextField tf;
	Choice choice;
	ColorCanvas canvas;
	int value = 255;

	Colorbar(int type) {
		sb = new Scrollbar(Scrollbar.VERTICAL,0,8,0,255);
		sb.setValue(255);
		this.type = type;
		setLayout(new BorderLayout());
		add("West",sb);
		add("Center",canvas = new ColorCanvas());
		add("South",tf=new TextField("*****"));
		    switch(type){
		    case RED:   add("North",new Label("Red")); break;
		    case GREEN: add("North",new Label("Green"));break;
		    case BLUE:  add("North",new Label("Blue")); break;
		}
		add("Center",canvas = new ColorCanvas());
		repaint();
	}

	public int getValue() {
		return value;
	}
	public void setValue(int v) {
		value =  v;
		sb.setValue(v);
		repaint();
	}

	public boolean handleEvent(Event evt) {
		Event e;
		if (evt.target == sb) {
			value = ((Integer)evt.arg).intValue();
			if (value<0) {
				value = 0;
				evt.arg = (Object)new Integer(value);
			}
			if (value>255) {
				value = 255;
				evt.arg = (Object)new Integer(value);
			}
	        repaint();
        	e = new Event(this, evt.when, Event.ACTION_EVENT,
           	     evt.x,evt.y,evt.key,evt.modifiers,new Integer(value));
	        deliverEvent(e);    // ship off ACTION_EVENT
	        return true;
		}
	 	return false;
	}

	public void paint(Graphics graphics) {
		switch(type){
		    case RED:
		        canvas.setBackground(new Color(value,0,0));
		        break;
		    case GREEN:
		        canvas.setBackground(new Color(0,value,0));
		        break;
		    case BLUE:
		        canvas.setBackground(new Color(0,0,value));
		        break;
		}
	    tf.setText(""+value);
		canvas.repaint();
	}

}

class ColorList{
	static Object[][] colorList = {
	    {Color.white,"white"},
	    {Color.black,"black"},
	    {Color.blue,"blue"},
	    {Color.cyan,"cyan"},
	    {Color.darkGray,"darkGray"},
	    {Color.gray,"gray "},
	    {Color.green,"green "},
	    {Color.lightGray,"lightGray"},
	    {Color.magenta,"magenta"},
	    {Color.orange,"orange"},
	    {Color.pink,"pink" },
	    {Color.red,"red"},
	    {Color.yellow,"yellow"}
	    };

    static int getLength(){
        return colorList.length;
    }

    static String getName(int i){
        return (String) colorList[i][1]+" "
          + getColor(i).toString().substring(14);
    }
    static Color getColor(int i){
        return (Color) colorList[i][0];
    }
}

class ColorChoice extends Choice{
    ColorCanvas color;
    ColorTest colortest;

	ColorChoice(ColorCanvas color, ColorTest colortest){
	    this.color=color;
	    this.colortest=colortest;
	    for(int i=0; i<ColorList.getLength(); i++){
	        addItem(ColorList.getName(i));
	    }
	    setBackground(Color.lightGray);
	}

    public boolean action(Event evt, Object arg) {
	     String choice = (String)arg;
	     for(int i=0; i<ColorList.getLength(); i++){
	        if(choice.equals(ColorList.getName(i))){
				colortest.red.setValue(ColorList.getColor(i).getRed());
				colortest.blue.setValue(ColorList.getColor(i).getBlue());
				colortest.green.setValue(ColorList.getColor(i).getGreen());
			    color.setBackground(ColorList.getColor(i));
		        color.repaint();
    		    return true;
		    }
		 }
	    return false;
	}
}
