// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.preferences;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
public abstract class CachedProperty<T> extends AbstractProperty<T> implements PreferenceChangedListener {
private final String defaultValueAsString;
private T value;
private int updateCount;
protected CachedProperty(String key, String defaultValueAsString) {
super(key, null);
Main.pref.addKeyPreferenceChangeListener(key, this);
this.defaultValueAsString = defaultValueAsString;
updateValue();
}
protected final void updateValue() {
if (!Main.pref.get(key).isEmpty()) {
this.value = fromString(Main.pref.get(key));
} else {
this.value = getDefaultValue();
}
updateCount++;
}
protected abstract T fromString(String s);
@Override
public T get() {
return value;
}
public void put(String value) {
Main.pref.put(key, value);
this.value = fromString(value);
updateCount++;
}
@Override
public final boolean put(T value) {
// Not used
throw new IllegalAccessError("You cannot use put(T). Use put(String) instead.");
}
public int getUpdateCount() {
return updateCount;
}
@Override
public T getDefaultValue() {
return fromString(getDefaultValueAsString());
}
public String getDefaultValueAsString() {
return defaultValueAsString;
}
public String getAsString() {
return getPreferences().get(getKey(), getDefaultValueAsString());
}
@Override
public void preferenceChanged(PreferenceChangeEvent e) {
if (e.getKey().equals(key)) {
updateValue();
}
}
}