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 }