/*******************************************************************************
* Copyright (c) 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.ui.css.swt.helpers;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.osgi.service.prefs.Preferences;
public class EclipsePreferencesHelper {
public final static String PROPS_OVERRIDDEN_BY_CSS_PROP = "overriddenByCSS";
public final static String SEPARATOR = ",";
private final static String MULTI_VALUE_FORMATTER = "%s%s" + SEPARATOR;
private static IPreferenceChangeListener preferenceChangeListener;
private static String previousThemeId;
private static String currentThemeId;
public static void appendOverriddenPropertyName(
IEclipsePreferences preferences, String name) {
String value = preferences.get(PROPS_OVERRIDDEN_BY_CSS_PROP, SEPARATOR);
if (value.equals(SEPARATOR)) {
preferences
.addPreferenceChangeListener(getPreferenceChangeListener());
}
if (!isOverriddenByCSS(value, name)) {
preferences.put(PROPS_OVERRIDDEN_BY_CSS_PROP,
String.format(MULTI_VALUE_FORMATTER, value, name));
}
}
public static IPreferenceChangeListener getPreferenceChangeListener() {
if (preferenceChangeListener == null) {
preferenceChangeListener = new PreferenceOverriddenByCssChangeListener();
}
return preferenceChangeListener;
}
private static boolean isOverriddenByCSS(String propertiesOverriddenByCSS,
String property) {
return propertiesOverriddenByCSS.contains(SEPARATOR + property
+ SEPARATOR);
}
public static List<String> getOverriddenPropertyNames(
IEclipsePreferences preferences) {
String value = preferences.get(PROPS_OVERRIDDEN_BY_CSS_PROP, null);
if (value == null) {
return Collections.emptyList();
}
List<String> result = new ArrayList<String>();
for (String name : value.split(SEPARATOR)) {
if (name != null && !name.isEmpty()) {
result.add(name);
}
}
return result;
}
public static void removeOverriddenPropertyNames(
IEclipsePreferences preferences) {
preferences.remove(PROPS_OVERRIDDEN_BY_CSS_PROP);
preferences
.removePreferenceChangeListener(getPreferenceChangeListener());
}
public static void removeOverriddenByCssProperty(
IEclipsePreferences preferences, String preferenceToRemove) {
StringBuilder overriddenByCSS = new StringBuilder(SEPARATOR);
for (String preference : getOverriddenPropertyNames(preferences)) {
if (!preference.equals(preferenceToRemove)) {
overriddenByCSS.append(preference).append(SEPARATOR);
}
}
preferences.put(PROPS_OVERRIDDEN_BY_CSS_PROP,
overriddenByCSS.toString());
}
public static void setPreviousThemeId(String themeId) {
previousThemeId = themeId;
}
public static void setCurrentThemeId(String themeId) {
currentThemeId = themeId;
}
public static boolean isThemeChanged() {
return currentThemeId != null && !currentThemeId.equals(previousThemeId);
}
public static class PreferenceOverriddenByCssChangeListener implements
IPreferenceChangeListener {
@Override
public void preferenceChange(PreferenceChangeEvent event) {
if (isModified(event) && isRelatedToOverriddenByCss(event)) {
removeOverriddenByCssProperty(event);
}
}
private boolean isModified(PreferenceChangeEvent event) {
return event.getOldValue() != null && event.getNewValue() != null;
}
private boolean isRelatedToOverriddenByCss(PreferenceChangeEvent event) {
return isOverriddenByCSS(
event.getNode()
.get(PROPS_OVERRIDDEN_BY_CSS_PROP, SEPARATOR),
event.getKey());
}
protected void removeOverriddenByCssProperty(PreferenceChangeEvent event) {
Preferences preferences = event.getNode();
if (preferences instanceof IEclipsePreferences) {
EclipsePreferencesHelper.removeOverriddenByCssProperty(
(IEclipsePreferences) preferences, event.getKey());
}
}
}
}