001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.data.preferences; 003 004import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener; 005import org.openstreetmap.josm.tools.CheckParameterUtil; 006 007/** 008 * Property that wraps another property along with a fallback property that is used as default value. 009 * 010 * @param <T> The content type 011 * @since 12987 012 */ 013public class FallbackProperty<T> extends AbstractProperty<T> { 014 015 private final AbstractProperty<T> property; 016 private final AbstractProperty<T> fallback; 017 018 /** 019 * Constructs a new {@code FallbackProperty}. 020 * @param property the wrapped property 021 * @param fallback fallback property that takes effect in the {@link #get()} method when 022 * {@code property} is not set 023 */ 024 public FallbackProperty(AbstractProperty<T> property, AbstractProperty<T> fallback) { 025 super(property.getKey(), null); 026 CheckParameterUtil.ensureParameterNotNull(property, "property"); 027 CheckParameterUtil.ensureParameterNotNull(fallback, "fallback"); 028 this.property = property; 029 this.fallback = fallback; 030 } 031 032 /** 033 * Get the wrapped property. 034 * @return the wrapped property 035 */ 036 public AbstractProperty<T> getDelegateProperty() { 037 return property; 038 } 039 040 /** 041 * Get the fallback property. 042 * @return the fallback property 043 */ 044 public AbstractProperty<T> getFallbackProperty() { 045 return fallback; 046 } 047 048 @Override 049 protected void storeDefaultValue() { 050 // Default value hidden in preferences. 051 } 052 053 @Override 054 public boolean isSet() { 055 return property.isSet(); 056 } 057 058 @Override 059 public T getDefaultValue() { 060 return fallback.getDefaultValue(); 061 } 062 063 @Override 064 public void remove() { 065 property.remove(); 066 } 067 068 @Override 069 public T get() { 070 if (property.isSet()) { 071 return property.get(); 072 } 073 return fallback.get(); 074 } 075 076 @Override 077 public boolean put(T value) { 078 return property.put(value); 079 } 080 081 @Override 082 protected void addListenerImpl(PreferenceChangedListener adapter) { 083 property.addListenerImpl(adapter); 084 fallback.addListenerImpl(adapter); 085 } 086 087 @Override 088 public void addWeakListener(ValueChangeListener<? super T> listener) { 089 property.addWeakListener(listener); 090 fallback.addWeakListener(listener); 091 } 092 093 @Override 094 protected void removeListenerImpl(PreferenceChangedListener adapter) { 095 property.removeListenerImpl(adapter); 096 fallback.removeListenerImpl(adapter); 097 } 098 099}