1 package net.sf.openrocket.gui.preset;
3 import net.sf.openrocket.database.Database;
4 import net.sf.openrocket.database.DatabaseListener;
5 import net.sf.openrocket.database.Databases;
6 import net.sf.openrocket.gui.dialogs.CustomMaterialDialog;
7 import net.sf.openrocket.l10n.Translator;
8 import net.sf.openrocket.material.Material;
9 import net.sf.openrocket.preset.loader.MaterialHolder;
10 import net.sf.openrocket.startup.Application;
12 import javax.swing.DefaultComboBoxModel;
13 import javax.swing.SwingUtilities;
14 import java.awt.Component;
17 * A material model specifically for presets.
19 public class MaterialModel extends DefaultComboBoxModel implements DatabaseListener<Material> {
21 private static final String CUSTOM = "Custom";
23 private final Database<Material> database;
25 private static final Translator trans = Application.getTranslator();
27 private Material.Type type;
29 private Component parent;
31 public MaterialModel(Component theParent, Material.Type theType, Database<Material> materials) {
35 database.addDatabaseListener(this);
38 public MaterialModel(Component theParent, Material.Type theType) {
44 this.database = Databases.LINE_MATERIAL;
48 this.database = Databases.BULK_MATERIAL;
52 this.database = Databases.SURFACE_MATERIAL;
56 throw new IllegalArgumentException("Unknown material type:" + type);
59 database.addDatabaseListener(this);
63 public void setSelectedItem(Object item) {
65 // Clear selection - huh?
71 // Open custom material dialog in the future, after combo box has closed
72 SwingUtilities.invokeLater(new Runnable() {
75 CustomMaterialDialog dialog = new CustomMaterialDialog(SwingUtilities.getWindowAncestor(parent), (Material) getSelectedItem(), true,
76 //// Define custom material
77 trans.get("MaterialModel.title.Defcustmat"));
79 dialog.setVisible(true);
81 if (!dialog.getOkClicked()) {
85 Material material = dialog.getMaterial();
86 MaterialModel.super.setSelectedItem(material);
87 if (dialog.isAddSelected()) {
88 database.add(material);
94 else if (item instanceof Material) {
95 super.setSelectedItem(item);
98 throw new IllegalArgumentException("Illegal item class " + item.getClass() +
104 public Object getElementAt(int index) {
105 if (index == database.size()) {
108 else if (index >= database.size() + 1) {
111 return database.get(index);
115 public int getSize() {
116 return database.size() + 1;
119 //////// Change listeners
122 public void elementAdded(Material element, Database<Material> source) {
123 this.fireContentsChanged(this, 0, database.size());
127 public void elementRemoved(Material element, Database<Material> source) {
128 this.fireContentsChanged(this, 0, database.size());
131 public Material.Type getType() {
135 public void removeListener() {
136 database.removeChangeListener(this);