/* * @(#)Scroll.java 1.2 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.ui; import java.awt.*; import java.awt.event.*; public class Scroll extends Component 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; ActionListener actionListener = null; public Scroll() { this(null, null); } public Scroll(float detents[]) { this(detents, null); } public Scroll(float detents[], Color background) { imageGrabber = BasicComp.fetchImage("grabber.gif"); imageGrabberDown = BasicComp.fetchImage("grabber-pressed.gif"); imageGrabberX = BasicComp.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 setActionListener(ActionListener al) { actionListener = al; } public void setValue(float value) { lower = 0.0f; upper = 1.0f; range = upper - lower; setSliderPosition(value - lower, range); repaint(); } public float getValue() { return value; } 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 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()); y = (getSize().height / 2) - 2; g.draw3DRect(2, y, size.width - 4, 3, false); // Draw the display in the trough if (displayPercent < 100) { g.setColor(Color.green); x = sliderWidth * displayPercent / 100 + 3; y += 2; g.drawLine(x, y, size.width - 4, y); } // 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() { value = ((float)grabberPosition/sliderWidth); if (detents != null && detents.length > 0 && dragging) { float tolerance = 0.05f; for (int i = 0; i < detents.length; i++) { if (Math.abs(detents[i] - value) <= tolerance) value = detents[i]; } } repaint(); if (actionListener != null) actionListener.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "scroll")); } /************************************************************************* * 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; } }