| ColorChooser |

    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;
            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);
        }

    }

| ColorChooser |