Remove FIXME by adding undo point before assigning the preset.
[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.document.OpenRocketDocument;
13 import net.sf.openrocket.gui.dialogs.preset.ComponentPresetChooserDialog;
14 import net.sf.openrocket.l10n.Translator;
15 import net.sf.openrocket.logging.LogHelper;
16 import net.sf.openrocket.preset.ComponentPreset;
17 import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
18 import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
19 import net.sf.openrocket.rocketcomponent.RocketComponent;
20 import net.sf.openrocket.startup.Application;
21 import net.sf.openrocket.util.BugException;
22
23 public class PresetModel extends AbstractListModel implements ComboBoxModel, ComponentChangeListener, DatabaseListener<ComponentPreset> {
24         
25         private static final LogHelper log = Application.getLogger();
26         private static final Translator trans = Application.getTranslator();
27         
28         private static final String NONE_SELECTED = trans.get("lbl.select");
29         private static final String SELECT_DATABASE = trans.get("lbl.database");
30         
31         private final Component parent;
32         private final RocketComponent component;
33         private final OpenRocketDocument document;
34         private ComponentPreset previousPreset;
35         
36         private List<ComponentPreset> presets;
37         
38         public PresetModel(Component parent, OpenRocketDocument document, RocketComponent component) {
39                 this.parent = parent;
40                 this.document = document;
41                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
42                 this.component = component;
43                 previousPreset = component.getPresetComponent();
44                 component.addComponentChangeListener(this);
45         }
46         
47         @Override
48         public int getSize() {
49                 return presets.size() + 2;
50         }
51         
52         @Override
53         public Object getElementAt(int index) {
54                 if (index == 0) {
55                         return NONE_SELECTED;
56                 }
57                 if (index == getSize() - 1) {
58                         return SELECT_DATABASE;
59                 }
60                 return presets.get(index - 1);
61         }
62         
63         @Override
64         public void setSelectedItem(Object item) {
65                 log.user("User selected preset item '" + item + "' for component " + component);
66                 
67                 if (item == null) {
68                         throw new BugException("item is null");
69                 } else if (item.equals(NONE_SELECTED)) {
70                         component.clearPreset();
71                 } else if (item.equals(SELECT_DATABASE)) {
72                         SwingUtilities.invokeLater(new Runnable() {
73                                 @Override
74                                 public void run() {
75                                         ComponentPresetChooserDialog dialog =
76                                                         new ComponentPresetChooserDialog(SwingUtilities.getWindowAncestor(parent), component);
77                                         dialog.setVisible(true);
78                                         ComponentPreset preset = dialog.getSelectedComponentPreset();
79                                         if (preset != null) {
80                                                 setSelectedItem(preset);
81                                         }
82                                 }
83                         });
84                 } else {
85                         document.addUndoPosition("Use Preset " + component.getComponentName());
86                         component.loadPreset((ComponentPreset) item);
87                 }
88         }
89         
90         @Override
91         public Object getSelectedItem() {
92                 ComponentPreset preset = component.getPresetComponent();
93                 if (preset == null) {
94                         return NONE_SELECTED;
95                 } else {
96                         return preset;
97                 }
98         }
99         
100         @Override
101         public void componentChanged(ComponentChangeEvent e) {
102                 if (previousPreset != component.getPresetComponent()) {
103                         previousPreset = component.getPresetComponent();
104                         fireContentsChanged(this, 0, getSize());
105                 }
106         }
107         
108         @Override
109         public void elementAdded(ComponentPreset element, Database<ComponentPreset> source) {
110                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
111                 this.fireContentsChanged(this, 0, getSize());
112         }
113         
114         @Override
115         public void elementRemoved(ComponentPreset element, Database<ComponentPreset> source) {
116                 presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
117                 this.fireContentsChanged(this, 0, getSize());
118         }
119         
120 }