001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.preferences;
003
004import org.openstreetmap.josm.Main;
005import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
006import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
007
008public 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 final 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}