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