From b84013fc07d691a6a4479a789b8edbad8b5493b9 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Sat, 4 Aug 2012 08:37:39 +0000 Subject: [PATCH] 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. git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@951 180e2498-e6e9-4542-8430-84ac67f01cd8 --- .../net/sf/openrocket/database/Databases.java | 61 +++++++++-------- .../gui/dialogs/CustomMaterialDialog.java | 67 ++++++++++--------- .../net/sf/openrocket/material/Material.java | 8 +-- 3 files changed, 73 insertions(+), 63 deletions(-) diff --git a/core/src/net/sf/openrocket/database/Databases.java b/core/src/net/sf/openrocket/database/Databases.java index 8be3574d..28b50dcb 100644 --- a/core/src/net/sf/openrocket/database/Databases.java +++ b/core/src/net/sf/openrocket/database/Databases.java @@ -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 LINE_MATERIAL = new Database(); - - - + + + 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 * null 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); } - - + + } diff --git a/core/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java b/core/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java index 8172e1fe..ed1d97cf 100644 --- a/core/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java +++ b/core/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java @@ -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("" + 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) { diff --git a/core/src/net/sf/openrocket/material/Material.java b/core/src/net/sf/openrocket/material/Material.java index 912e85cc..f197de61 100644 --- a/core/src/net/sf/openrocket/material/Material.java +++ b/core/src/net/sf/openrocket/material/Material.java @@ -218,16 +218,16 @@ public abstract class Material implements Comparable { /** * 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); -- 2.30.2