controlp5/src/controlP5/FieldChangedListener.java

135 lines
3.4 KiB
Java
Executable File

package controlP5;
/**
* controlP5 is a processing gui library.
*
* 2006-2015 by Andreas Schlegel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA
*
* @author Andreas Schlegel (http://www.sojamo.de)
* @modified ##date##
* @version ##version##
*
*/
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();
}