create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / main / MRUDesignFile.java
1 package net.sf.openrocket.gui.main;
2
3 import net.sf.openrocket.startup.Application;
4 import net.sf.openrocket.startup.Preferences;
5
6 import javax.swing.event.EventListenerList;
7 import java.beans.PropertyChangeEvent;
8 import java.beans.PropertyChangeListener;
9 import java.util.ArrayList;
10 import java.util.List;
11
12 /**
13  * Implements a most-recently-used list backed by preferences.  This is modified/adapted from an example on the
14  * Netbeans wiki.
15  */
16 public class MRUDesignFile {
17
18     public static final String MRU_FILE_LIST_PROPERTY = "MRUFileList";
19
20     public static final int MAX_SIZE = 9;
21
22     private List<String> mruFileList;
23
24     private static MRUDesignFile instance; // The single instance
25
26     private EventListenerList listenerList;
27
28     static {
29         instance = new MRUDesignFile();
30     }
31
32     /**
33      * Returns the single instance, creating one if it's the first time this method is called.
34      *
35      * @return The single instance.
36      */
37     public static MRUDesignFile getInstance() {
38         return instance;
39     }
40
41     /**
42      * Constructor.
43      */
44     protected MRUDesignFile() {
45         mruFileList = new ArrayList<String>(MAX_SIZE);
46         listenerList = new EventListenerList();
47         retrieve();
48     }
49
50     /**
51      * Get the current most-recently-used list of design files.
52      *
53      * @return a list that contains absolute file names
54      */
55     public List<String> getMRUFileList() {
56         return mruFileList;
57     }
58
59     /**
60      * Set the most-recently-used list to the given parameter and fire change events.
61      *
62      * @param list
63      */
64     public void setMRUFileList(List<String> list) {
65         this.mruFileList.clear();
66         this.mruFileList.addAll(list.subList(0, Math.min(list.size(), MAX_SIZE)));
67         firePropertyChange(MRU_FILE_LIST_PROPERTY, null, mruFileList);
68         store();
69     }
70
71     /**
72      * Remove a file from the MRU list and fire change events.
73      *
74      * @param absolutePath the filename to be removed
75      */
76     public void removeFile(String absolutePath) {
77         mruFileList.remove(absolutePath);
78         firePropertyChange(MRU_FILE_LIST_PROPERTY, null, mruFileList);
79         store();
80     }
81
82     /**
83      * Add a file to the MRU list and fire change events.
84      *
85      * @param absolutePath the filename to be added
86      */
87     public void addFile(String absolutePath) {
88         // remove the old
89         mruFileList.remove(absolutePath);
90
91         // add to the top
92         mruFileList.add(0, absolutePath);
93         while (mruFileList.size() > MAX_SIZE) {
94             mruFileList.remove(mruFileList.size() - 1);
95         }
96         firePropertyChange(MRU_FILE_LIST_PROPERTY, null, mruFileList);
97         store();
98     }
99
100     /**
101      * Clear all existing MRU references in the preferences backing store.
102      */
103     private void clear() {
104         Preferences prefs = getPreferences();
105
106         for (int i = 0; i < MAX_SIZE; i++) {
107             prefs.putString(MRU_FILE_LIST_PROPERTY + i, null);
108         }
109     }
110
111     /**
112      * Store the MRU list into the preferences backing store.
113      */
114     protected void store() {
115         Preferences prefs = getPreferences();
116
117         // clear the backing store
118         clear();
119
120         for (int i = 0; i < mruFileList.size(); i++) {
121             String str = mruFileList.get(i);
122             prefs.putString(MRU_FILE_LIST_PROPERTY + i, str);
123         }
124     }
125
126     /**
127      * Load the MRU list from the backing store.
128      */
129     protected void retrieve() {
130         mruFileList.clear();
131         Preferences prefs = getPreferences();
132
133         for (int i = 0; i < MAX_SIZE; i++) {
134             String str = prefs.getString(MRU_FILE_LIST_PROPERTY + i, null);
135             if (str != null) {
136                 mruFileList.add(str);
137             }
138             else {
139                 break;
140             }
141         }
142     }
143
144     /**
145      * {@inheritDoc}
146      */
147     public void addPropertyChangeListener(PropertyChangeListener listener) {
148         listenerList.add(PropertyChangeListener.class, listener);
149     }
150
151     /**
152      * {@inheritDoc}
153      */
154     public void removePropertyChangeListener(PropertyChangeListener listener) {
155         listenerList.remove(PropertyChangeListener.class, listener);
156     }
157
158     protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
159         // Guaranteed to return a non-null array
160         Object[] listeners = listenerList.getListenerList();
161         // Process the listeners last to first, notifying
162         // those that are interested in this event
163         PropertyChangeEvent event = new PropertyChangeEvent(this, propertyName, oldValue, newValue);
164         for (int i = listeners.length - 2; i >= 0; i -= 2) {
165             if (listeners[i] == PropertyChangeListener.class) {
166                 ((PropertyChangeListener) listeners[i + 1]).propertyChange(event);
167             }
168         }
169     }
170
171     /**
172      * Return the Preferences
173      *
174      * @return Preferences
175      */
176     protected final Preferences getPreferences() {
177         return Application.getPreferences();
178     }
179 }