]> git.gag.com Git - sw/motorsim/blob - src/com/billkuker/rocketry/motorsim/visual/Editor.java
Now a subclass of property sheet.
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / visual / Editor.java
1 package com.billkuker.rocketry.motorsim.visual;\r
2 \r
3 import java.awt.Component;\r
4 import java.beans.IntrospectionException;\r
5 import java.beans.Introspector;\r
6 import java.beans.PropertyChangeEvent;\r
7 import java.beans.PropertyChangeListener;\r
8 import java.beans.PropertyDescriptor;\r
9 import java.beans.PropertyEditorManager;\r
10 import java.beans.PropertyEditorSupport;\r
11 import java.lang.reflect.InvocationTargetException;\r
12 import java.util.Vector;\r
13 \r
14 import javax.measure.unit.NonSI;\r
15 import javax.measure.unit.Unit;\r
16 import javax.swing.JFrame;\r
17 import javax.swing.JPanel;\r
18 import javax.swing.JTextField;\r
19 import javax.swing.WindowConstants;\r
20 \r
21 import org.apache.log4j.Logger;\r
22 import org.jscience.physics.amount.Amount;\r
23 \r
24 import com.billkuker.rocketry.motorsim.Grain;\r
25 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
26 import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;\r
27 import com.l2fprod.common.propertysheet.PropertySheetPanel;\r
28 \r
29 public class Editor extends PropertySheetPanel {\r
30         private static final long serialVersionUID = 1L;\r
31 \r
32         private static Logger log = Logger.getLogger(Editor.class);\r
33 \r
34         private Object obj;\r
35 \r
36         public Editor(Object o) throws IntrospectionException,\r
37                         IllegalArgumentException, IllegalAccessException,\r
38                         InvocationTargetException {\r
39                 obj = o;\r
40 \r
41                 PropertyEditorManager.registerEditor(Amount.class,\r
42                                 AmountPropertyEditor.class);\r
43 \r
44                 // Build the list of properties we want it to edit\r
45                 //final PropertySheetPanel ps = new PropertySheetPanel();\r
46                 PropertyDescriptor props[] = Introspector.getBeanInfo(obj.getClass())\r
47                                 .getPropertyDescriptors();\r
48                 Vector<PropertyDescriptor> v = new Vector<PropertyDescriptor>();\r
49                 for (int i = 0; i < props.length; i++) {\r
50                         if (props[i].getName().equals("class"))\r
51                                 continue;\r
52                         v.add(props[i]);\r
53                 }\r
54                 setProperties(v.toArray(new PropertyDescriptor[v.size()]));\r
55 \r
56                 readFromObject(obj);\r
57 \r
58                 addPropertySheetChangeListener(new PropertyChangeListener() {\r
59 \r
60                         @Override\r
61                         public void propertyChange(PropertyChangeEvent evt) {\r
62                                 // When something changes just update the\r
63                                 // object, I want the changes to be immediate.\r
64                                 try {\r
65                                         log.debug("Writing properties to object.");\r
66                                         writeToObject(obj);\r
67                                 } catch (Exception v) {\r
68                                         // TODO\r
69                                         v.printStackTrace();\r
70                                         java.awt.Toolkit.getDefaultToolkit().beep();\r
71                                 } finally {\r
72                                         readFromObject(obj);\r
73                                 }\r
74                         }\r
75 \r
76                 });\r
77         }\r
78 \r
79         public static void main(String args[]) throws Exception {\r
80                 Grain g = new CoredCylindricalGrain();\r
81                 g = new RodAndTubeGrain();\r
82                 new Editor(g).show();\r
83                 new GrainPanel(g).show();\r
84         }\r
85 \r
86         public void show() {\r
87                 JFrame f = new JFrame();\r
88                 f.setSize(600, 400);\r
89                 f.setContentPane(this);\r
90                 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
91                 f.setVisible(true);\r
92         }\r
93 \r
94         public static class AmountPropertyEditor extends PropertyEditorSupport {\r
95                 JTextField editor = new JTextField();\r
96                 Unit oldUnit;\r
97 \r
98                 @Override\r
99                 public boolean supportsCustomEditor() {\r
100                         return true;\r
101                 }\r
102 \r
103                 @Override\r
104                 public String getAsText() {\r
105                         return editor.getText();\r
106                 }\r
107 \r
108                 @Override\r
109                 public Object getValue() {\r
110                         String text = editor.getText().trim();\r
111 \r
112                         // Trying to determine if the value is integer or\r
113                         // has a decimal part will prevent the uncertainty\r
114                         // term from appearing when user types an exact value\r
115                         try {\r
116                                 try {\r
117                                         return Amount.valueOf(Integer.parseInt(text), oldUnit);\r
118                                 } catch (NumberFormatException e) {\r
119 \r
120                                 }\r
121                                 Amount a = Amount.valueOf(Double.parseDouble(text), oldUnit);\r
122                                 return a;\r
123                         } catch (NumberFormatException e) {\r
124                                 // Storing the old unit allows you to type 10 into a field\r
125                                 // that says 20 mm and get 10 mm, so you dont have to\r
126                                 // type the unit if they havn't changed.\r
127                                 Amount a = Amount.valueOf(editor.getText());\r
128                                 oldUnit = a.getUnit();\r
129                                 return a;\r
130                         }\r
131 \r
132                 }\r
133 \r
134                 @Override\r
135                 public void setValue(Object o) {\r
136                         Amount a = (Amount) o;\r
137                         oldUnit = a.getUnit();\r
138 \r
139                         String text;\r
140                         //Leave off the fractional part if it is not relevant\r
141                         if (a.isExact())\r
142                                 text = a.getExactValue() + " " + a.getUnit();\r
143                         else\r
144                                 text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
145 \r
146                         setAsText(text);\r
147                 }\r
148 \r
149                 @Override\r
150                 public void setAsText(String text) throws IllegalArgumentException {\r
151                         editor.setText(text);\r
152                 };\r
153 \r
154                 @Override\r
155                 public Component getCustomEditor() {\r
156                         return editor;\r
157                 }\r
158         }\r
159 \r
160 }\r