001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.preferences;
003
004import org.openstreetmap.josm.Main;
005
006/**
007 * Captures the common functionality of preference properties
008 * @param <T> The type of object accessed by this property
009 */
010public abstract class AbstractProperty<T> {
011    protected final String key;
012    protected final T defaultValue;
013
014    /**
015     * Constructs a new {@code AbstractProperty}.
016     * @param key The property key
017     * @param defaultValue The default value
018     * @since 5464
019     */
020    public AbstractProperty(String key, T defaultValue) {
021        this.key = key;
022        this.defaultValue = defaultValue;
023    }
024
025    /**
026     * Replies the property key.
027     * @return The property key
028     */
029    public String getKey() {
030        return key;
031    }
032
033    /**
034     * Determines if this property is currently set in JOSM preferences.
035     * @return true if {@code Main.pref} contains this property.
036     */
037    public boolean isSet() {
038        return !Main.pref.get(key).isEmpty();
039    }
040
041    /**
042     * Replies the default value of this property.
043     * @return The default value of this property
044     */
045    public T getDefaultValue() {
046        return defaultValue;
047    }
048
049    /**
050     * Removes this property from JOSM preferences (i.e replace it by its default value).
051     */
052    public void remove() {
053        Main.pref.put(getKey(), String.valueOf(getDefaultValue()));
054    }
055
056    /**
057     * Replies the value of this property.
058     * @return the value of this property
059     * @since 5464
060     */
061    public abstract T get();
062
063    /**
064     * Sets this property to the specified value.
065     * @param value The new value of this property
066     * @return true if something has changed (i.e. value is different than before)
067     * @since 5464
068     */
069    public abstract boolean put(T value);
070}