001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.preferences;
003
004import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
005import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
006import org.openstreetmap.josm.spi.preferences.Config;
007
008/**
009 * This is an old-style cached preference value.
010 *
011 * You can replace this using the {@link StringProperty#cached()}, {@link BooleanProperty#cached()} accessors
012 *
013 * @param <T> The value type of this property
014 */
015public abstract class CachedProperty<T> extends AbstractProperty<T> implements PreferenceChangedListener {
016
017    private final String defaultValueAsString;
018    private T value;
019    private int updateCount;
020
021    protected CachedProperty(String key, String defaultValueAsString) {
022        super(key, null);
023        Config.getPref().addKeyPreferenceChangeListener(key, this);
024        this.defaultValueAsString = defaultValueAsString;
025        updateValue();
026    }
027
028    protected final void updateValue() {
029        if (!Config.getPref().get(key).isEmpty()) {
030            this.value = fromString(Config.getPref().get(key));
031        } else {
032            this.value = getDefaultValue();
033        }
034        updateCount++;
035    }
036
037    protected abstract T fromString(String s);
038
039    @Override
040    public T get() {
041        return value;
042    }
043
044    public void put(String value) {
045        Config.getPref().put(key, value);
046        this.value = fromString(value);
047        updateCount++;
048    }
049
050    @Override
051    public final boolean put(T value) {
052        // Not used
053        throw new UnsupportedOperationException("You cannot use put(T). Use put(String) instead.");
054    }
055
056    public int getUpdateCount() {
057        return updateCount;
058    }
059
060    @Override
061    public T getDefaultValue() {
062        return fromString(getDefaultValueAsString());
063    }
064
065    public String getDefaultValueAsString() {
066        return defaultValueAsString;
067    }
068
069    public String getAsString() {
070        return getPreferences().get(getKey(), getDefaultValueAsString());
071    }
072
073    @Override
074    public void preferenceChanged(PreferenceChangeEvent e) {
075        if (e.getKey().equals(key)) {
076            updateValue();
077        }
078    }
079
080}