Use ClassChooser to select grain type. Looks nicer
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / ClassChooser.java
1 package com.billkuker.rocketry.motorsim.visual;\r
2 \r
3 import java.awt.event.ActionEvent;\r
4 import java.awt.event.ActionListener;\r
5 import java.util.Collection;\r
6 import java.util.HashMap;\r
7 import java.util.Map;\r
8 \r
9 import javax.swing.DefaultComboBoxModel;\r
10 import javax.swing.JComboBox;\r
11 \r
12 public abstract class ClassChooser<T> extends JComboBox {\r
13         private static final long serialVersionUID = 1L;\r
14 \r
15         private class Element {\r
16                 private final Class<? extends T> clazz;\r
17                 Element(Class<? extends T> clazz){\r
18                         this.clazz = clazz;\r
19                 }\r
20                 @Override\r
21                 public String toString(){\r
22                         return clazz.getSimpleName();\r
23                 }\r
24         }\r
25         \r
26         private Map<Class<? extends T>, T> lastVal = new HashMap<Class<? extends T>, T>();\r
27                 \r
28         private DefaultComboBoxModel model ;\r
29         \r
30         @SuppressWarnings("unchecked")\r
31         public ClassChooser(Collection<Class<? extends T>> options, T current){\r
32                 super(new DefaultComboBoxModel());\r
33                 model = (DefaultComboBoxModel)getModel();\r
34                 for ( Class<? extends T> clazz : options){\r
35                         Element e = new Element(clazz);\r
36                         model.addElement(e);\r
37                         if ( clazz == current.getClass() )\r
38                                 setSelectedItem(e);\r
39                 }\r
40                 lastVal.put( (Class<? extends T>) current.getClass(), current);\r
41 \r
42                 addActionListener(new ActionListener(){\r
43                         @Override\r
44                         public void actionPerformed(ActionEvent e) {\r
45                                 Class<? extends T> selected = ((Element)getSelectedItem()).clazz;\r
46                                 lastVal.put(selected, classSelected(selected, lastVal.get(selected)));\r
47                         }});\r
48                 \r
49         }\r
50         \r
51         protected abstract T classSelected(Class<? extends T> clazz, T last);\r
52 }\r