org.openide.awt.SpinButton Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.openide.awt;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Vector;
/**
* A class that produces a Spin Button.
*
*
* properties of SpinButton
* Property Property Type Description
* Orientation boolean Orientation of SpinButton (Left-right or Up-down)
* Minimum int Minimum value.
* Maximum int Maximum value.
* Step int Step.
* Value int Current value.
* RepeatDelay int Delay time after press SpinButton [ms]
* RepeatRate int Repeat rate while holding PressButton [ms]
*
*
* @deprecated Obsoleted by javax.swing.JSpinner
in JDK 1.4
* @version 3.06, November 17, 1997
* @author Petr Hamernik, Jan Jancura
*/
@Deprecated
public class SpinButton extends Canvas {
/** generated Serialized Version UID */
static final long serialVersionUID = -3525959415481788776L;
/** Default orientation of SpinButton. Currently false (UP-DOWN).
* @see #DEFAULT_ORIENTATION
* @see #setOrientation
* @see #getOrientation
*/
public static final boolean DEFAULT_ORIENTATION = false;
/** Default minimum. Currently 0.
* @see #minimum
* @see #setMinimum
* @see #getMinimum
*/
public static final int DEFAULT_MINIMUM = 0;
/** Default maximum. Currently 100.
* @see #maximum
* @see #setMaximum
* @see #getMaximum
*/
public static final int DEFAULT_MAXIMUM = 100;
/** Default step. Currently 1.
* @see #step
* @see #setStep
* @see #getStep
*/
public static final int DEFAULT_STEP = 1;
/** Default value of repeatDelay. Currently 300 ms.
* @see #setDelay
* @see #getDelay
* @see #repeatDelay
*/
public static final int DEFAULT_REPEAT_DELAY = 300;
/** Default value of repeatRate. Currently 70 ms.
* @see #setRate
* @see #getRate
* @see #repeatRate
*/
public static final int DEFAULT_REPEAT_RATE = 70;
/** Helper constant */
private static final boolean SPIN_UP = true;
/** Helper constant */
private static final boolean SPIN_DOWN = false;
/** Current orientation of SpinButton.
* True = LEFT-RIGHT, False = UP-DOWN
* @see #DEFAULT_ORIENTATION
* @see #setOrientation
* @see #getOrientation
*/
protected boolean orientation = DEFAULT_ORIENTATION;
/** Current orientation of arrows of SpinButton.
* True = LEFT-RIGHT, False = UP-DOWN
* @see #DEFAULT_ORIENTATION
* @see #setOrientation
* @see #getOrientation
*/
protected boolean arrowsOrientation = DEFAULT_ORIENTATION;
/** Minimum of the range of the SpinButton.
* @see #DEFAULT_MINIMUM
* @see #setMinimum
* @see #getMinimum
*/
protected int minimum = DEFAULT_MINIMUM;
/** Maximum of the range of the SpinButton.
* @see #DEFAULT_MAXIMUM
* @see #setMaximum
* @see #getMaximum
*/
protected int maximum = DEFAULT_MAXIMUM;
/** Step of the SpinButton.
* @see #DEFAULT_STEP
* @see #setStep
* @see #getStep
*/
protected int step = DEFAULT_STEP;
/** Value of the SpinButton. Default 0.
* @see #setValue
* @see #getValue
*/
protected int value = 0;
/** Adjusts the amount of time that elapses before a increment
* (or decrement) begins repeating when you hold down a mouse
* button. [ms]
* @see #setDelay
* @see #getDelay
* @see #DEFAULT_REPEAT_DELAY
*/
protected int repeatDelay = DEFAULT_REPEAT_DELAY;
/** Adjusts the speed at which a increment (or decrement)
* repeats when you hold down a mouse button. [ms]
* @see #setRate
* @see #getRate
* @see #DEFAULT_REPEAT_RATE
*/
protected int repeatRate = DEFAULT_REPEAT_RATE;
/** Spin repeat thread. When the SpinButton is holded this thread
* runs and regulary sends the events to SpinButton.
*/
protected RepeatThread rt = null;
/** Flag if the SpinRepeatThread is currently running. */
protected boolean running = false;
/** Flag if the SpinRepeatThread is currently running. */
protected boolean repeating = true;
/** Current direction of the run of the SpinRepeatThread. */
protected boolean runningDir = SPIN_DOWN;
protected boolean boundsIgnored = false;
/** Property change listeners storage */
private PropertyChangeSupport valueSupport = new PropertyChangeSupport(this);
/** SpinButton change listeners storage */
private Vector spinButtonListeners = new Vector(3, 3);
/** Create new SpinButton. */
public SpinButton() {
setBackground(SystemColor.control);
setForeground(SystemColor.controlText);
addMouseListener(
new MouseAdapter() {
public @Override void mousePressed(MouseEvent evt) {
Dimension d = getSize();
boolean newDir = SPIN_UP;
if (orientation) {
if (evt.getX() <= ((d.width - 1) / 2)) {
newDir = SPIN_DOWN;
} else {
newDir = SPIN_UP;
}
} else {
if (evt.getY() <= ((d.height - 1) / 2)) {
newDir = SPIN_UP;
} else {
newDir = SPIN_DOWN;
}
}
if (
(((newDir == SPIN_UP) && (value >= maximum)) || ((newDir == SPIN_DOWN) && (value <= minimum))) &&
!boundsIgnored
) {
return;
}
switchRun(newDir);
repaint();
}
public @Override void mouseReleased(MouseEvent evt) {
boolean r = running;
switchStop();
if (r) {
repaint();
}
}
}
);
}
/**
* Setter method for foreground color.
*
* @param color New foreground color.
*/
public @Override void setForeground(Color color) {
super.setForeground(color);
repaint();
}
/** Sets the new orientation.
* @param aDir new value of orientation.
* @see #orientation
* @see #DEFAULT_ORIENTATION
* @see #getOrientation
*/
public void setOrientation(boolean aDir) {
orientation = aDir;
switchStop();
repaint();
}
/** Sets the new orientation of arows.
* @param aDir new value of orientation of arows.
* @see #orientation
* @see #DEFAULT_ORIENTATION
* @see #getOrientation
*/
public void setArrowsOrientation(boolean aDir) {
arrowsOrientation = aDir;
switchStop();
repaint();
}
/** Gets the current orientation of SpinButton.
* @return value of orientation.
* @see #orientation
* @see #DEFAULT_ORIENTATION
* @see #setOrientation
*/
public boolean getOrientation() {
return orientation;
}
/** Gets the current orientation of Arrows of SpinButton.
* @return value of orientation of Arrows.
* @see #orientation
* @see #DEFAULT_ORIENTATION
* @see #setOrientation
*/
public boolean getArrowsOrientation() {
return arrowsOrientation;
}
/** Sets a minimum of the range of the SpinButton. If value
* or maximum fall out of acceptable values they are adjusted.
* @param aMin New minimum.
* @see #getMinimum
*/
public void setMinimum(int aMin) {
minimum = aMin;
if (maximum < minimum) {
maximum = minimum;
}
if (value < minimum) {
setValue(value);
}
switchStop();
repaint();
}
/** Gets the current minimum of the range of SpinButton.
* @return Minimum.
* @see #setMinimum
*/
public int getMinimum() {
return minimum;
}
/** Sets a maximum of the range of the SpinButton. If value
* or minimum fall out of acceptable values they are adjusted.
* @param aMax New maximum.
* @see #getMinimum
*/
public void setMaximum(int aMax) {
maximum = aMax;
if (maximum < minimum) {
minimum = maximum;
}
if (value > maximum) {
setValue(value);
}
switchStop();
repaint();
}
/** Gets the current maximum of the range of SpinButton.
* @return Maximum.
* @see #setMaximum
*/
public int getMaximum() {
return maximum;
}
/** Sets a new value of the SpinButton. If value is outside
* the ranges it is set to nearest acceptable value.
* @param aValue New value.
* @see #getValue
*/
public void setValue(int aValue) {
int oldValue = value;
value = aValue;
if (!boundsIgnored) {
if (value < minimum) {
value = minimum;
}
if (value > maximum) {
value = maximum;
}
}
if (value != oldValue) {
valueSupport.firePropertyChange("value", new Integer(oldValue), new Integer(value)); // NOI18N
}
if ((getValue() == minimum) || (getValue() == maximum) || (oldValue == minimum) || (oldValue == maximum)) {
repaint();
}
}
/** Gets the current value of the SpinButton.
* @return Value.
* @see #setValue
*/
public int getValue() {
return value;
}
/** Sets a new step of the SpinButton.
* @param aStep New step.
* @see #getStep
*/
public void setStep(int aStep) {
step = aStep;
switchStop();
repaint();
}
/** Gets the current step of the SpinButton.
* @return Step.
* @see #setStep
*/
public int getStep() {
return step;
}
/** Sets new value of repeatDelay variable.
* @param aDelay New delay.
* @see #repeatDelay
* @see #getDelay
*/
public void setDelay(int aDelay) {
repeatDelay = aDelay;
switchStop();
repaint();
}
/** Gets the current value of repeatDelay variable.
* @return Delay.
* @see #repeatDelay
* @see #setDelay
*/
public int getDelay() {
return repeatDelay;
}
/** Sets new value of repeatRate variable.
* @param aRate New rate.
* @see #repeatRate
* @see #getRate
*/
public void setRate(int aRate) {
repeatRate = aRate;
switchStop();
repaint();
}
/** Gets the current value of rate variable.
* @return Rate.
* @see #repeatRate
* @see #setRate
*/
public int getRate() {
return repeatRate;
}
public boolean isBoundsIgnored() {
return boundsIgnored;
}
public void setBoundsIgnored(boolean ignored) {
boundsIgnored = ignored;
}
public boolean isRepeating() {
return repeating;
}
public void setRepeating(boolean aRepeating) {
repeating = aRepeating;
}
public @Override void paint(Graphics g) {
Dimension d = getSize();
int left = 0;
int top = 0;
int w = d.width - 1;
int h = d.height - 1;
g.setColor(getBackground());
g.fillRect(left, top, w, h);
if (orientation) {
w = w / 2;
paintBorder(g, left, top, w, h, running && (runningDir == SPIN_DOWN), SPIN_DOWN);
left += (w + 1);
w = d.width - 1 - left;
paintBorder(g, left, top, w, h, running && (runningDir == SPIN_UP), SPIN_UP);
} else {
h = h / 2;
paintBorder(g, left, top, w, h, running && (runningDir == SPIN_UP), SPIN_UP);
top += (h + 1);
h = d.height - 1 - top;
paintBorder(g, left, top, w, h, running && (runningDir == SPIN_DOWN), SPIN_DOWN);
}
}
private void paintBorder(Graphics g, int x, int y, int w, int h, boolean isDown, boolean aDir) {
g.setColor(Color.black);
if (!isDown) {
g.drawLine(x, y + h, x + w, y + h);
g.drawLine(x + w, y, x + w, y + h);
} else {
g.drawLine(x, y, x + w, y);
g.drawLine(x, y, x, y + h);
x++;
y++;
}
w--;
h--;
g.setColor(SystemColor.controlHighlight);
g.draw3DRect(x, y, w, h, !isDown);
paintArrow(g, x, y, w, h, aDir);
}
private void paintArrow(Graphics g, int x, int y, int w, int h, boolean aDir) {
if ((w <= 0) || (h <= 0)) {
return;
}
int wd = w / 4;
int hd = h / 4;
int[] xP = new int[3];
int[] yP = new int[3];
if (arrowsOrientation) {
if (aDir == SPIN_UP) {
xP[0] = x + wd;
xP[2] = (x + w) - wd;
} else {
xP[0] = (x + w) - wd;
xP[2] = x + wd;
}
xP[1] = xP[0];
yP[0] = y + hd;
yP[1] = (y + h) - hd;
yP[2] = y + (h / 2);
} else {
if (aDir == SPIN_UP) {
yP[0] = (y + h) - hd;
yP[2] = y + hd;
} else {
yP[0] = y + hd;
yP[2] = (y + h) - hd;
}
yP[1] = yP[0];
xP[0] = x + wd;
xP[1] = (x + w) - wd;
xP[2] = x + (w / 2);
}
if (
(((aDir == SPIN_UP) && (value >= maximum)) || ((aDir == SPIN_DOWN) && (value <= minimum))) &&
!boundsIgnored
) {
Color fg = getForeground();
Color bg = getBackground();
g.setColor(
new Color(
(fg.getRed() + (2 * bg.getRed())) / 3, (fg.getGreen() + (2 * bg.getGreen())) / 3,
(fg.getBlue() + (2 * bg.getBlue())) / 3
)
);
} else {
g.setColor(getForeground());
}
g.fillPolygon(xP, yP, 3);
}
protected synchronized void switchRun(boolean aDirect) {
if (running) {
rt.finish = true;
}
rt = new RepeatThread();
rt.start();
runningDir = aDirect;
running = true;
}
public synchronized void switchStop() {
if (rt == null) {
return;
}
rt.finish = true;
running = false;
}
public @Override Dimension getMinimumSize() {
return countSize();
}
public @Override Dimension getPreferredSize() {
return countSize();
}
private Dimension countSize() {
int x = 11;
int y = x;
if (orientation) {
x = x + x;
} else {
y = y + y;
}
return new Dimension(x, y);
}
public @Override void addPropertyChangeListener(PropertyChangeListener l) {
valueSupport.addPropertyChangeListener(l);
}
public @Override void removePropertyChangeListener(PropertyChangeListener l) {
valueSupport.removePropertyChangeListener(l);
}
public void addSpinButtonListener(SpinButtonListener spinButtonListener) {
spinButtonListeners.addElement(spinButtonListener);
}
public void removeSpinButtonListener(SpinButtonListener spinButtonListener) {
spinButtonListeners.removeElement(spinButtonListener);
}
public void notifySpinButtonListenersAboutUpMove() {
int i;
int k = spinButtonListeners.size();
for (i = 0; i < k; i++)
spinButtonListeners.elementAt(i).moveUp();
}
public void notifySpinButtonListenersAboutDownMove() {
int i;
int k = spinButtonListeners.size();
for (i = 0; i < k; i++)
spinButtonListeners.elementAt(i).moveDown();
}
protected void repeatThreadNotify() {
int old_val = getValue();
if (runningDir) {
setValue(getValue() + step);
if (value != old_val) {
notifySpinButtonListenersAboutUpMove();
}
} else {
setValue(getValue() - step);
if (value != old_val) {
notifySpinButtonListenersAboutDownMove();
}
}
if ((getValue() == old_val) && !boundsIgnored) {
switchStop();
repaint();
}
}
/** @deprecated Made visible only because it was (by mistake)
* visible from public signatures. No need to use it.
* @since 7.0
*/
@Deprecated
protected final class RepeatThread extends Thread {
boolean finish = false;
RepeatThread() {
finish = false;
}
@Override
public void run() {
repeatThreadNotify();
try {
sleep(repeatDelay);
} catch (InterruptedException e) {
}
if (!repeating) {
return;
}
while (true) {
if (finish) {
break;
}
repeatThreadNotify();
if (finish) {
break;
}
try {
sleep(repeatRate);
} catch (InterruptedException e) {
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy