001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.data.preferences; 003 004 import 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 */ 010 public 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 }