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.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;
27 public class CustomMaterialDialog extends JDialog {
28 private static final Translator trans = Application.getTranslator();
30 private final Material originalMaterial;
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;
40 public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
42 this(parent, material, saveOption, title, null);
46 public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
47 String title, String note) {
49 super(parent, trans.get("custmatdlg.title.Custommaterial"), Dialog.ModalityType.APPLICATION_MODAL);
51 this.originalMaterial = material;
53 JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel"));
58 panel.add(new JLabel("<html><b>" + title + ":"),
59 "gapleft para, span, wrap" + (note == null ? " para" : ""));
62 panel.add(new StyledLabel(note, -1), "span, wrap para");
67 panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
68 nameField = new JTextField(15);
69 if (material != null) {
70 nameField.setText(material.getName());
72 panel.add(nameField, "span, growx, wrap");
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() {
83 public void actionPerformed(ActionEvent e) {
87 panel.add(typeBox, "span, growx, wrap");
89 panel.add(new JLabel(material.getType().toString()), "span, growx, wrap");
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();
105 //// Add material to database
106 addBox = new JCheckBox(trans.get("custmatdlg.checkbox.Addmaterial"));
107 panel.add(addBox, "span, wrap");
111 JButton okButton = new JButton(trans.get("dlg.but.ok"));
113 okButton.addActionListener(new ActionListener() {
115 public void actionPerformed(ActionEvent e) {
117 CustomMaterialDialog.this.setVisible(false);
120 panel.add(okButton, "span, split, tag ok");
123 JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
124 closeButton.addActionListener(new ActionListener() {
126 public void actionPerformed(ActionEvent e) {
128 CustomMaterialDialog.this.setVisible(false);
131 panel.add(closeButton, "tag cancel");
133 this.setContentPane(panel);
135 this.setLocationByPlatform(true);
136 GUIUtil.setDisposableDialogOptions(this, okButton);
140 public boolean getOkClicked() {
145 public boolean isAddSelected() {
146 return addBox.isSelected();
150 public Material getMaterial() {
153 double materialDensity;
155 if (typeBox != null) {
156 type = (Material.Type) typeBox.getSelectedItem();
158 type = originalMaterial.getType();
161 name = nameField.getText().trim();
163 materialDensity = this.density.getValue();
165 return Databases.findMaterial(type, name, materialDensity);
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);
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);