001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.data.preferences;
003    
004    import org.openstreetmap.josm.Main;
005    import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
006    import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
007    
008    public abstract class CachedProperty<T> extends AbstractProperty<T> implements PreferenceChangedListener {
009    
010        private final String defaultValueAsString;
011        private T value;
012        private int updateCount;
013    
014        protected CachedProperty(String key, String defaultValueAsString) {
015            super(key, null);
016            Main.pref.addPreferenceChangeListener(this);
017            this.defaultValueAsString = defaultValueAsString;
018            updateValue();
019        }
020    
021        protected void updateValue() {
022            if (!Main.pref.get(key).isEmpty()) {
023                this.value = fromString(Main.pref.get(key));
024            } else {
025                this.value = getDefaultValue();
026            }
027            updateCount++;
028        }
029    
030        protected abstract T fromString(String s);
031    
032        @Override
033        public T get() {
034            return value;
035        }
036    
037        public void put(String value) {
038            Main.pref.put(key, value);
039            this.value = fromString(value);
040            updateCount++;
041        }
042    
043        @Override
044        public final boolean put(T value) {
045            // Not used
046            throw new IllegalAccessError("You cannot use put(T). Use put(String) instead.");
047        }
048    
049        public int getUpdateCount() {
050            return updateCount;
051        }
052        
053        @Override 
054        public T getDefaultValue() { 
055            return fromString(getDefaultValueAsString()); 
056        }
057    
058        public String getDefaultValueAsString() {
059            return defaultValueAsString;
060        }
061    
062        public String getAsString() {
063            return Main.pref.get(getKey(), getDefaultValueAsString());
064        }
065    
066        @Override
067        public void preferenceChanged(PreferenceChangeEvent e) {
068            if (e.getKey().equals(key)) {
069                updateValue();
070            }
071        }
072    
073    }