diff options
| author | Daniel Rolka | 2014-02-13 13:07:57 +0000 |
|---|---|---|
| committer | Gerrit Code Review @ Eclipse.org | 2014-03-04 00:41:10 +0000 |
| commit | 99409503bdd04b320f7ef9ea360a9599d2d0f998 (patch) | |
| tree | 0501134b11c217d0230ae7a922aa3304b5e0b551 | |
| parent | cbc039d9fc43d9f1bf46d202b1bd893feb896351 (diff) | |
| download | eclipse.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>
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) { + } } } |
