]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/g3d/property/MethodComboValueProvider.java
Reflection-based handling of Enum property editing.
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / property / MethodComboValueProvider.java
index c1e21e071d6ed0d5e7b9c5895b0179fca7377c97..0408235f3ca5d81824046748b18f32c5f11231f7 100644 (file)
 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; 
@@ -28,14 +31,39 @@ public class MethodComboValueProvider implements ComboValueProvider {
        
        @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();
        }
 }