When creating a new user material from an existing material (ie, key), make certain...
[debian/openrocket] / core / src / net / sf / openrocket / gui / dialogs / CustomMaterialDialog.java
1 package net.sf.openrocket.gui.dialogs;
2
3 import java.awt.Dialog;
4 import java.awt.Window;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7
8 import javax.swing.JButton;
9 import javax.swing.JCheckBox;
10 import javax.swing.JComboBox;
11 import javax.swing.JDialog;
12 import javax.swing.JLabel;
13 import javax.swing.JPanel;
14 import javax.swing.JSpinner;
15 import javax.swing.JTextField;
16
17 import net.miginfocom.swing.MigLayout;
18 import net.sf.openrocket.gui.adaptors.DoubleModel;
19 import net.sf.openrocket.gui.components.StyledLabel;
20 import net.sf.openrocket.gui.components.UnitSelector;
21 import net.sf.openrocket.gui.util.GUIUtil;
22 import net.sf.openrocket.l10n.Translator;
23 import net.sf.openrocket.material.Material;
24 import net.sf.openrocket.startup.Application;
25
26 public class CustomMaterialDialog extends JDialog {
27
28         private final Material originalMaterial;
29
30         private boolean okClicked = false;
31         private JComboBox typeBox;
32         private JTextField nameField;
33         private DoubleModel density;
34         private JSpinner densitySpinner;
35         private UnitSelector densityUnit;
36         private JCheckBox addBox;
37         private static final Translator trans = Application.getTranslator();
38
39         public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
40                         String title) {
41                 this(parent, material, saveOption, title, null);
42         }
43
44
45         public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
46                         String title, String note) {
47                 //// Custom material
48                 super(parent, trans.get("custmatdlg.title.Custommaterial"), Dialog.ModalityType.APPLICATION_MODAL);
49
50                 this.originalMaterial = material;
51
52                 JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel"));
53
54
55                 // Add title and note
56                 if (title != null) {
57                         panel.add(new JLabel("<html><b>" + title + ":"), 
58                                         "gapleft para, span, wrap" + (note == null ? " para":""));
59                 }
60                 if (note != null) {
61                         panel.add(new StyledLabel(note, -1), "span, wrap para");
62                 }
63
64
65                 //// Material name
66                 panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
67                 nameField = new JTextField(15);
68                 if (material != null) {
69                         nameField.setText(material.getName());
70                 }
71                 panel.add(nameField, "span, growx, wrap");
72
73
74                 // Material type (if not known)
75                 panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialtype")));
76                 if (material == null) {
77                         typeBox = new JComboBox(Material.Type.values());
78                         typeBox.setSelectedItem(Material.Type.BULK);
79                         typeBox.setEditable(false);
80                         typeBox.addActionListener(new ActionListener() {
81                                 @Override
82                                 public void actionPerformed(ActionEvent e) {
83                                         updateDensityModel();
84                                 }
85                         });
86                         panel.add(typeBox, "span, growx, wrap");
87                 } else {
88                         panel.add(new JLabel(material.getType().toString()), "span, growx, wrap");
89                 }
90
91
92                 // Material density:
93                 panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialdensity")));
94                 densitySpinner = new JSpinner();
95                 panel.add(densitySpinner, "w 70lp");
96                 densityUnit = new UnitSelector((DoubleModel)null);
97                 panel.add(densityUnit, "w 30lp");
98                 panel.add(new JPanel(), "growx, wrap");
99                 updateDensityModel();
100
101
102                 // Save option
103                 if (saveOption) {
104                         //// Add material to database
105                         addBox = new JCheckBox(trans.get("custmatdlg.checkbox.Addmaterial"));
106                         panel.add(addBox,"span, wrap");
107                 }
108
109                 //// OK button
110                 JButton okButton = new JButton(trans.get("dlg.but.ok"));
111
112                 okButton.addActionListener(new ActionListener() {
113                         @Override
114                         public void actionPerformed(ActionEvent e) {
115                                 okClicked = true;
116                                 CustomMaterialDialog.this.setVisible(false);
117                         }
118                 });
119                 panel.add(okButton,"span, split, tag ok");
120
121                 ////  Cancel
122                 JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
123                 closeButton.addActionListener(new ActionListener() {
124                         @Override
125                         public void actionPerformed(ActionEvent e) {
126                                 okClicked = false;
127                                 CustomMaterialDialog.this.setVisible(false);
128                         }
129                 });
130                 panel.add(closeButton,"tag cancel");
131
132                 this.setContentPane(panel);
133                 this.pack();
134                 this.setLocationByPlatform(true);
135                 GUIUtil.setDisposableDialogOptions(this, okButton);
136         }
137
138
139         public boolean getOkClicked() {
140                 return okClicked;
141         }
142
143
144         public boolean isAddSelected() {
145                 return addBox.isSelected();
146         }
147
148
149         public Material getMaterial() {
150                 Material.Type type;
151                 String name;
152                 double density;
153
154                 if (typeBox != null) {
155                         type = (Material.Type) typeBox.getSelectedItem();
156                 } else {
157                         type = originalMaterial.getType();
158                 }
159
160                 name = nameField.getText().trim();
161
162                 density = this.density.getValue();
163
164                 // If the name has not changed from the original name and we started with a system material.
165                 if ( name.equals( originalMaterial.getName()) ) {
166                         return Material.newUserMaterialWithKey(type, originalMaterial.getKey(), originalMaterial.getName(), density);
167                 } else {
168                         return Material.newUserMaterial(type, name, density);
169                 }
170         }
171
172
173         private void updateDensityModel() {
174                 if (originalMaterial != null) {
175                         if (density == null) {
176                                 density = new DoubleModel(originalMaterial.getDensity(),
177                                                 originalMaterial.getType().getUnitGroup(), 0);
178                                 densitySpinner.setModel(density.getSpinnerModel());
179                                 densityUnit.setModel(density);
180                         }
181                 } else {
182                         Material.Type type = (Material.Type) typeBox.getSelectedItem();
183                         density = new DoubleModel(0, type.getUnitGroup(), 0);
184                         densitySpinner.setModel(density.getSpinnerModel());
185                         densityUnit.setModel(density);
186                 }
187         }
188 }