updates for 0.9.4
[debian/openrocket] / src / net / sf / openrocket / gui / dialogs / preferences / PreferencesDialog.java
1 package net.sf.openrocket.gui.dialogs.preferences;
2
3 import java.awt.Dialog;
4 import java.awt.Window;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.awt.event.WindowAdapter;
8 import java.awt.event.WindowEvent;
9 import java.util.ArrayList;
10 import java.util.List;
11
12 import javax.swing.AbstractListModel;
13 import javax.swing.ComboBoxModel;
14 import javax.swing.JButton;
15 import javax.swing.JComboBox;
16 import javax.swing.JDialog;
17 import javax.swing.JLabel;
18 import javax.swing.JPanel;
19 import javax.swing.JTabbedPane;
20
21 import net.miginfocom.swing.MigLayout;
22 import net.sf.openrocket.gui.components.StyledLabel;
23 import net.sf.openrocket.unit.Unit;
24 import net.sf.openrocket.unit.UnitGroup;
25 import net.sf.openrocket.util.GUIUtil;
26 import net.sf.openrocket.util.Prefs;
27
28 public class PreferencesDialog extends JDialog {
29         
30         private final List<DefaultUnitSelector> unitSelectors = new ArrayList<DefaultUnitSelector>();
31
32         private PreferencesDialog() {
33                 super((Window)null, "Preferences", Dialog.ModalityType.APPLICATION_MODAL);
34                 
35                 JPanel panel = new JPanel(new MigLayout("fill, gap unrel","[grow]","[grow][]"));
36                                 
37                 JTabbedPane tabbedPane = new JTabbedPane();
38                 panel.add(tabbedPane,"grow, wrap");
39                 
40
41                 tabbedPane.addTab("Units", null, unitsPane(), "Default units");
42                 tabbedPane.addTab("Materials", null, new MaterialEditPanel(), "Custom materials");
43                 tabbedPane.addTab("Confirmation", null, confirmationPane(), "Confirmation dialog settings");
44                 
45                 
46                 JButton close = new JButton("Close");
47                 close.addActionListener(new ActionListener() {
48                         @Override
49                         public void actionPerformed(ActionEvent arg0) {
50                                 PreferencesDialog.this.setVisible(false);
51                                 PreferencesDialog.this.dispose();
52                         }
53                 });
54                 panel.add(close,"span, right, tag close");
55                 
56                 this.setContentPane(panel);
57                 pack();
58                 this.setLocationRelativeTo(null);
59                 
60                 this.addWindowListener(new WindowAdapter() {
61                         @Override
62                         public void windowClosed(WindowEvent e) {
63                                 Prefs.storeDefaultUnits();
64                         }
65                 });
66
67                 GUIUtil.setDisposableDialogOptions(this, close);
68         }
69         
70         
71         private JPanel confirmationPane() {
72                 JPanel panel = new JPanel(new MigLayout("fill"));
73                 
74                 panel.add(new JLabel("Position to insert new body components:"));
75                 panel.add(new JComboBox(new PrefChoiseSelector(Prefs.BODY_COMPONENT_INSERT_POSITION_KEY,
76                                 "Always ask", "Insert in middle", "Add to end")), "wrap para, sg combos");
77                 
78                 panel.add(new JLabel("Confirm deletion of simulations:"));
79                 panel.add(new JComboBox(new PrefBooleanSelector(Prefs.CONFIRM_DELETE_SIMULATION,
80                                 "Delete", "Confirm", true)), "wrap para, sg combos");
81                 
82                 return panel;
83         }
84         
85         
86         
87         private JPanel unitsPane() {
88                 JPanel panel = new JPanel(new MigLayout("", "[][]40lp[][]"));
89                 JComboBox combo;
90                 
91                 panel.add(new JLabel("Select your preferred units:"), "span, wrap paragraph");
92                 
93                 
94                 panel.add(new JLabel("Rocket dimensions:"));
95                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_LENGTH));
96                 panel.add(combo, "sizegroup boxes");
97                 
98                 panel.add(new JLabel("Line density:"));
99                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_LINE));
100                 panel.add(combo, "sizegroup boxes, wrap");
101                 
102                 
103                 
104                 panel.add(new JLabel("Motor dimensions:"));
105                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_MOTOR_DIMENSIONS));
106                 panel.add(combo, "sizegroup boxes");
107                 
108                 panel.add(new JLabel("Surface density:"));
109                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_SURFACE));
110                 panel.add(combo, "sizegroup boxes, wrap");
111                 
112
113                 
114                 panel.add(new JLabel("Distance:"));
115                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DISTANCE));
116                 panel.add(combo, "sizegroup boxes");
117                 
118                 panel.add(new JLabel("Bulk density::"));
119                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_BULK));
120                 panel.add(combo, "sizegroup boxes, wrap");
121                 
122
123                 
124                 panel.add(new JLabel("Velocity:"));
125                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_VELOCITY));
126                 panel.add(combo, "sizegroup boxes");
127
128                 panel.add(new JLabel("Surface roughness:"));
129                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ROUGHNESS));
130                 panel.add(combo, "sizegroup boxes, wrap");
131                 
132                 
133                 
134                 panel.add(new JLabel("Acceleration:"));
135                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ACCELERATION));
136                 panel.add(combo, "sizegroup boxes");
137
138                 panel.add(new JLabel("Area:"));
139                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_AREA));
140                 panel.add(combo, "sizegroup boxes, wrap");
141                 
142                 
143
144                 panel.add(new JLabel("Mass:"));
145                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_MASS));
146                 panel.add(combo, "sizegroup boxes");
147                 
148                 panel.add(new JLabel("Angle:"));
149                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ANGLE));
150                 panel.add(combo, "sizegroup boxes, wrap");
151                 
152
153                 
154                 panel.add(new JLabel("Force:"));
155                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_FORCE));
156                 panel.add(combo, "sizegroup boxes");
157                 
158                 panel.add(new JLabel("Roll rate:"));
159                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ROLL));
160                 panel.add(combo, "sizegroup boxes, wrap");
161                 
162
163                 
164                 panel.add(new JLabel("Total impulse:"));
165                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_IMPULSE));
166                 panel.add(combo, "sizegroup boxes");
167                 
168                 panel.add(new JLabel("Temperature:"));
169                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_TEMPERATURE));
170                 panel.add(combo, "sizegroup boxes, wrap");
171                 
172
173                 
174                 panel.add(new JLabel("Stability:"));
175                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_STABILITY));
176                 panel.add(combo, "sizegroup boxes");
177
178                 panel.add(new JLabel("Pressure:"));
179                 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_PRESSURE));
180                 panel.add(combo, "sizegroup boxes, wrap para");
181                 
182                 
183                 
184                 JButton button = new JButton("Default metric");
185                 button.addActionListener(new ActionListener() {
186                         @Override
187                         public void actionPerformed(ActionEvent e) {
188                                 UnitGroup.setDefaultMetricUnits();
189                                 for (DefaultUnitSelector s: unitSelectors)
190                                         s.fireChange();
191                         }
192                 });
193                 panel.add(button, "spanx, split 2, grow");
194                 
195                 button = new JButton("Default imperial");
196                 button.addActionListener(new ActionListener() {
197                         @Override
198                         public void actionPerformed(ActionEvent e) {
199                                 UnitGroup.setDefaultImperialUnits();
200                                 for (DefaultUnitSelector s: unitSelectors)
201                                         s.fireChange();
202                         }
203                 });
204                 panel.add(button, "grow, wrap para");
205                 
206                 
207                 panel.add(new StyledLabel("The effects will take place the next time you open a window.",-2),
208                                 "spanx, wrap");
209                 
210
211                 return panel;
212         }
213         
214         
215         
216         
217         
218         private class DefaultUnitSelector extends AbstractListModel implements ComboBoxModel {
219                 
220                 private final UnitGroup group;
221                 public DefaultUnitSelector(UnitGroup group) {
222                         this.group = group;
223                         unitSelectors.add(this);
224                 }
225                 
226                 @Override
227                 public Object getSelectedItem() {
228                         return group.getDefaultUnit();
229                 }
230                 @Override
231                 public void setSelectedItem(Object item) {
232                         if (!(item instanceof Unit)) {
233                                 throw new IllegalArgumentException("Illegal argument "+item);
234                         }
235                         group.setDefaultUnit(group.getUnitIndex((Unit)item));
236                 }
237                 @Override
238                 public Object getElementAt(int index) {
239                         return group.getUnit(index);
240                 }
241                 @Override
242                 public int getSize() {
243                         return group.getUnitCount();
244                 }
245                 
246                 
247                 public void fireChange() {
248                         this.fireContentsChanged(this, 0, this.getSize());
249                 }
250         }
251         
252
253         
254         private class PrefChoiseSelector extends AbstractListModel implements ComboBoxModel {
255                 private final String preference;
256                 private final String[] descriptions;
257                 
258                 public PrefChoiseSelector(String preference, String ... descriptions) {
259                         this.preference = preference;
260                         this.descriptions = descriptions;
261                 }
262                 
263                 @Override
264                 public Object getSelectedItem() {
265                         return descriptions[Prefs.getChoise(preference, descriptions.length, 0)];
266                 }
267                 
268                 @Override
269                 public void setSelectedItem(Object item) {
270                         if (!(item instanceof String)) {
271                                 throw new IllegalArgumentException("Illegal argument "+item);
272                         }
273                         int index;
274                         for (index = 0; index < descriptions.length; index++) {
275                                 if (((String)item).equalsIgnoreCase(descriptions[index]))
276                                         break;
277                         }
278                         if (index >= descriptions.length) {
279                                 throw new IllegalArgumentException("Illegal argument "+item);
280                         }
281                         
282                         Prefs.putChoise(preference, index);
283                 }
284                 
285                 @Override
286                 public Object getElementAt(int index) {
287                         return descriptions[index];
288                 }
289                 @Override
290                 public int getSize() {
291                         return descriptions.length;
292                 }
293         }
294         
295
296         private class PrefBooleanSelector extends AbstractListModel implements ComboBoxModel {
297                 private final String preference;
298                 private final String trueDesc, falseDesc;
299                 private final boolean def;
300                 
301                 public PrefBooleanSelector(String preference, String falseDescription, 
302                                 String trueDescription, boolean defaultState) {
303                         this.preference = preference;
304                         this.trueDesc = trueDescription;
305                         this.falseDesc = falseDescription;
306                         this.def = defaultState;
307                 }
308                 
309                 @Override
310                 public Object getSelectedItem() {
311                         if (Prefs.NODE.getBoolean(preference, def)) {
312                                 return trueDesc;
313                         } else {
314                                 return falseDesc;
315                         }
316                 }
317                 
318                 @Override
319                 public void setSelectedItem(Object item) {
320                         if (!(item instanceof String)) {
321                                 throw new IllegalArgumentException("Illegal argument "+item);
322                         }
323                         
324                         if (trueDesc.equals(item)) {
325                                 Prefs.NODE.putBoolean(preference, true);
326                         } else if (falseDesc.equals(item)) {
327                                 Prefs.NODE.putBoolean(preference, false);
328                         } else {
329                                 throw new IllegalArgumentException("Illegal argument "+item);
330                         }
331                 }
332                 
333                 @Override
334                 public Object getElementAt(int index) {
335                         switch (index) {
336                         case 0:
337                                 return def ? trueDesc : falseDesc;
338
339                         case 1:
340                                 return def ? falseDesc: trueDesc;
341                                 
342                         default:
343                                 throw new IndexOutOfBoundsException("Boolean asked for index="+index);
344                         }
345                 }
346                 @Override
347                 public int getSize() {
348                         return 2;
349                 }
350         }
351         
352         
353         
354         ////////  Singleton implementation  ////////
355         
356         private static PreferencesDialog dialog = null;
357         
358         public static void showPreferences() {
359                 if (dialog != null) {
360                         dialog.dispose();
361                 }
362                 dialog = new PreferencesDialog();
363                 dialog.setVisible(true);
364         }
365         
366         
367 }