package hep.aida.ref.pdf;
import java.util.ArrayList;
import org.freehep.util.Value;
/**
* The base class for a Variable object.
* Variables can be dependent, parameters and Functions.
*
* @author The FreeHEP team @ SLAC.
*
*/
public abstract class Variable implements HasName, HasValue, HasUnits {
public static int FUNCTION = 0;
public static int DEPENDENT = 1;
public static int PARAMETER = 2;
static int NAME_CHANGING = 0;
static int NAME_CHANGED = 1;
static int UNITS_CHANGING = 2;
static int UNITS_CHANGED = 3;
static int VALUE_CHANGING = 4;
static int VALUE_CHANGED = 5;
static int RANGE_CHANGED = 6;
private String name;
private Units units;
private int type;
private Value v = new Value();
private ArrayList listeners = new ArrayList();
public Variable(String name, int type) {
this(name, type, "");
}
public Variable(String name, int type, String units) {
this(name, type, new Units(units) );
}
public Variable(String name, int type, Units units) {
if ( type != FUNCTION && type != DEPENDENT && type != PARAMETER )
throw new IllegalArgumentException("Unknown type "+type);
this.type = type;
setName(name);
setUnits(units);
}
public void addVariableListener(VariableListener listener) {
listeners.add(listener);
}
public void removeVariableListener(VariableListener listener) {
listeners.remove(listener);
}
public int type() {
return type;
}
public String name() {
return name;
}
public void setName(String name) {
if ( notifyVariableChanging(NAME_CHANGING, name) ) {
this.name = name;
notifyVariableChanged(NAME_CHANGED);
}
else
throw new IllegalArgumentException("Cannot change the variable name to "+name);
}
public Units units() {
return units;
}
public void setUnits(Units units) {
if ( notifyVariableChanging(UNITS_CHANGING, units) ) {
this.units = units;
notifyVariableChanged(UNITS_CHANGED);
}
else
throw new IllegalArgumentException("Cannot change the variable units to "+units);
}
public abstract double value();
public void setValue(double value) {
v.set(value);
if ( notifyVariableChanging(VALUE_CHANGING, v) ) {
setVariableValue(value);
notifyVariableChanged(VALUE_CHANGED);
}
else
throw new IllegalArgumentException("Cannot change the variable value to "+value);
}
protected abstract void setVariableValue(double value);
boolean notifyVariableChanging(int type, Object change) {
for ( int i = 0; i < listeners.size(); i++ ) {
VariableListener l = (VariableListener) listeners.get(i);
if ( type == NAME_CHANGING ) {
if ( ! l.variableChangingName(this, (String) change) )
return false;
}
else if ( type == VALUE_CHANGING ) {
if ( ! l.variableChangingValue(this, ( (Value) change ).getDouble()) )
return false;
}
else if ( type == UNITS_CHANGING )
if ( ! l.variableChangingUnits(this, (Units) change) )
return false;
}
return true;
}
void notifyVariableChanged(int type) {
for ( int i = 0; i < listeners.size(); i++ ) {
VariableListener l = (VariableListener) listeners.get(i);
if ( type == NAME_CHANGED )
l.variableChangedName(this);
else if ( type == VALUE_CHANGED )
l.variableChangedValue(this);
else if ( type == UNITS_CHANGED )
l.variableChangedUnits(this);
else if ( type == RANGE_CHANGED )
l.variableChangedRange(this);
}
}
}