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}