]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/g3d/property/ComboPropertyManipulator.java
Reflection-based handling of Enum property editing.
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / property / ComboPropertyManipulator.java
1 package org.simantics.g3d.property;
2
3 import java.util.List;
4
5 import org.simantics.utils.datastructures.Arrays;
6
7 public class ComboPropertyManipulator implements PropertyManipulator{
8
9     ComboValueProvider provider;
10     Object input;
11     
12     boolean editMode;
13     
14     public ComboPropertyManipulator(ValueProvider provider, Object input) {
15         this.provider = (ComboValueProvider)provider;
16         this.input = input;
17     }
18     
19     @Override
20     public int getValueCount() {
21         return 1;
22     }
23     
24     @Override
25     public String getDescription(int i) {
26         if (i == 0)
27             return "Value";
28         return null;
29     }
30     
31     @Override
32     public String getValue(int i) {
33         try {
34             Object rawValue = provider.getValue(input);
35             if (rawValue == null) {
36                 return null;
37             }
38             else if (rawValue instanceof Integer) {
39                 Integer value = (Integer)rawValue;
40                 return getItems()[value];
41             }
42             else if (rawValue instanceof Enum) {
43                 return rawValue.toString();
44             }
45             else {
46                 return null;
47             }
48         } catch (Exception e) {
49             return null;
50         }
51     }
52     
53     @Override
54     public String setValue(String value, int i) {
55         try {
56             int intValue = Integer.parseInt(value);
57             Class<?> valueType = provider.getValueType();
58             if (Enum.class.isAssignableFrom(valueType)) {
59                 provider.setValue(input, valueType.getEnumConstants()[intValue]);
60             }
61             else {
62                 provider.setValue(input, intValue);
63             }
64         } catch (Exception e) {
65             return e.getMessage();
66         }
67         return null;
68     }
69
70     @Override
71     public boolean getEditMode() {
72         return editMode;
73     }
74     
75     @Override
76     public void setEditMode(boolean b) {
77         editMode = b;
78     }
79     
80     public String[] getItems() {
81         try {
82             List<Object> vals = provider.getValues(input);
83             String arr[] = new String[vals.size()];
84             for (int i = 0; i < vals.size(); i++) {
85                 arr[i] = vals.get(i).toString();
86             }
87             return arr;
88         } catch (Exception e) {
89             return new String[0];
90         }
91     }
92     
93     public Integer getValueIndex() {
94         try {
95             Object value = provider.getValue(input);
96             Class<?> valueType = provider.getValueType();
97             if (valueType.isEnum()) {
98                 return Arrays.indexOf(valueType.getEnumConstants(), value);
99             }
100             else {
101                 return (Integer) value;
102             }
103         } catch (Exception e) {
104             return null;
105         }
106     }
107     
108     public Integer indexOf(String value) {
109         String[] items = getItems();
110         for (int i = 0; i < items.length; i++)
111             if (items[i].equals(value))
112                 return i;
113         return -1;
114     }
115 }