allow chamber type choice
authorBill Kuker <bkuker@billkuker.com>
Mon, 8 Nov 2010 11:58:16 +0000 (11:58 +0000)
committerBill Kuker <bkuker@billkuker.com>
Mon, 8 Nov 2010 11:58:16 +0000 (11:58 +0000)
gui/com/billkuker/rocketry/motorsim/visual/ClassChooser.java [new file with mode: 0644]
gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java

diff --git a/gui/com/billkuker/rocketry/motorsim/visual/ClassChooser.java b/gui/com/billkuker/rocketry/motorsim/visual/ClassChooser.java
new file mode 100644 (file)
index 0000000..e37a453
--- /dev/null
@@ -0,0 +1,52 @@
+package com.billkuker.rocketry.motorsim.visual;\r
+\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import javax.swing.DefaultComboBoxModel;\r
+import javax.swing.JComboBox;\r
+\r
+public abstract class ClassChooser<T> extends JComboBox {\r
+       private static final long serialVersionUID = 1L;\r
+\r
+       private class Element {\r
+               private final Class<? extends T> clazz;\r
+               Element(Class<? extends T> clazz){\r
+                       this.clazz = clazz;\r
+               }\r
+               @Override\r
+               public String toString(){\r
+                       return clazz.getSimpleName();\r
+               }\r
+       }\r
+       \r
+       private Map<Class<? extends T>, T> lastVal = new HashMap<Class<? extends T>, T>();\r
+               \r
+       private DefaultComboBoxModel model ;\r
+       \r
+       public ClassChooser(Collection<Class<? extends T>> options, T current){\r
+               super(new DefaultComboBoxModel());\r
+               model = (DefaultComboBoxModel)getModel();\r
+               for ( Class<? extends T> clazz : options){\r
+                       Element e = new Element(clazz);\r
+                       model.addElement(e);\r
+                       if ( clazz == current.getClass() )\r
+                               setSelectedItem(e);\r
+               }\r
+               lastVal.put( (Class<? extends T>) current.getClass(), current);\r
+\r
+               addActionListener(new ActionListener(){\r
+                       @Override\r
+                       public void actionPerformed(ActionEvent e) {\r
+                               @SuppressWarnings("unchecked")\r
+                               Class<? extends T> selected = ((Element)getSelectedItem()).clazz;\r
+                               lastVal.put(selected, classSelected(selected, lastVal.get(selected)));\r
+                       }});\r
+               \r
+       }\r
+       \r
+       protected abstract T classSelected(Class<? extends T> clazz, T last);\r
+}\r
index 4954ebe1ad3323660b66c4651b15fc4ca6867c1b..b12815bf30eacc7957c3b3612b6f694ae6220d6a 100644 (file)
@@ -60,6 +60,7 @@ import com.billkuker.rocketry.motorsim.grain.MultiGrain;
 import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;\r
 import com.billkuker.rocketry.motorsim.grain.Star;\r
 import com.billkuker.rocketry.motorsim.visual.BurnPanel;\r
+import com.billkuker.rocketry.motorsim.visual.ClassChooser;\r
 import com.billkuker.rocketry.motorsim.visual.Editor;\r
 import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
 import com.billkuker.rocketry.motorsim.visual.HardwarePanel;\r
@@ -98,6 +99,12 @@ public class MotorEditor extends JPanel implements PropertyChangeListener {
                grainTypes.add(CSlot.class);\r
                grainTypes.add(EndBurner.class);\r
        }\r
+       \r
+       private List<Class<? extends Chamber>> chamberTypes = new Vector<Class<? extends Chamber>>();\r
+       {\r
+               chamberTypes.add(CylindricalChamber.class);\r
+               chamberTypes.add(Schedule40.class);\r
+       }\r
 \r
        private abstract class Chooser<T> extends JPanel {\r
                private static final long serialVersionUID = 1L;\r
@@ -245,8 +252,35 @@ public class MotorEditor extends JPanel implements PropertyChangeListener {
 \r
        private class CaseEditor extends JSplitPane implements ComponentListener {\r
                private static final long serialVersionUID = 1L;\r
+               \r
+               private HardwarePanel hp;\r
+               private JPanel casing;\r
+               private JPanel nozzle;\r
+               private Editor casingEditor;\r
+               private Editor nozzleEditor;\r
+               \r
+               private void setup() {\r
+                       if (casingEditor != null)\r
+                               casing.remove(casingEditor);\r
+                       casing.add(casingEditor = new Editor(motor.getChamber()));\r
+                       if (nozzleEditor != null)\r
+                               nozzle.remove(nozzleEditor);\r
+                       nozzle.add(nozzleEditor = new Editor(motor.getNozzle()));\r
+                       if (hp != null)\r
+                               remove(hp);\r
+                       setBottomComponent(hp = new HardwarePanel(motor.getNozzle(),\r
+                                       motor.getChamber()));\r
+                       if (motor.getNozzle() instanceof ChangeListening.Subject) {\r
+                               ((ChangeListening.Subject) motor.getNozzle())\r
+                                               .addPropertyChangeListener(MotorEditor.this);\r
+                       }\r
+                       if (motor.getChamber() instanceof ChangeListening.Subject) {\r
+                               ((ChangeListening.Subject) motor.getChamber())\r
+                                               .addPropertyChangeListener(MotorEditor.this);\r
+                       }\r
+               }\r
 \r
-               public CaseEditor(Nozzle n, Chamber c) {\r
+               public CaseEditor() {\r
                        super(JSplitPane.VERTICAL_SPLIT);\r
                        setName("General Parameters");\r
                        this.addComponentListener(this);\r
@@ -254,7 +288,6 @@ public class MotorEditor extends JPanel implements PropertyChangeListener {
                        JPanel parts = new JPanel();\r
                        parts.setLayout(new BoxLayout(parts, BoxLayout.X_AXIS));\r
                        setTopComponent(parts);\r
-                       setBottomComponent(new HardwarePanel(n, c));\r
                        \r
                        JPanel nameAndFuel = new JPanel();\r
                        nameAndFuel.setLayout(new BoxLayout(nameAndFuel, BoxLayout.Y_AXIS));\r
@@ -286,13 +319,12 @@ public class MotorEditor extends JPanel implements PropertyChangeListener {
 \r
                                }\r
                        });\r
+                       \r
                        nameAndFuel.add(new JLabel("Fuel:"));\r
                        nameAndFuel.add( new JComboBox(availableFuels){\r
-                               {\r
-                                       this.setSelectedItem(motor.getFuel());\r
-                               }\r
                                private static final long serialVersionUID = 1L;\r
                                {\r
+                                       this.setSelectedItem(motor.getFuel());\r
                                        setMinimumSize(new Dimension(200, 20));\r
                                        setMaximumSize(new Dimension(Short.MAX_VALUE, 20));\r
                                        addActionListener(new ActionListener(){\r
@@ -303,29 +335,58 @@ public class MotorEditor extends JPanel implements PropertyChangeListener {
                                                }});\r
                                }\r
                        });\r
+                       \r
+                       nameAndFuel.add(new JLabel("Casing:"));\r
+                       nameAndFuel.add(new ClassChooser<Chamber>(chamberTypes, motor.getChamber()) {\r
+                               private static final long serialVersionUID = 1L;\r
+                               {\r
+                                       setMinimumSize(new Dimension(200, 20));\r
+                                       setMaximumSize(new Dimension(Short.MAX_VALUE, 20));\r
+                               }\r
+                               @Override\r
+                               protected Chamber classSelected(Class<? extends Chamber> clazz, Chamber c) {\r
+                                       try {\r
+                                               if ( c != null ){\r
+                                                       motor.setChamber(c);\r
+                                               } else {\r
+                                                       motor.setChamber(clazz.newInstance());\r
+                                               }\r
+                                               return motor.getChamber();\r
+                                       } catch (InstantiationException e) {\r
+                                               // TODO Auto-generated catch block\r
+                                               e.printStackTrace();\r
+                                       } catch (IllegalAccessException e) {\r
+                                               // TODO Auto-generated catch block\r
+                                               e.printStackTrace();\r
+                                       }\r
+                                       return null;\r
+                               }\r
+                       });\r
+                       \r
+                       \r
                        nameAndFuel.add(Box.createVerticalGlue());\r
                        parts.add(nameAndFuel);\r
                        \r
-                       JPanel casing = new JPanel();\r
+                       casing = new JPanel();\r
                        casing.setLayout(new BoxLayout(casing, BoxLayout.Y_AXIS));\r
                        casing.add(new JLabel("Casing:"));\r
-                       casing.add(new Editor(c));\r
                        parts.add(casing);\r
                        \r
-                       JPanel nozzle = new JPanel();\r
+                       nozzle = new JPanel();\r
                        nozzle.setLayout(new BoxLayout(nozzle, BoxLayout.Y_AXIS));\r
                        nozzle.add(new JLabel("Nozzle:"));\r
-                       nozzle.add(new Editor(n));\r
                        parts.add(nozzle);\r
-\r
-                       if (n instanceof ChangeListening.Subject) {\r
-                               ((ChangeListening.Subject) n)\r
-                                               .addPropertyChangeListener(MotorEditor.this);\r
-                       }\r
-                       if (c instanceof ChangeListening.Subject) {\r
-                               ((ChangeListening.Subject) c)\r
-                                               .addPropertyChangeListener(MotorEditor.this);\r
-                       }\r
+                       \r
+                       motor.addPropertyChangeListener(new PropertyChangeListener() {\r
+                               @Override\r
+                               public void propertyChange(PropertyChangeEvent arg0) {\r
+                                       setup();\r
+                                       setResizeWeight(.5);\r
+                                       setDividerLocation(.5);\r
+                               }\r
+                       });\r
+                       \r
+                       setup();\r
                }\r
 \r
                @Override\r
@@ -376,7 +437,7 @@ public class MotorEditor extends JPanel implements PropertyChangeListener {
                        remove(grainEditor);\r
                while (tabs.getTabCount() > 1)\r
                        tabs.removeTabAt(1);\r
-               tabs.add(new CaseEditor(motor.getNozzle(), motor.getChamber()), CASING_TAB);\r
+               tabs.add(new CaseEditor(), CASING_TAB);\r
                tabs.add(new GrainEditor(motor.getGrain()), GRAIN_TAB);\r
                tabs.add(bt = new BurnTab(), BURN_TAB);\r
        }\r