// Copyright (c) 2003-2004 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.common.ui.preferences.overlay;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
/** <p>A preference store that can be used for caching preference values
* (e.g. on tabbed pages).</p>
*
* @author Leif Frenzel
*/
public class OverlayPreferenceStore implements IPreferenceStore {
/** The parent preference store. */
private final IPreferenceStore parent;
/** The underlying preference store. */
private final IPreferenceStore store;
/** The keys of this store. */
private final List<OverlayKey> overlayKeys;
private IPropertyChangeListener propertyListener;
public OverlayPreferenceStore( final IPreferenceStore parent ) {
this.parent = parent;
overlayKeys = new ArrayList<>();
store = new PreferenceStore();
}
public void addKey( final OverlayType type, final String key ) {
this.overlayKeys.add( new OverlayKey( type, key ) );
}
public void addBooleanKey( final String key ) {
addKey( OverlayType.BOOLEAN, key );
}
public void addDoubleKey( final String key ) {
addKey( OverlayType.DOUBLE, key );
}
public void addFloatKey( final String key ) {
addKey( OverlayType.FLOAT, key );
}
public void addIntKey( final String key ) {
addKey( OverlayType.INT, key );
}
public void addLongKey( final String key ) {
addKey( OverlayType.LONG, key );
}
public void addStringKey( final String key ) {
addKey( OverlayType.STRING, key );
}
/**
* Propagates all overlay keys from this store to the parent store.
*/
public void propagate() {
for( Iterator<OverlayKey> i = overlayKeys.iterator(); i.hasNext(); ) {
propagateProperty( store, i.next(), parent );
}
}
public void load() {
Iterator<OverlayKey> iter = overlayKeys.iterator();
while( iter.hasNext() ) {
OverlayKey key = iter.next();
Loader.loadProperty( parent, key, store, true );
}
}
public void loadDefaults() {
Iterator<OverlayKey> iter = overlayKeys.iterator();
while( iter.hasNext() ) {
OverlayKey key = iter.next();
setToDefault( key.getKey() );
}
}
/**
* Starts to listen for changes.
*/
public void startListening() {
if( propertyListener == null ) {
propertyListener = new IPropertyChangeListener() {
@Override
public void propertyChange( final PropertyChangeEvent event ) {
OverlayKey key = findOverlayKey( event.getProperty() );
if( key != null ) {
propagateProperty( parent, key, store );
}
}
};
parent.addPropertyChangeListener( propertyListener );
}
}
public void stopListening() {
if( propertyListener != null ) {
parent.removePropertyChangeListener( propertyListener );
propertyListener = null;
}
}
// IPreferenceStore Implementation -----------------------------------------
@Override
public void addPropertyChangeListener( final IPropertyChangeListener li ) {
store.addPropertyChangeListener( li );
}
@Override
public void removePropertyChangeListener( final IPropertyChangeListener li ) {
store.removePropertyChangeListener( li );
}
@Override
public void firePropertyChangeEvent( final String name,
final Object oldValue,
final Object newValue ) {
store.firePropertyChangeEvent( name, oldValue, newValue );
}
@Override
public boolean contains( final String name ) {
return store.contains( name );
}
@Override
public boolean getBoolean( final String name ) {
return store.getBoolean( name );
}
@Override
public boolean getDefaultBoolean( final String name ) {
return store.getDefaultBoolean( name );
}
@Override
public double getDefaultDouble( final String name ) {
return store.getDefaultDouble( name );
}
@Override
public float getDefaultFloat( final String name ) {
return store.getDefaultFloat( name );
}
@Override
public int getDefaultInt( final String name ) {
return store.getDefaultInt( name );
}
@Override
public long getDefaultLong( final String name ) {
return store.getDefaultLong( name );
}
@Override
public String getDefaultString( final String name ) {
return store.getDefaultString( name );
}
@Override
public double getDouble( final String name ) {
return store.getDouble( name );
}
@Override
public float getFloat( final String name ) {
return store.getFloat( name );
}
@Override
public int getInt( final String name ) {
return store.getInt( name );
}
@Override
public long getLong( final String name ) {
return store.getLong( name );
}
@Override
public String getString( final String name ) {
return store.getString( name );
}
@Override
public boolean isDefault( final String name ) {
return store.isDefault( name );
}
@Override
public boolean needsSaving() {
return store.needsSaving();
}
@Override
public void putValue( final String name, final String value ) {
if( covers( name ) ) {
store.putValue( name, value );
}
}
@Override
public void setDefault( final String name, final double value ) {
if( covers( name ) ) {
store.setDefault( name, value );
}
}
@Override
public void setDefault( final String name, final float value ) {
if( covers( name ) ) {
store.setDefault( name, value );
}
}
@Override
public void setDefault( final String name, final int value ) {
if( covers( name ) ) {
store.setDefault( name, value );
}
}
@Override
public void setDefault( final String name, final long value ) {
if( covers( name ) ) {
store.setDefault( name, value );
}
}
@Override
public void setDefault( final String name, final String value ) {
if( covers( name ) ) {
store.setDefault( name, value );
}
}
@Override
public void setDefault( final String name, final boolean value ) {
if( covers( name ) ) {
store.setDefault( name, value );
}
}
@Override
public void setToDefault( final String name ) {
store.setToDefault( name );
}
@Override
public void setValue( final String name, final double value ) {
if( covers( name ) ) {
store.setValue( name, value );
}
}
@Override
public void setValue( final String name, final float value ) {
if( covers( name ) ) {
store.setValue( name, value );
}
}
@Override
public void setValue( final String name, final int value ) {
if( covers( name ) ) {
store.setValue( name, value );
}
}
@Override
public void setValue( final String name, final long value ) {
if( covers( name ) ) {
store.setValue( name, value );
}
}
@Override
public void setValue( final String name, final String value ) {
if( covers( name ) ) {
store.setValue( name, value );
}
}
@Override
public void setValue( final String name, final boolean value ) {
if( covers( name ) ) {
store.setValue( name, value );
}
}
/**
* Tries to find and return the overlay key for the given preference key
* string.
*
* @param key
* the preference key string
* @return the overlay key or <code>null</code> if none can be found
*/
protected OverlayKey findOverlayKey( final String key ) {
OverlayKey result = null;
Iterator<OverlayKey> iter = overlayKeys.iterator();
while( iter.hasNext() ) {
OverlayKey overlayKey = iter.next();
if( overlayKey.getKey().equals( key ) ) {
result = overlayKey;
}
}
return result;
}
protected final void propagateProperty( final IPreferenceStore origin,
final OverlayKey key,
final IPreferenceStore target ) {
if( origin.isDefault( key.getKey() ) ) {
if( !target.isDefault( key.getKey() ) ) {
target.setToDefault( key.getKey() );
}
} else {
Propagator.propagate( origin, key, target );
}
}
private boolean covers( final String key ) {
return ( findOverlayKey( key ) != null );
}
}