controlp5/src/controlP5/FieldChangedListener.java

110 lines
2.5 KiB
Java
Executable File

package controlP5;
import java.lang.reflect.Field;
/**
* the FieldChangedListener is used to observe changes of variables that are
* linked to a controller. The FieldChangedListener is for primarily for
* internal use.
*
* @see controlP5.Controller#listen(boolean)
*/
class FieldChangedListener {
private FieldValue value;
private ControlP5 controlP5;
public FieldChangedListener(ControlP5 theControlP5) {
controlP5 = theControlP5;
}
/**
* Assigns a listener to a specific field of an object.
*
* this can be done in a more elegant way using generics.
*
* @param theObject
* @param theFieldName
*/
public void listenTo(final Object theObject, final String theFieldName) {
try {
Class<?> c = theObject.getClass();
final Field field = c.getDeclaredField(theFieldName);
field.setAccessible(true);
if (field.getType().isAssignableFrom(Float.TYPE)) {
value = new FieldValue() {
float then;
public void check() {
try {
float now = (Float) field.get(theObject);
if (now != then) {
controlP5.getController(theFieldName, theObject).setValue(now);
then = now;
}
} catch (IllegalAccessException e) {
}
}
};
} else if (field.getType().isAssignableFrom(Integer.TYPE)) {
value = new FieldValue() {
int then;
public void check() {
try {
int now = (Integer) field.get(theObject);
if (now != then) {
controlP5.getController(theFieldName, theObject).setValue(now);
then = now;
}
} catch (IllegalAccessException e) {
}
}
};
} else if (field.getType().isAssignableFrom(Boolean.TYPE)) {
value = new FieldValue() {
boolean then;
public void check() {
try {
boolean now = (Boolean) field.get(theObject);
if (now != then) {
controlP5.getController(theFieldName, theObject).setValue(now == true ? 1 : 0);
then = now;
}
} catch (IllegalAccessException e) {
}
}
};
} else if (field.getType().isAssignableFrom(String.class)) {
value = new FieldValue() {
String then;
public void check() {
try {
String now = (String) field.get(theObject);
if (!now.equals(then)) {
controlP5.getController(theFieldName, theObject).setStringValue(now);
then = now;
}
} catch (IllegalAccessException e) {
}
}
};
}
} catch (Exception e) {
System.out.println(e);
}
}
void update() {
value.check();
}
}
interface FieldValue {
public void check();
}