FileDocCategorySizeDatePackage
MetalSliderUI.javaAPI DocJava SE 6 API18411Tue Jun 10 00:26:50 BST 2008javax.swing.plaf.metal

MetalSliderUI

public class MetalSliderUI extends BasicSliderUI
A Java L&F implementation of SliderUI.

Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeansTM has been added to the java.beans package. Please see {@link java.beans.XMLEncoder}.

version
1.36 11/30/05
author
Tom Santos

Fields Summary
protected final int
TICK_BUFFER
protected boolean
filledSlider
protected static Color
thumbColor
protected static Color
highlightColor
protected static Color
darkShadowColor
protected static int
trackWidth
protected static int
tickLength
protected static Icon
horizThumbIcon
A default horizontal thumb Icon. This field might not be used. To change the Icon used by this delgate directly set it using the Slider.horizontalThumbIcon UIManager property.
protected static Icon
vertThumbIcon
A default vertical thumb Icon. This field might not be used. To change the Icon used by this delgate directly set it using the Slider.verticalThumbIcon UIManager property.
private static Icon
SAFE_HORIZ_THUMB_ICON
private static Icon
SAFE_VERT_THUMB_ICON
protected final String
SLIDER_FILL
Constructors Summary
public MetalSliderUI()

        super( null );
    
Methods Summary
private java.awt.ColorchooseColor(boolean chooseFirst, java.awt.Color c1, java.awt.Color c2)
If chooseFirstis true, c1 is returned, otherwise c2.

        if (chooseFirst) {
            return c2;
        }
        return c1;
    
protected java.beans.PropertyChangeListenercreatePropertyChangeListener(javax.swing.JSlider slider)

        return new MetalPropertyListener();
    
public static javax.swing.plaf.ComponentUIcreateUI(javax.swing.JComponent c)


            
        return new MetalSliderUI();
    
private static javax.swing.IcongetHorizThumbIcon()

        if (System.getSecurityManager() != null) {
            return SAFE_HORIZ_THUMB_ICON;
        } else {
            return horizThumbIcon;
        }
    
private java.awt.RectanglegetPaintTrackRect()
Returns a rectangle enclosing the track that will be painted.

        int trackLeft = 0, trackRight = 0, trackTop = 0, trackBottom = 0;
        if (slider.getOrientation() == JSlider.HORIZONTAL) {
            trackBottom = (trackRect.height - 1) - getThumbOverhang();
            trackTop = trackBottom - (getTrackWidth() - 1);
            trackRight = trackRect.width - 1;
        }
        else {
	    if (MetalUtils.isLeftToRight(slider)) {
	        trackLeft = (trackRect.width - getThumbOverhang()) - 
		                                         getTrackWidth();
		trackRight = (trackRect.width - getThumbOverhang()) - 1;
	    }
	    else {
	        trackLeft = getThumbOverhang();
		trackRight = getThumbOverhang() + getTrackWidth() - 1;
	    }
            trackBottom = trackRect.height - 1;
        }
        return new Rectangle(trackRect.x + trackLeft, trackRect.y + trackTop,
                             trackRight - trackLeft, trackBottom - trackTop);
    
protected intgetThumbOverhang()
Returns the amount that the thumb goes past the slide bar.

        return (int)(getThumbSize().getHeight()-getTrackWidth())/2;
    
protected java.awt.DimensiongetThumbSize()

        Dimension size = new Dimension();

        if ( slider.getOrientation() == JSlider.VERTICAL ) {
            size.width = getVertThumbIcon().getIconWidth();
            size.height = getVertThumbIcon().getIconHeight();
	}
	else {
            size.width = getHorizThumbIcon().getIconWidth();
            size.height = getHorizThumbIcon().getIconHeight();
	}

	return size;
    
public intgetTickLength()
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.

        return slider.getOrientation() == JSlider.HORIZONTAL ? tickLength + TICK_BUFFER + 1 :
        tickLength + TICK_BUFFER + 3;
    
protected intgetTrackLength()
Returns the longer dimension of the slide bar. (The slide bar is only the part that runs directly under the thumb)

   
        if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
            return trackRect.width; 
        }
        return trackRect.height;
    
protected intgetTrackWidth()
Returns the shorter dimension of the track.

        // This strange calculation is here to keep the
        // track in proportion to the thumb.
        final double kIdealTrackWidth = 7.0;
	final double kIdealThumbHeight = 16.0;
        final double kWidthScalar = kIdealTrackWidth / kIdealThumbHeight;

        if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
	    return (int)(kWidthScalar * thumbRect.height);
	}
	else {
	    return (int)(kWidthScalar * thumbRect.width);
	}
    
private static javax.swing.IcongetVertThumbIcon()

        if (System.getSecurityManager() != null) {
            return SAFE_VERT_THUMB_ICON;
        } else {
            return vertThumbIcon;
        }
    
public voidinstallUI(javax.swing.JComponent c)

        trackWidth = ((Integer)UIManager.get( "Slider.trackWidth" )).intValue();
        tickLength = ((Integer)UIManager.get( "Slider.majorTickLength" )).intValue();
        horizThumbIcon = SAFE_HORIZ_THUMB_ICON =
                UIManager.getIcon( "Slider.horizontalThumbIcon" );
        vertThumbIcon = SAFE_VERT_THUMB_ICON =
                UIManager.getIcon( "Slider.verticalThumbIcon" );

	super.installUI( c );

        thumbColor = UIManager.getColor("Slider.thumb");
        highlightColor = UIManager.getColor("Slider.highlight");
        darkShadowColor = UIManager.getColor("Slider.darkShadow");

        scrollListener.setScrollByBlock( false );

        Object sliderFillProp = c.getClientProperty( SLIDER_FILL );
        if ( sliderFillProp != null ) {
            filledSlider = ((Boolean)sliderFillProp).booleanValue();
        }
    
private voidoceanPaintTrack(java.awt.Graphics g)

	boolean leftToRight = MetalUtils.isLeftToRight(slider);
        boolean drawInverted = drawInverted();
        Color sliderAltTrackColor = (Color)UIManager.get(
                                    "Slider.altTrackColor");

        // Translate to the origin of the painting rectangle
        Rectangle paintRect = getPaintTrackRect();
        g.translate(paintRect.x, paintRect.y);

        // Width and height of the painting rectangle.
        int w = paintRect.width;
        int h = paintRect.height;

        if (!slider.isEnabled()) {
            g.setColor(MetalLookAndFeel.getControlShadow());
            g.drawRect(0, 0, w - 1, h - 1);
        }
	else if (slider.getOrientation() == JSlider.HORIZONTAL) {
            int middleOfThumb = thumbRect.x + (thumbRect.width / 2) -
                                paintRect.x;
            int fillMinX;
            int fillMaxX;

            if (middleOfThumb > 0) {
                g.setColor(chooseColor(drawInverted,
                           MetalLookAndFeel.getPrimaryControlDarkShadow(),
                           MetalLookAndFeel.getControlDarkShadow()));
               g.drawRect(0, 0, middleOfThumb - 1, h - 1);
            }
            if (middleOfThumb < w) {
                g.setColor(chooseColor(drawInverted,
                           MetalLookAndFeel.getControlDarkShadow(),
                           MetalLookAndFeel.getPrimaryControlDarkShadow()));
                g.drawRect(middleOfThumb, 0, w - middleOfThumb - 1, h - 1);
            }
            g.setColor(MetalLookAndFeel.getPrimaryControlShadow());
            if (drawInverted) {
                fillMinX = middleOfThumb;
                fillMaxX = w - 2;
                g.drawLine(1, 1, middleOfThumb, 1);
            }
            else {
                fillMinX = 1;
                fillMaxX = middleOfThumb;
                g.drawLine(middleOfThumb, 1, w - 1, 1);
            }
            if (h == 6) {
                g.setColor(MetalLookAndFeel.getWhite());
                g.drawLine(fillMinX, 1, fillMaxX, 1);
                g.setColor(sliderAltTrackColor);
                g.drawLine(fillMinX, 2, fillMaxX, 2);
                g.setColor(MetalLookAndFeel.getControlShadow());
                g.drawLine(fillMinX, 3, fillMaxX, 3);
                g.setColor(MetalLookAndFeel.getPrimaryControlShadow());
                g.drawLine(fillMinX, 4, fillMaxX, 4);
            }
        }
        else {
            int middleOfThumb = thumbRect.y + (thumbRect.height / 2) -
                                paintRect.y;
            int fillMinY;
            int fillMaxY;

            if (middleOfThumb > 0) {
                g.setColor(chooseColor(drawInverted,
                           MetalLookAndFeel.getControlDarkShadow(),
                           MetalLookAndFeel.getPrimaryControlDarkShadow()));
                g.drawRect(0, 0, w - 1, middleOfThumb - 1);
            }
            if (middleOfThumb < h) {
                g.setColor(chooseColor(drawInverted,
                           MetalLookAndFeel.getPrimaryControlDarkShadow(),
                           MetalLookAndFeel.getControlDarkShadow()));
                g.drawRect(0, middleOfThumb, w - 1, h - middleOfThumb - 1);
            }
            g.setColor(MetalLookAndFeel.getPrimaryControlShadow());
            if (drawInverted()) {
                fillMinY = 1;
                fillMaxY = middleOfThumb;
                if (leftToRight) {
                    g.drawLine(1, middleOfThumb, 1, h - 1);
                }
                else {
                    g.drawLine(w - 2, middleOfThumb, w - 2, h - 1);
                }
            }
            else {
                fillMinY = middleOfThumb;
                fillMaxY = h - 2;
                if (leftToRight) {
                    g.drawLine(1, 1, 1, middleOfThumb);
                }
                else {
                    g.drawLine(w - 2, 1, w - 2, middleOfThumb);
                }
            }
            if (w == 6) {
                g.setColor(chooseColor(!leftToRight,
                           MetalLookAndFeel.getWhite(),
                           MetalLookAndFeel.getPrimaryControlShadow()));
                g.drawLine(1, fillMinY, 1, fillMaxY);
                g.setColor(chooseColor(!leftToRight, sliderAltTrackColor,
                           MetalLookAndFeel.getControlShadow()));
                g.drawLine(2, fillMinY, 2, fillMaxY);
                g.setColor(chooseColor(!leftToRight,
                           MetalLookAndFeel.getControlShadow(),
                           sliderAltTrackColor));
                g.drawLine(3, fillMinY, 3, fillMaxY);
                g.setColor(chooseColor(!leftToRight,
                           MetalLookAndFeel.getPrimaryControlShadow(),
                           MetalLookAndFeel.getWhite()));
                g.drawLine(4, fillMinY, 4, fillMaxY);
            }
        }

        g.translate(-paintRect.x, -paintRect.y);
    
public voidpaintFocus(java.awt.Graphics g)

        
    
protected voidpaintMajorTickForHorizSlider(java.awt.Graphics g, java.awt.Rectangle tickBounds, int x)

        g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
        g.drawLine( x, TICK_BUFFER , x, TICK_BUFFER + (tickLength - 1) );
    
protected voidpaintMajorTickForVertSlider(java.awt.Graphics g, java.awt.Rectangle tickBounds, int y)

        g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );

	if (MetalUtils.isLeftToRight(slider)) {
	    g.drawLine( TICK_BUFFER, y, TICK_BUFFER + tickLength, y );
	}
	else {
	    g.drawLine( 0, y, tickLength, y );
	}
    
protected voidpaintMinorTickForHorizSlider(java.awt.Graphics g, java.awt.Rectangle tickBounds, int x)

        g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
        g.drawLine( x, TICK_BUFFER, x, TICK_BUFFER + (tickLength / 2) );
    
protected voidpaintMinorTickForVertSlider(java.awt.Graphics g, java.awt.Rectangle tickBounds, int y)

        g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );

	if (MetalUtils.isLeftToRight(slider)) {
	    g.drawLine( TICK_BUFFER, y, TICK_BUFFER + (tickLength / 2), y );
	}
	else {
	    g.drawLine( 0, y, tickLength/2, y );
	}
    
public voidpaintThumb(java.awt.Graphics g)

        Rectangle knobBounds = thumbRect;

        g.translate( knobBounds.x, knobBounds.y );

        if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
            getHorizThumbIcon().paintIcon( slider, g, 0, 0 );
        }
        else {
            getVertThumbIcon().paintIcon( slider, g, 0, 0 );
        }

        g.translate( -knobBounds.x, -knobBounds.y );
    
public voidpaintTrack(java.awt.Graphics g)

        if (MetalLookAndFeel.usingOcean()) {
            oceanPaintTrack(g);
            return;
        }
        Color trackColor = !slider.isEnabled() ? MetalLookAndFeel.getControlShadow() :
                           slider.getForeground();

	boolean leftToRight = MetalUtils.isLeftToRight(slider);

        g.translate( trackRect.x, trackRect.y );

        int trackLeft = 0;
        int trackTop = 0;
        int trackRight = 0;
        int trackBottom = 0;

        // Draw the track
	if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
            trackBottom = (trackRect.height - 1) - getThumbOverhang();
            trackTop = trackBottom - (getTrackWidth() - 1);
            trackRight = trackRect.width - 1;
	}
	else {
	    if (leftToRight) {
	        trackLeft = (trackRect.width - getThumbOverhang()) - 
		                                         getTrackWidth();
		trackRight = (trackRect.width - getThumbOverhang()) - 1;
	    }
	    else {
	        trackLeft = getThumbOverhang();
		trackRight = getThumbOverhang() + getTrackWidth() - 1;
	    }
            trackBottom = trackRect.height - 1;
	}

	if ( slider.isEnabled() ) {
	    g.setColor( MetalLookAndFeel.getControlDarkShadow() );
	    g.drawRect( trackLeft, trackTop,
			(trackRight - trackLeft) - 1, (trackBottom - trackTop) - 1 );
	    
	    g.setColor( MetalLookAndFeel.getControlHighlight() );
	    g.drawLine( trackLeft + 1, trackBottom, trackRight, trackBottom );
	    g.drawLine( trackRight, trackTop + 1, trackRight, trackBottom );

	    g.setColor( MetalLookAndFeel.getControlShadow() );
	    g.drawLine( trackLeft + 1, trackTop + 1, trackRight - 2, trackTop + 1 );
	    g.drawLine( trackLeft + 1, trackTop + 1, trackLeft + 1, trackBottom - 2 );
	}
	else {
	    g.setColor( MetalLookAndFeel.getControlShadow() );
	    g.drawRect( trackLeft, trackTop,
			(trackRight - trackLeft) - 1, (trackBottom - trackTop) - 1 );
	}

        // Draw the fill
	if ( filledSlider ) {
	    int middleOfThumb = 0;
	    int fillTop = 0;
	    int fillLeft = 0;
	    int fillBottom = 0;
	    int fillRight = 0;

	    if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
	        middleOfThumb = thumbRect.x + (thumbRect.width / 2);
		middleOfThumb -= trackRect.x; // To compensate for the g.translate()
		fillTop = !slider.isEnabled() ? trackTop : trackTop + 1;
		fillBottom = !slider.isEnabled() ? trackBottom - 1 : trackBottom - 2;
		
		if ( !drawInverted() ) {
		    fillLeft = !slider.isEnabled() ? trackLeft : trackLeft + 1;
		    fillRight = middleOfThumb;
		}
		else {
		    fillLeft = middleOfThumb;
		    fillRight = !slider.isEnabled() ? trackRight - 1 : trackRight - 2;
		}
	    }
	    else {
	        middleOfThumb = thumbRect.y + (thumbRect.height / 2);
		middleOfThumb -= trackRect.y; // To compensate for the g.translate()
		fillLeft = !slider.isEnabled() ? trackLeft : trackLeft + 1;
		fillRight = !slider.isEnabled() ? trackRight - 1 : trackRight - 2;
		
		if ( !drawInverted() ) {
		    fillTop = middleOfThumb;
		    fillBottom = !slider.isEnabled() ? trackBottom - 1 : trackBottom - 2;
		}
		else {
		    fillTop = !slider.isEnabled() ? trackTop : trackTop + 1;
		    fillBottom = middleOfThumb;
		}
	    }
	    
	    if ( slider.isEnabled() ) {
	        g.setColor( slider.getBackground() );
		g.drawLine( fillLeft, fillTop, fillRight, fillTop );
		g.drawLine( fillLeft, fillTop, fillLeft, fillBottom );

		g.setColor( MetalLookAndFeel.getControlShadow() );
		g.fillRect( fillLeft + 1, fillTop + 1,
			    fillRight - fillLeft, fillBottom - fillTop );
	    }
	    else {
	        g.setColor( MetalLookAndFeel.getControlShadow() );
		g.fillRect( fillLeft, fillTop,
			    fillRight - fillLeft, trackBottom - trackTop );
	    }
	}

        g.translate( -trackRect.x, -trackRect.y );
    
protected voidscrollDueToClickInTrack(int dir)

        scrollByUnit( dir );