1 package net.sf.openrocket.gui.dialogs;
3 import java.awt.Dialog;
4 import java.awt.Window;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
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;
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;
24 public class CustomMaterialDialog extends JDialog {
26 private final Material originalMaterial;
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;
36 public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
38 this(parent, material, saveOption, title, null);
42 public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
43 String title, String note) {
44 super(parent, "Custom material", Dialog.ModalityType.APPLICATION_MODAL);
46 this.originalMaterial = material;
48 JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel"));
53 panel.add(new JLabel("<html><b>" + title + ":"),
54 "gapleft para, span, wrap" + (note == null ? " para":""));
57 panel.add(new StyledLabel(note, -1), "span, wrap para");
62 panel.add(new JLabel("Material name:"));
63 nameField = new JTextField(15);
64 if (material != null) {
65 nameField.setText(material.getName());
67 panel.add(nameField, "span, growx, wrap");
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() {
78 public void actionPerformed(ActionEvent e) {
82 panel.add(typeBox, "span, growx, wrap");
84 panel.add(new JLabel(material.getType().toString()), "span, growx, wrap");
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");
100 addBox = new JCheckBox("Add material to database");
101 panel.add(addBox,"span, wrap");
104 JButton okButton = new JButton("OK");
105 okButton.addActionListener(new ActionListener() {
107 public void actionPerformed(ActionEvent e) {
109 CustomMaterialDialog.this.setVisible(false);
112 panel.add(okButton,"span, split, tag ok");
114 JButton closeButton = new JButton("Cancel");
115 closeButton.addActionListener(new ActionListener() {
117 public void actionPerformed(ActionEvent e) {
119 CustomMaterialDialog.this.setVisible(false);
122 panel.add(closeButton,"tag cancel");
124 this.setContentPane(panel);
126 this.setLocationByPlatform(true);
127 GUIUtil.setDisposableDialogOptions(this, okButton);
131 public boolean getOkClicked() {
136 public boolean isAddSelected() {
137 return addBox.isSelected();
141 public Material getMaterial() {
146 if (typeBox != null) {
147 type = (Material.Type) typeBox.getSelectedItem();
149 type = originalMaterial.getType();
152 name = nameField.getText().trim();
154 density = this.density.getValue();
156 return Material.newMaterial(type, name, density, true);
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);
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);