package org.limewire.ui.swing.components; import javax.swing.JSlider; /** * An extension of JSlider to select a range of values using two thumb controls. * The thumb controls are used to select the lower and upper value of a range * with pre-determined minimum and maximum values. Either thumb control may * be disabled. * * <p>Note that RangeSlider makes use of the default BoundedRangeModel, which * supports an inner range defined by a value and an extent. The upper value * returned by RangeSlider is simply the lower value plus the extent.</p> */ public class RangeSlider extends JSlider { /** Indicator that determines whether the lower thumb is displayed. */ private boolean lowerThumbEnabled = true; /** Indicator that determines whether the upper thumb is displayed. */ private boolean upperThumbEnabled = true; /** * Constructs a RangeSlider with default minimum and maximum values of 0 * and 100. */ public RangeSlider() { initSlider(); } /** * Constructs a RangeSlider with the specified default minimum and maximum * values. */ public RangeSlider(int min, int max) { super(min, max); initSlider(); } /** * Initializes the slider by setting default properties. */ private void initSlider() { setOrientation(HORIZONTAL); } /** * Overrides the superclass method to install the UI delegate to draw two * thumbs. */ @Override public void updateUI() { setUI(new RangeSliderUI(this)); // Update UI for slider labels. This must be called after updating the // UI of the slider. Refer to JSlider.updateUI(). updateLabelUIs(); } /** * Returns an indicator that determines whether the lower thumb is enabled. * The default value is true. */ public boolean isLowerThumbEnabled() { return lowerThumbEnabled; } /** * Sets an indicator that determines whether the lower thumb is enabled. */ public void setLowerThumbEnabled(boolean lowerThumbEnabled) { this.lowerThumbEnabled = lowerThumbEnabled; } /** * Returns an indicator that determines whether the upper thumb is enabled. * The default value is true. */ public boolean isUpperThumbEnabled() { return upperThumbEnabled; } /** * Sets an indicator that determines whether the upper thumb is enabled. */ public void setUpperThumbEnabled(boolean upperThumbEnabled) { this.upperThumbEnabled = upperThumbEnabled; } /** * Returns the lower value in the range. */ @Override public int getValue() { return super.getValue(); } /** * Sets the lower value in the range. */ @Override public void setValue(int value) { int oldValue = getValue(); if (oldValue == value) { return; } // Compute new value and extent to maintain upper value. int oldExtent = getExtent(); int newValue = Math.min(Math.max(getMinimum(), value), oldValue + oldExtent); int newExtent = oldExtent + oldValue - newValue; // Set new value and extent, and fire a single change event. getModel().setRangeProperties(newValue, newExtent, getMinimum(), getMaximum(), getValueIsAdjusting()); } /** * Returns the upper value in the range. */ public int getUpperValue() { return getValue() + getExtent(); } /** * Sets the upper value in the range. */ public void setUpperValue(int value) { // Compute new extent. int lowerValue = getValue(); int newExtent = Math.min(Math.max(0, value - lowerValue), getMaximum() - lowerValue); // Set extent to set upper value. setExtent(newExtent); } }