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