001    package nl.cwi.sen1.tide;
002    
003    import java.awt.Font;
004    import java.io.File;
005    import java.io.FileInputStream;
006    import java.io.FileOutputStream;
007    import java.io.IOException;
008    import java.io.InputStream;
009    import java.io.OutputStream;
010    import java.util.ArrayList;
011    import java.util.Iterator;
012    import java.util.List;
013    import java.util.Properties;
014    
015    public class PreferenceSet {
016            public static final String PREFS_FILE = ".tiderc";
017    
018            private List<String> preferenceNames;
019            private Properties preferences;
020            private List<PreferenceListener> listeners;
021    
022            private boolean is_clean;
023    
024            public PreferenceSet(Properties defaults) {
025                    preferenceNames = new ArrayList<String>();
026                    preferences = new Properties(defaults);
027                    listeners = new ArrayList<PreferenceListener>();
028            }
029    
030            public void registerPreference(String name) {
031                    preferenceNames.add(name);
032            }
033    
034            public Iterator<String> preferenceNameIterator(String prefix) {
035                    return new PreferenceIterator(prefix, preferenceNames);
036            }
037    
038            public void addPreferenceListener(PreferenceListener listener) {
039                    listeners.add(listener);
040            }
041    
042            public void removePreferenceListener(PreferenceListener listener) {
043                    listeners.remove(listener);
044            }
045    
046            public void firePreferenceChanged(String name, String oldValue,
047                            String newValue) {
048                    System.out.println("preference changed: " + name + " from " + oldValue
049                                    + " into " + newValue);
050    
051                    Iterator<PreferenceListener> iter = listeners.iterator();
052                    while (iter.hasNext()) {
053                            PreferenceListener listener = iter.next();
054                            listener.preferenceChanged(this, name, oldValue, newValue);
055                    }
056            }
057    
058            public void firePreferencesChanged() {
059                    Iterator<PreferenceListener> iter = listeners.iterator();
060                    while (iter.hasNext()) {
061                            PreferenceListener listener = iter.next();
062                            listener.preferencesChanged(this);
063                    }
064            }
065    
066            public void firePreferencesStatusChanged(boolean new_status) {
067                    Iterator<PreferenceListener> iter = listeners.iterator();
068                    while (iter.hasNext()) {
069                            PreferenceListener listener = iter.next();
070                            listener.preferencesStatusChanged(this, new_status);
071                    }
072            }
073    
074            public void loadPreferences() throws IOException {
075                    String path = System.getProperty("user.home");
076                    File file = new File(path, PREFS_FILE);
077                    FileInputStream input = new FileInputStream(file);
078                    loadPreferences(input);
079            }
080    
081            public void loadPreferences(InputStream input) throws IOException {
082                    preferences.load(input);
083                    firePreferencesChanged();
084            }
085    
086            public void savePreferences() throws IOException {
087                    FileOutputStream stream = new FileOutputStream(PREFS_FILE);
088                    savePreferences(stream);
089            }
090    
091            public void savePreferences(OutputStream stream) throws IOException {
092                    preferences.store(stream, "Tide Preferences");
093                    setClean();
094            }
095    
096            public void setClean() {
097                    setStatus(true);
098            }
099    
100            private void setStatus(boolean status) {
101                    if (is_clean != status) {
102                            is_clean = status;
103                            firePreferencesStatusChanged(is_clean);
104                    }
105            }
106    
107            public void setPreference(String name, String value) {
108                    String oldValue = (String) preferences.setProperty(name, value);
109                    if (oldValue == null || !oldValue.equals(value)) {
110                            firePreferenceChanged(name, oldValue, value);
111                            setStatus(false);
112                    }
113            }
114    
115            public void setBooleanPreference(String name, boolean value) {
116                    setPreference(name, new Boolean(value).toString());
117            }
118    
119            public void setIntegerPreference(String name, int value) {
120                    setPreference(name, new Integer(value).toString());
121            }
122    
123            public String getPreference(String name) {
124                    return preferences.getProperty(name);
125            }
126    
127            public Boolean getBooleanPreference(String name) {
128                    String value = getPreference(name);
129                    if (value == null) {
130                            return null;
131                    }
132    
133                    return Boolean.valueOf(value);
134            }
135    
136            public Integer getIntegerPreference(String name) {
137                    String value = getPreference(name);
138                    if (value == null) {
139                            return null;
140                    }
141    
142                    return Integer.valueOf(value);
143            }
144    
145            public Font getFontPreference(String name) {
146                    return Font.decode(getPreference(name));
147            }
148    }
149    
150    class PreferenceIterator implements Iterator<String> {
151            private String prefix;
152            private List<String> names;
153            private int index;
154            private String curName;
155    
156            public PreferenceIterator(String prefix, List<String> names) {
157                    this.prefix = prefix;
158                    this.names = names;
159    
160                    index = 0;
161    
162                    forward();
163            }
164    
165            private void forward() {
166                    while (index < names.size()) {
167                            curName = names.get(index);
168                            if (curName.startsWith(prefix)) {
169                                    break;
170                            }
171                    }
172            }
173    
174            public boolean hasNext() {
175                    return index < names.size();
176            }
177    
178            public String next() {
179                    String name = curName;
180                    index++;
181                    forward();
182    
183                    return name;
184            }
185    
186            public void remove() {
187                    throw new UnsupportedOperationException();
188            }
189    }