--- /dev/null
+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
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
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
\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
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
\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
}});\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
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