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