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