package ij.gui;
import ij.*;
import ij.process.*;
import ij.util.*;
import java.awt.*;
import java.util.Vector;
import java.awt.event.*;


 /** Displays a dialog that allows the user to select a color using three sliders. */
public class ColorChooser implements TextListener, AdjustmentListener {
    Vector colors, sliders;
    ColorPanel panel;
    Color initialColor;
    int red, green, blue;
    boolean useHSB;
    String title;
    boolean mono;

    /** Constructs a ColorChooser using the specified title and initial color. */
    public ColorChooser(String title, Color initialColor, boolean useHSB) {
    	this.title = title;
    	if (initialColor==null) initialColor = Color.black;
    	this.initialColor = initialColor;
    	red = initialColor.getRed();
    	green = initialColor.getGreen();
    	blue = initialColor.getBlue();
    	mono = red==green && green==blue;
    	this.useHSB = useHSB;
    }
    
    /** Displays a color selection dialog and returns the color selected by the user. */
    public Color getColor() {
        GenericDialog gd = new GenericDialog(title);
        gd.addSlider("Red:", 0, 255, red);
        gd.addSlider("Green:", 0, 255, green);
        gd.addSlider("Blue:", 0, 255, blue);
        panel = new ColorPanel(initialColor);
        gd.addPanel(panel, GridBagConstraints.CENTER, new Insets(10, 0, 0, 0));
        colors = gd.getNumericFields();
        for (int i=0; i<colors.size(); i++)
            ((TextField)colors.elementAt(i)).addTextListener(this);
        sliders = gd.getSliders();
        for (int i=0; i<sliders.size(); i++)
            ((Scrollbar)sliders.elementAt(i)).addAdjustmentListener(this);
        gd.showDialog();
        if (gd.wasCanceled()) return null;
        int red = (int)gd.getNextNumber();
        int green = (int)gd.getNextNumber();
        int blue = (int)gd.getNextNumber();
        return new Color(red, green, blue);
    }

    public void textValueChanged(TextEvent e) {
        int red = (int)Tools.parseDouble(((TextField)colors.elementAt(0)).getText());
        int green = (int)Tools.parseDouble(((TextField)colors.elementAt(1)).getText());
        int blue = (int)Tools.parseDouble(((TextField)colors.elementAt(2)).getText());
        if (red<0) red=0; if (red>255) red=255;
        if (green<0) green=0; if (green>255) green=255;
        if (blue<0) blue=0; if (blue>255) blue=255;
        panel.setColor(new Color(red, green, blue));
        panel.repaint();
    }

	public synchronized void adjustmentValueChanged(AdjustmentEvent e) {
		Object source = e.getSource();
		for (int i=0; i<sliders.size(); i++) {
			if (source==sliders.elementAt(i)) {
				Scrollbar sb = (Scrollbar)source;
				TextField tf = (TextField)colors.elementAt(i);
				if (i==0 && mono) { // red
					String red = tf.getText();
					TextField tf1 = (TextField)colors.elementAt(1);
					TextField tf2 = (TextField)colors.elementAt(2);
					tf1.setText(red);
					tf2.setText(red);
				}
				if (i!=0) mono = false;
			}
		}
	}

}

class ColorPanel extends Panel {
    static final int WIDTH=100, HEIGHT=50;
    Color c;
     
    ColorPanel(Color c) {
        this.c = c;
    }

    public Dimension getPreferredSize() {
        return new Dimension(WIDTH, HEIGHT);
    }

    void setColor(Color c) {
        this.c = c;
    }

    public Dimension getMinimumSize() {
        return new Dimension(WIDTH, HEIGHT);
    }

    public void paint(Graphics g) {
        g.setColor(c);
        g.fillRect(0, 0, WIDTH, HEIGHT);
        g.setColor(Color.black);
        g.drawRect(0, 0, WIDTH-1, HEIGHT-1);
    }

}
