9f148063a7a027a57c31dcf28bcca633480ec5a3
[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                         SwingUtilities.invokeLater( new Runnable() {
69                                 @Override
70                                 public void run() {
71                                         ComponentPresetChooserDialog dialog = 
72                                                         new ComponentPresetChooserDialog( SwingUtilities.getWindowAncestor(PresetModel.this.parent),
73                                                                         PresetModel.this.component);
74                                         dialog.setVisible(true);
75                                         ComponentPreset preset = dialog.getSelectedComponentPreset();
76                                         setSelectedItem(preset);
77
78                                 }
79                         });
80                 } else {
81                         // FIXME: Add undo point here
82                         component.loadPreset((ComponentPreset) item);
83                 }
84         }
85
86         @Override
87         public Object getSelectedItem() {
88                 ComponentPreset preset = component.getPresetComponent();
89                 if (preset == null) {
90                         return NONE_SELECTED;
91                 } else {
92                         return preset;
93                 }
94         }
95
96         @Override
97         public void componentChanged(ComponentChangeEvent e) {
98                 if (previousPreset != component.getPresetComponent()) {
99                         previousPreset = component.getPresetComponent();
100                         fireContentsChanged(this, 0, getSize());
101                 }
102         }
103
104         @Override
105         public void elementAdded(ComponentPreset element, Database<ComponentPreset> source) {
106                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
107                 this.fireContentsChanged(this, 0, getSize());
108         }
109
110         @Override
111         public void elementRemoved(ComponentPreset element, Database<ComponentPreset> source) {
112                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
113                 this.fireContentsChanged(this, 0, getSize());
114         }
115
116 }