package com.mobilesorcery.sdk.core; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.preferences.ScopedPreferenceStore; import org.osgi.service.prefs.BackingStoreException; public class PreferenceStorePropertyOwner extends PropertyOwnerBase { private final IPreferenceStore store; private final boolean useDefault; public PreferenceStorePropertyOwner(IPreferenceStore store) { this(store, false); } /** * Creates a new {@link PreferenceStorePropertyOwner} with * the option to work with the default values instead. * @param store * @param useDefault */ public PreferenceStorePropertyOwner(IPreferenceStore store, boolean useDefault) { this.store = store; this.useDefault = useDefault; } @Override public boolean setProperty(String key, String newValue) { String oldValue = getProperty(key); if (newValue == null) { store.setToDefault(key); } else { if (useDefault) { store.setDefault(key, newValue); } else { store.setValue(key, newValue); } } return !Util.equals(oldValue, newValue); } @Override public String getProperty(String key) { return useDefault ? store.getDefaultString(key) : store.getString(key); } @Override public String getDefaultProperty(String key) { return store.getDefaultString(key); } @Override public boolean isDefault(String key) { return useDefault || store.isDefault(key); } @Override public String getContext() { return null; } @Override public void initProperty(String key, String value) { setProperty(key, value); } @Override public Map<String, String> getProperties() { if (store instanceof ScopedPreferenceStore) { ScopedPreferenceStore scopedPrefs = (ScopedPreferenceStore) store; IEclipsePreferences[] nodes = scopedPrefs.getPreferenceNodes(useDefault); ArrayList<String> prefKeys = new ArrayList<String>(); try { for (IEclipsePreferences node : nodes) { prefKeys.addAll(Arrays.asList(node.keys())); } } catch (BackingStoreException e) { CoreMoSyncPlugin.getDefault().log(e); } HashMap<String, String> result = new HashMap<String, String>(); for (String key : prefKeys) { // TODO: Non-string prefs does not really work... but that's usually ok. String value = scopedPrefs.getString(key); if (!Util.isEmpty(value)) { result.put(key, value); } } return result; } else { throw new UnsupportedOperationException(); } } }