package org.simantics.g3d.property;
import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.List;
+import org.simantics.utils.datastructures.Arrays;
+
public class MethodComboValueProvider implements ComboValueProvider {
Method getter;
@Override
public Object getValue(Object obj) throws Exception{
- return getter.invoke(obj);
+ if (getValueType().isEnum()) {
+ Object value = getter.invoke(obj);
+ Object[] vs = getValueType().getEnumConstants();
+ return (Integer) Arrays.indexOf(vs, value);
+ }
+ else {
+ return getter.invoke(obj);
+ }
}
@Override
public void setValue(Object obj, Object value) throws Exception {
setter.invoke(obj,value);
}
+ @SuppressWarnings("unchecked")
public List<Object> getValues(Object obj) throws Exception {
- return (List<Object>)values.invoke(obj);
+ if (values != null) {
+ return (List<Object>)values.invoke(obj);
+ }
+ else if (getValueType().isEnum()) {
+ Object[] enumConstants = getValueType().getEnumConstants();
+ List<Object> result = new ArrayList<>(enumConstants.length);
+ for (Object c : enumConstants)
+ result.add(c);
+ return result;
+ }
+ else {
+ throw new IllegalStateException("No value list defined for " + getter.toString());
+ }
+ }
+
+ @Override
+ public Class<?> getValueType() {
+ return getter.getReturnType();
}
}