Moved the ComponentPresetChooserDialog from the BodyTubeConfig temporary button to...
[debian/openrocket] / core / src / net / sf / openrocket / gui / adaptors / PresetModel.java
1 package net.sf.openrocket.gui.adaptors;
2
3 import java.awt.Component;
4 import java.util.List;
5
6 import javax.swing.AbstractListModel;
7 import javax.swing.ComboBoxModel;
8 import javax.swing.SwingUtilities;
9
10 import net.sf.openrocket.database.Database;
11 import net.sf.openrocket.database.DatabaseListener;
12 import net.sf.openrocket.gui.dialogs.preset.ComponentPresetChooserDialog;
13 import net.sf.openrocket.l10n.Translator;
14 import net.sf.openrocket.logging.LogHelper;
15 import net.sf.openrocket.preset.ComponentPreset;
16 import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
17 import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
18 import net.sf.openrocket.rocketcomponent.RocketComponent;
19 import net.sf.openrocket.startup.Application;
20
21 public class PresetModel extends AbstractListModel implements ComboBoxModel, ComponentChangeListener, DatabaseListener<ComponentPreset> {
22         
23         private static final LogHelper log = Application.getLogger();
24         private static final Translator trans = Application.getTranslator();
25         
26         private static final String NONE_SELECTED = "";
27         private static final String SELECT_DATABASE = trans.get("lbl.database");
28         
29         private final Component parent;
30         private final RocketComponent component;
31         private ComponentPreset previousPreset;
32         
33         private List<ComponentPreset> presets;
34         
35         public PresetModel(Component parent, RocketComponent component) {
36                 this.parent = parent;
37                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
38                 this.component = component;
39                 previousPreset = component.getPresetComponent();
40                 component.addComponentChangeListener(this);
41         }
42         
43         @Override
44         public int getSize() {
45                 return presets.size() + 2;
46         }
47         
48         @Override
49         public Object getElementAt(int index) {
50                 if (index == 0) {
51                         return NONE_SELECTED;
52                 }
53                 if (index == getSize() - 1) {
54                         return SELECT_DATABASE;
55                 }
56                 return presets.get(index - 1);
57         }
58         
59         @Override
60         public void setSelectedItem(Object item) {
61                 log.user("User selected preset item '" + item + "' for component " + component);
62                 
63                 if (item == null) {
64                         // FIXME:  What to do?
65                 } else if (item.equals(NONE_SELECTED)) {
66                         component.clearPreset();
67                 } else if (item.equals(SELECT_DATABASE)) {
68                         // FIXME - when the dialog first appears, the preset drop down still is open and has focus.
69                         // we need to force focus to the new dialog.
70                         ComponentPresetChooserDialog dialog = 
71                                         new ComponentPresetChooserDialog( SwingUtilities.getWindowAncestor(PresetModel.this.parent),
72                                                         PresetModel.this.component);
73                         dialog.setVisible(true);
74                         ComponentPreset preset = dialog.getSelectedComponentPreset();
75                         setSelectedItem(preset);
76                 } else {
77                         // FIXME: Add undo point here
78                         component.loadPreset((ComponentPreset) item);
79                 }
80         }
81         
82         @Override
83         public Object getSelectedItem() {
84                 ComponentPreset preset = component.getPresetComponent();
85                 if (preset == null) {
86                         return NONE_SELECTED;
87                 } else {
88                         return preset;
89                 }
90         }
91         
92         @Override
93         public void componentChanged(ComponentChangeEvent e) {
94                 if (previousPreset != component.getPresetComponent()) {
95                         previousPreset = component.getPresetComponent();
96                         fireContentsChanged(this, 0, getSize());
97                 }
98         }
99         
100         @Override
101         public void elementAdded(ComponentPreset element, Database<ComponentPreset> source) {
102                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
103                 this.fireContentsChanged(this, 0, getSize());
104         }
105
106         @Override
107         public void elementRemoved(ComponentPreset element, Database<ComponentPreset> source) {
108                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
109                 this.fireContentsChanged(this, 0, getSize());
110         }
111
112 }