git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@951
180e2498-e6e9-4542-8430-
84ac67f01cd8
*/
public class Databases {
private static final LogHelper log = Application.getLogger();
*/
public class Databases {
private static final LogHelper log = Application.getLogger();
/* Static implementations of specific databases: */
/* Static implementations of specific databases: */
/**
* A database of bulk materials (with bulk densities).
*/
/**
* A database of bulk materials (with bulk densities).
*/
* A database of linear material (with length densities).
*/
public static final Database<Material> LINE_MATERIAL = new Database<Material>();
* A database of linear material (with length densities).
*/
public static final Database<Material> LINE_MATERIAL = new Database<Material>();
// Add default materials
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Acrylic", 1190));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Aluminum", 2700));
// Add default materials
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Acrylic", 1190));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Aluminum", 2700));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Titanium", 4500));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Quantumtubing", 1050));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"BlueTube", 1300));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Titanium", 4500));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Quantumtubing", 1050));
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"BlueTube", 1300));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Ripstopnylon", 0.067));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Mylar", 0.021));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Polyethylenethin", 0.015));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Ripstopnylon", 0.067));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Mylar", 0.021));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Polyethylenethin", 0.015));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Paperoffice", 0.080));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Cellophane", 0.018));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Crepepaper", 0.025));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Paperoffice", 0.080));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Cellophane", 0.018));
SURFACE_MATERIAL.add(Material.newSystemMaterial(Material.Type.SURFACE,"Crepepaper", 0.025));
//// Thread (heavy-duty)
LINE_MATERIAL.add(Material.newSystemMaterial(Material.Type.LINE,"Threadheavy-duty", 0.0003));
//// Elastic cord (round 2mm, 1/16 in)
//// Thread (heavy-duty)
LINE_MATERIAL.add(Material.newSystemMaterial(Material.Type.LINE,"Threadheavy-duty", 0.0003));
//// Elastic cord (round 2mm, 1/16 in)
LINE_MATERIAL.add(Material.newSystemMaterial(Material.Type.LINE,"Tubularnylon14mm", 0.016));
//// Tubular nylon (25 mm, 1 in)
LINE_MATERIAL.add(Material.newSystemMaterial(Material.Type.LINE,"Tubularnylon25mm", 0.029));
LINE_MATERIAL.add(Material.newSystemMaterial(Material.Type.LINE,"Tubularnylon14mm", 0.016));
//// Tubular nylon (25 mm, 1 in)
LINE_MATERIAL.add(Material.newSystemMaterial(Material.Type.LINE,"Tubularnylon25mm", 0.029));
// Add user-defined materials
for (Material m : Application.getPreferences().getUserMaterials()) {
switch (m.getType()) {
case LINE:
LINE_MATERIAL.add(m);
break;
// Add user-defined materials
for (Material m : Application.getPreferences().getUserMaterials()) {
switch (m.getType()) {
case LINE:
LINE_MATERIAL.add(m);
break;
case SURFACE:
SURFACE_MATERIAL.add(m);
break;
case SURFACE:
SURFACE_MATERIAL.add(m);
break;
case BULK:
BULK_MATERIAL.add(m);
break;
case BULK:
BULK_MATERIAL.add(m);
break;
default:
log.warn("ERROR: Unknown material type " + m);
}
}
default:
log.warn("ERROR: Unknown material type " + m);
}
}
// Add database storage listener
MaterialStorage listener = new MaterialStorage();
LINE_MATERIAL.addDatabaseListener(listener);
SURFACE_MATERIAL.addDatabaseListener(listener);
BULK_MATERIAL.addDatabaseListener(listener);
}
// Add database storage listener
MaterialStorage listener = new MaterialStorage();
LINE_MATERIAL.addDatabaseListener(listener);
SURFACE_MATERIAL.addDatabaseListener(listener);
BULK_MATERIAL.addDatabaseListener(listener);
}
/*
* Used just for ensuring initialization of the class.
*/
public static void fakeMethod() {
/*
* Used just for ensuring initialization of the class.
*/
public static void fakeMethod() {
/**
* Find a material from the database with the specified type and name. Returns
* <code>null</code> if the specified material could not be found.
/**
* Find a material from the database with the specified type and name. Returns
* <code>null</code> if the specified material could not be found.
default:
throw new IllegalArgumentException("Illegal material type: " + type);
}
default:
throw new IllegalArgumentException("Illegal material type: " + type);
}
for (Material m : db) {
if (m.getName().equalsIgnoreCase(name)) {
return m;
for (Material m : db) {
if (m.getName().equalsIgnoreCase(name)) {
return m;
/**
* Find a material from the database or return a new user defined material if the specified
* material with the specified density is not found.
/**
* Find a material from the database or return a new user defined material if the specified
* material with the specified density is not found.
default:
throw new IllegalArgumentException("Illegal material type: " + type);
}
default:
throw new IllegalArgumentException("Illegal material type: " + type);
}
Material bestMatch = null;
Material bestMatch = null;
// Alter the search mechanism to handle older specifications.
// If a key is specified, then we match on key, if one is found.
// Otherwise we return the material which matches on name.
// this requires us to loop through the entire db at least once to look for the key.
for (Material m : db) {
// perfect match based on key.
// Alter the search mechanism to handle older specifications.
// If a key is specified, then we match on key, if one is found.
// Otherwise we return the material which matches on name.
// this requires us to loop through the entire db at least once to look for the key.
for (Material m : db) {
// perfect match based on key.
- if ( key != null && m.getKey().equals(key) && MathUtil.equals(m.getDensity(), density) ) {
- return m;
+ if ( key != null && m.getKey().equals(key) ) {
+ // Exact match
+ if ( MathUtil.equals(m.getDensity(), density) ) {
+ return m;
+ }
+ // Custom material with standard name
+ return Material.newUserMaterialWithKey(type, key, m.getName(), density);
}
if (m.getName().equalsIgnoreCase(name) && MathUtil.equals(m.getDensity(), density)) {
bestMatch = m;
}
if (m.getName().equalsIgnoreCase(name) && MathUtil.equals(m.getDensity(), density)) {
bestMatch = m;
}
return Material.newUserMaterial(type, name, density);
}
}
return Material.newUserMaterial(type, name, density);
}
public class CustomMaterialDialog extends JDialog {
private final Material originalMaterial;
public class CustomMaterialDialog extends JDialog {
private final Material originalMaterial;
private boolean okClicked = false;
private JComboBox typeBox;
private JTextField nameField;
private boolean okClicked = false;
private JComboBox typeBox;
private JTextField nameField;
String title) {
this(parent, material, saveOption, title, null);
}
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);
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;
this.originalMaterial = material;
JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel"));
JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel"));
// Add title and note
if (title != null) {
panel.add(new JLabel("<html><b>" + title + ":"),
// Add title and note
if (title != null) {
panel.add(new JLabel("<html><b>" + title + ":"),
if (note != null) {
panel.add(new StyledLabel(note, -1), "span, wrap para");
}
if (note != null) {
panel.add(new StyledLabel(note, -1), "span, wrap para");
}
//// Material name
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
//// Material name
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
nameField.setText(material.getName());
}
panel.add(nameField, "span, growx, wrap");
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) {
// Material type (if not known)
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialtype")));
if (material == null) {
} else {
panel.add(new JLabel(material.getType().toString()), "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();
// Material density:
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialdensity")));
densitySpinner = new JSpinner();
panel.add(densityUnit, "w 30lp");
panel.add(new JPanel(), "growx, wrap");
updateDensityModel();
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");
}
// 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"));
//// OK button
JButton okButton = new JButton(trans.get("dlg.but.ok"));
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
panel.add(okButton,"span, split, tag ok");
}
});
panel.add(okButton,"span, split, tag ok");
//// Cancel
JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
closeButton.addActionListener(new ActionListener() {
//// Cancel
JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
closeButton.addActionListener(new ActionListener() {
}
});
panel.add(closeButton,"tag cancel");
}
});
panel.add(closeButton,"tag cancel");
this.setContentPane(panel);
this.pack();
this.setLocationByPlatform(true);
GUIUtil.setDisposableDialogOptions(this, okButton);
}
this.setContentPane(panel);
this.pack();
this.setLocationByPlatform(true);
GUIUtil.setDisposableDialogOptions(this, okButton);
}
public boolean getOkClicked() {
return okClicked;
}
public boolean getOkClicked() {
return okClicked;
}
public boolean isAddSelected() {
return addBox.isSelected();
}
public boolean isAddSelected() {
return addBox.isSelected();
}
public Material getMaterial() {
Material.Type type;
String name;
double density;
public Material getMaterial() {
Material.Type type;
String name;
double density;
if (typeBox != null) {
type = (Material.Type) typeBox.getSelectedItem();
} else {
type = originalMaterial.getType();
}
if (typeBox != null) {
type = (Material.Type) typeBox.getSelectedItem();
} else {
type = originalMaterial.getType();
}
name = nameField.getText().trim();
name = nameField.getText().trim();
density = this.density.getValue();
density = this.density.getValue();
-
- return Material.newUserMaterial(type, name, density);
+
+ // If the name has not changed from the original name and we started with a system material.
+ if ( name.equals( originalMaterial.getName()) ) {
+ return Material.newUserMaterialWithKey(type, originalMaterial.getKey(), originalMaterial.getName(), density);
+ } else {
+ return Material.newUserMaterial(type, name, density);
+ }
private void updateDensityModel() {
if (originalMaterial != null) {
if (density == null) {
private void updateDensityModel() {
if (originalMaterial != null) {
if (density == null) {
/**
* Return a new user defined material of the specified type and localizable key.
*/
/**
* Return a new user defined material of the specified type and localizable key.
*/
- public static Material newUserMaterialWithKey(Type type, String key, double density) {
+ public static Material newUserMaterialWithKey(Type type, String key, String name, double density) {
switch (type) {
case LINE:
switch (type) {
case LINE:
- return new Material.Line(null, key, density, true);
+ return new Material.Line(name, key, density, true);
- return new Material.Surface(null, key, density, true);
+ return new Material.Surface(name, key, density, true);
- return new Material.Bulk(null, key, density, true);
+ return new Material.Bulk(name, key, density, true);
default:
throw new IllegalArgumentException("Unknown material type: " + type);
default:
throw new IllegalArgumentException("Unknown material type: " + type);