// Slider - a slider widget // // This code is freely usable for any purpose. package Acme.Widgets; import java.awt.*; /// A slider widget. //

// A slider is a widget that varies between a minimum and a maximum // value. The user can drag a "thumb" to change the current value. As // the slider is dragged, Motion() is called. When the slider is // released, Release() is called. Override these two methods to give // the slider behavior. //

// This is (strongly) based on a version by // Adam Doppelt. //

// Fetch the software.
// Fetch the entire Acme package. public class Slider extends Canvas { private static final int THUMB_SIZE = 14; private static final int BUFFER = 2; private static final int TEXT_HEIGHT = 15; private static final int TEXT_BUFFER = 3; private static final int DEFAULT_WIDTH = 100; private static final int DEFAULT_HEIGHT = 15; private static final int MIN_WIDTH = 2 * ( THUMB_SIZE + BUFFER + 1 ); private static final int MIN_HEIGHT = 2 * ( BUFFER + 1 ); private static final int DEFAULT_MIN = 1; private static final int DEFAULT_MAX = 100; int value, valueMin, valueMax; int pixel, pixelMin, pixelMax; Color barColor, thumbColor, lineColor, textColor; /// Constructor, all default values. public Slider() { setDefaults(); } /// Constructor, some specified values. public Slider( int valueMin, int valueMax ) { setDefaults(); setMinimum( valueMin ); setMaximum( valueMax ); setValue( valueMin ); } /// Constructor, some specified values. public Slider( int valueMin, int valueMax, int width ) { setDefaults(); setMinimum( valueMin ); setMaximum( valueMax ); setValue( valueMin ); setWidth( width ); } private void setDefaults() { valueMin = DEFAULT_MIN; valueMax = DEFAULT_MAX; thumbColor = getBackground(); if ( thumbColor == null ) thumbColor = Color.lightGray; barColor = thumbColor.darker(); textColor = getForeground(); if ( textColor == null ) textColor = Color.black; lineColor = textColor; resize( DEFAULT_WIDTH, DEFAULT_HEIGHT + TEXT_HEIGHT ); // setSize( DEFAULT_WIDTH, DEFAULT_HEIGHT + TEXT_HEIGHT ); setValue( valueMin ); } /// This method is called when the "thumb" of the slider is moved by // the user. May be overridden to give the slider some behavior. public void motion() { } /// This method is called when the "thumb" of the slider is released // after being moved. May be overridden to give the slider some behavior. public void release() { } /// Sets the maximum value for the slider. // @param num The new maximum. public void setMaximum( int num ) { valueMax = num; if ( valueMin > valueMax ) valueMin = valueMax; setValue( value ); } /// Sets the minimum value for the slider. // @param num The new minimum. public void setMinimum( int num ) { valueMin = num; if ( valueMax < valueMin ) valueMax = valueMin; setValue( value ); } /// Sets the current value for the slider. The thumb will move to // reflect the new setting. // @param num The new setting for the slider. public void setValue( int num ) { value = num; if ( value < valueMin ) value = valueMin; else if ( value > valueMax ) value = valueMax; if ( value != valueMin ) pixel = (int) ( Math.round( Math.abs( (double) ( value - valueMin ) / (double) ( valueMax - valueMin ) ) * (double) ( pixelMax - pixelMin ) ) + pixelMin ); else pixel = pixelMin; repaint(); } /// Sets the height of the slider. This is the height of the entire // slider canvas, including space reserved for displaying the // current value. // @param num The new height. public void setHeight( int num ) { if ( num < MIN_HEIGHT + TEXT_HEIGHT ) num = MIN_HEIGHT + TEXT_HEIGHT; resize( size().width, num ); // setSize( getSize().width, num ); repaint(); } /// Sets the width of the slider. This is the width of the actual // slider box. // @param num The new width. public void setWidth( int num ) { if ( num < MIN_WIDTH ) num = MIN_WIDTH; resize( num, size().height ); // setSize( num, getSize().height ); repaint(); } /// Sets the color for the slider's bar. The "bar" is the rectangle // that the thumb slides around in. // @param color The new bar color. public void setBarColor( Color color ) { barColor = color; repaint(); } /// Sets the color for the slider's thumb. The "thumb" is the box that // the user can slide back and forth. // @param color The new thumb color. public void setThumbColor( Color color ) { thumbColor = color; repaint(); } /// Sets the line color for the slider - the little vertical line // on the thumb. // @param color The new line color. public void setLineColor( Color color ) { lineColor = color; repaint(); } /// Sets the color for the slider`s text. // @param color The new text color. public void setTextColor( Color color ) { textColor = color; repaint(); } /// Returns the current value for the slider. // @return The current value for the slider. public int getValue() { return value; } public void paint( Graphics g ) { int width = size().width; // int width = getSize().width; int height = size().height; // int height = getSize().height; g.setColor( barColor ); g.fill3DRect( 0, TEXT_HEIGHT, width, height - TEXT_HEIGHT, false ); g.setColor( thumbColor ); g.fill3DRect( pixel - THUMB_SIZE, TEXT_HEIGHT + BUFFER, THUMB_SIZE * 2 + 1, height - 2 * BUFFER - TEXT_HEIGHT, true ); g.setColor( lineColor ); g.drawLine( pixel, TEXT_HEIGHT + BUFFER + 1, pixel, height - 2 * BUFFER ); g.setColor( textColor ); String str = String.valueOf( value ); int strWidth = getFontMetrics( g.getFont() ).stringWidth( str ); g.drawString( str, pixel - strWidth / 2, TEXT_HEIGHT - TEXT_BUFFER ); } public void setBounds( int x, int y, int width, int height ) { super.setBounds( x, y, width, height ); pixelMin = THUMB_SIZE + BUFFER; pixelMax = width - THUMB_SIZE - BUFFER - 1; if ( value != valueMin ) pixel = (int) ( Math.round( Math.abs( (double) ( value - valueMin ) / (double) ( valueMax - valueMin ) ) * (double) ( pixelMax - pixelMin ) ) + pixelMin ); else pixel = pixelMin; } public boolean mouseDown( Event e, int x, int y ) { if ( x >= pixel - THUMB_SIZE && x <= pixel + THUMB_SIZE ) { if ( x < pixel ) setValue( value - 1 ); else if ( x > pixel ) setValue( value + 1 ); } else mouseAction( x ); motion(); return true; } public boolean mouseDrag( Event e, int x, int y ) { mouseAction( x ); motion(); return true; } public boolean mouseUp( Event e, int x, int y ) { release(); return true; } private void mouseAction( int x ) { double percent; pixel = Math.min( Math.max( x, pixelMin ), pixelMax ); if ( pixel != pixelMin ) percent = ( (double) pixel - pixelMin ) / ( pixelMax - pixelMin ); else percent = 0; value = (int) ( Math.round( percent * (double) ( valueMax - valueMin ) ) ) + valueMin; repaint(); } }