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