/**
*
*/
package uk.ac.lkl.migen.system.expresser.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.ref.WeakReference;
import javax.swing.Timer;
import uk.ac.lkl.common.util.value.IntegerValue;
import uk.ac.lkl.migen.system.MiGenConfiguration;
import uk.ac.lkl.migen.system.expresser.model.tiednumber.TiedNumberExpression;
/**
* The timer that causes task variables to repeated change values
*
* @author Ken Kahn
*
*/
public class TiedNumberTimer extends Timer {
// if Integer.MIN_VALUE then a small random amount
final static public int RANDOM_STEP = Integer.MIN_VALUE;
protected int stepAmount = RANDOM_STEP;
// valueAtStart is where the value of the tied number is saved
// so that when the animation stops its original value is restored
// for stepping this should be null
// protected IntegerValue valueAtStart = null;
protected WeakReference<TiedNumberExpression<?>> tiedNumberWeakReference;
public TiedNumberTimer(WeakReference<TiedNumberExpression<?>> tiedNumberWeakReference) {
super(MiGenConfiguration.getTiedNumberPlayDelay(),null);
this.tiedNumberWeakReference = tiedNumberWeakReference;
ActionListener actionListener = new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(ActionEvent e) {
TiedNumberExpression<IntegerValue> tiedNumber =
(TiedNumberExpression<IntegerValue>) TiedNumberTimer.this.tiedNumberWeakReference.get();
if (tiedNumber == null || tiedNumber.isLocked()) {
return;
}
int currentValue = ((IntegerValue) tiedNumber.getValue()).getInt();
int delta;
final int maximum = 10;
final int minimum = 1;
if (stepAmount == RANDOM_STEP) {
final int deltas[] = {-3, -2, -1, 1, 2, 3};
double random_double_less_than_6 = Math.random()*6;
delta = deltas[(int) random_double_less_than_6];
if (currentValue + delta > maximum) {
delta = -delta;
} else if (currentValue + delta < minimum) {
delta = -delta;
}
} else {
if (currentValue + stepAmount > maximum) {
stepAmount = -stepAmount;
} else if (currentValue + stepAmount < minimum) {
stepAmount = -stepAmount;
}
delta = stepAmount;
}
tiedNumber.setValue(new IntegerValue(currentValue + delta));
}
};
addActionListener(actionListener);
}
@SuppressWarnings("unchecked")
@Override
public void start() {
TiedNumberExpression<IntegerValue> tiedNumber =
(TiedNumberExpression<IntegerValue>) tiedNumberWeakReference.get();
if (tiedNumber == null) {
return;
}
// valueAtStart = tiedNumber.getValue();
super.start();
}
@SuppressWarnings("unchecked")
@Override
public void stop() {
super.stop();
TiedNumberExpression<IntegerValue> tiedNumber =
(TiedNumberExpression<IntegerValue>) tiedNumberWeakReference.get();
if (tiedNumber == null) {
return;
}
// if (valueAtStart != null) {
// tiedNumber.setValue(valueAtStart);
// valueAtStart = null;
// }
}
public int getStepAmount() {
return stepAmount;
}
public void setStepAmount(int stepAmount) {
this.stepAmount = stepAmount;
}
@Override
// need to make this public
public void fireActionPerformed(ActionEvent e) {
super.fireActionPerformed(e);
}
}
|