// Copyright 1996, Marimba Inc. All Rights Reserved.


// @(#)ColorPickerWidget.java, 1.3, 12/19/96





package marimba.gui;





import java.awt.*;


import java.awt.image.*;


import java.util.*;





import marimba.persist.*;





/**


 * Widget to choose a color


 *


 * @author      Carl W. Haynes III


 * @version 	1.3, 12/19/96


 */


public class ColorPickerWidget extends Widget {


    /**


     * A color picker can be filled.


     * @see #isFilled


     * @see #setFilled


     */


    public boolean  filled;





    /**


     * The current value of the red slider.


     * @see #getValue


     * @see #getColorValue


     */


    protected int  red = 0;





    /**


     * The current value of the green slider.


     * @see #getValue


     * @see #getColorValue


     */


    protected int  green = 0;





    /**


     * The current value of the blue slider.


     * @see #getValue


     * @see #getColorValue


     */


    protected int  blue = 0;





    /**


     * The image for the blue slider.


     */


    protected Image  blueImage = null;





    /**


     * The image for the red slider.


     */


    protected Image  redImage = null;





    /**


     * The image for the green slider.


     */


    protected Image  greenImage = null;





    /** memory for  image */


    int  redpix[] = new int[128];


    int  greenpix[] = new int[128];


    int  bluepix[] = new int[128];





    /** offsets for drawing */


    int  imgLeft = 15;


    int  redTop = 10;


    int  greenTop = 35;


    int  blueTop = 60;


    int  imgHeight = 8;


    int  imgWidth = 128;





    /** item currently being dragged */


    int  tracking = -1;








    /**


     * Default constructor.


     */


    public ColorPickerWidget() {


    }





    /**


     * Constructor with color.


     */


    public ColorPickerWidget(Color color) {


	red = color.getRed();


	green = color.getGreen();


	blue = color.getBlue();


    }





    /**


     * Get the properties of this widget.


     */


    public void getProperties(PropertyList list) {


    	super.getProperties(list);


    	list.setInteger("red", red, red);


    	list.setInteger("green", green, green);


    	list.setInteger("blue", blue, blue);


	list.setBoolean("filled", filled, false);


    }





    /**


     * Set the properties of this widget.


     */


    public void setProperties(PropertyList list) {


    	super.setProperties(list);


    	red = list.getInteger("red", red);


    	green = list.getInteger("green", green);


    	blue = list.getInteger("blue", blue);


	filled = list.getBoolean("filled", false);


	transparent = !filled;


    }





    /**


     * Check whether the color picker is filled.


     * @see #filled


     */


    public boolean isFilled() {


	return filled;


    }





    /**


     * Let the color picker fill itself or not.


     * @see #filled


     */


    public void setFilled(boolean filled) {


	if (filled != this.filled) {


	    this.filled = filled;


	    repaint();


	}


    }





    /**


     * Create the images.


     */


    public void start() {


	createImages();


    }





    /**


     * Set the colors.


     */


    protected void createImages() {


	for (int i = 0 ; i < 128 ; i++) {


	    int tmp = i*2;


	    redpix[i] = (255 << 24) | (tmp << 16) | (green << 8) | blue;


	}


	redImage = getPlayerPanel().createImage(new MemoryImageSource(128, 1, redpix, 0, 128));





	for (int i = 0 ; i < 128 ; i++) {


	    int tmp = i*2;


	    greenpix[i] = (255 << 24) | (red << 16) | (tmp << 8) | blue;


	}


	greenImage = getPlayerPanel().createImage(new MemoryImageSource(128, 1, greenpix, 0, 128));





	for (int i = 0 ; i < 128 ; i++) {


	    int tmp = i*2;


	    bluepix[i] = (255 << 24) | (red << 16) | (green << 8) | tmp;


	}


	blueImage = getPlayerPanel().createImage(new MemoryImageSource(128, 1, bluepix, 0, 128));


    }





    /**


     * Set the current color.


     */


    public void setValue(Object color) {


	if (color instanceof Color) {


	    Color  col = (Color)color;


	    red = col.getRed();


	    green = col.getGreen();


	    blue = col.getBlue();


	    if (getPlayerPanel() != null) {


		createImages();


	    }


	    repaint();


	}


    }





    /**


     * Get the current color.


     * @see #getColorValue


     */


    public Object getValue() {


	return getColorValue();


    }





    /**


     * Get the current color, by constructing one


     * using the current red, green and blue settings.


     * @see #color


     */


    public Color getColorValue() {


	return(new Color(red, green, blue));


    }





    /**


     * Paint this color picker.


     */


    public void paint(Graphics g) {


	if (filled) {


	    g.setColor(background);


	    g.fillRect(0, 0, width, height);


	}





	g.setFont(font);


	g.setColor(Color.black);


	drawRed(g);


	drawGreen(g);


	drawBlue(g);


	drawPreview(g);


	drawText(g);


    }


    


    /**


     * Draw the red selector.


     */


    protected void drawRed(Graphics g) {


	g.drawImage(redImage, imgLeft, redTop, imgWidth, imgHeight, this);





	g.setColor(Color.black);


	g.drawRect(imgLeft, redTop, imgWidth, imgHeight);





	g.setColor(foreground);


	int left = imgLeft+(red/2);


	g.drawLine(left, redTop+imgHeight+1, left-5, redTop+imgHeight+6);


	g.drawLine(left, redTop+imgHeight+1, left+5, redTop+imgHeight+6);


	g.drawLine(left-5, redTop+imgHeight+6, left+5, redTop+imgHeight+6);


    }





    /**


     * Draw the green selector


     */


    protected void drawGreen(Graphics g) {


	g.drawImage(greenImage, imgLeft, greenTop, imgWidth, imgHeight, this);





	g.setColor(Color.black);


	g.drawRect(imgLeft, greenTop, imgWidth, imgHeight);





	g.setColor(foreground);


	int left = imgLeft+(green/2);


	g.drawLine(left, greenTop+imgHeight+1, left-5, greenTop+imgHeight+6);


	g.drawLine(left, greenTop+imgHeight+1, left+5, greenTop+imgHeight+6);


	g.drawLine(left-5, greenTop+imgHeight+6, left+5, greenTop+imgHeight+6);


    }





    /**


     * Draw the blue selector


     */


    protected void drawBlue(Graphics g) {


	g.drawImage(blueImage, imgLeft, blueTop, imgWidth, imgHeight, this);





	g.setColor(Color.black);


	g.drawRect(imgLeft, blueTop, imgWidth, imgHeight);


	


	g.setColor(foreground);


	int left = imgLeft+(blue/2);


	g.drawLine(left, blueTop+imgHeight+1, left-5, blueTop+imgHeight+6);


	g.drawLine(left, blueTop+imgHeight+1, left+5, blueTop+imgHeight+6);


	g.drawLine(left-5, blueTop+imgHeight+6, left+5, blueTop+imgHeight+6);


    }





    /**


     * Draw the preview selector


     */


    protected void drawPreview(Graphics g) {


	g.setColor(new Color(red, green, blue));


	g.fillRect(width-28, 10, 25, 25);





	g.setColor(Color.black);


	g.drawRect(width-28, 10, 25, 25);





	g.setColor(foreground);


	g.drawRect(width-30, 8, 29, 29);


    }





    /**


     * Draw the text


     */


    protected void drawText(Graphics g) {


	FontMetrics fm = g.getFontMetrics();


	g.setColor(foreground);





	String label = "R";


	int lx = 0;


	int ly = (((redTop+(imgHeight/2))*2) - fm.getHeight())/2 + fm.getAscent();


	g.drawString(label, 0, ly);


	label = "" + red;


	g.drawString(label, (width-35)-fm.stringWidth(label), ly);





	label = "G";


	ly = (((greenTop+(imgHeight/2))*2) - fm.getHeight())/2 + fm.getAscent();


	g.drawString(label, 0, ly);


	label = "" + green;


	g.drawString(label, (width-35)-fm.stringWidth(label), ly);





	label = "B";


	ly = (((blueTop+(imgHeight/2))*2) - fm.getHeight())/2 + fm.getAscent();


	g.drawString(label, 0, ly);


	label = "" + blue;


	g.drawString(label, (width-35)-fm.stringWidth(label), ly);


    }








    /**


     * Handle the events.


     */


    public boolean handleEvent(Event evt) {


	switch(evt.id) {


	  case Event.MOUSE_UP:


	  case Event.MOUSE_DRAG:


	    int val = 0;


	    if (evt.x <= imgLeft) {


		val = 0;


	    }


	    else if (evt.x >= imgLeft+imgWidth) {


		val = 255;


	    }


	    else {


		val = (evt.x-imgLeft)*2;


	    }


	    switch(tracking) {


	      case RED:


		red = val;


		break;


	      case GREEN:


		green = val;


		break;


	      case BLUE:


		blue = val;


		break;


	    }


	    createImages();


	    repaint();


	    action();


	    if (evt.id == Event.MOUSE_UP)


		tracking = -1;


	    break;


	  case Event.MOUSE_DOWN:


	    if (evt.x >= (imgLeft-5) && evt.x <= imgLeft+imgWidth+5) {


		val = 0;


		if (evt.x <= imgLeft) {


		    val = 0;


		}


		else if (evt.x >= imgLeft+imgWidth) {


		    val = 255;


		}


		else {


		    val = (evt.x-imgLeft)*2;


		}





		if (evt.y >=  redTop && evt.y <= redTop+imgHeight+6) {


		    red = val;


		    createImages();


		    tracking = RED;


		    repaint();


		    action();


		}


		else if (evt.y >=  greenTop && evt.y <= greenTop+imgHeight+6) {


		    green = val;


		    createImages();


		    tracking = GREEN;


		    repaint();


		    action();


		}


		else if (evt.y >=  blueTop && evt.y <= blueTop+imgHeight+6) {


		    blue = val;


		    createImages();


		    tracking = BLUE;


		    repaint();


		    action();


		}


	    }





	    break;


	}


	return super.handleEvent(evt);


    }


}


