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