When creating a new user material from an existing material (ie, key), make certain to use the name associated with the material because the key might not be localizable.
This commit is contained in:
parent
f9c450c79c
commit
a373126c41
@ -14,9 +14,9 @@ import net.sf.openrocket.util.MathUtil;
|
||||
*/
|
||||
public class Databases {
|
||||
private static final LogHelper log = Application.getLogger();
|
||||
|
||||
|
||||
/* Static implementations of specific databases: */
|
||||
|
||||
|
||||
/**
|
||||
* A database of bulk materials (with bulk densities).
|
||||
*/
|
||||
@ -29,11 +29,11 @@ public class Databases {
|
||||
* A database of linear material (with length densities).
|
||||
*/
|
||||
public static final Database<Material> LINE_MATERIAL = new Database<Material>();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static {
|
||||
|
||||
|
||||
// Add default materials
|
||||
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Acrylic", 1190));
|
||||
BULK_MATERIAL.add(Material.newSystemMaterial(Material.Type.BULK,"Aluminum", 2700));
|
||||
@ -62,7 +62,7 @@ public class Databases {
|
||||
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));
|
||||
@ -71,7 +71,7 @@ public class Databases {
|
||||
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)
|
||||
@ -94,44 +94,44 @@ public class Databases {
|
||||
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;
|
||||
|
||||
|
||||
case SURFACE:
|
||||
SURFACE_MATERIAL.add(m);
|
||||
break;
|
||||
|
||||
|
||||
case BULK:
|
||||
BULK_MATERIAL.add(m);
|
||||
break;
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 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.
|
||||
@ -155,7 +155,7 @@ public class Databases {
|
||||
default:
|
||||
throw new IllegalArgumentException("Illegal material type: " + type);
|
||||
}
|
||||
|
||||
|
||||
for (Material m : db) {
|
||||
if (m.getName().equalsIgnoreCase(name)) {
|
||||
return m;
|
||||
@ -163,8 +163,8 @@ public class Databases {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Find a material from the database or return a new user defined material if the specified
|
||||
* material with the specified density is not found.
|
||||
@ -189,17 +189,22 @@ public class Databases {
|
||||
default:
|
||||
throw new IllegalArgumentException("Illegal material type: " + type);
|
||||
}
|
||||
|
||||
|
||||
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.
|
||||
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;
|
||||
@ -210,6 +215,6 @@ public class Databases {
|
||||
}
|
||||
return Material.newUserMaterial(type, name, density);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ import net.sf.openrocket.startup.Application;
|
||||
public class CustomMaterialDialog extends JDialog {
|
||||
|
||||
private final Material originalMaterial;
|
||||
|
||||
|
||||
private boolean okClicked = false;
|
||||
private JComboBox typeBox;
|
||||
private JTextField nameField;
|
||||
@ -40,18 +40,18 @@ public class CustomMaterialDialog extends JDialog {
|
||||
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 + ":"),
|
||||
@ -60,7 +60,7 @@ public class CustomMaterialDialog extends JDialog {
|
||||
if (note != null) {
|
||||
panel.add(new StyledLabel(note, -1), "span, wrap para");
|
||||
}
|
||||
|
||||
|
||||
|
||||
//// Material name
|
||||
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
|
||||
@ -69,8 +69,8 @@ public class CustomMaterialDialog extends JDialog {
|
||||
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) {
|
||||
@ -87,8 +87,8 @@ public class CustomMaterialDialog extends JDialog {
|
||||
} 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();
|
||||
@ -97,18 +97,18 @@ public class CustomMaterialDialog extends JDialog {
|
||||
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) {
|
||||
@ -117,7 +117,7 @@ public class CustomMaterialDialog extends JDialog {
|
||||
}
|
||||
});
|
||||
panel.add(okButton,"span, split, tag ok");
|
||||
|
||||
|
||||
//// Cancel
|
||||
JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
|
||||
closeButton.addActionListener(new ActionListener() {
|
||||
@ -128,43 +128,48 @@ public class CustomMaterialDialog extends JDialog {
|
||||
}
|
||||
});
|
||||
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 density;
|
||||
|
||||
|
||||
if (typeBox != null) {
|
||||
type = (Material.Type) typeBox.getSelectedItem();
|
||||
} else {
|
||||
type = originalMaterial.getType();
|
||||
}
|
||||
|
||||
|
||||
name = nameField.getText().trim();
|
||||
|
||||
|
||||
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) {
|
||||
|
@ -218,16 +218,16 @@ public abstract class Material implements Comparable<Material> {
|
||||
/**
|
||||
* 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:
|
||||
return new Material.Line(null, key, density, true);
|
||||
return new Material.Line(name, key, density, true);
|
||||
|
||||
case SURFACE:
|
||||
return new Material.Surface(null, key, density, true);
|
||||
return new Material.Surface(name, key, density, true);
|
||||
|
||||
case BULK:
|
||||
return new Material.Bulk(null, key, density, true);
|
||||
return new Material.Bulk(name, key, density, true);
|
||||
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown material type: " + type);
|
||||
|
Loading…
x
Reference in New Issue
Block a user