]> git.gag.com Git - sw/motorsim/commitdiff
Now a subclass of property sheet.
authorBill Kuker <bkuker@billkuker.com>
Sun, 12 Apr 2009 14:13:07 +0000 (14:13 +0000)
committerBill Kuker <bkuker@billkuker.com>
Sun, 12 Apr 2009 14:13:07 +0000 (14:13 +0000)
src/com/billkuker/rocketry/motorsim/visual/Editor.java

index ef94189641bc483eaa89a17a012e3df6a2c0e251..0c05e2d6be7cbf1a88781a1147e8150f2ed23ea5 100644 (file)
@@ -1,26 +1,32 @@
 package com.billkuker.rocketry.motorsim.visual;\r
+\r
 import java.awt.Component;\r
 import java.beans.IntrospectionException;\r
 import java.beans.Introspector;\r
 import java.beans.PropertyChangeEvent;\r
 import java.beans.PropertyChangeListener;\r
+import java.beans.PropertyDescriptor;\r
 import java.beans.PropertyEditorManager;\r
 import java.beans.PropertyEditorSupport;\r
 import java.lang.reflect.InvocationTargetException;\r
+import java.util.Vector;\r
 \r
 import javax.measure.unit.NonSI;\r
 import javax.measure.unit.Unit;\r
 import javax.swing.JFrame;\r
 import javax.swing.JPanel;\r
 import javax.swing.JTextField;\r
+import javax.swing.WindowConstants;\r
 \r
 import org.apache.log4j.Logger;\r
 import org.jscience.physics.amount.Amount;\r
 \r
+import com.billkuker.rocketry.motorsim.Grain;\r
 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
+import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;\r
 import com.l2fprod.common.propertysheet.PropertySheetPanel;\r
 \r
-public class Editor extends JPanel {\r
+public class Editor extends PropertySheetPanel {\r
        private static final long serialVersionUID = 1L;\r
 \r
        private static Logger log = Logger.getLogger(Editor.class);\r
@@ -31,68 +37,61 @@ public class Editor extends JPanel {
                        IllegalArgumentException, IllegalAccessException,\r
                        InvocationTargetException {\r
                obj = o;\r
-               /*\r
-               BeanInfo b = Introspector.getBeanInfo(o.getClass());\r
-               setLayout(new GridLayout(b.getPropertyDescriptors().length - 1, 2));\r
-               for (PropertyDescriptor p : b.getPropertyDescriptors()) {\r
-                       log.debug(p.getName());\r
-                       if (p.getName().equals("class"))\r
-                               continue;\r
 \r
-                       add(new JLabel(p.getName()));\r
-                       if (p.getPropertyType().isAssignableFrom(Amount.class)){\r
-                               add(new AmountEditor(p));\r
-                       } else if ( p.getPropertyType() == boolean.class ){\r
-                               add( new BooleanEditor(p) );\r
-                               \r
-                       }\r
+               PropertyEditorManager.registerEditor(Amount.class,\r
+                               AmountPropertyEditor.class);\r
+\r
+               // Build the list of properties we want it to edit\r
+               //final PropertySheetPanel ps = new PropertySheetPanel();\r
+               PropertyDescriptor props[] = Introspector.getBeanInfo(obj.getClass())\r
+                               .getPropertyDescriptors();\r
+               Vector<PropertyDescriptor> v = new Vector<PropertyDescriptor>();\r
+               for (int i = 0; i < props.length; i++) {\r
+                       if (props[i].getName().equals("class"))\r
+                               continue;\r
+                       v.add(props[i]);\r
                }\r
-               log.debug(PropertyEditorManager.findEditor(boolean.class).supportsCustomEditor());*/\r
-               \r
-               PropertyEditorManager.registerEditor(Amount.class, AmountPropertyEditor.class);\r
-               \r
-               final PropertySheetPanel ps = new PropertySheetPanel();\r
-               ps.setBeanInfo(Introspector.getBeanInfo(obj.getClass()));\r
-               ps.readFromObject(obj);\r
-               add(ps);\r
-               \r
-               ps.addPropertySheetChangeListener(new PropertyChangeListener(){\r
+               setProperties(v.toArray(new PropertyDescriptor[v.size()]));\r
+\r
+               readFromObject(obj);\r
+\r
+               addPropertySheetChangeListener(new PropertyChangeListener() {\r
 \r
                        @Override\r
                        public void propertyChange(PropertyChangeEvent evt) {\r
-                               //When something changes just update the\r
-                               //object, I want the changes to be immediate.\r
+                               // When something changes just update the\r
+                               // object, I want the changes to be immediate.\r
                                try {\r
-                                       ps.writeToObject(obj);\r
-                               } catch ( Exception v ){\r
-                                       //TODO\r
+                                       log.debug("Writing properties to object.");\r
+                                       writeToObject(obj);\r
+                               } catch (Exception v) {\r
+                                       // TODO\r
                                        v.printStackTrace();\r
                                        java.awt.Toolkit.getDefaultToolkit().beep();\r
                                } finally {\r
-                                       ps.readFromObject(obj);\r
+                                       readFromObject(obj);\r
                                }\r
                        }\r
-                       \r
+\r
                });\r
        }\r
 \r
        public static void main(String args[]) throws Exception {\r
-               CoredCylindricalGrain g = new CoredCylindricalGrain();\r
-               g.setOD(Amount.valueOf(1, NonSI.INCH));\r
+               Grain g = new CoredCylindricalGrain();\r
+               g = new RodAndTubeGrain();\r
                new Editor(g).show();\r
-               \r
                new GrainPanel(g).show();\r
        }\r
 \r
        public void show() {\r
                JFrame f = new JFrame();\r
-               f.setSize(600,400);\r
+               f.setSize(600, 400);\r
                f.setContentPane(this);\r
-               f.setDefaultCloseOperation(f.DISPOSE_ON_CLOSE);\r
+               f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
                f.setVisible(true);\r
        }\r
-       \r
-       public static class AmountPropertyEditor extends PropertyEditorSupport{\r
+\r
+       public static class AmountPropertyEditor extends PropertyEditorSupport {\r
                JTextField editor = new JTextField();\r
                Unit oldUnit;\r
 \r
@@ -100,48 +99,62 @@ public class Editor extends JPanel {
                public boolean supportsCustomEditor() {\r
                        return true;\r
                }\r
-               @Override public String getAsText(){\r
+\r
+               @Override\r
+               public String getAsText() {\r
                        return editor.getText();\r
                }\r
-               \r
-               @Override public Object getValue(){\r
+\r
+               @Override\r
+               public Object getValue() {\r
                        String text = editor.getText().trim();\r
+\r
+                       // Trying to determine if the value is integer or\r
+                       // has a decimal part will prevent the uncertainty\r
+                       // term from appearing when user types an exact value\r
                        try {\r
                                try {\r
                                        return Amount.valueOf(Integer.parseInt(text), oldUnit);\r
-                               } catch (NumberFormatException e){\r
-                                       \r
+                               } catch (NumberFormatException e) {\r
+\r
                                }\r
                                Amount a = Amount.valueOf(Double.parseDouble(text), oldUnit);\r
                                return a;\r
-                       } catch (NumberFormatException e){\r
+                       } catch (NumberFormatException e) {\r
+                               // Storing the old unit allows you to type 10 into a field\r
+                               // that says 20 mm and get 10 mm, so you dont have to\r
+                               // type the unit if they havn't changed.\r
                                Amount a = Amount.valueOf(editor.getText());\r
                                oldUnit = a.getUnit();\r
                                return a;\r
                        }\r
 \r
                }\r
-               @Override public void setValue(Object o){\r
-                       Amount a = (Amount)o;\r
+\r
+               @Override\r
+               public void setValue(Object o) {\r
+                       Amount a = (Amount) o;\r
                        oldUnit = a.getUnit();\r
-                       \r
+\r
                        String text;\r
-                       if ( a.isExact() )\r
-                                        text = a.getExactValue() + " " + a.getUnit();\r
+                       //Leave off the fractional part if it is not relevant\r
+                       if (a.isExact())\r
+                               text = a.getExactValue() + " " + a.getUnit();\r
                        else\r
-                                text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
-                       \r
+                               text = a.doubleValue(a.getUnit()) + " " + a.getUnit();\r
+\r
                        setAsText(text);\r
                }\r
-               @Override public void setAsText(String text) throws IllegalArgumentException {\r
+\r
+               @Override\r
+               public void setAsText(String text) throws IllegalArgumentException {\r
                        editor.setText(text);\r
                };\r
+\r
                @Override\r
-               public Component getCustomEditor(){\r
+               public Component getCustomEditor() {\r
                        return editor;\r
                }\r
        }\r
 \r
-\r
-\r
 }\r