package gui;

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

/**
 * A component that contains both a slider and a label
 * showing the current value of the slider.
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class SliderPanel extends JPanel implements ChangeListener
{
    private JLabel     maxLabel, minLabel, valueLabel;
    private JSlider    slider;


    /**
     * Explicit Value Constructor.
     *
     * @param min   The minimum value on the slider
     * @param max   The maximum value on the slider
     * @param step  The difference between tick marks
     */
    public SliderPanel(int min, int max, int step)
    {
       super();

       slider = new JSlider(min, max, min);
       slider.setMajorTickSpacing(step);
       slider.setSnapToTicks(true);
       slider.setPaintTicks(true);
       slider.addChangeListener(this);

       minLabel = new JLabel(""+min);
       maxLabel = new JLabel(""+max);
       valueLabel = new JLabel(""+slider.getValue());
       valueLabel.setHorizontalAlignment(JLabel.CENTER);

       setLayout(new BorderLayout());

       add(minLabel, BorderLayout.WEST);
       add(maxLabel, BorderLayout.EAST);

       add(slider, BorderLayout.CENTER);

       add(valueLabel, BorderLayout.NORTH);
    }

    /**
     * Get the current value on the slider.
     *
     * @return  The current value
     */
    public int getValue()
    {
       return slider.getValue();
    }

    /**
     * Handle stateChanged events (required by ChangeListener).
     *
     * @param evt   The ChangeEvent
     */
    public void stateChanged(ChangeEvent evt)
    {
       int    value;


       value = slider.getValue();

       valueLabel.setText(""+value);
       valueLabel.repaint();        
    }
}
