create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / preset / MaterialModel.java
1 package net.sf.openrocket.gui.preset;
2
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;
11
12 import javax.swing.DefaultComboBoxModel;
13 import javax.swing.SwingUtilities;
14 import java.awt.Component;
15
16 /**
17  * A material model specifically for presets.
18  */
19 public class MaterialModel extends DefaultComboBoxModel implements DatabaseListener<Material> {
20
21     private static final String CUSTOM = "Custom";
22
23     private final Database<Material> database;
24
25     private static final Translator trans = Application.getTranslator();
26
27     private Material.Type type;
28
29     private Component parent;
30
31     public MaterialModel(Component theParent, Material.Type theType, Database<Material> materials) {
32         parent = theParent;
33         type = theType;
34         database = materials;
35         database.addDatabaseListener(this);
36     }
37
38     public MaterialModel(Component theParent, Material.Type theType) {
39         parent = theParent;
40         type = theType;
41
42         switch (type) {
43             case LINE:
44                 this.database = Databases.LINE_MATERIAL;
45                 break;
46
47             case BULK:
48                 this.database = Databases.BULK_MATERIAL;
49                 break;
50
51             case SURFACE:
52                 this.database = Databases.SURFACE_MATERIAL;
53                 break;
54
55             default:
56                 throw new IllegalArgumentException("Unknown material type:" + type);
57         }
58
59         database.addDatabaseListener(this);
60     }
61
62     @Override
63     public void setSelectedItem(Object item) {
64         if (item == null) {
65             // Clear selection - huh?
66             return;
67         }
68
69         if (item == CUSTOM) {
70
71             // Open custom material dialog in the future, after combo box has closed
72             SwingUtilities.invokeLater(new Runnable() {
73                 @Override
74                 public void run() {
75                     CustomMaterialDialog dialog = new CustomMaterialDialog(SwingUtilities.getWindowAncestor(parent), (Material) getSelectedItem(), true,
76                             //// Define custom material
77                             trans.get("MaterialModel.title.Defcustmat"));
78
79                     dialog.setVisible(true);
80
81                     if (!dialog.getOkClicked()) {
82                         return;
83                     }
84
85                     Material material = dialog.getMaterial();
86                     MaterialModel.super.setSelectedItem(material);
87                     if (dialog.isAddSelected()) {
88                         database.add(material);
89                     }
90                 }
91             });
92
93         }
94         else if (item instanceof Material) {
95             super.setSelectedItem(item);
96         }
97         else {
98             throw new IllegalArgumentException("Illegal item class " + item.getClass() +
99                     " item=" + item);
100         }
101     }
102
103     @Override
104     public Object getElementAt(int index) {
105         if (index == database.size()) {
106             return CUSTOM;
107         }
108         else if (index >= database.size() + 1) {
109             return null;
110         }
111         return database.get(index);
112     }
113
114     @Override
115     public int getSize() {
116         return database.size() + 1;
117     }
118
119     ////////  Change listeners
120
121     @Override
122     public void elementAdded(Material element, Database<Material> source) {
123         this.fireContentsChanged(this, 0, database.size());
124     }
125
126     @Override
127     public void elementRemoved(Material element, Database<Material> source) {
128         this.fireContentsChanged(this, 0, database.size());
129     }
130
131     public Material.Type getType() {
132         return type;
133     }
134
135     public void removeListener() {
136         database.removeChangeListener(this);
137     }
138 }