- /*
- * @(#)BasicSliderUI.java 1.81 00/02/02
- *
- * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
- *
- * This software is the proprietary information of Sun Microsystems, Inc.
- * Use is subject to license terms.
- *
- */
-
- package javax.swing.plaf.basic;
-
- import java.awt.Component;
- import java.awt.Container;
- import java.awt.Adjustable;
- import java.awt.event.*;
- import java.awt.Graphics;
- import java.awt.Dimension;
- import java.awt.Rectangle;
- import java.awt.Point;
- import java.awt.Insets;
- import java.awt.Color;
- import java.awt.IllegalComponentStateException;
- import java.awt.Polygon;
- import java.beans.*;
- import java.util.Dictionary;
- import java.util.Enumeration;
-
- import javax.swing.border.AbstractBorder;
-
- import javax.swing.*;
- import javax.swing.event.*;
- import javax.swing.plaf.*;
-
-
- /**
- * A Basic L&F implementation of SliderUI.
- *
- * @version 1.81 02/02/00
- * @author Tom Santos
- */
- public class BasicSliderUI extends SliderUI{
- public static final int POSITIVE_SCROLL = +1;
- public static final int NEGATIVE_SCROLL = -1;
- public static final int MIN_SCROLL = -2;
- public static final int MAX_SCROLL = +2;
-
- protected Timer scrollTimer;
- protected JSlider slider;
-
- protected Insets focusInsets = null;
- protected Insets insetCache = null;
- protected boolean leftToRightCache = true;
- protected Rectangle focusRect = null;
- protected Rectangle contentRect = null;
- protected Rectangle labelRect = null;
- protected Rectangle tickRect = null;
- protected Rectangle trackRect = null;
- protected Rectangle thumbRect = null;
-
- protected int trackBuffer = 0; // The distance that the track is from the side of the control
-
- private static final Dimension PREFERRED_HORIZONTAL_SIZE = new Dimension(200, 21);
- private static final Dimension PREFERRED_VERTICAL_SIZE = new Dimension(21, 200);
- private static final Dimension MINIMUM_HORIZONTAL_SIZE = new Dimension(36, 21);
- private static final Dimension MINIMUM_VERTICAL_SIZE = new Dimension(21, 36);
-
- private transient boolean isDragging;
-
- protected TrackListener trackListener;
- protected ChangeListener changeListener;
- protected ComponentListener componentListener;
- protected FocusListener focusListener;
- protected ScrollListener scrollListener;
- protected PropertyChangeListener propertyChangeListener;
-
- // Colors
- private Color shadowColor;
- private Color highlightColor;
- private Color focusColor;
-
-
- protected Color getShadowColor() {
- return shadowColor;
- }
-
- protected Color getHighlightColor() {
- return highlightColor;
- }
-
- protected Color getFocusColor() {
- return focusColor;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // ComponentUI Interface Implementation methods
- /////////////////////////////////////////////////////////////////////////////
- public static ComponentUI createUI(JComponent b) {
- return new BasicSliderUI((JSlider)b);
- }
-
- public BasicSliderUI(JSlider b) {
- }
-
- public void installUI(JComponent c) {
- slider = (JSlider) c;
-
- slider.setEnabled(slider.isEnabled());
- slider.setOpaque(true);
-
- isDragging = false;
- trackListener = createTrackListener( slider );
- changeListener = createChangeListener( slider );
- componentListener = createComponentListener( slider );
- focusListener = createFocusListener( slider );
- scrollListener = createScrollListener( slider );
- propertyChangeListener = createPropertyChangeListener( slider );
-
- installDefaults( slider );
- installListeners( slider );
- installKeyboardActions( slider );
-
- scrollTimer = new Timer( 100, scrollListener );
- scrollTimer.setInitialDelay( 300 );
-
- insetCache = slider.getInsets();
- leftToRightCache = BasicGraphicsUtils.isLeftToRight(slider);
- focusRect = new Rectangle();
- contentRect = new Rectangle();
- labelRect = new Rectangle();
- tickRect = new Rectangle();
- trackRect = new Rectangle();
- thumbRect = new Rectangle();
-
- calculateGeometry(); // This figures out where the labels, ticks, track, and thumb are.
- }
-
- public void uninstallUI(JComponent c) {
- if ( c != slider )
- throw new IllegalComponentStateException(
- this + " was asked to deinstall() "
- + c + " when it only knows about "
- + slider + ".");
-
- LookAndFeel.uninstallBorder(slider);
-
- scrollTimer.stop();
- scrollTimer = null;
-
- uninstallListeners( slider );
- uninstallKeyboardActions(slider);
-
- focusInsets = null;
- insetCache = null;
- leftToRightCache = true;
- focusRect = null;
- contentRect = null;
- labelRect = null;
- tickRect = null;
- trackRect = null;
- thumbRect = null;
- trackListener = null;
- changeListener = null;
- componentListener = null;
- focusListener = null;
- scrollListener = null;
- propertyChangeListener = null;
- slider = null;
- }
-
- protected void installDefaults( JSlider slider ) {
- LookAndFeel.installBorder(slider, "Slider.border");
- LookAndFeel.installColors(slider, "Slider.background", "Slider.foreground");
- highlightColor = UIManager.getColor("Slider.highlight");
-
- shadowColor = UIManager.getColor("Slider.shadow");
- focusColor = UIManager.getColor("Slider.focus");
-
- focusInsets = (Insets)UIManager.get( "Slider.focusInsets" );
- }
-
- protected TrackListener createTrackListener( JSlider slider ) {
- return new TrackListener();
- }
-
- protected ChangeListener createChangeListener( JSlider slider ) {
- return new ChangeHandler();
- }
-
- protected ComponentListener createComponentListener( JSlider slider ) {
- return new ComponentHandler();
- }
-
- protected FocusListener createFocusListener( JSlider slider ) {
- return new FocusHandler();
- }
-
- protected ScrollListener createScrollListener( JSlider slider ) {
- return new ScrollListener();
- }
-
- protected PropertyChangeListener createPropertyChangeListener( JSlider slider ) {
- return new PropertyChangeHandler();
- }
-
- protected void installListeners( JSlider slider ) {
- slider.addMouseListener(trackListener);
- slider.addMouseMotionListener(trackListener);
- slider.addFocusListener(focusListener);
- slider.addComponentListener(componentListener);
- slider.addPropertyChangeListener( propertyChangeListener );
- slider.getModel().addChangeListener(changeListener);
- }
-
- protected void uninstallListeners( JSlider slider ) {
- slider.removeMouseListener(trackListener);
- slider.removeMouseMotionListener(trackListener);
- slider.removeFocusListener(focusListener);
- slider.removeComponentListener(componentListener);
- slider.removePropertyChangeListener( propertyChangeListener );
- slider.getModel().removeChangeListener(changeListener);
- }
-
- protected void installKeyboardActions( JSlider slider ) {
- InputMap km = getInputMap(JComponent.WHEN_FOCUSED);
-
- SwingUtilities.replaceUIInputMap(slider, JComponent.WHEN_FOCUSED,
- km);
- ActionMap am = getActionMap();
-
- SwingUtilities.replaceUIActionMap(slider, am);
- }
-
- InputMap getInputMap(int condition) {
- if (condition == JComponent.WHEN_FOCUSED) {
- return (InputMap)UIManager.get("Slider.focusInputMap");
- }
- return null;
- }
-
- ActionMap getActionMap() {
- ActionMap map = (ActionMap)UIManager.get("Slider.actionMap");
-
- if (map == null) {
- map = createActionMap();
- if (map != null) {
- UIManager.put("Slider.actionMap", map);
- }
- }
- return map;
- }
-
- ActionMap createActionMap() {
- ActionMap map = new ActionMapUIResource();
- map.put("positiveUnitIncrement", new SharedActionScroller
- (POSITIVE_SCROLL, false));
- map.put("positiveBlockIncrement", new SharedActionScroller
- (POSITIVE_SCROLL, true));
- map.put("negativeUnitIncrement", new SharedActionScroller
- (NEGATIVE_SCROLL, false));
- map.put("negativeBlockIncrement", new SharedActionScroller
- (NEGATIVE_SCROLL, true));
- map.put("minScroll", new SharedActionScroller(MIN_SCROLL, true));
- map.put("maxScroll", new SharedActionScroller(MAX_SCROLL, true));
- return map;
- }
-
- protected void uninstallKeyboardActions( JSlider slider ) {
- SwingUtilities.replaceUIActionMap(slider, null);
- SwingUtilities.replaceUIInputMap(slider, JComponent.WHEN_FOCUSED,
- null);
- }
-
- public Dimension getPreferredHorizontalSize() {
- return PREFERRED_HORIZONTAL_SIZE;
- }
-
- public Dimension getPreferredVerticalSize() {
- return PREFERRED_VERTICAL_SIZE;
- }
-
- public Dimension getMinimumHorizontalSize() {
- return MINIMUM_HORIZONTAL_SIZE;
- }
-
- public Dimension getMinimumVerticalSize() {
- return MINIMUM_VERTICAL_SIZE;
- }
-
- public Dimension getPreferredSize(JComponent c) {
- recalculateIfInsetsChanged();
- Dimension d;
- if ( slider.getOrientation() == JSlider.VERTICAL ) {
- d = new Dimension(getPreferredVerticalSize());
- d.width = insetCache.left + insetCache.right;
- d.width += focusInsets.left + focusInsets.right;
- d.width += trackRect.width + tickRect.width + labelRect.width;
- }
- else {
- d = new Dimension(getPreferredHorizontalSize());
- d.height = insetCache.top + insetCache.bottom;
- d.height += focusInsets.top + focusInsets.bottom;
- d.height += trackRect.height + tickRect.height + labelRect.height;
- }
-
- return d;
- }
-
- public Dimension getMinimumSize(JComponent c) {
- recalculateIfInsetsChanged();
- Dimension d;
-
- if ( slider.getOrientation() == JSlider.VERTICAL ) {
- d = new Dimension(getMinimumVerticalSize());
- d.width = insetCache.left + insetCache.right;
- d.width += focusInsets.left + focusInsets.right;
- d.width += trackRect.width + tickRect.width + labelRect.width;
- }
- else {
- d = new Dimension(getMinimumHorizontalSize());
- d.height = insetCache.top + insetCache.bottom;
- d.height += focusInsets.top + focusInsets.bottom;
- d.height += trackRect.height + tickRect.height + labelRect.height;
- }
-
- return d;
- }
-
- public Dimension getMaximumSize(JComponent c) {
- Dimension d = getPreferredSize(c);
- if ( slider.getOrientation() == JSlider.VERTICAL ) {
- d.height = Short.MAX_VALUE;
- }
- else {
- d.width = Short.MAX_VALUE;
- }
-
- return d;
- }
-
- protected void calculateGeometry() {
- calculateFocusRect();
- calculateContentRect();
- calculateThumbSize();
- calculateTrackBuffer();
- calculateTrackRect();
- calculateTickRect();
- calculateLabelRect();
- calculateThumbLocation();
- }
-
- protected void calculateFocusRect() {
- focusRect.x = insetCache.left;
- focusRect.y = insetCache.top;
- focusRect.width = slider.getWidth() - (insetCache.left + insetCache.right);
- focusRect.height = slider.getHeight() - (insetCache.top + insetCache.bottom);
- }
-
- protected void calculateThumbSize() {
- Dimension size = getThumbSize();
- thumbRect.setSize( size.width, size.height );
- }
-
- protected void calculateContentRect() {
- contentRect.x = focusRect.x + focusInsets.left;
- contentRect.y = focusRect.y + focusInsets.top;
- contentRect.width = focusRect.width - (focusInsets.left + focusInsets.right);
- contentRect.height = focusRect.height - (focusInsets.top + focusInsets.bottom);
- }
-
- protected void calculateThumbLocation() {
- if ( slider.getSnapToTicks() ) {
- int sliderValue = slider.getValue();
- int snappedValue = sliderValue;
- int majorTickSpacing = slider.getMajorTickSpacing();
- int minorTickSpacing = slider.getMinorTickSpacing();
- int tickSpacing = 0;
-
- if ( minorTickSpacing > 0 ) {
- tickSpacing = minorTickSpacing;
- }
- else if ( majorTickSpacing > 0 ) {
- tickSpacing = majorTickSpacing;
- }
-
- if ( tickSpacing != 0 ) {
- // If it's not on a tick, change the value
- if ( (sliderValue - slider.getMinimum()) % tickSpacing != 0 ) {
- float temp = (float)(sliderValue - slider.getMinimum()) / (float)tickSpacing;
- int whichTick = Math.round( temp );
- snappedValue = slider.getMinimum() + (whichTick * tickSpacing);
- }
-
- if( snappedValue != sliderValue ) {
- slider.setValue( snappedValue );
- }
- }
- }
-
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- int valuePosition = xPositionForValue(slider.getValue());
-
- thumbRect.x = valuePosition - (thumbRect.width / 2);
- thumbRect.y = trackRect.y;
- }
- else {
- int valuePosition = yPositionForValue(slider.getValue());
-
- thumbRect.x = trackRect.x;
- thumbRect.y = valuePosition - (thumbRect.height / 2);
- }
- }
-
- protected void calculateTrackBuffer() {
- if ( slider.getPaintLabels() && slider.getLabelTable() != null ) {
- Component highLabel = getHighestValueLabel();
- Component lowLabel = getLowestValueLabel();
-
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- trackBuffer = Math.max( highLabel.getBounds().width, lowLabel.getBounds().width ) / 2;
- trackBuffer = Math.max( trackBuffer, thumbRect.width / 2 );
- }
- else {
- trackBuffer = Math.max( highLabel.getBounds().height, lowLabel.getBounds().height ) / 2;
- trackBuffer = Math.max( trackBuffer, thumbRect.height / 2 );
- }
- }
- else {
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- trackBuffer = thumbRect.width / 2;
- }
- else {
- trackBuffer = thumbRect.height / 2;
- }
- }
- }
-
-
- protected void calculateTrackRect() {
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- trackRect.x = contentRect.x + trackBuffer;
- trackRect.y = contentRect.y;
- trackRect.width = contentRect.width - (trackBuffer * 2);
- trackRect.height = thumbRect.height;
- }
- else {
- if(BasicGraphicsUtils.isLeftToRight(slider)) {
- trackRect.x = contentRect.x;
- }
- else {
- int tickLength = 0;
- if ( slider.getPaintTicks() ) {
- tickLength = getTickLength();
- }
- trackRect.x = contentRect.x + tickLength +
- getWidthOfWidestLabel();
- }
- trackRect.y = contentRect.y + trackBuffer;
- trackRect.width = thumbRect.width;
- trackRect.height = contentRect.height - (trackBuffer * 2);
- }
- }
-
- /**
- * Gets the height of the tick area for horizontal sliders and the width of the
- * tick area for vertical sliders. BasicSliderUI uses the returned value to
- * determine the tick area rectangle. If you want to give your ticks some room,
- * make this larger than you need and paint your ticks away from the sides in paintTicks().
- */
- protected int getTickLength() {
- return 8;
- }
-
- protected void calculateTickRect() {
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- tickRect.x = trackRect.x;
- tickRect.y = trackRect.y + trackRect.height;
- tickRect.width = trackRect.width;
- tickRect.height = getTickLength();
-
- if ( !slider.getPaintTicks() ) {
- --tickRect.y;
- tickRect.height = 0;
- }
- }
- else {
- if(BasicGraphicsUtils.isLeftToRight(slider)) {
- tickRect.x = trackRect.x + trackRect.width;
- tickRect.width = getTickLength();
- }
- else {
- tickRect.width = getTickLength();
- tickRect.x = trackRect.x - tickRect.width;
- }
- tickRect.y = trackRect.y;
- tickRect.height = trackRect.height;
-
- if ( !slider.getPaintTicks() ) {
- --tickRect.x;
- tickRect.width = 0;
- }
- }
- }
-
- protected void calculateLabelRect() {
- if ( slider.getPaintLabels() ) {
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- labelRect.x = tickRect.x - trackBuffer;
- labelRect.y = tickRect.y + tickRect.height;
- labelRect.width = tickRect.width + (trackBuffer * 2);
- labelRect.height = getHeightOfTallestLabel();
- }
- else {
- if(BasicGraphicsUtils.isLeftToRight(slider)) {
- labelRect.x = tickRect.x + tickRect.width;
- labelRect.width = getWidthOfWidestLabel();
- }
- else {
- labelRect.width = getWidthOfWidestLabel();
- labelRect.x = tickRect.x - labelRect.width;
- }
- labelRect.y = tickRect.y - trackBuffer;
- labelRect.height = tickRect.height + (trackBuffer * 2);
- }
- }
- else {
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- labelRect.x = tickRect.x;
- labelRect.y = tickRect.y + tickRect.height;
- labelRect.width = tickRect.width;
- labelRect.height = 0;
- }
- else {
- if(BasicGraphicsUtils.isLeftToRight(slider)) {
- labelRect.x = tickRect.x + tickRect.width;
- }
- else {
- labelRect.x = tickRect.x;
- }
- labelRect.y = tickRect.y;
- labelRect.width = 0;
- labelRect.height = tickRect.height;
- }
- }
- }
-
- protected Dimension getThumbSize() {
- Dimension size = new Dimension();
-
- if ( slider.getOrientation() == JSlider.VERTICAL ) {
- size.width = 20;
- size.height = 11;
- }
- else {
- size.width = 11;
- size.height = 20;
- }
-
- return size;
- }
-
- public class PropertyChangeHandler implements PropertyChangeListener {
- public void propertyChange( PropertyChangeEvent e ) {
- String propertyName = e.getPropertyName();
- if (propertyName.equals( "orientation" ) ||
- propertyName.equals( "inverted" ) ||
- propertyName.equals( "labelTable" ) ||
- propertyName.equals( "majorTickSpacing" ) ||
- propertyName.equals( "minorTickSpacing" ) ||
- propertyName.equals( "paintTicks" ) ||
- propertyName.equals( "paintTrack" ) ||
- propertyName.equals( "paintLabels" ) ) {
-
- calculateGeometry();
- }
- else if ( propertyName.equals( "model" ) ) {
- ((BoundedRangeModel)e.getOldValue()).removeChangeListener( changeListener );
- ((BoundedRangeModel)e.getNewValue()).addChangeListener( changeListener );
- calculateThumbLocation();
- slider.repaint();
- }
- }
- }
-
- protected int getWidthOfWidestLabel() {
- Dictionary dictionary = slider.getLabelTable();
- int widest = 0;
- if ( dictionary != null ) {
- Enumeration keys = dictionary.keys();
- while ( keys.hasMoreElements() ) {
- Component label = (Component)dictionary.get( keys.nextElement() );
- widest = Math.max( label.getPreferredSize().width, widest );
- }
- }
- return widest;
- }
-
- protected int getHeightOfTallestLabel() {
- Dictionary dictionary = slider.getLabelTable();
- int tallest = 0;
- if ( dictionary != null ) {
- Enumeration keys = dictionary.keys();
- while ( keys.hasMoreElements() ) {
- Component label = (Component)dictionary.get( keys.nextElement() );
- tallest = Math.max( label.getPreferredSize().height, tallest );
- }
- }
- return tallest;
- }
-
- protected int getWidthOfHighValueLabel() {
- Component label = getHighestValueLabel();
- int width = 0;
-
- if ( label != null ) {
- width = label.getPreferredSize().width;
- }
-
- return width;
- }
-
- protected int getWidthOfLowValueLabel() {
- Component label = getLowestValueLabel();
- int width = 0;
-
- if ( label != null ) {
- width = label.getPreferredSize().width;
- }
-
- return width;
- }
-
- protected int getHeightOfHighValueLabel() {
- Component label = getHighestValueLabel();
- int height = 0;
-
- if ( label != null ) {
- height = label.getPreferredSize().height;
- }
-
- return height;
- }
-
- protected int getHeightOfLowValueLabel() {
- Component label = getLowestValueLabel();
- int height = 0;
-
- if ( label != null ) {
- height = label.getPreferredSize().height;
- }
-
- return height;
- }
-
- protected boolean drawInverted() {
- if (slider.getOrientation()==JSlider.HORIZONTAL) {
- if(BasicGraphicsUtils.isLeftToRight(slider)) {
- return slider.getInverted();
- } else {
- return !slider.getInverted();
- }
- } else {
- return slider.getInverted();
- }
- }
-
- /**
- * Returns the label that corresponds to the highest slider value in the label table.
- * @see JSlider#setLabelTable
- */
- protected Component getLowestValueLabel() {
- Dictionary dictionary = slider.getLabelTable();
- Component label = null;
-
- if ( dictionary != null ) {
- Enumeration keys = dictionary.keys();
- if ( keys.hasMoreElements() ) {
- int lowestValue = ((Integer)keys.nextElement()).intValue();
-
- while ( keys.hasMoreElements() ) {
- int value = ((Integer)keys.nextElement()).intValue();
- lowestValue = Math.min( value, lowestValue );
- }
-
- label = (Component)dictionary.get( new Integer( lowestValue ) );
- }
- }
-
- return label;
- }
-
- /**
- * Returns the label that corresponds to the lowest slider value in the label table.
- * @see JSlider#setLabelTable
- */
- protected Component getHighestValueLabel() {
- Dictionary dictionary = slider.getLabelTable();
- Component label = null;
-
- if ( dictionary != null ) {
- Enumeration keys = dictionary.keys();
- if ( keys.hasMoreElements() ) {
- int highestValue = ((Integer)keys.nextElement()).intValue();
-
- while ( keys.hasMoreElements() ) {
- int value = ((Integer)keys.nextElement()).intValue();
- highestValue = Math.max( value, highestValue );
- }
-
- label = (Component)dictionary.get( new Integer( highestValue ) );
- }
- }
-
- return label;
- }
-
- public void paint( Graphics g, JComponent c ) {
- recalculateIfInsetsChanged();
- recalculateIfOrientationChanged();
- Rectangle clip = g.getClipBounds();
-
- if ( slider.getPaintTrack() && clip.intersects( trackRect ) ) {
- paintTrack( g );
- }
- if ( slider.getPaintTicks() && clip.intersects( tickRect ) ) {
- paintTicks( g );
- }
- if ( slider.getPaintLabels() && clip.intersects( labelRect ) ) {
- paintLabels( g );
- }
- if ( slider.hasFocus() && clip.intersects( focusRect ) ) {
- paintFocus( g );
- }
- if ( clip.intersects( thumbRect ) ) {
- paintThumb( g );
- }
- }
-
- protected void recalculateIfInsetsChanged() {
- Insets newInsets = slider.getInsets();
- if ( !newInsets.equals( insetCache ) ) {
- insetCache = newInsets;
- calculateGeometry();
- }
- }
-
- protected void recalculateIfOrientationChanged() {
- boolean ltr = BasicGraphicsUtils.isLeftToRight(slider);
- if ( ltr!=leftToRightCache ) {
- leftToRightCache = ltr;
- calculateGeometry();
- }
- }
-
- public void paintFocus(Graphics g) {
- g.setColor( getFocusColor() );
-
- BasicGraphicsUtils.drawDashedRect( g, focusRect.x, focusRect.y,
- focusRect.width, focusRect.height );
- }
-
- public void paintTrack(Graphics g) {
- int cx, cy, cw, ch;
- int pad;
-
- Rectangle trackBounds = trackRect;
-
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- pad = trackBuffer;
- cx = pad;
- cy = (trackBounds.height / 2) - 2;
- cw = trackBounds.width;
-
- g.translate(trackBounds.x, trackBounds.y + cy);
-
- g.setColor(getShadowColor());
- g.drawLine(0, 0, cw - 1, 0);
- g.drawLine(0, 1, 0, 2);
- g.setColor(getHighlightColor());
- g.drawLine(0, 3, cw, 3);
- g.drawLine(cw, 0, cw, 3);
- g.setColor(Color.black);
- g.drawLine(1, 1, cw-2, 1);
-
- g.translate(-trackBounds.x, -(trackBounds.y + cy));
- }
- else {
- pad = trackBuffer;
- cx = (trackBounds.width / 2) - 2;
- cy = pad;
- ch = trackBounds.height;
-
- g.translate(trackBounds.x + cx, trackBounds.y);
-
- g.setColor(getShadowColor());
- g.drawLine(0, 0, 0, ch - 1);
- g.drawLine(1, 0, 2, 0);
- g.setColor(getHighlightColor());
- g.drawLine(3, 0, 3, ch);
- g.drawLine(0, ch, 3, ch);
- g.setColor(Color.black);
- g.drawLine(1, 1, 1, ch-2);
-
- g.translate(-(trackBounds.x + cx), -trackBounds.y);
- }
- }
-
- public void paintTicks(Graphics g) {
- Rectangle tickBounds = tickRect;
- int i;
- int maj, min, max;
- int w = tickBounds.width;
- int h = tickBounds.height;
- int centerEffect, tickHeight;
-
- g.setColor(slider.getBackground());
- g.fillRect(tickBounds.x, tickBounds.y, tickBounds.width, tickBounds.height);
- g.setColor(Color.black);
-
- maj = slider.getMajorTickSpacing();
- min = slider.getMinorTickSpacing();
-
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- g.translate( 0, tickBounds.y);
-
- int value = slider.getMinimum();
- int xPos = 0;
-
- if ( slider.getMinorTickSpacing() > 0 ) {
- while ( value <= slider.getMaximum() ) {
- xPos = xPositionForValue( value );
- paintMinorTickForHorizSlider( g, tickBounds, xPos );
- value += slider.getMinorTickSpacing();
- }
- }
-
- if ( slider.getMajorTickSpacing() > 0 ) {
- value = slider.getMinimum();
-
- while ( value <= slider.getMaximum() ) {
- xPos = xPositionForValue( value );
- paintMajorTickForHorizSlider( g, tickBounds, xPos );
- value += slider.getMajorTickSpacing();
- }
- }
-
- g.translate( 0, -tickBounds.y);
- }
- else {
- g.translate(tickBounds.x, 0);
-
- int value = slider.getMinimum();
- int yPos = 0;
-
- if ( slider.getMinorTickSpacing() > 0 ) {
- int offset = 0;
- if(!BasicGraphicsUtils.isLeftToRight(slider)) {
- offset = tickBounds.width - tickBounds.width / 2;
- g.translate(offset, 0);
- }
-
- while ( value <= slider.getMaximum() ) {
- yPos = yPositionForValue( value );
- paintMinorTickForVertSlider( g, tickBounds, yPos );
- value += slider.getMinorTickSpacing();
- }
-
- if(!BasicGraphicsUtils.isLeftToRight(slider)) {
- g.translate(-offset, 0);
- }
- }
-
- if ( slider.getMajorTickSpacing() > 0 ) {
- value = slider.getMinimum();
- if(!BasicGraphicsUtils.isLeftToRight(slider)) {
- g.translate(2, 0);
- }
-
- while ( value <= slider.getMaximum() ) {
- yPos = yPositionForValue( value );
- paintMajorTickForVertSlider( g, tickBounds, yPos );
- value += slider.getMajorTickSpacing();
- }
-
- if(!BasicGraphicsUtils.isLeftToRight(slider)) {
- g.translate(-2, 0);
- }
- }
- g.translate(-tickBounds.x, 0);
- }
- }
-
- protected void paintMinorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
- g.drawLine( x, 0, x, tickBounds.height / 2 - 1 );
- }
-
- protected void paintMajorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
- g.drawLine( x, 0, x, tickBounds.height - 2 );
- }
-
- protected void paintMinorTickForVertSlider( Graphics g, Rectangle tickBounds, int y ) {
- g.drawLine( 0, y, tickBounds.width / 2 - 1, y );
- }
-
- protected void paintMajorTickForVertSlider( Graphics g, Rectangle tickBounds, int y ) {
- g.drawLine( 0, y, tickBounds.width - 2, y );
- }
-
- public void paintLabels( Graphics g ) {
- Rectangle labelBounds = labelRect;
-
- Dictionary dictionary = slider.getLabelTable();
- if ( dictionary != null ) {
- Enumeration keys = dictionary.keys();
- while ( keys.hasMoreElements() ) {
- Integer key = (Integer)keys.nextElement();
- Component label = (Component)dictionary.get( key );
-
- if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- g.translate( 0, labelBounds.y );
- paintHorizontalLabel( g, key.intValue(), label );
- g.translate( 0, -labelBounds.y );
- }
- else {
- int offset = 0;
- if(!BasicGraphicsUtils.isLeftToRight(slider)) {
- offset = labelBounds.width -
- label.getPreferredSize().width;
- }
- g.translate( labelBounds.x + offset, 0 );
- paintVerticalLabel( g, key.intValue(), label );
- g.translate( -labelBounds.x - offset, 0 );
- }
- }
- }
-
- }
-
- /**
- * Called for every label in the label table. Used to draw the labels for horizontal sliders.
- * The graphics have been translated to labelRect.y already.
- * @see JSlider#setLabelTable
- */
- protected void paintHorizontalLabel( Graphics g, int value, Component label ) {
- int labelCenter = xPositionForValue( value );
- int labelLeft = labelCenter - (label.getPreferredSize().width / 2);
- g.translate( labelLeft, 0 );
- label.paint( g );
- g.translate( -labelLeft, 0 );
- }
-
- /**
- * Called for every label in the label table. Used to draw the labels for vertical sliders.
- * The graphics have been translated to labelRect.x already.
- * @see JSlider#setLabelTable
- */
- protected void paintVerticalLabel( Graphics g, int value, Component label ) {
- int labelCenter = yPositionForValue( value );
- int labelTop = labelCenter - (label.getPreferredSize().height / 2);
- g.translate( 0, labelTop );
- label.paint( g );
- g.translate( 0, -labelTop );
- }
-
- public void paintThumb(Graphics g) {
- Rectangle knobBounds = thumbRect;
- int w = knobBounds.width;
- int h = knobBounds.height;
-
- g.translate(knobBounds.x, knobBounds.y);
-
- if ( slider.isEnabled() ) {
- g.setColor(slider.getBackground());
- }
- else {
- g.setColor(slider.getBackground().darker());
- }
-
- if ( !slider.getPaintTicks() ) {
-
- // "plain" version
- g.fillRect(0, 0, w, h);
-
- g.setColor(Color.black);
- g.drawLine(0, h-1, w-1, h-1);
- g.drawLine(w-1, 0, w-1, h-1);
-
- g.setColor(highlightColor);
- g.drawLine(0, 0, 0, h-2);
- g.drawLine(1, 0, w-2, 0);
-
- g.setColor(shadowColor);
- g.drawLine(1, h-2, w-2, h-2);
- g.drawLine(w-2, 1, w-2, h-3);
- }
- else if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
- int cw = w / 2;
- g.fillRect(1, 1, w-3, h-1-cw);
- Polygon p = new Polygon();
- p.addPoint(1, h-cw);
- p.addPoint(cw-1, h-1);
- p.addPoint(w-2, h-1-cw);
- g.fillPolygon(p);
-
- g.setColor(highlightColor);
- g.drawLine(0, 0, w-2, 0);
- g.drawLine(0, 1, 0, h-1-cw);
- g.drawLine(0, h-cw, cw-1, h-1);
-
- g.setColor(Color.black);
- g.drawLine(w-1, 0, w-1, h-2-cw);
- g.drawLine(w-1, h-1-cw, w-1-cw, h-1);
-
- g.setColor(shadowColor);
- g.drawLine(w-2, 1, w-2, h-2-cw);
- g.drawLine(w-2, h-1-cw, w-1-cw, h-2);
- }
- else { // vertical
- int cw = h / 2;
- if(BasicGraphicsUtils.isLeftToRight(slider)) {
- g.fillRect(1, 1, w-1-cw, h-3);
- Polygon p = new Polygon();
- p.addPoint(w-cw-1, 0);
- p.addPoint(w-1, cw);
- p.addPoint(w-1-cw, h-2);
- g.fillPolygon(p);
-
- g.setColor(highlightColor);
- g.drawLine(0, 0, 0, h - 2); // left
- g.drawLine(1, 0, w-1-cw, 0); // top
- g.drawLine(w-cw-1, 0, w-1, cw); // top slant
-
- g.setColor(Color.black);
- g.drawLine(0, h-1, w-2-cw, h-1); // bottom
- g.drawLine(w-1-cw, h-1, w-1, h-1-cw); // bottom slant
-
- g.setColor(shadowColor);
- g.drawLine(1, h-2, w-2-cw, h-2 ); // bottom
- g.drawLine(w-1-cw, h-2, w-2, h-cw-1 ); // bottom slant
- }
- else {
- g.fillRect(5, 1, w-1-cw, h-3);
- Polygon p = new Polygon();
- p.addPoint(cw, 0);
- p.addPoint(0, cw);
- p.addPoint(cw, h-2);
- g.fillPolygon(p);
-
- g.setColor(highlightColor);
- g.drawLine(cw-1, 0, w-2, 0); // top
- g.drawLine(0, cw, cw, 0); // top slant
-
- g.setColor(Color.black);
- g.drawLine(0, h-1-cw, cw, h-1 ); // bottom slant
- g.drawLine(cw, h-1, w-1, h-1); // bottom
-
- g.setColor(shadowColor);
- g.drawLine(cw, h-2, w-2, h-2 ); // bottom
- g.drawLine(w-1, 1, w-1, h-2 ); // right
- }
- }
-
- g.translate(-knobBounds.x, -knobBounds.y);
- }
-
- // Used exclusively by setThumbLocation()
- private static Rectangle unionRect = new Rectangle();
-
- public void setThumbLocation(int x, int y) {
- unionRect.setBounds( thumbRect );
-
- thumbRect.setLocation( x, y );
-
- SwingUtilities.computeUnion( thumbRect.x, thumbRect.y, thumbRect.width, thumbRect.height, unionRect );
- slider.repaint( unionRect.x, unionRect.y, unionRect.width, unionRect.height );
- }
-
- public void scrollByBlock(int direction) {
- synchronized(slider) {
-
- int oldValue = slider.getValue();
- int blockIncrement = slider.getMaximum() / 10;
- int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
-
- slider.setValue(oldValue + delta);
- }
- }
-
- public void scrollByUnit(int direction) {
- synchronized(slider) {
-
- int oldValue = slider.getValue();
- int delta = 1 * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
-
- slider.setValue(oldValue + delta);
- }
- }
-
- /**
- * This function is called when a mousePressed was detected in the track, not
- * in the thumb. The default behavior is to scroll by block. You can
- * override this method to stop it from scrolling or to add additional behavior.
- */
- protected void scrollDueToClickInTrack( int dir ) {
- scrollByBlock( dir );
- }
-
- protected int xPositionForValue( int value ) {
- int min = slider.getMinimum();
- int max = slider.getMaximum();
- int trackLength = trackRect.width;
- int valueRange = slider.getMaximum() - slider.getMinimum();
- double pixelsPerValue = (double)trackLength / (double)valueRange;
- int trackLeft = trackRect.x;
- int trackRight = trackRect.x + (trackRect.width - 1);
- int xPosition;
-
- if ( !drawInverted() ) {
- xPosition = trackLeft;
- xPosition += Math.round( pixelsPerValue * (double)(value - min) );
- }
- else {
- xPosition = trackRight;
- xPosition -= Math.round( pixelsPerValue * (double)(value - min) );
- }
-
- xPosition = Math.max( trackLeft, xPosition );
- xPosition = Math.min( trackRight, xPosition );
-
- return xPosition;
- }
-
- protected int yPositionForValue( int value ) {
- int min = slider.getMinimum();
- int max = slider.getMaximum();
- int trackLength = trackRect.height;
- int valueRange = slider.getMaximum() - slider.getMinimum();
- double pixelsPerValue = (double)trackLength / (double)valueRange;
- int trackTop = trackRect.y;
- int trackBottom = trackRect.y + (trackRect.height - 1);
- int yPosition;
-
- if ( !drawInverted() ) {
- yPosition = trackTop;
- yPosition += Math.round( pixelsPerValue * (double)(max - value ) );
- }
- else {
- yPosition = trackTop;
- yPosition += Math.round( pixelsPerValue * (double)(value - min) );
- }
-
- yPosition = Math.max( trackTop, yPosition );
- yPosition = Math.min( trackBottom, yPosition );
-
- return yPosition;
- }
-
- /**
- * Returns a value give a y position. If yPos is past the track at the top or the
- * bottom it will set the value to the min or max of the slider, depending if the
- * slider is inverted or not.
- */
- public int valueForYPosition( int yPos ) {
- int value;
- final int minValue = slider.getMinimum();
- final int maxValue = slider.getMaximum();
- final int trackLength = trackRect.height;
- final int trackTop = trackRect.y;
- final int trackBottom = trackRect.y + (trackRect.height - 1);
-
- if ( yPos <= trackTop ) {
- value = drawInverted() ? minValue : maxValue;
- }
- else if ( yPos >= trackBottom ) {
- value = drawInverted() ? maxValue : minValue;
- }
- else {
- int distanceFromTrackTop = yPos - trackTop;
- int valueRange = maxValue - minValue;
- double valuePerPixel = (double)valueRange / (double)trackLength;
- int valueFromTrackTop = (int)Math.round( distanceFromTrackTop * valuePerPixel );
-
- value = drawInverted() ? minValue + valueFromTrackTop : maxValue - valueFromTrackTop;
- }
-
- return value;
- }
-
- /**
- * Returns a value give an x position. If xPos is past the track at the left or the
- * right it will set the value to the min or max of the slider, depending if the
- * slider is inverted or not.
- */
- public int valueForXPosition( int xPos ) {
- int value;
- final int minValue = slider.getMinimum();
- final int maxValue = slider.getMaximum();
- final int trackLength = trackRect.width;
- final int trackLeft = trackRect.x;
- final int trackRight = trackRect.x + (trackRect.width - 1);
-
- if ( xPos <= trackLeft ) {
- value = drawInverted() ? maxValue : minValue;
- }
- else if ( xPos >= trackRight ) {
- value = drawInverted() ? minValue : maxValue;
- }
- else {
- int distanceFromTrackLeft = xPos - trackLeft;
- int valueRange = maxValue - minValue;
- double valuePerPixel = (double)valueRange / (double)trackLength;
- int valueFromTrackLeft = (int)Math.round( distanceFromTrackLeft * valuePerPixel );
-
- value = drawInverted() ? maxValue - valueFromTrackLeft :
- minValue + valueFromTrackLeft;
- }
-
- return value;
- }
-
- /////////////////////////////////////////////////////////////////////////
- /// Model Listener Class
- /////////////////////////////////////////////////////////////////////////
- /**
- * Data model listener.
- *
- * This inner class is marked "public" due to a compiler bug.
- * This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
- */
- public class ChangeHandler implements ChangeListener {
- public void stateChanged(ChangeEvent e) {
- if ( !isDragging ) {
- calculateThumbLocation();
- slider.repaint();
- }
- }
- }
-
- /////////////////////////////////////////////////////////////////////////
- /// Track Listener Class
- /////////////////////////////////////////////////////////////////////////
- /**
- * Track mouse movements.
- *
- * This inner class is marked "public" due to a compiler bug.
- * This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
- */
- public class TrackListener extends MouseInputAdapter {
- protected transient int offset;
- protected transient int currentMouseX, currentMouseY;
-
- public void mouseReleased(MouseEvent e) {
- if ( !slider.isEnabled() )
- return;
-
- offset = 0;
- scrollTimer.stop();
-
- // This is the way we have to determine snap-to-ticks. It's hard to explain
- // but since ChangeEvents don't give us any idea what has changed we don't
- // have a way to stop the thumb bounds from being recalculated. Recalculating
- // the thumb bounds moves the thumb over the current value (i.e., snapping
- // to the ticks).
- if ( slider.getSnapToTicks() /*|| slider.getSnapToValue()*/ ) {
- isDragging = false;
- slider.setValueIsAdjusting(false);
- }
- else {
- slider.setValueIsAdjusting(false);
- isDragging = false;
- }
-
- slider.repaint();
- }
-
- /**
- * If the mouse is pressed above the "thumb" component
- * then reduce the scrollbars value by one page ("page up"),
- * otherwise increase it by one page. If there is no
- * thumb then page up if the mouse is in the upper half
- * of the track.
- */
- public void mousePressed(MouseEvent e) {
-
- if ( !slider.isEnabled() )
- return;
-
- currentMouseX = e.getX();
- currentMouseY = e.getY();
-
- slider.requestFocus();
-
- // Clicked in the Thumb area?
- if ( thumbRect.contains(currentMouseX, currentMouseY) ) {
- switch ( slider.getOrientation() ) {
- case JSlider.VERTICAL:
- offset = currentMouseY - thumbRect.y;
- break;
- case JSlider.HORIZONTAL:
- offset = currentMouseX - thumbRect.x;
- break;
- }
- isDragging = true;
- slider.setValueIsAdjusting(true);
- return;
- }
- isDragging = false;
- slider.setValueIsAdjusting(true);
-
- Dimension sbSize = slider.getSize();
- int direction = POSITIVE_SCROLL;
-
- switch ( slider.getOrientation() ) {
- case JSlider.VERTICAL:
- if ( thumbRect.isEmpty() ) {
- int scrollbarCenter = sbSize.height / 2;
- if ( !drawInverted() ) {
- direction = (currentMouseY < scrollbarCenter) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;
- }
- else {
- direction = (currentMouseY < scrollbarCenter) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;
- }
- }
- else {
- int thumbY = thumbRect.y;
- if ( !drawInverted() ) {
- direction = (currentMouseY < thumbY) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;
- }
- else {
- direction = (currentMouseY < thumbY) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;
- }
- }
- break;
- case JSlider.HORIZONTAL:
- if ( thumbRect.isEmpty() ) {
- int scrollbarCenter = sbSize.width / 2;
- if ( !drawInverted() ) {
- direction = (currentMouseX < scrollbarCenter) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;
- }
- else {
- direction = (currentMouseX < scrollbarCenter) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;
- }
- }
- else {
- int thumbX = thumbRect.x;
- if ( !drawInverted() ) {
- direction = (currentMouseX < thumbX) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;
- }
- else {
- direction = (currentMouseX < thumbX) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;
- }
- }
- break;
- }
- scrollDueToClickInTrack(direction);
- Rectangle r = thumbRect;
- if ( !r.contains(currentMouseX, currentMouseY) ) {
- if ( shouldScroll(direction) ) {
- scrollTimer.stop();
- scrollListener.setDirection(direction);
- scrollTimer.start();
- }
- }
- }
-
- public boolean shouldScroll(int direction) {
- Rectangle r = thumbRect;
- if ( slider.getOrientation() == JSlider.VERTICAL ) {
- if ( drawInverted() ? direction < 0 : direction > 0 ) {
- if ( r.y + r.height <= currentMouseY ) {
- return false;
- }
- }
- else if ( r.y >= currentMouseY ) {
- return false;
- }
- }
- else {
- if ( drawInverted() ? direction < 0 : direction > 0 ) {
- if ( r.x + r.width >= currentMouseX ) {
- return false;
- }
- }
- else if ( r.x <= currentMouseX ) {
- return false;
- }
- }
-
- if ( direction > 0 && slider.getValue() + slider.getExtent() >= slider.getMaximum() ) {
- return false;
- }
- else if ( direction < 0 && slider.getValue() <= slider.getMinimum() ) {
- return false;
- }
-
- return true;
- }
-
- /**
- * Set the models value to the position of the top/left
- * of the thumb relative to the origin of the track.
- */
- public void mouseDragged( MouseEvent e ) {
- BasicScrollBarUI ui;
- int thumbMiddle = 0;
-
- if ( !slider.isEnabled() )
- return;
-
- currentMouseX = e.getX();
- currentMouseY = e.getY();
-
- if ( !isDragging )
- return;
-
- switch ( slider.getOrientation() ) {
- case JSlider.VERTICAL:
- int halfThumbHeight = thumbRect.height / 2;
- int thumbTop = e.getY() - offset;
- int trackTop = trackRect.y;
- int trackBottom = trackRect.y + (trackRect.height - 1);
-
- thumbTop = Math.max( thumbTop, trackTop - halfThumbHeight );
- thumbTop = Math.min( thumbTop, trackBottom - halfThumbHeight );
-
- setThumbLocation(thumbRect.x, thumbTop);
-
- thumbMiddle = thumbTop + halfThumbHeight;
- slider.setValue( valueForYPosition( thumbMiddle ) );
- break;
- case JSlider.HORIZONTAL:
- int halfThumbWidth = thumbRect.width / 2;
- int thumbLeft = e.getX() - offset;
- int trackLeft = trackRect.x;
- int trackRight = trackRect.x + (trackRect.width - 1);
-
- thumbLeft = Math.max( thumbLeft, trackLeft - halfThumbWidth );
- thumbLeft = Math.min( thumbLeft, trackRight - halfThumbWidth );
-
- setThumbLocation( thumbLeft, thumbRect.y);
-
- thumbMiddle = thumbLeft + halfThumbWidth;
- slider.setValue( valueForXPosition( thumbMiddle ) );
- break;
- default:
- return;
- }
- }
-
- public void mouseMoved(MouseEvent e) {}
-
- }
-
- /**
- * Scroll-event listener.
- *
- * This inner class is marked "public" due to a compiler bug.
- * This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
- */
- public class ScrollListener implements ActionListener {
- // changed this class to public to avoid bogus IllegalAccessException bug i
- // InternetExplorer browser. It was protected. Work around for 4109432
- int direction = POSITIVE_SCROLL;
- boolean useBlockIncrement;
-
- public ScrollListener() {
- direction = POSITIVE_SCROLL;
- useBlockIncrement = true;
- }
-
- public ScrollListener(int dir, boolean block) {
- direction = dir;
- useBlockIncrement = block;
- }
-
- public void setDirection(int direction) { this.direction = direction;}
- public void setScrollByBlock(boolean block) { this.useBlockIncrement = block;}
-
- public void actionPerformed(ActionEvent e) {
- if ( useBlockIncrement ) {
- scrollByBlock(direction);
- }
- else {
- scrollByUnit(direction);
- }
- if ( !trackListener.shouldScroll(direction) ) {
- ((Timer)e.getSource()).stop();
- }
- }
- };
-
- /**
- * Listener for resizing events.
- * <p>
- * This inner class is marked "public" due to a compiler bug.
- * This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
- */
- public class ComponentHandler extends ComponentAdapter {
- public void componentResized(ComponentEvent e) {
- calculateGeometry();
- slider.repaint();
- }
- };
-
- /**
- * Focus-change listener.
- * <p>
- * This inner class is marked "public" due to a compiler bug.
- * This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
- */
- public class FocusHandler implements FocusListener {
- public void focusGained(FocusEvent e) { slider.repaint();}
- public void focusLost(FocusEvent e) { slider.repaint();}
- };
-
- /**
- * As of Java 2 platform v1.3 this undocumented class is no longer used.
- * The recommended approach to creating bindings is to use a
- * combination of an <code>ActionMap</code>, to contain the action,
- * and an <code>InputMap</code> to contain the mapping from KeyStroke
- * to action description. The InputMap is is usually described in the
- * LookAndFeel tables.
- * <p>
- * Please refer to the key bindings specification for further details.
- * <p>
- * This inner class is marked "public" due to a compiler bug.
- * This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
- */
- public class ActionScroller extends AbstractAction {
- int dir;
- boolean block;
- JSlider slider;
-
- public ActionScroller( JSlider slider, int dir, boolean block) {
- this.dir = dir;
- this.block = block;
- this.slider = slider;
- }
-
- public void actionPerformed(ActionEvent e) {
- if ( dir == NEGATIVE_SCROLL || dir == POSITIVE_SCROLL ) {
- int realDir = dir;
- if ( drawInverted() ) {
- realDir = dir == NEGATIVE_SCROLL ? POSITIVE_SCROLL : NEGATIVE_SCROLL;
- }
-
- if ( block )
- scrollByBlock(realDir);
- else
- scrollByUnit(realDir);
- }
- else {
- if ( drawInverted() ) {
- if ( dir == MIN_SCROLL )
- slider.setValue(slider.getMaximum());
- else if ( dir == MAX_SCROLL )
- slider.setValue(slider.getMinimum());
- }
- else {
- if ( dir == MIN_SCROLL )
- slider.setValue(slider.getMinimum());
- else if ( dir == MAX_SCROLL )
- slider.setValue(slider.getMaximum());
- }
- }
- }
- public boolean isEnabled() {
- boolean b = true;
- if (slider != null) {
- b = slider.isEnabled();
- }
- return b;
- }
-
- };
-
-
- /**
- * A static version of the above.
- */
- static class SharedActionScroller extends AbstractAction {
- int dir;
- boolean block;
-
- public SharedActionScroller(int dir, boolean block) {
- this.dir = dir;
- this.block = block;
- }
-
- public void actionPerformed(ActionEvent e) {
- JSlider slider = (JSlider)e.getSource();
- if ( dir == NEGATIVE_SCROLL || dir == POSITIVE_SCROLL ) {
- int realDir = dir;
- BasicSliderUI ui = (BasicSliderUI)slider.getUI();
- if ( slider.getInverted() ) {
- realDir = dir == NEGATIVE_SCROLL ? POSITIVE_SCROLL : NEGATIVE_SCROLL;
- }
-
- if ( block )
- ui.scrollByBlock(realDir);
- else
- ui.scrollByUnit(realDir);
- }
- else {
- if ( slider.getInverted() ) {
- if ( dir == MIN_SCROLL )
- slider.setValue(slider.getMaximum());
- else if ( dir == MAX_SCROLL )
- slider.setValue(slider.getMinimum());
- }
- else {
- if ( dir == MIN_SCROLL )
- slider.setValue(slider.getMinimum());
- else if ( dir == MAX_SCROLL )
- slider.setValue(slider.getMaximum());
- }
- }
- }
- }
- }