package net.sf.openrocket.gui.dialogs;
import java.awt.Dialog;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.database.Databases;
import net.sf.openrocket.gui.SpinnerEditor;
import net.sf.openrocket.gui.adaptors.DoubleModel;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.UnitSelector;
import net.sf.openrocket.gui.util.GUIUtil;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.startup.Application;
public class CustomMaterialDialog extends JDialog {
private static final Translator trans = Application.getTranslator();
private final Material originalMaterial;
private boolean okClicked = false;
private JComboBox typeBox;
private JTextField nameField;
private DoubleModel density;
private JSpinner densitySpinner;
private UnitSelector densityUnit;
private JCheckBox addBox;
public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
String title) {
this(parent, material, saveOption, title, null);
}
public CustomMaterialDialog(Window parent, Material material, boolean saveOption,
String title, String note) {
//// Custom material
super(parent, trans.get("custmatdlg.title.Custommaterial"), Dialog.ModalityType.APPLICATION_MODAL);
this.originalMaterial = material;
JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel"));
// Add title and note
if (title != null) {
panel.add(new JLabel("<html><b>" + title + ":"),
"gapleft para, span, wrap" + (note == null ? " para" : ""));
}
if (note != null) {
panel.add(new StyledLabel(note, -1), "span, wrap para");
}
//// Material name
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
nameField = new JTextField(15);
if (material != null) {
nameField.setText(material.getName());
}
panel.add(nameField, "span, growx, wrap");
// Material type (if not known)
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialtype")));
if (material == null) {
typeBox = new JComboBox(Material.Type.values());
typeBox.setSelectedItem(Material.Type.BULK);
typeBox.setEditable(false);
typeBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateDensityModel();
}
});
panel.add(typeBox, "span, growx, wrap");
} else {
panel.add(new JLabel(material.getType().toString()), "span, growx, wrap");
}
// Material density:
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialdensity")));
densitySpinner = new JSpinner();
panel.add(densitySpinner, "w 70lp");
densityUnit = new UnitSelector((DoubleModel) null);
panel.add(densityUnit, "w 30lp");
panel.add(new JPanel(), "growx, wrap");
updateDensityModel();
// Save option
if (saveOption) {
//// Add material to database
addBox = new JCheckBox(trans.get("custmatdlg.checkbox.Addmaterial"));
panel.add(addBox, "span, wrap");
}
//// OK button
JButton okButton = new JButton(trans.get("dlg.but.ok"));
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
okClicked = true;
CustomMaterialDialog.this.setVisible(false);
}
});
panel.add(okButton, "span, split, tag ok");
//// Cancel
JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
okClicked = false;
CustomMaterialDialog.this.setVisible(false);
}
});
panel.add(closeButton, "tag cancel");
this.setContentPane(panel);
this.pack();
this.setLocationByPlatform(true);
GUIUtil.setDisposableDialogOptions(this, okButton);
}
public boolean getOkClicked() {
return okClicked;
}
public boolean isAddSelected() {
return addBox.isSelected();
}
public Material getMaterial() {
Material.Type type;
String name;
double materialDensity;
if (typeBox != null) {
type = (Material.Type) typeBox.getSelectedItem();
} else {
type = originalMaterial.getType();
}
name = nameField.getText().trim();
materialDensity = this.density.getValue();
return Databases.findMaterial(type, name, materialDensity);
}
private void updateDensityModel() {
if (originalMaterial != null) {
if (density == null) {
density = new DoubleModel(originalMaterial.getDensity(),
originalMaterial.getType().getUnitGroup(), 0);
densitySpinner.setModel(density.getSpinnerModel());
densitySpinner.setEditor(new SpinnerEditor(densitySpinner));
densityUnit.setModel(density);
}
} else {
Material.Type type = (Material.Type) typeBox.getSelectedItem();
density = new DoubleModel(0, type.getUnitGroup(), 0);
densitySpinner.setModel(density.getSpinnerModel());
densitySpinner.setEditor(new SpinnerEditor(densitySpinner));
densityUnit.setModel(density);
}
}
}