*/
public class Databases {
private static final LogHelper log = Application.getLogger();
-
+
/* Static implementations of specific databases: */
-
+
/**
* 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>();
-
-
-
+
+
+
static {
-
+
// 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));
-
+
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));
-
+
//// 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));
-
-
+
+
// 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.
default:
throw new IllegalArgumentException("Illegal material type: " + type);
}
-
+
for (Material m : db) {
if (m.getName().equalsIgnoreCase(name)) {
return m;
}
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.
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;
}
return Material.newUserMaterial(type, name, density);
}
-
-
+
+
}
public class CustomMaterialDialog extends JDialog {
private final Material originalMaterial;
-
+
private boolean okClicked = false;
private JComboBox typeBox;
private JTextField nameField;
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 + ":"),
if (note != null) {
panel.add(new StyledLabel(note, -1), "span, wrap para");
}
-
+
//// Material name
panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialname")));
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) {
} 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(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) {
}
});
panel.add(okButton,"span, split, tag ok");
-
+
//// Cancel
JButton closeButton = new JButton(trans.get("dlg.but.cancel"));
closeButton.addActionListener(new ActionListener() {
}
});
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) {
/**
* 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);