
import objectdraw.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

/*
 * Class which implements an applet which displays the color selected
 * using three scrollbars.  It illustrates the use of "listeners"
 */
public class ColorSlider extends WindowController implements ChangeListener {

        private static final int MIN_COLOR_VALUE = 0; //min value in Sliderbar
        private static final int MAX_COLOR_VALUE = 255; //max value in Sliderbar

        private static final int NUM_SLIDERS = 3; // number of sliders in window

        private static final int COLOR_COLUMNS = 3;
        // number of components per subpanel

        private static final int HORIZONTAL_SPACING = 10; // spacing for panels
        private static final int VERTICAL_SPACING = 5;

        // labels for color controlled by each of three Sliderbars
        private JLabel redLabel;
        private JLabel blueLabel;
        private JLabel greenLabel;

        // Red, green, and blue Sliderbars
        private JSlider redSlider;
        private JSlider greenSlider;
        private JSlider blueSlider;

        // Labels to display current value of each Sliderbar
        private JLabel redValueLabel;
        private JLabel greenValueLabel;
        private JLabel blueValueLabel;

        private FilledRect colorRect; // Rectangle displaying chosen color

        // Set up Sliderbars and labels on panels
        public void begin() {
                Panel sliderPanel =
                        new Panel(new GridLayout(NUM_SLIDERS, COLOR_COLUMNS, 
                                                 HORIZONTAL_SPACING, VERTICAL_SPACING));

                redSlider = new JSlider(JSlider.HORIZONTAL, MIN_COLOR_VALUE, 
                                        MAX_COLOR_VALUE, MIN_COLOR_VALUE);
                redSlider.addChangeListener(this);

                // Set up JSlider for green
                greenSlider = new JSlider(JSlider.HORIZONTAL, MIN_COLOR_VALUE, 
                                          MAX_COLOR_VALUE, MIN_COLOR_VALUE);
                greenSlider.addChangeListener(this);

                // Set up JSlider for blue
                blueSlider = new JSlider(JSlider.HORIZONTAL, MIN_COLOR_VALUE, 
                                         MAX_COLOR_VALUE, MIN_COLOR_VALUE);
                blueSlider.addChangeListener(this);

                redLabel = new JLabel("Red", JLabel.RIGHT);
                blueLabel = new JLabel(" Blue", JLabel.RIGHT);
                greenLabel = new JLabel("Green", JLabel.RIGHT);

                redValueLabel = new JLabel("0", JLabel.LEFT);
                greenValueLabel = new JLabel("0", JLabel.LEFT);
                blueValueLabel = new JLabel("0", JLabel.LEFT);

                // Add "red" components
                sliderPanel.add(redLabel);
                sliderPanel.add(redSlider);
                sliderPanel.add(redValueLabel);

                // Add "green" components
                sliderPanel.add(greenLabel);
                sliderPanel.add(greenSlider);
                sliderPanel.add(greenValueLabel);

                // Add blue components
                sliderPanel.add(blueLabel);
                sliderPanel.add(blueSlider);
                sliderPanel.add(blueValueLabel);

                Container contentPane = getContentPane();
                contentPane.add(sliderPanel, BorderLayout.SOUTH);
                contentPane.validate();

                // create color display
                colorRect =
                        new FilledRect(0, 0, canvas.getWidth(), canvas.getHeight(), canvas);
        }

        /** This method is called whenever any of the Sliders are moved.  It
         * repaints the colorRect with the color obtained from the Sliderbar
         * choices.  Don't bother to check who is responsible, just change color!
         */

        public void stateChanged(ChangeEvent evt) {
                // Get component color values
                int redValue = redSlider.getValue();
                int greenValue = greenSlider.getValue();
                int blueValue = blueSlider.getValue();

                // Create the new color and make it the color for colorRect
                Color newColor = new Color(redValue, greenValue, blueValue);
                colorRect.setColor(newColor);

                // Update color values shown on the screen.
                redValueLabel.setText("" + redValue);
                blueValueLabel.setText("" + blueValue);
                greenValueLabel.setText("" + greenValue);
        }

}
