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 }