diff options
author | Tom Tromey <tromey@gcc.gnu.org> | 2005-07-16 00:30:23 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2005-07-16 00:30:23 +0000 |
commit | f911ba985aa7fe0096c386c5be385ac5825ea527 (patch) | |
tree | a0b991cf5866ae1d616639b906ac001811d74508 /libjava/classpath/javax/swing/JSlider.java | |
parent | 6f4434b39b261de5317dc81ddfdd94d2e1d62b11 (diff) | |
download | gcc-f911ba985aa7fe0096c386c5be385ac5825ea527.zip gcc-f911ba985aa7fe0096c386c5be385ac5825ea527.tar.gz gcc-f911ba985aa7fe0096c386c5be385ac5825ea527.tar.bz2 |
Initial revision
From-SVN: r102074
Diffstat (limited to 'libjava/classpath/javax/swing/JSlider.java')
-rw-r--r-- | libjava/classpath/javax/swing/JSlider.java | 907 |
1 files changed, 907 insertions, 0 deletions
diff --git a/libjava/classpath/javax/swing/JSlider.java b/libjava/classpath/javax/swing/JSlider.java new file mode 100644 index 0000000..7f99511 --- /dev/null +++ b/libjava/classpath/javax/swing/JSlider.java @@ -0,0 +1,907 @@ +/* JSlider.java -- + Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package javax.swing; + +import java.awt.Dimension; +import java.awt.MenuContainer; +import java.awt.image.ImageObserver; +import java.io.Serializable; +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.Hashtable; + +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleStateSet; +import javax.accessibility.AccessibleValue; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.SliderUI; + +/** + * The JSlider is a Swing component that allows selection of a value within a + * range by adjusting a thumb in a track. The values for the minimum, + * maximum, extent and value are stored in a {@link + * DefaultBoundedRangeModel}. + * + * <p> + * JSliders have the following properties: + * </p> + * + * <table> + * <tr><th> Property </th><th> Stored in </th><th> Bound? </th></tr> + * <tr><td> extent </td><td> model </td><td> no </td></tr> + * <tr><td> inverted </td><td> slider </td><td> yes </td></tr> + * <tr><td> labelTable </td><td> slider </td><td> yes </td></tr> + * <tr><td> majorTickSpacing </td><td> slider </td><td> yes </td></tr> + * <tr><td> maximum </td><td> model </td><td> no </td></tr> + * <tr><td> minimum </td><td> model </td><td> no </td></tr> + * <tr><td> minorTickSpacing </td><td> slider </td><td> yes </td></tr> + * <tr><td> model </td><td> slider </td><td> yes </td></tr> + * <tr><td> orientation </td><td> slider </td><td> yes </td></tr> + * <tr><td> paintLabels </td><td> slider </td><td> yes </td></tr> + * <tr><td> paintTicks </td><td> slider </td><td> yes </td></tr> + * <tr><td> snapToTicks </td><td> slider </td><td> no </td></tr> + * <tr><td> value </td><td> model </td><td> no </td></tr> + * <tr><td> valueIsAdjusting </td><td> model </td><td> no </td></tr> + * </table> + * + * <p> + * The various behavioral aspects of these properties follows: + * </p> + * + * <ul> + * <li> + * When non-bound properties stored in the slider change, the slider fires + * ChangeEvents to its ChangeListeners. + * </li> + * <li> + * When bound properties stored in the slider change, the slider fires + * PropertyChangeEvents to its PropertyChangeListeners + * </li> + * <li> + * If any of the model's properties change, it fires a ChangeEvent to its + * ChangeListeners, which include the slider. + * </li> + * <li> + * If the slider receives a ChangeEvent from its model, it will propagate the + * ChangeEvent to its ChangeListeners, with the ChangeEvent's "source" + * property set to refer to the slider, rather than the model. + * </li> + * </ul> + */ +public class JSlider extends JComponent implements SwingConstants, Accessible, + ImageObserver, + MenuContainer, Serializable +{ + /** DOCUMENT ME! */ + private static final long serialVersionUID = -1441275936141218479L; + + /** + * DOCUMENT ME! + */ + protected class AccessibleJSlider extends JComponent.AccessibleJComponent + implements AccessibleValue + { + private static final long serialVersionUID = -6301740148041106789L; + + /** + * Creates a new AccessibleJSlider object. + * + * @param value0 DOCUMENT ME! + */ + protected AccessibleJSlider() + { + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public AccessibleStateSet getAccessibleStateSet() + { + return null; + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public AccessibleRole getAccessibleRole() + { + return null; + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public AccessibleValue getAccessibleValue() + { + return null; + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public Number getCurrentAccessibleValue() + { + return null; + } + + /** + * setCurrentAccessibleValue + * + * @param value0 TODO + * + * @return boolean + */ + public boolean setCurrentAccessibleValue(Number value0) + { + return false; + } + + /** + * getMinimumAccessibleValue + * + * @return Number + */ + public Number getMinimumAccessibleValue() + { + return null; + } + + /** + * getMaximumAccessibleValue + * + * @return Number + */ + public Number getMaximumAccessibleValue() + { + return null; + } + } + + /** Whether or not this slider paints its ticks. */ + private transient boolean paintTicks = false; + + /** Whether or not this slider paints its track. */ + private transient boolean paintTrack = true; + + /** Whether or not this slider paints its labels. */ + private transient boolean paintLabels = false; + + /** + * A dictionary of (Integer, Component) pairs where each Component is a + * JLabel and the Integer determines where the label will be painted. + */ + private transient Dictionary labelTable; + + /** The model used to describe the slider. */ + protected BoundedRangeModel sliderModel; + + /** The space between major ticks. */ + protected int majorTickSpacing; + + /** The space between minor ticks. */ + protected int minorTickSpacing; + + /** Whether the slider snaps its values to ticks. */ + protected boolean snapToTicks = true; + + /** The orientation of the slider. */ + protected int orientation = HORIZONTAL; + + /** Whether the slider is inverted. */ + private transient boolean isInverted; + + /** The ChangeListener that listens to the model. */ + protected ChangeListener changeListener; + + /** The ChangeEvent that is passed to all listeners of this slider. */ + protected transient ChangeEvent changeEvent; + + /** + * Creates a new horizontal JSlider object with a minimum of 0, a maximum of + * 100, and a value of 50. + */ + public JSlider() + { + this(HORIZONTAL, 0, 100, 50); + } + + /** + * Creates a new JSlider object with the given orientation and a minimum of + * 0, a maximum of 100, and a value of 50. + * + * @param orientation The orientation of the slider. + */ + public JSlider(int orientation) + { + this(orientation, 0, 100, 50); + } + + /** + * Creates a new horizontal JSlider object with the given maximum and + * minimum and a value that is halfway between the minimum and the + * maximum. + * + * @param minimum The minimum value of the JSlider. + * @param maximum The maximum value of the JSlider. + */ + public JSlider(int minimum, int maximum) + { + this(HORIZONTAL, minimum, maximum, (maximum + minimum) / 2); + } + + /** + * Creates a new horizontal JSlider object with the given minimum, maximum, + * and value. + * + * @param minimum The minimum value of the JSlider. + * @param maximum The maximum value of the JSlider. + * @param value The initial value of the JSlider. + */ + public JSlider(int minimum, int maximum, int value) + { + this(HORIZONTAL, minimum, maximum, value); + } + + /** + * Creates a new JSlider object with the given orientation, minimum, + * maximum, and value. + * + * @param orientation The orientation of the JSlider. + * @param minimum The minimum value of the JSlider. + * @param maximum The maximum value of the JSlider. + * @param value The initial value of the JSlider. + */ + public JSlider(int orientation, int minimum, int maximum, int value) + { + sliderModel = new DefaultBoundedRangeModel(value, 0, minimum, maximum); + if (orientation != HORIZONTAL && orientation != VERTICAL) + throw new IllegalArgumentException(orientation + " is not a legal orientation"); + this.orientation = orientation; + changeListener = createChangeListener(); + sliderModel.addChangeListener(changeListener); + updateUI(); + } + + /** + * Creates a new horizontal JSlider object with the given model. + * + * @param model The model the slider will be created with. + */ + public JSlider(BoundedRangeModel model) + { + if (model == null) + sliderModel = new DefaultBoundedRangeModel(50, 0, 0, 100); + else + sliderModel = model; + changeListener = createChangeListener(); + sliderModel.addChangeListener(changeListener); + updateUI(); + } + + /** + * This method returns the current value of the slider. + * + * @return The value of the slider stored in the model. + */ + public int getValue() + { + return sliderModel.getValue(); + } + + /** + * This method sets the value of the slider. + * + * @param value The slider's new value. + */ + public void setValue(int value) + { + sliderModel.setValue(value); + } + + /** + * This method returns the slider's UI delegate. + * + * @return The slider's UI delegate. + */ + public SliderUI getUI() + { + return (SliderUI) ui; + } + + /** + * This method sets the slider's UI delegate. + * + * @param ui A SliderUI object to use with this slider. + */ + public void setUI(SliderUI ui) + { + super.setUI(ui); + } + + /** + * This method sets this slider's UI to the UIManager's default for the + * current look and feel. + */ + public void updateUI() + { + setUI((SliderUI) UIManager.getUI(this)); + invalidate(); + repaint(); + } + + /** + * This method returns a name to identify which look and feel class will be + * the UI delegate for the slider. + * + * @return The Look and Feel classID. "SliderUI" + */ + public String getUIClassID() + { + return "SliderUI"; + } + + /** + * Creates a ChangeListener for this Slider. + * + * @return A new ChangeListener. + */ + protected ChangeListener createChangeListener() + { + return new ChangeListener() + { + public void stateChanged(ChangeEvent ce) + { + // No need to trigger a repaint since the UI listens to the model + // as well. All we need to do is pass on the stateChanged event + // to our listeners. + fireStateChanged(); + } + }; + } + + /** + * This method registers a listener to this slider. The listener will be + * informed of new ChangeEvents. + * + * @param listener The listener to register. + */ + public void addChangeListener(ChangeListener listener) + { + listenerList.add(ChangeListener.class, listener); + } + + /** + * This method removes a listener from this slider. + * + * @param listener The listener to remove. + */ + public void removeChangeListener(ChangeListener listener) + { + listenerList.remove(ChangeListener.class, listener); + } + + /** + * This method is called whenever the model fires a ChangeEvent. It should + * propagate the ChangeEvent to its listeners with a new ChangeEvent that + * identifies the slider as the source. + */ + protected void fireStateChanged() + { + Object[] changeListeners = listenerList.getListenerList(); + if (changeEvent == null) + changeEvent = new ChangeEvent(this); + for (int i = changeListeners.length - 2; i >= 0; i -= 2) + { + if (changeListeners[i] == ChangeListener.class) + ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent); + } + } + + /** + * This method returns an array of all ChangeListeners listening to this + * slider. + * + * @return An array of ChangeListeners listening to this slider. + */ + public ChangeListener[] getChangeListeners() + { + return (ChangeListener[]) listenerList.getListeners(ChangeListener.class); + } + + /** + * This method returns the model of the slider. + * + * @return The slider's model. + */ + public BoundedRangeModel getModel() + { + return sliderModel; + } + + /** + * This method changes the "model" property. It also needs to unregister + * any listeners to the old model and register any listeners to the new + * model. + * + * @param model The model to use with the slider. + */ + public void setModel(BoundedRangeModel model) + { + // I didn't do the null pointer check on purpose. + // If you try it with Sun's, it'll go ahead and set it to null + // and bork the next time it tries to access the model. + if (model != sliderModel) + { + BoundedRangeModel oldModel = sliderModel; + sliderModel = model; + oldModel.removeChangeListener(changeListener); + sliderModel.addChangeListener(changeListener); + firePropertyChange("model", oldModel, sliderModel); + } + } + + /** + * This method returns the minimum value of the slider. + * + * @return The minimum value of the slider. + */ + public int getMinimum() + { + return sliderModel.getMinimum(); + } + + /** + * This method sets the minimum value of the slider. + * + * @param minimum The minimum value of the slider. + */ + public void setMinimum(int minimum) + { + sliderModel.setMinimum(minimum); + } + + /** + * This method returns the maximum value of the slider. + * + * @return The maximum value of the slider. + */ + public int getMaximum() + { + return sliderModel.getMaximum(); + } + + /** + * This method sets the maximum value of the slider. + * + * @param maximum The maximum value of the slider. + */ + public void setMaximum(int maximum) + { + sliderModel.setMaximum(maximum); + } + + /** + * This method returns this slider's isAdjusting value which is true if the + * thumb is being dragged. + * + * @return The slider's isAdjusting value. + */ + public boolean getValueIsAdjusting() + { + return sliderModel.getValueIsAdjusting(); + } + + /** + * This method sets the isAdjusting value for the slider. + * + * @param adjusting The slider's isAdjusting value. + */ + public void setValueIsAdjusting(boolean adjusting) + { + sliderModel.setValueIsAdjusting(adjusting); + } + + /** + * This method returns the extent value for this slider. + * + * @return The extent value for this slider. + */ + public int getExtent() + { + return sliderModel.getExtent(); + } + + /** + * This method sets the extent value for this slider. + * + * @param extent The extent value for this slider. + */ + public void setExtent(int extent) + { + sliderModel.setExtent(extent); + } + + /** + * This method returns the slider orientation. + * + * @return The orientation of the slider. + */ + public int getOrientation() + { + return orientation; + } + + /** + * This method changes the "orientation" property of this slider. If the + * orientation is not VERTICAL or HORIZONTAL, this method does nothing. + * + * @param orientation The orientation of this slider. + */ + public void setOrientation(int orientation) + { + if (orientation != VERTICAL && orientation != HORIZONTAL) + throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL"); + if (orientation != this.orientation) + { + int oldOrientation = this.orientation; + this.orientation = orientation; + firePropertyChange("orientation", oldOrientation, + this.orientation); + } + } + + /** + * This method returns the label table for this slider. + * + * @return The label table for this slider. + */ + public Dictionary getLabelTable() + { + return labelTable; + } + + /** + * This method changes the "labelTable" property of this slider. + * + * @param table The label table for this slider. + */ + public void setLabelTable(Dictionary table) + { + if (table != labelTable) + { + Dictionary oldTable = labelTable; + labelTable = table; + firePropertyChange("labelTable", oldTable, labelTable); + } + } + + /** + * This method is called to reset UI delegates for the labels in the + * labelTable to a default for the current look and feel. + */ + protected void updateLabelUIs() + { + if (labelTable == null) + return; + for (Enumeration list = labelTable.elements(); list.hasMoreElements();) + { + JLabel label = (JLabel) list.nextElement(); + label.updateUI(); + } + } + + /** + * Creates a hashtable of (Integer, JLabel) pairs that can be used as a + * label table for this slider. The labels will start from the sliders + * minimum and increase by the increment. Each label will have a text + * string indicating their integer value. + * + * @param increment The increment to between labels. + * + * @return A hashtable with the labels and their keys. + */ + public Hashtable createStandardLabels(int increment) + { + return createStandardLabels(increment, sliderModel.getMinimum()); + } + + /** + * Creates a hashtable of (Integer, JLabel) pairs that can be used as a + * label table for this slider. The labels will start from the given start + * value and increase by the increment. Each label will have a text string + * indicating their integer value. + * + * @param increment The increment to between labels. + * @param start The value to start from. + * + * @return A hashtable with the labels and their keys. + */ + public Hashtable createStandardLabels(int increment, int start) + { + Hashtable table = new Hashtable(); + JLabel label; + Dimension dim; + + int max = sliderModel.getMaximum(); + + for (int i = start; i <= max; i += increment) + { + label = new JLabel(String.valueOf(i)); + label.setVerticalAlignment(CENTER); + label.setHorizontalAlignment(CENTER); + + // Make sure these labels have the width and height + // they want. + dim = label.getPreferredSize(); + label.setBounds(label.getX(), label.getY(), + (int) dim.getWidth(), + (int) dim.getHeight()); + table.put(new Integer(i), label); + } + return table; + } + + /** + * This method returns whether the slider is inverted. Horizontal sliders + * that are not inverted will have the minimums on the left. If they are + * inverted, the minimums will be on the right. Vertical sliders that are + * not inverted will have the minimums at the bottom. If they are inverted, + * the minimums will be at the top. + * + * @return Whether this slider is inverted. + */ + public boolean getInverted() + { + return isInverted; + } + + /** + * This method changes the "inverted" property for this slider.Horizontal + * sliders that are not inverted will have the minimums on the left. If + * they are inverted, the minimums will be on the right. Vertical sliders + * that are not inverted will have the minimums at the bottom. If they are + * inverted, the minimums will be at the top. However, if the slider's + * componentOrientation is set to RIGHT_TO_LEFT, then everything gets + * reversed again. + * + * @param inverted Whether the slider should be inverted. + */ + public void setInverted(boolean inverted) + { + if (isInverted != inverted) + { + boolean oldInverted = isInverted; + isInverted = inverted; + firePropertyChange("inverted", oldInverted, isInverted); + } + } + + /** + * This method returns the amount of units between each major tick mark. + * + * @return The amount of units between each major tick mark. + */ + public int getMajorTickSpacing() + { + return majorTickSpacing; + } + + /** + * This method changes the "majorTickSpacing" property for this slider. The + * major tick spacing is the amount of units between each major tick mark. + * + * @param spacing The amount of units between each major tick mark. + */ + public void setMajorTickSpacing(int spacing) + { + if (majorTickSpacing != spacing) + { + int oldSpacing = majorTickSpacing; + majorTickSpacing = spacing; + firePropertyChange("majorTickSpacing", oldSpacing, + majorTickSpacing); + } + } + + /** + * This method returns the amount of units between each minor tick mark. + * + * @return The amount of units between each minor tick mark. + */ + public int getMinorTickSpacing() + { + return minorTickSpacing; + } + + /** + * This method changes the "minorTickSpacing" property for this slider. The + * minor tick spacing is the amount of units between each minor tick mark. + * + * @param spacing The amount of units between each minor tick mark. + */ + public void setMinorTickSpacing(int spacing) + { + if (minorTickSpacing != spacing) + { + int oldSpacing = minorTickSpacing; + minorTickSpacing = spacing; + firePropertyChange("minorTickSpacing", oldSpacing, + minorTickSpacing); + } + } + + /** + * This method returns whether this slider is snapping to ticks. Sliders + * that snap to ticks will automatically move the thumb to the nearest tick + * mark. + * + * @return Whether this slider snaps to ticks. + */ + public boolean getSnapToTicks() + { + return snapToTicks; + } + + /** + * This method sets whether this slider will snap to ticks. Sliders that + * snap to ticks will automatically move the thumb to the nearest tick + * mark. + * + * @param snap Whether this slider snaps to ticks. + */ + public void setSnapToTicks(boolean snap) + { + if (snap != snapToTicks) + { + snapToTicks = snap; + fireStateChanged(); + } + } + + /** + * This method returns whether the slider will paint its tick marks. In + * addition to setting this property to true, one of minor tick spacing or + * major tick spacing must be set to a value greater than 0 in order for + * ticks to be painted. + * + * @return Whether ticks will be painted. + */ + public boolean getPaintTicks() + { + return paintTicks; + } + + /** + * This method changes the "paintTicks" property for this slider. In + * addition to setting this property to true, one of minor tick spacing or + * major tick spacing must be set to a value greater than 0 in order for + * ticks to be painted. + * + * @param paint Whether ticks will be painted. + */ + public void setPaintTicks(boolean paint) + { + if (paint != paintTicks) + { + boolean oldPaintTicks = paintTicks; + paintTicks = paint; + firePropertyChange("paintTicks", oldPaintTicks, paintTicks); + } + } + + /** + * This method returns whether the track will be painted. + * + * @return Whether the track will be painted. + */ + public boolean getPaintTrack() + { + return paintTrack; + } + + /** + * This method sets whether the track will be painted. + * + * @param paint Whether the track will be painted. + */ + public void setPaintTrack(boolean paint) + { + paintTrack = paint; + } + + /** + * This method returns whether labels will be painted. + * + * @return Whether labels will be painted. + */ + public boolean getPaintLabels() + { + return paintLabels; + } + + /** + * This method changes the "paintLabels" property. + * + * @param paint Whether labels will be painted. + */ + public void setPaintLabels(boolean paint) + { + if (paint != paintLabels) + { + boolean oldPaintLabels = paintLabels; + paintLabels = paint; + firePropertyChange("paintLabels", oldPaintLabels, paintLabels); + } + } + + /** + * This method is used primarily for debugging purposes and returns a string + * that can be used to represent this slider. + * + * @return A string representing this slider. + */ + protected String paramString() + { + return "JSlider"; + } + + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public AccessibleContext getAccessibleContext() + { + if (accessibleContext == null) + accessibleContext = new AccessibleJSlider(); + + return accessibleContext; + } +} |