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