/*
* @(#)Slider.java 1.4 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.ui;
import com.sun.media.controls.*;
import java.awt.*;
import java.awt.event.*;
import com.sun.media.util.*;
public class Slider extends BasicComp
implements MouseListener, MouseMotionListener {
Image imageGrabber;
Image imageGrabberX;
Image imageGrabberDown;
Graphics paintG = null;
boolean grabbed;
boolean entered;
int grabberPosition;
int leftBorder = 8;
int rightBorder = 8;
int sliderWidth;
int width, height;
int displayPercent;
float detents[];
Dimension dimension;
float lower = 0.0f, upper = 1.0f, range = 1.0f, value = 0.5f;
boolean dragging = false;
boolean grabberVisible = true;
public Slider() {
this(null, null);
}
public Slider(float detents[]) {
this(detents, null);
}
public Slider(float detents[], Color background) {
super("Slider");
imageGrabber = fetchImage("grabber.gif");
imageGrabberDown = fetchImage("grabber-pressed.gif");
imageGrabberX = fetchImage("grabber-disabled.gif");
this.detents = detents;
if (background != null) {
setBackground(background);
}
width = 115;
height = 18;
displayPercent = 100;
dimension = new Dimension(width, height);
sliderWidth = width - leftBorder - rightBorder;
setSize(width, height);
setVisible(true);
grabbed = false;
entered = false;
addMouseListener( this );
addMouseMotionListener( this );
}
public void setEnabled(boolean state) {
super.setEnabled(state);
repaint();
}
public Point getPosition() {
return new Point(grabberPosition + leftBorder, 10);
}
public void setDisplayPercent(int percent) {
if (percent != displayPercent) {
displayPercent = percent;
if (displayPercent > 100) {
displayPercent = 100;
} else if (displayPercent < 0) {
displayPercent = 0;
}
repaint();
}
}
public boolean isGrabberVisible() {
return grabberVisible;
}
public void setGrabberVisible(boolean visible) {
if (grabberVisible != visible) {
grabberVisible = visible;
repaint();
}
}
public void paint(Graphics g) {
Dimension size = getSize();
int x;
int y = (size.height / 2) - 2;
paintG = g;
int grabberX = grabberPosition + leftBorder - 5;
// Draw the trough
g.setColor( getBackground().darker() );
g.drawRect (leftBorder, y, sliderWidth, 3);
g.setColor(getBackground());
g.draw3DRect(leftBorder, y, (int)(sliderWidth * displayPercent / 100), 3, false);
// Draw the marks for detents
if (detents != null && detents.length != 0) {
paintG.setColor(Color.black);
for (int i = 0; i < detents.length; i++) {
x = leftBorder + (int)(detents[i] * sliderWidth / range);
paintG.drawLine(x, 12, x, 15);
}
}
// Draw the grabber
if (grabberVisible) {
Image image;
if (isEnabled()) {
if (grabbed || entered)
image = imageGrabberDown;
else
image = imageGrabber;
} else {
image = imageGrabberX;
}
paintG.drawImage(image, grabberX, 4, this);
}
}
private int limitGrabber(int mousex) {
int x = mousex - leftBorder;
if (x < 0)
x = 0;
else if (x > sliderWidth)
x = sliderWidth;
return x;
}
private void setSliderPosition(float value, float range) {
grabberPosition = (int) ( value / range * sliderWidth);
}
private void seek() {
if (control != null && control instanceof NumericControl) {
NumericControl nc = (NumericControl) control;
float lower = nc.getLowerLimit();
float upper = nc.getUpperLimit();
float value = ((float)grabberPosition/sliderWidth) * (upper - lower)
+ lower;
if (detents != null && detents.length > 0 && dragging) {
float tolerance = (upper - lower) * 0.05f;
for (int i = 0; i < detents.length; i++) {
if (Math.abs(detents[i] - value) <= tolerance)
value = detents[i];
}
}
float result = nc.setValue(value);
if (value != result)
setSliderPosition(result - lower, upper - lower);
}
repaint();
}
/*************************************************************************
* MouseListener methods
*************************************************************************/
public void mousePressed(MouseEvent me) {
int modifier = me.getModifiers();
if ((modifier & InputEvent.BUTTON2_MASK) == 0 &&
(modifier & InputEvent.BUTTON3_MASK) == 0 ) {
if (isEnabled()) {
dragging = false;
grabbed = true;
grabberPosition = limitGrabber(me.getX());
seek();
}
}
}
public void mouseReleased(MouseEvent me) {
int modifier = me.getModifiers();
if ((modifier & InputEvent.BUTTON2_MASK) == 0 &&
(modifier & InputEvent.BUTTON3_MASK) == 0 ) {
if (isEnabled()) {
dragging = false;
grabbed = false;
repaint();
}
}
}
public void mouseDragged(MouseEvent me) {
int modifier = me.getModifiers();
if ((modifier & InputEvent.BUTTON2_MASK) == 0 &&
(modifier & InputEvent.BUTTON3_MASK) == 0 ) {
if (isEnabled()) {
dragging = true;
grabberPosition = limitGrabber(me.getX());
seek();
}
}
}
public void mouseEntered(MouseEvent me) {
entered = true;
repaint();
}
public void mouseExited(MouseEvent me) {
entered = false;
repaint();
}
public void mouseClicked(MouseEvent me) { }
public void mouseMoved(MouseEvent me) { }
/*************************************************************************
* Component methods
*************************************************************************/
public void setSize(int width, int height) {
super.setSize(width, height);
paintG = null;
repaint();
}
public Dimension getPreferredSize() {
return dimension;
}
}
|