import java.beans.PropertyChangeListener;\r
import java.beans.PropertyVetoException;\r
import java.util.Collection;\r
-import java.util.HashMap;\r
import java.util.List;\r
-import java.util.Map;\r
import java.util.Vector;\r
\r
-import javax.measure.quantity.Length;\r
import javax.measure.unit.SI;\r
import javax.swing.Box;\r
import javax.swing.BoxLayout;\r
import javax.swing.DefaultComboBoxModel;\r
-import javax.swing.JButton;\r
import javax.swing.JComboBox;\r
import javax.swing.JFrame;\r
import javax.swing.JLabel;\r
import javax.swing.JPanel;\r
-import javax.swing.JProgressBar;\r
import javax.swing.JSplitPane;\r
import javax.swing.JTabbedPane;\r
import javax.swing.JTextArea;\r
import com.billkuker.rocketry.motorsim.Grain;\r
import com.billkuker.rocketry.motorsim.Motor;\r
import com.billkuker.rocketry.motorsim.Nozzle;\r
-import com.billkuker.rocketry.motorsim.RocketScience;\r
import com.billkuker.rocketry.motorsim.cases.Schedule40;\r
import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
import com.billkuker.rocketry.motorsim.grain.CSlot;\r
chamberTypes.add(Schedule40.class);\r
}\r
\r
- private abstract class Chooser<T> extends JPanel {\r
- private static final long serialVersionUID = 1L;\r
- private List<Class<? extends T>> types;\r
- private Map<Class<? extends T>, T> old = new HashMap<Class<? extends T>, T>();\r
-\r
- @SuppressWarnings("unchecked")\r
- public Chooser(T initial, List<Class<? extends T>> ts) {\r
- types = ts;\r
- if ( initial != null )\r
- old.put((Class<? extends T>)initial.getClass(), initial);\r
- setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));\r
- for (final Class<? extends T> c : types) {\r
- JButton b = new JButton(c.getSimpleName());\r
- add(b);\r
- b.addActionListener(new ActionListener() {\r
- public void actionPerformed(ActionEvent e) {\r
- try {\r
- T val = old.get(c);\r
- if ( val == null ){\r
- System.err.println("CREATED NEW =========================");\r
- val = c.newInstance();\r
- old.put(c, val);\r
- }\r
- choiceMade(val);\r
- } catch (InstantiationException e1) {\r
- e1.printStackTrace();\r
- } catch (IllegalAccessException e1) {\r
- e1.printStackTrace();\r
- }\r
- }\r
- });\r
- }\r
- }\r
-\r
- protected abstract void choiceMade(T o);\r
- }\r
-\r
private class BurnTab extends JPanel {\r
private static final long serialVersionUID = 1L;\r
private Thread currentThread;\r
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));\r
p.add(new Editor(g));\r
for (Grain gg : ((Grain.Composite) g).getGrains()) {\r
- final int grainEditorIndex = p.getComponentCount() + 1;\r
- p.add(new Chooser<Grain>(gg, grainTypes) {\r
+ final int grainEditorIndex = p.getComponentCount() + 2;\r
+ p.add(new JLabel("Grain Type:"));\r
+ p.add(new ClassChooser<Grain>(grainTypes, gg) {\r
private static final long serialVersionUID = 1L;\r
\r
@Override\r
- protected void choiceMade(Grain ng) {\r
+ protected Grain classSelected(\r
+ Class<? extends Grain> clazz, Grain ng) {\r
+ if ( ng == null ){\r
+ try {\r
+ ng = clazz.newInstance();\r
+ } catch (InstantiationException e) {\r
+ e.printStackTrace();\r
+ } catch (IllegalAccessException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
if (g instanceof MultiGrain) {\r
((MultiGrain) g).setGrain(ng);\r
p.remove(grainEditorIndex);\r
p.remove(0);\r
p.add(new Editor(g), 0);\r
}\r
+ return ng;\r
+\r
}\r
});\r
p.add(new Editor(gg));\r