Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Rolka2014-02-13 13:07:57 +0000
committerGerrit Code Review @ Eclipse.org2014-03-04 00:41:10 +0000
commit99409503bdd04b320f7ef9ea360a9599d2d0f998 (patch)
tree0501134b11c217d0230ae7a922aa3304b5e0b551
parentcbc039d9fc43d9f1bf46d202b1bd893feb896351 (diff)
downloadeclipse.platform.ui-99409503bdd04b320f7ef9ea360a9599d2d0f998.tar.gz
eclipse.platform.ui-99409503bdd04b320f7ef9ea360a9599d2d0f998.tar.xz
eclipse.platform.ui-99409503bdd04b320f7ef9ea360a9599d2d0f998.zip
Bug 429338 - [CSS] Colors and Fonts defined in CSS can't be overriddenI20140304-0800I20140303-2000
Change-Id: I22cc7a8a2d8bd7fc1491060fa7e39abe21ed7f46 Signed-off-by: Daniel Rolka <daniel.rolka@pl.ibm.com>
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ButtonElement.java2
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabFolderElement.java2
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabItemElement.java2
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CompositeElement.java2
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ControlElement.java6
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ShellElement.java7
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/TableItemElement.java2
-rw-r--r--bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ToolItemElement.java2
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorDefinition.java4
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java199
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/FontDefinition.java4
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.properties3
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementDefinition.java92
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java31
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemesExtension.java6
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java158
-rw-r--r--tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ColorDefinitionTest.java4
-rw-r--r--tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/FontDefinitionTest.java6
-rw-r--r--tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ThemesExtensionTest.java6
-rw-r--r--tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/WorkbenchThemeChangedHandlerTest.java43
20 files changed, 428 insertions, 153 deletions
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ButtonElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ButtonElement.java
index 1c09ced7e6e..212ffb429fa 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ButtonElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ButtonElement.java
@@ -84,8 +84,8 @@ public class ButtonElement extends ControlElement {
@Override
public void reset() {
- super.reset();
CSSSWTImageHelper.restoreDefaultImage(getButton());
+ super.reset();
}
}
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabFolderElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabFolderElement.java
index 1348f6ffca0..84c74c1469f 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabFolderElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabFolderElement.java
@@ -81,7 +81,6 @@ public class CTabFolderElement extends CompositeElement {
@Override
public void reset() {
- super.reset();
CTabFolder folder = (CTabFolder) getWidget();
folder.setSelectionBackground((Color) null);
folder.setSelectionForeground((Color) null);
@@ -98,6 +97,7 @@ public class CTabFolderElement extends CompositeElement {
renderer.setOuterKeyline(null);
renderer.setShadowColor(null);
}
+ super.reset();
}
private void resetChildrenBackground(Composite composite) {
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabItemElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabItemElement.java
index 4a2df141f68..598dda251ba 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabItemElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CTabItemElement.java
@@ -51,10 +51,10 @@ public class CTabItemElement extends ItemElement {
@Override
public void reset() {
- super.reset();
CTabItem item = getItem();
CSSSWTImageHelper.restoreDefaultImage(item);
item.setFont(null); // in such case the parent's font will be taken
+ super.reset();
}
}
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CompositeElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CompositeElement.java
index b3de7d2ca84..f0c32e72702 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CompositeElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/CompositeElement.java
@@ -46,12 +46,12 @@ public class CompositeElement extends ControlElement {
@Override
public void reset() {
- super.reset();
Composite composite = getComposite();
if (composite.getData(BACKGROUND_OVERRIDDEN_BY_CSS_MARKER) != null) {
composite.setData(BACKGROUND_OVERRIDDEN_BY_CSS_MARKER, null);
}
+ super.reset();
}
public static boolean hasBackgroundOverriddenByCSS(Control control) {
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ControlElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ControlElement.java
index 77d3b096821..e98c412409f 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ControlElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ControlElement.java
@@ -145,12 +145,13 @@ public class ControlElement extends WidgetElement {
@Override
public void reset() {
- super.reset();
Control control = getControl();
CSSSWTFontHelper.restoreDefaultFont(control);
CSSSWTCursorHelper.restoreDefaultCursor(control);
- control.setBackgroundImage(null);
GradientBackgroundListener.remove(control);
+ if (control.getBackgroundImage() != null) {
+ control.setBackgroundImage(null);
+ }
if (WEBSITE_CLASS.equals(control.getClass().getName())) {
control.setBackground(control.getDisplay().getSystemColor(
@@ -161,6 +162,7 @@ public class ControlElement extends WidgetElement {
control.setBackground(null);
control.setForeground(null);
}
+ super.reset();
}
}
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ShellElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ShellElement.java
index 479dc4c0d34..e84b4d0ff70 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ShellElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ShellElement.java
@@ -31,22 +31,27 @@ public class ShellElement extends CompositeElement {
// Create SWT Shell Listener
private ShellListener shellListener = new ShellListener() {
+ @Override
public void shellActivated(ShellEvent e) {
ShellElement.this.isActive = true;
doApplyStyles();
}
+ @Override
public void shellDeactivated(ShellEvent e) {
ShellElement.this.isActive = false;
doApplyStyles();
}
+ @Override
public void shellDeiconified(ShellEvent e) {
}
+ @Override
public void shellIconified(ShellEvent e) {
}
+ @Override
public void shellClosed(ShellEvent e) {
ShellElement.this.dispose();
}
@@ -136,7 +141,7 @@ public class ShellElement extends CompositeElement {
@Override
public void reset() {
- super.reset();
CSSSWTImageHelper.restoreDefaultImage(getShell());
+ super.reset();
}
}
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/TableItemElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/TableItemElement.java
index 5b1018cd38d..2c596998162 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/TableItemElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/TableItemElement.java
@@ -51,7 +51,6 @@ public class TableItemElement extends ItemElement {
@Override
public void reset() {
- super.reset();
TableItem tableItem = getTableItem();
tableItem.setForeground(null);
tableItem.setBackground(null);
@@ -62,5 +61,6 @@ public class TableItemElement extends ItemElement {
parent.setForeground(null);
parent.setBackground(null);
CSSSWTFontHelper.restoreDefaultFont(parent);
+ super.reset();
}
}
diff --git a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ToolItemElement.java b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ToolItemElement.java
index a08368a4572..5bbd103d75e 100644
--- a/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ToolItemElement.java
+++ b/bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/dom/ToolItemElement.java
@@ -65,7 +65,7 @@ public class ToolItemElement extends ItemElement {
@Override
public void reset() {
- super.reset();
CSSSWTImageHelper.restoreDefaultImage(getToolItem());
+ super.reset();
}
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorDefinition.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorDefinition.java
index 28f71402ecc..2d56397fc53 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorDefinition.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorDefinition.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2003, 2013 IBM Corporation and others.
+ * Copyright (c) 2003, 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
@@ -169,7 +169,7 @@ public class ColorDefinition extends ThemeElementDefinition implements IPluginCo
public void setValue(RGB data) {
if (data != null) {
parsedValue = data;
- setOverridden(true);
+ appendState(State.OVERRIDDEN);
}
}
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java
index 1804af5d9d8..f5b209f0171 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ColorsAndFontsPreferencePage.java
@@ -25,7 +25,7 @@ import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.e4.core.services.events.IEventBroker;
-import org.eclipse.e4.ui.workbench.UIEvents;
+import org.eclipse.e4.ui.css.swt.theme.IThemeEngine;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
@@ -614,10 +614,11 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
private Font appliedDialogFont;
/**
- * Map of definition id->RGB capturing the explicit changes made by the
- * user. These changes need to be stored into the preference store.
+ * Map of definition ColorDefinition->RGB capturing the explicit changes
+ * made by the user. These changes need to be stored into the preference
+ * store.
*/
- private Map colorPreferencesToSet = new HashMap(7);
+ private Map<ColorDefinition, RGB> colorPreferencesToSet = new HashMap<ColorDefinition, RGB>(7);
private CascadingColorRegistry colorRegistry;
@@ -683,10 +684,12 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
private Button goToDefaultButton;
/**
- * Map of definition id->FontData[] capturing the changes explicitly made by
- * the user. These changes need to be stored into the preference store.
+ * Map of definition FontDefinition->FontData[] capturing the changes
+ * explicitly made by the user. These changes need to be stored into the
+ * preference store.
*/
- private Map fontPreferencesToSet = new HashMap(7);
+ private Map<FontDefinition, FontData[]> fontPreferencesToSet = new HashMap<FontDefinition, FontData[]>(
+ 7);
private CascadingFontRegistry fontRegistry;
@@ -726,7 +729,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
private PresentationLabelProvider labelProvider;
- private CascadingTheme cascadingTheme;
+ private CascadingThemeExt cascadingTheme;
private IPropertyChangeListener themeChangeListener;
@@ -744,9 +747,18 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
updateThemeInfo(workbench.getThemeManager());
refreshCategory();
refreshAllLabels();
+
+ clearPreviews();
+ previewMap.clear();
+ restoreTreeSelection();
+ updateControls();
}
};
+ private org.eclipse.e4.ui.css.swt.theme.ITheme currentCSSTheme;
+
+ private IThemeEngine themeEngine;
+
/**
* Create a new instance of the receiver.
*/
@@ -1018,9 +1030,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
if (element instanceof ThemeElementDefinition) {
ThemeElementDefinition definition = (ThemeElementDefinition) element;
- if (definition.isOverridden() || definition.isAddedByCss()) {
- return;
- }
+
if (element instanceof FontDefinition) {
editFont(tree.getDisplay());
} else if (element instanceof ColorDefinition
@@ -1103,7 +1113,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
*/
private RGB getColorValue(ColorDefinition definition) {
String id = definition.getId();
- RGB updatedRGB = (RGB) colorPreferencesToSet.get(id);
+ RGB updatedRGB = colorPreferencesToSet.get(definition);
if (updatedRGB == null) {
updatedRGB = (RGB) colorValuesToSet.get(id);
if (updatedRGB == null)
@@ -1164,14 +1174,15 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
FontDefinition ancestor = getFontAncestor(definition);
if (ancestor == null) {
return PreferenceConverter.getDefaultFontDataArray(
- getPreferenceStore(), ThemeElementHelper.createPreferenceKey(currentTheme, definition.getId()));
+getPreferenceStore(),
+ createPreferenceKey(definition));
}
return getFontValue(ancestor);
}
protected FontData[] getFontValue(FontDefinition definition) {
String id = definition.getId();
- FontData[] updatedFD = (FontData[]) fontPreferencesToSet.get(id);
+ FontData[] updatedFD = fontPreferencesToSet.get(definition);
if (updatedFD == null) {
updatedFD = (FontData[]) fontValuesToSet.get(id);
if (updatedFD == null)
@@ -1243,7 +1254,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
if (definition == null)
return;
FontData[] defaultFontData = JFaceResources.getDefaultFont().getFontData();
- setFontPreferenceValue(definition, defaultFontData);
+ setFontPreferenceValue(definition, defaultFontData, false);
updateControls();
}
});
@@ -1296,7 +1307,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
*/
public void init(IWorkbench aWorkbench) {
this.workbench = (Workbench) aWorkbench;
- eventBroker = (IEventBroker) workbench.getService(IEventBroker.class);
+ themeEngine = (IThemeEngine) workbench.getService(IThemeEngine.class);
setPreferenceStore(PrefUtil.getInternalPreferenceStore());
final IThemeManager themeManager = aWorkbench.getThemeManager();
@@ -1333,9 +1344,16 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
currentTheme = manager.getCurrentTheme();
+ currentCSSTheme = themeEngine.getActiveTheme();
+
colorRegistry = new CascadingColorRegistry(currentTheme.getColorRegistry());
fontRegistry = new CascadingFontRegistry(currentTheme.getFontRegistry());
+ if (cascadingTheme != null) {
+ cascadingTheme.dispose();
+ cascadingTheme = new CascadingThemeExt(currentTheme, colorRegistry, fontRegistry);
+ }
+
fontPreferencesToSet.clear();
fontValuesToSet.clear();
@@ -1357,12 +1375,12 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
private boolean isDefault(ColorDefinition definition) {
String id = definition.getId();
- if (colorPreferencesToSet.containsKey(id)) {
+ if (colorPreferencesToSet.containsKey(definition)) {
if (definition.getValue() != null) { // value-based color
- if (colorPreferencesToSet.get(id).equals(definition.getValue()))
+ if (colorPreferencesToSet.get(definition).equals(definition.getValue()))
return true;
} else {
- if (colorPreferencesToSet.get(id).equals(getColorAncestorValue(definition)))
+ if (colorPreferencesToSet.get(definition).equals(getColorAncestorValue(definition)))
return true;
}
} else if (colorValuesToSet.containsKey(id)) {
@@ -1375,7 +1393,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
}
} else {
if (definition.getValue() != null) { // value-based color
- if (getPreferenceStore().isDefault(ThemeElementHelper.createPreferenceKey(currentTheme, id)))
+ if (getPreferenceStore().isDefault(createPreferenceKey(definition)))
return true;
} else {
// a descendant is default if it's the same value as its ancestor
@@ -1389,13 +1407,14 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
private boolean isDefault(FontDefinition definition) {
String id = definition.getId();
- if (fontPreferencesToSet.containsKey(id)) {
+ if (fontPreferencesToSet.containsKey(definition)) {
if (definition.getValue() != null) { // value-based font
- if (Arrays.equals((FontData[]) fontPreferencesToSet.get(id), definition.getValue()))
+ if (Arrays.equals(fontPreferencesToSet.get(definition),
+ definition.getValue()))
return true;
} else {
FontData[] ancestor = getFontAncestorValue(definition);
- if (Arrays.equals((FontData[]) fontPreferencesToSet.get(id), ancestor))
+ if (Arrays.equals(fontPreferencesToSet.get(definition), ancestor))
return true;
}
} else if (fontValuesToSet.containsKey(id)) {
@@ -1410,7 +1429,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
} else {
if (definition.getValue() != null) { // value-based font
- if (getPreferenceStore().isDefault(ThemeElementHelper.createPreferenceKey(currentTheme, id)))
+ if (getPreferenceStore().isDefault(createPreferenceKey(definition)))
return true;
} else {
FontData[] ancestor = getFontAncestorValue(definition);
@@ -1457,7 +1476,10 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
if (oldFont != null) {
oldFont.dispose();
}
- publishThemeChangedEvent();
+
+ if (performColorOk() && performFontOk()) {
+ publishThemeRegistryModifiedEvent();
+ }
}
private void performColorDefaults() {
@@ -1475,11 +1497,9 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
}
private boolean performColorOk() {
- for (Iterator i = colorPreferencesToSet.keySet().iterator(); i.hasNext();) {
- String id = (String) i.next();
- String key = ThemeElementHelper.createPreferenceKey(currentTheme, id);
- RGB rgb = (RGB) colorPreferencesToSet.get(id);
- String rgbString = StringConverter.asString(rgb);
+ for (Map.Entry<ColorDefinition, RGB> entry : colorPreferencesToSet.entrySet()) {
+ String key = createPreferenceKey(entry.getKey());
+ String rgbString = StringConverter.asString(entry.getValue());
String storeString = getPreferenceStore().getString(key);
if (!rgbString.equals(storeString))
@@ -1491,6 +1511,15 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
return true;
}
+ private String createPreferenceKey(ThemeElementDefinition definition) {
+ if (isAvailableInCurrentTheme(definition)
+ && (definition.isOverridden() || definition.isAddedByCss())) {
+ return ThemeElementHelper.createPreferenceKey(currentCSSTheme, currentTheme,
+ definition.getId());
+ }
+ return ThemeElementHelper.createPreferenceKey(currentTheme, definition.getId());
+ }
+
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@@ -1516,13 +1545,9 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
}
private boolean performFontOk() {
-
- for (Iterator i = fontPreferencesToSet.keySet().iterator(); i.hasNext();) {
- String id = (String) i.next();
- String key = ThemeElementHelper.createPreferenceKey(currentTheme, id);
- FontData[] fd = (FontData[]) fontPreferencesToSet.get(id);
-
- String fdString = PreferenceConverter.getStoredRepresentation(fd);
+ for (Map.Entry<FontDefinition, FontData[]> entry : fontPreferencesToSet.entrySet()) {
+ String key = createPreferenceKey(entry.getKey());
+ String fdString = PreferenceConverter.getStoredRepresentation(entry.getValue());
String storeString = getPreferenceStore().getString(key);
if (!fdString.equals(storeString))
@@ -1543,7 +1568,7 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
boolean result = performColorOk() && performFontOk();
if (result) {
PrefUtil.savePrefs();
- publishThemeChangedEvent();
+ publishThemeRegistryModifiedEvent();
}
return result;
}
@@ -1570,8 +1595,9 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
newRGB = getColorAncestorValue(definition);
if (newRGB != null) {
- setColorPreferenceValue(definition, newRGB);
+ setColorPreferenceValue(definition, newRGB, true);
setRegistryValue(definition, newRGB);
+ refreshElement(definition);
return true;
}
}
@@ -1584,11 +1610,12 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
if (!force && definition.getDefaultsTo() != null)
newFD = getFontAncestorValue(definition);
else
- newFD = PreferenceConverter.getDefaultFontDataArray(getPreferenceStore(), ThemeElementHelper
- .createPreferenceKey(currentTheme, definition.getId()));
+ newFD = PreferenceConverter.getDefaultFontDataArray(getPreferenceStore(),
+ createPreferenceKey(definition));
if (newFD != null) {
- setFontPreferenceValue(definition, newFD);
+ setFontPreferenceValue(definition, newFD, true);
+ refreshElement(definition);
return true;
}
}
@@ -1602,9 +1629,10 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
* @param newRGB the new <code>RGB</code> value for the definitions
* identifier.
*/
- protected void setColorPreferenceValue(ColorDefinition definition, RGB newRGB) {
+ protected void setColorPreferenceValue(ColorDefinition definition, RGB newRGB, boolean reset) {
setDescendantRegistryValues(definition, newRGB);
- colorPreferencesToSet.put(definition.getId(), newRGB);
+ colorPreferencesToSet.put(definition, newRGB);
+ updateDefinitionState(definition, reset);
}
/**
@@ -1635,15 +1663,16 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
setDescendantRegistryValues(children[i], datas);
setRegistryValue(children[i], datas);
fontValuesToSet.put(children[i].getId(), datas);
- fontPreferencesToSet.remove(children[i].getId());
+ fontPreferencesToSet.remove(children[i]);
}
}
}
- protected void setFontPreferenceValue(FontDefinition definition, FontData[] datas) {
+ protected void setFontPreferenceValue(FontDefinition definition, FontData[] datas, boolean reset) {
setDescendantRegistryValues(definition, datas);
- fontPreferencesToSet.put(definition.getId(), datas);
+ fontPreferencesToSet.put(definition, datas);
setRegistryValue(definition, datas);
+ updateDefinitionState(definition, reset);
}
/**
@@ -1679,8 +1708,9 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
}
private ITheme getCascadingTheme() {
- if (cascadingTheme == null)
- cascadingTheme = new CascadingTheme(currentTheme, colorRegistry, fontRegistry);
+ if (cascadingTheme == null) {
+ cascadingTheme = new CascadingThemeExt(currentTheme, colorRegistry, fontRegistry);
+ }
return cascadingTheme;
}
@@ -1897,7 +1927,8 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
fontDialog.setFontList(getFontValue(definition));
final FontData data = fontDialog.open();
if (data != null) {
- setFontPreferenceValue(definition, fontDialog.getFontList());
+ setFontPreferenceValue(definition, fontDialog.getFontList(), false);
+ refreshElement(definition);
}
}
}
@@ -1915,38 +1946,35 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
colorDialog.setRGB(currentColor);
RGB selectedColor = colorDialog.open();
if ((selectedColor != null) && (!selectedColor.equals(currentColor))) {
- setColorPreferenceValue(definition, selectedColor);
- setRegistryValue(definition, selectedColor);
+ setColorPreferenceValue(definition, selectedColor, false);
+ setRegistryValue(definition, selectedColor);
+ refreshElement(definition);
}
}
protected void updateControls() {
FontDefinition fontDefinition = getSelectedFontDefinition();
- if (fontDefinition != null) {
- boolean definedByCSS = fontDefinition.isOverridden() || fontDefinition.isAddedByCss();
+ if (fontDefinition != null) {
boolean isDefault = isDefault(fontDefinition);
boolean hasDefault = fontDefinition.getDefaultsTo() != null;
- fontChangeButton.setEnabled(!definedByCSS);
- fontSystemButton.setEnabled(!definedByCSS);
- fontResetButton.setEnabled(!isDefault && !definedByCSS);
- editDefaultButton.setEnabled(hasDefault && isDefault && !definedByCSS);
- goToDefaultButton.setEnabled(hasDefault && !definedByCSS);
+ fontChangeButton.setEnabled(true);
+ fontSystemButton.setEnabled(true);
+ fontResetButton.setEnabled(!isDefault);
+ editDefaultButton.setEnabled(hasDefault && isDefault);
+ goToDefaultButton.setEnabled(hasDefault);
setCurrentFont(fontDefinition);
return;
}
ColorDefinition colorDefinition = getSelectedColorDefinition();
if (colorDefinition != null) {
- boolean definedByCSS = colorDefinition.isOverridden() || colorDefinition.isAddedByCss();
- boolean availableInTheme = isAvailableInCurrentTheme(colorDefinition);
boolean isDefault = isDefault(getSelectedColorDefinition());
boolean hasDefault = colorDefinition.getDefaultsTo() != null;
- fontChangeButton.setEnabled(!definedByCSS && availableInTheme);
+ fontChangeButton.setEnabled(true);
fontSystemButton.setEnabled(false);
- fontResetButton.setEnabled(!isDefault && !definedByCSS && availableInTheme);
- editDefaultButton.setEnabled(hasDefault && isDefault && !definedByCSS
- && availableInTheme);
- goToDefaultButton.setEnabled(hasDefault && !definedByCSS && availableInTheme);
+ fontResetButton.setEnabled(!isDefault);
+ editDefaultButton.setEnabled(hasDefault && isDefault);
+ goToDefaultButton.setEnabled(hasDefault);
setCurrentColor(colorDefinition);
return;
}
@@ -2160,10 +2188,9 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
myApplyDialogFont(descriptionText);
}
- private void publishThemeChangedEvent() {
+ private void publishThemeRegistryModifiedEvent() {
if (eventBroker != null) {
- eventBroker.send(UIEvents.UILifeCycle.THEME_DEFINITION_CHANGED,
- workbench.getApplication());
+ eventBroker.send(WorkbenchThemeManager.Events.THEME_REGISTRY_MODIFIED, null);
}
}
@@ -2188,4 +2215,38 @@ public final class ColorsAndFontsPreferencePage extends PreferencePage
return MessageFormat.format(RESOURCE_BUNDLE.getString("definitionNotAvailInTheme"), //$NON-NLS-1$
new Object[] { description }).trim();
}
+
+ private void updateDefinitionState(ThemeElementDefinition definition, boolean reset) {
+ if (reset) {
+ definition.removeState(ThemeElementDefinition.State.MODIFIED_BY_USER);
+ } else {
+ definition.appendState(ThemeElementDefinition.State.MODIFIED_BY_USER);
+ }
+ }
+
+ private void refreshElement(ThemeElementDefinition definition) {
+ tree.getViewer().refresh(definition);
+ updateTreeSelection(tree.getViewer().getSelection());
+
+ Object newValue = definition instanceof ColorDefinition ?
+ ((ColorDefinition) definition).getValue(): ((FontDefinition) definition).getValue();
+ cascadingTheme.fire(new PropertyChangeEvent(this, definition.getId(), null, newValue));
+ }
+
+ private static class CascadingThemeExt extends CascadingTheme {
+ /**
+ * @param currentTheme
+ * @param colorRegistry
+ * @param fontRegistry
+ */
+ public CascadingThemeExt(ITheme currentTheme, CascadingColorRegistry colorRegistry,
+ CascadingFontRegistry fontRegistry) {
+ super(currentTheme, colorRegistry, fontRegistry);
+ }
+
+ public void fire(PropertyChangeEvent event) {
+ super.fire(event);
+ }
+
+ }
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/FontDefinition.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/FontDefinition.java
index bd9b3007d46..ee438cf6587 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/FontDefinition.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/FontDefinition.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 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
@@ -139,7 +139,7 @@ public class FontDefinition extends ThemeElementDefinition implements
}
value = data[0].getName();
parsedValue = data;
- setOverridden(true);
+ appendState(State.OVERRIDDEN);
}
}
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.properties b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.properties
index 4e9438124ba..33a73b8e3a0 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.properties
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/Theme.properties
@@ -9,5 +9,6 @@
# IBM Corporation - initial API and implementation
###############################################################################
DefaultTheme.label=Default
-Overridden.by.css.label=(overridden by CSS)
+Overridden.by.css.label={0} (overridden by CSS {1})
Added.by.css.desc=The definition has been added by CSS
+Modified.by.user.label=and modified by user
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementDefinition.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementDefinition.java
index 3b8cf11ae9e..12f80a647cc 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementDefinition.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementDefinition.java
@@ -11,6 +11,7 @@
package org.eclipse.ui.internal.themes;
+import com.ibm.icu.text.MessageFormat;
import java.util.ResourceBundle;
/**
@@ -18,19 +19,32 @@ import java.util.ResourceBundle;
*
*/
public class ThemeElementDefinition {
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(Theme.class
+ .getName());
+
+ public static interface State {
+ int UNKNOWN = 0;
+
+ int OVERRIDDEN = 1;
+
+ int ADDED_BY_CSS = 2;
+
+ int MODIFIED_BY_USER = 4;
+ }
+
private String id;
private String label;
private String description;
- private String categoryId;
+ private String formattedDescription;
- private boolean overridden;
+ private String categoryId;
- private boolean addedByCss;
+ private int state = State.UNKNOWN;
- private String overriddenLabel;
+ private int stateDuringFormattingMessage;
public ThemeElementDefinition(String id, String label, String description, String categoryId) {
this.id = id;
@@ -57,7 +71,7 @@ public class ThemeElementDefinition {
public void setName(String label) {
this.label = label;
- setOverridden(true);
+ appendState(State.OVERRIDDEN);
}
/**
@@ -72,12 +86,31 @@ public class ThemeElementDefinition {
* .
*/
public String getDescription() {
+ if (formattedDescription == null || stateDuringFormattingMessage != state) {
+ formattedDescription = formatDescription();
+ stateDuringFormattingMessage = state;
+ }
+ return formattedDescription;
+ }
+
+ private String formatDescription() {
+ String description = this.description != null ? this.description : label;
+ String modifiedByUserLabel = isModifiedByUser() ? RESOURCE_BUNDLE
+ .getString("Modified.by.user.label") : ""; //$NON-NLS-1$ //$NON-NLS-2$
+ if (isAddedByCss()) {
+ return RESOURCE_BUNDLE.getString("Added.by.css.desc").trim(); //$NON-NLS-1$
+ }
+ if (isOverridden()) {
+ return MessageFormat.format(RESOURCE_BUNDLE.getString("Overridden.by.css.label"), //$NON-NLS-1$
+ new Object[] { description, modifiedByUserLabel }).trim();
+ }
return description;
}
public void setDescription(String description) {
this.description = description;
- setOverridden(true);
+ formattedDescription = null;
+ appendState(State.OVERRIDDEN);
}
/**
@@ -91,9 +124,20 @@ public class ThemeElementDefinition {
public void setCategoryId(String categoryId) {
this.categoryId = categoryId;
- setOverridden(true);
+ appendState(State.OVERRIDDEN);
}
+ public int getState() {
+ return state;
+ }
+
+ public void appendState(int state) {
+ this.state |= state;
+ }
+
+ public void removeState(int state) {
+ this.state &= ~state;
+ }
/*
* (non-Javadoc)
*
@@ -101,42 +145,18 @@ public class ThemeElementDefinition {
* org.eclipse.e4.ui.css.swt.definition.IDefinitionOverridable#isOverriden()
*/
public boolean isOverridden() {
- return overridden;
- }
-
- protected void setOverridden(boolean overridden) {
- this.overridden = overridden;
- if (isAddedByCss()) {
- return;
- }
-
- boolean hasOverriddenLabel = description.endsWith(getOverriddenLabel());
- if (overridden && !hasOverriddenLabel) {
- description += ' ' + getOverriddenLabel();
- } else if (!overridden && hasOverriddenLabel) {
- description = description.substring(0, description.length()
- - getOverriddenLabel().length() - 1);
- }
+ return (state & State.OVERRIDDEN) != 0;
}
public boolean isAddedByCss() {
- return addedByCss;
+ return (state & State.ADDED_BY_CSS) != 0;
}
- public void setAddedByCss(boolean addedByCss) {
- this.addedByCss = addedByCss;
- }
-
- public String getOverriddenLabel() {
- if (overriddenLabel == null) {
- ResourceBundle resourceBundle = ResourceBundle.getBundle(Theme.class.getName());
- overriddenLabel = resourceBundle.getString("Overridden.by.css.label"); //$NON-NLS-1$
- }
- return overriddenLabel;
+ public boolean isModifiedByUser() {
+ return (state & State.MODIFIED_BY_USER) != 0;
}
public void resetToDefaultValue() {
- setOverridden(false);
- setAddedByCss(false);
+ state = State.UNKNOWN;
}
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java
index b64284af524..6356897af35 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemeElementHelper.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2013 IBM Corporation and others.
+ * Copyright (c) 2004, 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
@@ -13,12 +13,12 @@ package org.eclipse.ui.internal.themes;
import java.util.Arrays;
import java.util.SortedSet;
import java.util.TreeSet;
-
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.StringConverter;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
@@ -31,6 +31,16 @@ import org.eclipse.ui.themes.IThemeManager;
* @since 3.0
*/
public final class ThemeElementHelper {
+ public static void populateDefinition(org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme,
+ ITheme theme, FontRegistry registry, FontDefinition definition, IPreferenceStore store) {
+ String key = createPreferenceKey(cssTheme, theme, definition.getId());
+ String value = store.getString(key);
+ if (!IPreferenceStore.STRING_DEFAULT_DEFAULT.equals(value)) {
+ definition.appendState(ThemeElementDefinition.State.OVERRIDDEN);
+ definition.appendState(ThemeElementDefinition.State.MODIFIED_BY_USER);
+ registry.put(definition.getId(), PreferenceConverter.basicGetFontData(value));
+ }
+ }
public static void populateRegistry(ITheme theme,
FontDefinition[] definitions, IPreferenceStore store) {
@@ -144,6 +154,17 @@ public final class ThemeElementHelper {
}
}
+ public static void populateDefinition(org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme,
+ ITheme theme, ColorRegistry registry, ColorDefinition definition, IPreferenceStore store) {
+ String key = createPreferenceKey(cssTheme, theme, definition.getId());
+ String value = store.getString(key);
+ if (!IPreferenceStore.STRING_DEFAULT_DEFAULT.equals(value)) {
+ definition.appendState(ThemeElementDefinition.State.OVERRIDDEN);
+ definition.appendState(ThemeElementDefinition.State.MODIFIED_BY_USER);
+ registry.put(definition.getId(), StringConverter.asRGB(value));
+ }
+ }
+
public static void populateRegistry(ITheme theme,
ColorDefinition[] definitions, IPreferenceStore store) {
// sort the definitions by dependant ordering so that we process
@@ -330,6 +351,12 @@ public final class ThemeElementHelper {
return themeId + '.' + id;
}
+ public static String createPreferenceKey(org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme,
+ ITheme theme, String id) {
+ String cssThemePrefix = cssTheme != null ? cssTheme.getId() + '.' : ""; //$NON-NLS-1$
+ return cssThemePrefix + createPreferenceKey(theme, id);
+ }
+
/**
* @param theme
* @param property
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemesExtension.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemesExtension.java
index 22637fdbf13..9b6881e6f12 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemesExtension.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/ThemesExtension.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 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
@@ -39,7 +39,7 @@ public class ThemesExtension implements IThemesExtension {
FontDefinition definition = new FontDefinition(formatDefaultName(FontDefinition.class,
symbolicName), symbolicName, null, null, DEFAULT_CATEGORY_ID, true,
getDefaultDescription());
- definition.setAddedByCss(true);
+ definition.appendState(ThemeElementDefinition.State.ADDED_BY_CSS);
definitions.add(definition);
}
@@ -53,7 +53,7 @@ public class ThemesExtension implements IThemesExtension {
ColorDefinition definition = new ColorDefinition(formatDefaultName(ColorDefinition.class,
symbolicName), symbolicName, null, null, DEFAULT_CATEGORY_ID, true,
getDefaultDescription(), getPluginId());
- definition.setAddedByCss(true);
+ definition.appendState(ThemeElementDefinition.State.ADDED_BY_CSS);
definitions.add(definition);
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java
index aabaa165c0f..05e2deaf9d3 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/themes/WorkbenchThemeManager.java
@@ -22,6 +22,7 @@ import org.eclipse.e4.ui.internal.css.swt.definition.IThemeElementDefinitionOver
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.JFaceResources;
@@ -67,6 +68,8 @@ public class WorkbenchThemeManager extends EventManager implements
public static final String TOPIC = "org/eclipse/ui/internal/themes/WorkbenchThemeManager"; //$NON-NLS-1$
public static final String THEME_REGISTRY_RESTYLED = TOPIC + "/themeRegistryRestyled"; //$NON-NLS-1$
+
+ public static final String THEME_REGISTRY_MODIFIED = TOPIC + "/themeRegistryModified"; //$NON-NLS-1$
}
/**
@@ -126,6 +129,8 @@ public class WorkbenchThemeManager extends EventManager implements
private EventHandler themeChangedHandler = new WorkbenchThemeChangedHandler();
+ private EventHandler themeRegistryModifiedHandler = new ThemeRegistryModifiedHandler();
+
/*
* Initialize the WorkbenchThemeManager.
* Determine the default theme according to the following rules:
@@ -176,6 +181,7 @@ public class WorkbenchThemeManager extends EventManager implements
if (eventBroker != null) {
eventBroker.subscribe(UIEvents.UILifeCycle.THEME_CHANGED, themeChangedHandler);
eventBroker.subscribe(IThemeEngine.Events.THEME_CHANGED, themeChangedHandler);
+ eventBroker.subscribe(Events.THEME_REGISTRY_MODIFIED, themeRegistryModifiedHandler);
}
}
@@ -221,6 +227,7 @@ public class WorkbenchThemeManager extends EventManager implements
public void dispose() {
if (eventBroker != null) {
eventBroker.unsubscribe(themeChangedHandler);
+ eventBroker.unsubscribe(themeRegistryModifiedHandler);
}
for (Iterator i = themes.values().iterator(); i.hasNext();) {
@@ -411,8 +418,10 @@ public class WorkbenchThemeManager extends EventManager implements
ColorRegistry colorRegistry = getColorRegistry();
resetThemeRegistries(themeRegistry, fontRegistry, colorRegistry);
- overrideAlreadyExistingDefinitions(engine, themeRegistry, fontRegistry, colorRegistry);
- addNewDefinitions(engine, themeRegistry, fontRegistry, colorRegistry);
+ overrideAlreadyExistingDefinitions(event, engine, themeRegistry, fontRegistry,
+ colorRegistry);
+ addNewDefinitions(event, engine, themeRegistry, fontRegistry, colorRegistry);
+
sendThemeRegistryRestyledEvent();
}
@@ -425,11 +434,11 @@ public class WorkbenchThemeManager extends EventManager implements
}
protected FontRegistry getFontRegistry() {
- return getCurrentTheme().getFontRegistry();
+ return getColorsAndFontsTheme().getFontRegistry();
}
protected ColorRegistry getColorRegistry() {
- return getCurrentTheme().getColorRegistry();
+ return getColorsAndFontsTheme().getColorRegistry();
}
protected void sendThemeRegistryRestyledEvent() {
@@ -438,7 +447,7 @@ public class WorkbenchThemeManager extends EventManager implements
eventBroker.send(Events.THEME_REGISTRY_RESTYLED, null);
}
- private ITheme getCurrentTheme() {
+ protected ITheme getColorsAndFontsTheme() {
return WorkbenchThemeManager.getInstance().getCurrentTheme();
}
@@ -446,19 +455,30 @@ public class WorkbenchThemeManager extends EventManager implements
return WorkbenchThemeManager.getInstance().context;
}
+ protected org.eclipse.e4.ui.css.swt.theme.ITheme getTheme(org.osgi.service.event.Event event) {
+ org.eclipse.e4.ui.css.swt.theme.ITheme theme = (org.eclipse.e4.ui.css.swt.theme.ITheme) event
+ .getProperty(IThemeEngine.Events.THEME);
+ if (theme == null) {
+ IThemeEngine themeEngine = (IThemeEngine) getContext().get(
+ IThemeEngine.class.getName());
+ theme = themeEngine != null ? themeEngine.getActiveTheme() : null;
+ }
+ return theme;
+ }
+
// At this moment we don't remove the definitions added by CSS since we
// don't want to modify the 3.x theme registries api
private void resetThemeRegistries(ThemeRegistry themeRegistry, FontRegistry fontRegistry,
ColorRegistry colorRegistry) {
for (FontDefinition def : themeRegistry.getFonts()) {
- if (def.isOverridden() || def.isAddedByCss()) {
+ if (def.isOverridden()) {
def.resetToDefaultValue();
fontRegistry.put(def.getId(), def.getValue() != null ? def.getValue()
: EMPRY_FONT_DATA_VALUE);
}
}
for (ColorDefinition def : themeRegistry.getColors()) {
- if (def.isOverridden() || def.isAddedByCss()) {
+ if (def.isOverridden()) {
def.resetToDefaultValue();
colorRegistry.put(def.getId(), def.getValue() != null ? def.getValue()
: EMPTY_COLOR_VALUE);
@@ -466,24 +486,38 @@ public class WorkbenchThemeManager extends EventManager implements
}
}
- private void overrideAlreadyExistingDefinitions(IStylingEngine engine,
- ThemeRegistry themeRegistry, FontRegistry fontRegistry, ColorRegistry colorRegistry) {
+ private void overrideAlreadyExistingDefinitions(org.osgi.service.event.Event event,
+ IStylingEngine engine, ThemeRegistry themeRegistry, FontRegistry fontRegistry,
+ ColorRegistry colorRegistry) {
+ IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
+ org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme = getTheme(event);
+ ITheme theme = getColorsAndFontsTheme();
+
for (FontDefinition fontDefinition : themeRegistry.getFonts()) {
engine.style(fontDefinition);
if (fontDefinition.isOverridden()) {
- fontRegistry.put(fontDefinition.getId(), fontDefinition.getValue());
+ populateDefinition(cssTheme, theme, fontRegistry, fontDefinition, store);
+ if (!fontDefinition.isModifiedByUser()) {
+ fontRegistry.put(fontDefinition.getId(), fontDefinition.getValue());
+ }
}
}
for (ColorDefinition colorDefinition : themeRegistry.getColors()) {
engine.style(colorDefinition);
if (colorDefinition.isOverridden()) {
- colorRegistry.put(colorDefinition.getId(), colorDefinition.getValue());
+ populateDefinition(cssTheme, theme, colorRegistry, colorDefinition, store);
+ if (!colorDefinition.isModifiedByUser()) {
+ colorRegistry.put(colorDefinition.getId(), colorDefinition.getValue());
+ }
}
}
}
- private void addNewDefinitions(IStylingEngine engine, ThemeRegistry themeRegistry,
- FontRegistry fontRegistry, ColorRegistry colorRegistry) {
+ private void addNewDefinitions(org.osgi.service.event.Event event, IStylingEngine engine,
+ ThemeRegistry themeRegistry, FontRegistry fontRegistry, ColorRegistry colorRegistry) {
+ IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
+ org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme = getTheme(event);
+ ITheme theme = getColorsAndFontsTheme();
ThemesExtension themesExtension = createThemesExtension();
engine.style(themesExtension);
@@ -492,27 +526,117 @@ public class WorkbenchThemeManager extends EventManager implements
engine.style(definition);
if (definition.isOverridden() && definition instanceof FontDefinition) {
addFontDefinition((FontDefinition) definition, themeRegistry, fontRegistry);
+ populateDefinition(cssTheme, theme, fontRegistry, (FontDefinition) definition,
+ store);
} else if (definition.isOverridden() && definition instanceof ColorDefinition) {
addColorDefinition((ColorDefinition) definition, themeRegistry, colorRegistry);
+ populateDefinition(cssTheme, theme, colorRegistry,
+ (ColorDefinition) definition, store);
}
}
}
private void addFontDefinition(FontDefinition definition, ThemeRegistry themeRegistry,
FontRegistry fontRegistry) {
- themeRegistry.add(definition);
- fontRegistry.put(definition.getId(), definition.getValue());
+ if (fontRegistry.get(definition.getId()) == null) {
+ themeRegistry.add(definition);
+ fontRegistry.put(definition.getId(), definition.getValue());
+ }
}
private void addColorDefinition(ColorDefinition definition, ThemeRegistry themeRegistry,
ColorRegistry colorRegistry) {
- themeRegistry.add(definition);
- colorRegistry.put(definition.getId(), definition.getValue());
+ if (colorRegistry.get(definition.getId()) == null) {
+ themeRegistry.add(definition);
+ colorRegistry.put(definition.getId(), definition.getValue());
+ }
}
protected ThemesExtension createThemesExtension() {
return new ThemesExtension();
}
+
+ protected void populateDefinition(org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme,
+ ITheme theme, ColorRegistry registry, ColorDefinition definition,
+ IPreferenceStore store) {
+ ThemeElementHelper.populateDefinition(cssTheme, theme, registry, definition, store);
+ }
+
+ protected void populateDefinition(org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme,
+ ITheme theme, FontRegistry registry, FontDefinition definition,
+ IPreferenceStore store) {
+ ThemeElementHelper.populateDefinition(cssTheme, theme, registry, definition, store);
+ }
+ }
+
+ private static class ThemeRegistryModifiedHandler implements EventHandler {
+ @Override
+ public void handleEvent(org.osgi.service.event.Event event) {
+ populateThemeRegistries(getThemeRegistry(), getFontRegistry(), getColorRegistry(),
+ getTheme(), getColorsAndFontsTheme());
+ sendThemeDefinitionChangedEvent();
+ }
+
+ private org.eclipse.e4.ui.css.swt.theme.ITheme getTheme() {
+ IThemeEngine themeEngine = (IThemeEngine) getContext()
+ .get(IThemeEngine.class.getName());
+ return themeEngine != null ? themeEngine.getActiveTheme() : null;
+ }
+
+ private ThemeRegistry getThemeRegistry() {
+ return (ThemeRegistry) getContext().get(IThemeRegistry.class.getName());
+ }
+
+ private FontRegistry getFontRegistry() {
+ return getColorsAndFontsTheme().getFontRegistry();
+ }
+
+ private ColorRegistry getColorRegistry() {
+ return getColorsAndFontsTheme().getColorRegistry();
+ }
+
+ private ITheme getColorsAndFontsTheme() {
+ return WorkbenchThemeManager.getInstance().getCurrentTheme();
+ }
+
+ private IEclipseContext getContext() {
+ return WorkbenchThemeManager.getInstance().context;
+ }
+
+ private void sendThemeDefinitionChangedEvent() {
+ MApplication application = (MApplication) getContext()
+ .get(MApplication.class.getName());
+ getInternalInstance().eventBroker.send(UIEvents.UILifeCycle.THEME_DEFINITION_CHANGED,
+ application);
+ }
+
+ private void populateThemeRegistries(ThemeRegistry themeRegistry,
+ FontRegistry fontRegistry, ColorRegistry colorRegistry,
+ org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme, ITheme theme) {
+ IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
+ for (FontDefinition definition : themeRegistry.getFonts()) {
+ if (definition.isOverridden() || definition.isAddedByCss()) {
+ populateDefinition(cssTheme, theme, fontRegistry, definition, store);
+ }
+ }
+ for (ColorDefinition definition : themeRegistry.getColors()) {
+ if (definition.isOverridden() || definition.isAddedByCss()) {
+ populateDefinition(cssTheme, theme, colorRegistry, definition, store);
+ }
+ }
+ }
+
+ protected void populateDefinition(org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme,
+ ITheme theme, ColorRegistry registry, ColorDefinition definition,
+ IPreferenceStore store) {
+ ThemeElementHelper.populateDefinition(cssTheme, theme, registry, definition, store);
+ }
+
+ protected void populateDefinition(org.eclipse.e4.ui.css.swt.theme.ITheme cssTheme,
+ ITheme theme, FontRegistry registry, FontDefinition definition,
+ IPreferenceStore store) {
+ ThemeElementHelper.populateDefinition(cssTheme, theme, registry, definition, store);
+ }
}
}
diff --git a/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ColorDefinitionTest.java b/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ColorDefinitionTest.java
index 27ee7a878f0..20ce5e7c637 100644
--- a/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ColorDefinitionTest.java
+++ b/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ColorDefinitionTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 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
@@ -48,7 +48,6 @@ public class ColorDefinitionTest extends CSSSWTTestCase {
assertEquals("name", definition.getName());
assertEquals("categoryId", definition.getCategoryId());
assertTrue(definition.getDescription().startsWith("description"));
- assertTrue(definition.getDescription().endsWith(definition.getOverriddenLabel()));
assertTrue(definition.isOverridden());
}
@@ -70,7 +69,6 @@ public class ColorDefinitionTest extends CSSSWTTestCase {
assertEquals("nameOverridden", definition.getName());
assertEquals("categoryIdOverridden", definition.getCategoryId());
assertTrue(definition.getDescription().startsWith("descriptionOverridden"));
- assertTrue(definition.getDescription().endsWith(definition.getOverriddenLabel()));
assertTrue(definition.isOverridden());
}
diff --git a/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/FontDefinitionTest.java b/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/FontDefinitionTest.java
index 5413a58b975..91b8dfc8b37 100644
--- a/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/FontDefinitionTest.java
+++ b/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/FontDefinitionTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 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
@@ -52,7 +52,6 @@ public class FontDefinitionTest extends CSSSWTTestCase {
assertEquals("categoryId", definition.getCategoryId());
assertEquals("name", definition.getName());
assertTrue(definition.getDescription().startsWith("description"));
- assertTrue(definition.getDescription().endsWith(definition.getOverriddenLabel()));
assertTrue(definition.isOverridden());
}
@@ -60,7 +59,7 @@ public class FontDefinitionTest extends CSSSWTTestCase {
throws Exception {
// given
CSSEngine engine = createEngine("FontDefinition#org-eclipse-jface-bannerfont {font-family: 'Times';font-size: 12;font-style: italic;" +
- " label:'nameOverridden'; category: '#categoryIdOverridden'; description: 'descriptionOverridden'}", display);
+ " label:'nameOverridden'; category: '#categoryIdOverridden'; description: 'descriptionOverridden'}", display);
FontDefinition definition = fontDefinition("org.eclipse.jface.bannerfont", "name", "categoryId", "description");
assertNull(definition.getValue());
@@ -77,7 +76,6 @@ public class FontDefinitionTest extends CSSSWTTestCase {
assertEquals("categoryIdOverridden", definition.getCategoryId());
assertEquals("nameOverridden", definition.getName());
assertTrue(definition.getDescription().startsWith("descriptionOverridden"));
- assertTrue(definition.getDescription().endsWith(definition.getOverriddenLabel()));
assertTrue(definition.isOverridden());
}
diff --git a/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ThemesExtensionTest.java b/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ThemesExtensionTest.java
index 7d994e39e05..d06489f292d 100644
--- a/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ThemesExtensionTest.java
+++ b/tests/org.eclipse.e4.ui.tests.css.swt/src/org/eclipse/e4/ui/tests/css/swt/ThemesExtensionTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013 IBM Corporation and others.
+ * Copyright (c) 2013, 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
@@ -45,7 +45,6 @@ public class ThemesExtensionTest extends CSSSWTTestCase {
assertEquals(ThemesExtension.DEFAULT_CATEGORY_ID,fontDefinition1.getCategoryId());
assertTrue(fontDefinition1.getName().startsWith(FontDefinition.class.getSimpleName()));
assertTrue(fontDefinition1.getName().endsWith(fontDefinition1.getId()));
- assertFalse(fontDefinition1.getDescription().contains(fontDefinition1.getOverriddenLabel()));
assertEquals(themesExtention.getDefaultDescription(),fontDefinition1.getDescription());
assertTrue(themesExtention.getDefinitions().get(1) instanceof FontDefinition);
@@ -56,7 +55,6 @@ public class ThemesExtensionTest extends CSSSWTTestCase {
assertEquals(ThemesExtension.DEFAULT_CATEGORY_ID,fontDefinition1.getCategoryId());
assertTrue(fontDefinition2.getName().startsWith(FontDefinition.class.getSimpleName()));
assertTrue(fontDefinition2.getName().endsWith(fontDefinition2.getId()));
- assertFalse(fontDefinition2.getDescription().contains(fontDefinition2.getOverriddenLabel()));
assertEquals(themesExtention.getDefaultDescription(),fontDefinition2.getDescription());
assertTrue(themesExtention.getDefinitions().get(2) instanceof ColorDefinition);
@@ -64,12 +62,10 @@ public class ThemesExtensionTest extends CSSSWTTestCase {
assertTrue(colorDefinition1.isAddedByCss());
assertFalse(colorDefinition1.isOverridden());
assertEquals("org.eclipse.ui.workbench.COLOR_DEF_1",colorDefinition1.getId());
- assertFalse(colorDefinition1.getDescription().contains(colorDefinition1.getOverriddenLabel()));
assertEquals(themesExtention.getDefaultDescription(),colorDefinition1.getDescription());
assertEquals(ThemesExtension.DEFAULT_CATEGORY_ID,colorDefinition1.getCategoryId());
assertTrue(colorDefinition1.getName().startsWith(ColorDefinition.class.getSimpleName()));
assertTrue(colorDefinition1.getName().endsWith(colorDefinition1.getId()));
- assertFalse(colorDefinition1.getDescription().contains(colorDefinition1.getOverriddenLabel()));
assertEquals(themesExtention.getDefaultDescription(),colorDefinition1.getDescription());
}
}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/WorkbenchThemeChangedHandlerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/WorkbenchThemeChangedHandlerTest.java
index cda77c3b2ca..849431b4475 100644
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/WorkbenchThemeChangedHandlerTest.java
+++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/WorkbenchThemeChangedHandlerTest.java
@@ -13,7 +13,9 @@ package org.eclipse.ui.tests.themes;
import java.util.Arrays;
+import org.eclipse.e4.ui.css.swt.theme.ITheme;
import org.eclipse.e4.ui.services.IStylingEngine;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.swt.graphics.FontData;
@@ -85,6 +87,16 @@ public class WorkbenchThemeChangedHandlerTest extends TestCase {
verify(colorRegistry, times(2)).put(eq("colorDefinition"), any(RGB.class));
verify(colorRegistry, times(1)).put(eq("colorDefinition"), eq(EMPTY_COLOR_VALUE));
+ verify(handler, times(1)).populateDefinition(any(ITheme.class), any(org.eclipse.ui.themes.ITheme.class),
+ eq(fontRegistry), eq(fontDefinition1), any(IPreferenceStore.class));
+ verify(handler, never()).populateDefinition(any(ITheme.class), any(org.eclipse.ui.themes.ITheme.class),
+ eq(fontRegistry), eq(fontDefinition2), any(IPreferenceStore.class));
+ verify(handler, times(1)).populateDefinition(any(ITheme.class), any(org.eclipse.ui.themes.ITheme.class),
+ eq(colorRegistry), eq(colorDefinition), any(IPreferenceStore.class));
+
+ verify(stylingEngine, times(1)).style(fontDefinition2);
+ verify(stylingEngine, times(1)).style(colorDefinition);
+
verify(handler, times(1)).sendThemeRegistryRestyledEvent();
}
@@ -190,6 +202,15 @@ public class WorkbenchThemeChangedHandlerTest extends TestCase {
verify(colorRegistry, times(2)).put(eq("colorDefinition2"), any(RGB.class));
verify(colorRegistry, times(1)).put(eq("colorDefinition2"), eq(EMPTY_COLOR_VALUE));
+ verify(handler, times(1)).populateDefinition(any(ITheme.class), any(org.eclipse.ui.themes.ITheme.class),
+ eq(fontRegistry), eq(fontDefinition1), any(IPreferenceStore.class));
+ verify(handler, times(1)).populateDefinition(any(ITheme.class), any(org.eclipse.ui.themes.ITheme.class),
+ eq(fontRegistry), eq(fontDefinition2), any(IPreferenceStore.class));
+ verify(handler, times(1)).populateDefinition(any(ITheme.class), any(org.eclipse.ui.themes.ITheme.class),
+ eq(colorRegistry), eq(colorDefinition1), any(IPreferenceStore.class));
+ verify(handler, times(1)).populateDefinition(any(ITheme.class), any(org.eclipse.ui.themes.ITheme.class),
+ eq(colorRegistry), eq(colorDefinition2), any(IPreferenceStore.class));
+
verify(handler, times(1)).sendThemeRegistryRestyledEvent();
}
@@ -222,5 +243,27 @@ public class WorkbenchThemeChangedHandlerTest extends TestCase {
@Override
public void sendThemeRegistryRestyledEvent() {
}
+
+ @Override
+ public ITheme getTheme(Event event) {
+ return null;
+ }
+
+ @Override
+ public org.eclipse.ui.themes.ITheme getColorsAndFontsTheme() {
+ return null;
+ }
+
+ @Override
+ public void populateDefinition(ITheme cssTheme,
+ org.eclipse.ui.themes.ITheme theme, ColorRegistry registry, ColorDefinition definition,
+ IPreferenceStore store) {
+ }
+
+ @Override
+ protected void populateDefinition(ITheme cssTheme,
+ org.eclipse.ui.themes.ITheme theme, FontRegistry registry, FontDefinition definition,
+ IPreferenceStore store) {
+ }
}
}

Back to the top