1 package net.sf.openrocket.gui.dialogs.preferences;
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;
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;
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;
28 public class PreferencesDialog extends JDialog {
30 private final List<DefaultUnitSelector> unitSelectors = new ArrayList<DefaultUnitSelector>();
32 private PreferencesDialog() {
33 super((Window)null, "Preferences", Dialog.ModalityType.APPLICATION_MODAL);
35 JPanel panel = new JPanel(new MigLayout("fill, gap unrel","[grow]","[grow][]"));
37 JTabbedPane tabbedPane = new JTabbedPane();
38 panel.add(tabbedPane,"grow, wrap");
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");
46 JButton close = new JButton("Close");
47 close.addActionListener(new ActionListener() {
49 public void actionPerformed(ActionEvent arg0) {
50 PreferencesDialog.this.setVisible(false);
51 PreferencesDialog.this.dispose();
54 panel.add(close,"span, right, tag close");
56 this.setContentPane(panel);
58 this.setLocationRelativeTo(null);
60 this.addWindowListener(new WindowAdapter() {
62 public void windowClosed(WindowEvent e) {
63 Prefs.storeDefaultUnits();
67 GUIUtil.setDisposableDialogOptions(this, close);
71 private JPanel confirmationPane() {
72 JPanel panel = new JPanel(new MigLayout("fill"));
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");
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");
87 private JPanel unitsPane() {
88 JPanel panel = new JPanel(new MigLayout("", "[][]40lp[][]"));
91 panel.add(new JLabel("Select your preferred units:"), "span, wrap paragraph");
94 panel.add(new JLabel("Rocket dimensions:"));
95 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_LENGTH));
96 panel.add(combo, "sizegroup boxes");
98 panel.add(new JLabel("Line density:"));
99 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_LINE));
100 panel.add(combo, "sizegroup boxes, wrap");
104 panel.add(new JLabel("Motor dimensions:"));
105 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_MOTOR_DIMENSIONS));
106 panel.add(combo, "sizegroup boxes");
108 panel.add(new JLabel("Surface density:"));
109 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_SURFACE));
110 panel.add(combo, "sizegroup boxes, wrap");
114 panel.add(new JLabel("Distance:"));
115 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DISTANCE));
116 panel.add(combo, "sizegroup boxes");
118 panel.add(new JLabel("Bulk density::"));
119 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_DENSITY_BULK));
120 panel.add(combo, "sizegroup boxes, wrap");
124 panel.add(new JLabel("Velocity:"));
125 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_VELOCITY));
126 panel.add(combo, "sizegroup boxes");
128 panel.add(new JLabel("Surface roughness:"));
129 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ROUGHNESS));
130 panel.add(combo, "sizegroup boxes, wrap");
134 panel.add(new JLabel("Acceleration:"));
135 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ACCELERATION));
136 panel.add(combo, "sizegroup boxes");
138 panel.add(new JLabel("Area:"));
139 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_AREA));
140 panel.add(combo, "sizegroup boxes, wrap");
144 panel.add(new JLabel("Mass:"));
145 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_MASS));
146 panel.add(combo, "sizegroup boxes");
148 panel.add(new JLabel("Angle:"));
149 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ANGLE));
150 panel.add(combo, "sizegroup boxes, wrap");
154 panel.add(new JLabel("Force:"));
155 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_FORCE));
156 panel.add(combo, "sizegroup boxes");
158 panel.add(new JLabel("Roll rate:"));
159 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_ROLL));
160 panel.add(combo, "sizegroup boxes, wrap");
164 panel.add(new JLabel("Total impulse:"));
165 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_IMPULSE));
166 panel.add(combo, "sizegroup boxes");
168 panel.add(new JLabel("Temperature:"));
169 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_TEMPERATURE));
170 panel.add(combo, "sizegroup boxes, wrap");
174 panel.add(new JLabel("Stability:"));
175 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_STABILITY));
176 panel.add(combo, "sizegroup boxes");
178 panel.add(new JLabel("Pressure:"));
179 combo = new JComboBox(new DefaultUnitSelector(UnitGroup.UNITS_PRESSURE));
180 panel.add(combo, "sizegroup boxes, wrap para");
184 JButton button = new JButton("Default metric");
185 button.addActionListener(new ActionListener() {
187 public void actionPerformed(ActionEvent e) {
188 UnitGroup.setDefaultMetricUnits();
189 for (DefaultUnitSelector s: unitSelectors)
193 panel.add(button, "spanx, split 2, grow");
195 button = new JButton("Default imperial");
196 button.addActionListener(new ActionListener() {
198 public void actionPerformed(ActionEvent e) {
199 UnitGroup.setDefaultImperialUnits();
200 for (DefaultUnitSelector s: unitSelectors)
204 panel.add(button, "grow, wrap para");
207 panel.add(new StyledLabel("The effects will take place the next time you open a window.",-2),
218 private class DefaultUnitSelector extends AbstractListModel implements ComboBoxModel {
220 private final UnitGroup group;
221 public DefaultUnitSelector(UnitGroup group) {
223 unitSelectors.add(this);
227 public Object getSelectedItem() {
228 return group.getDefaultUnit();
231 public void setSelectedItem(Object item) {
232 if (!(item instanceof Unit)) {
233 throw new IllegalArgumentException("Illegal argument "+item);
235 group.setDefaultUnit(group.getUnitIndex((Unit)item));
238 public Object getElementAt(int index) {
239 return group.getUnit(index);
242 public int getSize() {
243 return group.getUnitCount();
247 public void fireChange() {
248 this.fireContentsChanged(this, 0, this.getSize());
254 private class PrefChoiseSelector extends AbstractListModel implements ComboBoxModel {
255 private final String preference;
256 private final String[] descriptions;
258 public PrefChoiseSelector(String preference, String ... descriptions) {
259 this.preference = preference;
260 this.descriptions = descriptions;
264 public Object getSelectedItem() {
265 return descriptions[Prefs.getChoise(preference, descriptions.length, 0)];
269 public void setSelectedItem(Object item) {
270 if (!(item instanceof String)) {
271 throw new IllegalArgumentException("Illegal argument "+item);
274 for (index = 0; index < descriptions.length; index++) {
275 if (((String)item).equalsIgnoreCase(descriptions[index]))
278 if (index >= descriptions.length) {
279 throw new IllegalArgumentException("Illegal argument "+item);
282 Prefs.putChoise(preference, index);
286 public Object getElementAt(int index) {
287 return descriptions[index];
290 public int getSize() {
291 return descriptions.length;
296 private class PrefBooleanSelector extends AbstractListModel implements ComboBoxModel {
297 private final String preference;
298 private final String trueDesc, falseDesc;
299 private final boolean def;
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;
310 public Object getSelectedItem() {
311 if (Prefs.NODE.getBoolean(preference, def)) {
319 public void setSelectedItem(Object item) {
320 if (!(item instanceof String)) {
321 throw new IllegalArgumentException("Illegal argument "+item);
324 if (trueDesc.equals(item)) {
325 Prefs.NODE.putBoolean(preference, true);
326 } else if (falseDesc.equals(item)) {
327 Prefs.NODE.putBoolean(preference, false);
329 throw new IllegalArgumentException("Illegal argument "+item);
334 public Object getElementAt(int index) {
337 return def ? trueDesc : falseDesc;
340 return def ? falseDesc: trueDesc;
343 throw new IndexOutOfBoundsException("Boolean asked for index="+index);
347 public int getSize() {
354 //////// Singleton implementation ////////
356 private static PreferencesDialog dialog = null;
358 public static void showPreferences() {
359 if (dialog != null) {
362 dialog = new PreferencesDialog();
363 dialog.setVisible(true);