Bug 575277: [SourceEditor] Fix background color for preview and snippet
editors in dark theme
Change-Id: I35df96e427bc02a7f8bcd995fb2ad3a1d54587ff
diff --git a/ltk/org.eclipse.statet.ltk.ui/META-INF/MANIFEST.MF b/ltk/org.eclipse.statet.ltk.ui/META-INF/MANIFEST.MF
index 59b38c7..a4ff798 100644
--- a/ltk/org.eclipse.statet.ltk.ui/META-INF/MANIFEST.MF
+++ b/ltk/org.eclipse.statet.ltk.ui/META-INF/MANIFEST.MF
@@ -19,6 +19,8 @@
org.eclipse.core.expressions,
org.eclipse.ui,
org.eclipse.jface.databinding,
+ org.eclipse.e4.ui.css.core,
+ org.eclipse.e4.ui.css.swt,
org.eclipse.ui.editors;visibility:=reexport,
org.eclipse.ui.workbench.texteditor;visibility:=reexport,
org.eclipse.ui.views,
@@ -59,6 +61,8 @@
org.eclipse.statet.ltk.ui.sourceediting.actions,
org.eclipse.statet.ltk.ui.sourceediting.assist,
org.eclipse.statet.ltk.ui.sourceediting.folding,
+ org.eclipse.statet.ltk.ui.sourceediting.swt,
+ org.eclipse.statet.ltk.ui.sourceediting.util,
org.eclipse.statet.ltk.ui.templates,
org.eclipse.statet.ltk.ui.templates.config,
org.eclipse.statet.ltk.ui.util,
diff --git a/ltk/org.eclipse.statet.ltk.ui/plugin.xml b/ltk/org.eclipse.statet.ltk.ui/plugin.xml
index 8cfc621..031dfba 100644
--- a/ltk/org.eclipse.statet.ltk.ui/plugin.xml
+++ b/ltk/org.eclipse.statet.ltk.ui/plugin.xml
@@ -1173,6 +1173,46 @@
</theme>
</extension>
<extension
+ point="org.eclipse.e4.ui.css.core.elementProvider">
+ <provider
+ class="org.eclipse.statet.internal.ltk.ui.css.CustomSwtElementProvider">
+ <widget
+ class="org.eclipse.statet.ltk.ui.sourceediting.swt.EnhStyledText"/>
+ </provider>
+ </extension>
+ <extension
+ point="org.eclipse.e4.ui.css.core.propertyHandler">
+ <handler
+ adapter="org.eclipse.statet.internal.ltk.ui.css.EnhStyledTextElement"
+ handler="org.eclipse.statet.internal.ltk.ui.css.NoopCssPropertyHandler">
+ <property-name
+ name="background-color"/>
+ <property-name
+ name="color"/>
+ </handler>
+ <handler
+ adapter="org.eclipse.statet.internal.ltk.ui.css.EnhStyledTextElement"
+ handler="org.eclipse.statet.internal.ltk.ui.css.NoopCssPropertyHandler"
+ composite="true">
+ <property-name
+ name="font"/>
+ <property-name
+ name="font-family"/>
+ <property-name
+ name="font-size"/>
+ <property-name
+ name="font-adjust"/>
+ <property-name
+ name="font-stretch"/>
+ <property-name
+ name="font-style"/>
+ <property-name
+ name="font-variant"/>
+ <property-name
+ name="font-weight"/>
+ </handler>
+ </extension>
+ <extension
point="org.eclipse.e4.ui.css.swt.theme">
<stylesheet
uri="css/e4_dark.css">
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/text/ui/TextViewerEditorColorUpdater.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/text/ui/TextViewerEditorColorUpdater.java
deleted file mode 100644
index 30b2e3a..0000000
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/text/ui/TextViewerEditorColorUpdater.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2011, 2021 Stephan Wahlbrink and others.
- #
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- #
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- #
- # Contributors:
- # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ecommons.text.ui;
-
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND;
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT;
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND;
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT;
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND;
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT;
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND;
-import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-import org.eclipse.statet.jcommons.lang.NonNullByDefault;
-import org.eclipse.statet.jcommons.lang.Nullable;
-
-import org.eclipse.statet.ecommons.ui.util.UIAccess;
-
-
-@NonNullByDefault
-public class TextViewerEditorColorUpdater {
-
-
- protected final ISourceViewer viewer;
- protected final IPreferenceStore preferenceStore;
-
- private @Nullable IPropertyChangeListener listener;
-
-
- public TextViewerEditorColorUpdater(final SourceViewer viewer, final IPreferenceStore preferenceStore) {
- assert (viewer != null);
- assert (preferenceStore != null);
-
- this.viewer= viewer;
- this.preferenceStore= preferenceStore;
-
- viewer.getTextWidget().addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(final DisposeEvent e) {
- dispose();
- }
- });
-
- this.listener= new IPropertyChangeListener() {
- @Override
- public void propertyChange(final PropertyChangeEvent event) {
- if (PREFERENCE_COLOR_FOREGROUND.equals(event.getProperty())
- || PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT.equals(event.getProperty())
- || PREFERENCE_COLOR_BACKGROUND.equals(event.getProperty())
- || PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(event.getProperty())
- || PREFERENCE_COLOR_SELECTION_FOREGROUND.equals(event.getProperty())
- || PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT.equals(event.getProperty())
- || PREFERENCE_COLOR_SELECTION_BACKGROUND.equals(event.getProperty())
- || PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT.equals(event.getProperty()) ) {
- updateColors();
- }
- }
- };
- this.preferenceStore.addPropertyChangeListener(this.listener);
-
- updateColors();
- }
-
-
- protected void updateColors() {
- final var viewer= this.viewer;
- final StyledText styledText= viewer.getTextWidget();
- if (styledText != null && !styledText.isDisposed()) {
- update(viewer, styledText);
- }
- }
-
- protected void update(final ISourceViewer viewer, final StyledText styledText) {
- { // foreground color
- final Color color= this.preferenceStore.getBoolean(
- PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT) ? null :
- createColor(this.preferenceStore, PREFERENCE_COLOR_FOREGROUND);
- styledText.setForeground(color);
- }
- { // background color
- final Color color= this.preferenceStore.getBoolean(
- PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT) ? null :
- createColor(this.preferenceStore, PREFERENCE_COLOR_BACKGROUND);
- styledText.setBackground(color);
- }
- { // selection foreground color
- final Color color= this.preferenceStore.getBoolean(
- PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT) ? null :
- createColor(this.preferenceStore, PREFERENCE_COLOR_SELECTION_FOREGROUND);
- styledText.setSelectionForeground(color);
- }
- { // selection background color
- final Color color= this.preferenceStore.getBoolean(
- PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT) ? null :
- createColor(this.preferenceStore, PREFERENCE_COLOR_SELECTION_BACKGROUND);
- styledText.setSelectionBackground(color);
- }
- }
-
- protected @Nullable Color createColor(final IPreferenceStore store, final String key) {
- final RGB rgb= PreferenceConverter.getColor(store, key);
- return (rgb != null) ? new Color(rgb) : null;
- }
-
-
- protected void dispose() {
- { final var listener= this.listener;
- if (listener != null) {
- this.listener= null;
- this.preferenceStore.removePropertyChangeListener(listener);
- }
- }
-
- final StyledText styledText= this.viewer.getTextWidget();
- if (UIAccess.isOkToUse(styledText)) {
- styledText.setForeground(null);
- styledText.setBackground(null);
- styledText.setSelectionForeground(null);
- styledText.setSelectionBackground(null);
- }
- }
-
-}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/text/ui/presentation/AbstractTextStylesConfigurationBlock.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/text/ui/presentation/AbstractTextStylesConfigurationBlock.java
index 82e04a1..3189510 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/text/ui/presentation/AbstractTextStylesConfigurationBlock.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ecommons/text/ui/presentation/AbstractTextStylesConfigurationBlock.java
@@ -82,8 +82,6 @@
import org.eclipse.statet.ecommons.preferences.ui.OverlayStorePreference;
import org.eclipse.statet.ecommons.preferences.ui.PreferenceStoreBeanWrapper;
import org.eclipse.statet.ecommons.preferences.ui.RGBPref;
-import org.eclipse.statet.ecommons.text.ui.TextViewerEditorColorUpdater;
-import org.eclipse.statet.ecommons.text.ui.TextViewerJFaceUpdater;
import org.eclipse.statet.ecommons.text.ui.presentation.AbstractTextStylesConfigurationBlock.SyntaxNode.UseStyle;
import org.eclipse.statet.ecommons.text.ui.settings.JFaceTextStyleManager;
import org.eclipse.statet.ecommons.text.ui.settings.PreferenceStoreTextStyleManager;
@@ -95,6 +93,7 @@
import org.eclipse.statet.ecommons.ui.viewers.ViewerUtils.Node;
import org.eclipse.statet.internal.ecommons.text.ui.Messages;
+import org.eclipse.statet.internal.ltk.ui.PreviewSourceViewer;
import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfiguration;
@@ -701,12 +700,9 @@
private Control createPreviewer(final Composite parent) {
final IPreferenceStore store= new ChainedPreferenceStore(new IPreferenceStore[] {
this.fOverlayStore, EditorsUI.getPreferenceStore() });
- this.previewViewer= new SourceViewer(parent, null, null, false, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
- this.previewViewer.setEditable(false);
+ this.previewViewer= new PreviewSourceViewer(parent, store);
this.configuration= getSourceViewerConfiguration(store);
this.previewViewer.configure(this.configuration);
- new TextViewerJFaceUpdater(this.previewViewer, store);
- new TextViewerEditorColorUpdater(this.previewViewer, store);
final String content= loadPreviewContentFromFile(getPreviewFileName());
final IDocument document= new Document(content);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/PreviewSourceViewer.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/PreviewSourceViewer.java
new file mode 100644
index 0000000..0fff330
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/PreviewSourceViewer.java
@@ -0,0 +1,67 @@
+/*=============================================================================#
+ # Copyright (c) 2021 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.internal.ltk.ui;
+
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.editors.text.EditorsUI;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.swt.EnhStyledText;
+import org.eclipse.statet.ltk.ui.sourceediting.util.SourceViewerEditorPreferenceUpdater;
+
+
+@NonNullByDefault
+public class PreviewSourceViewer extends SourceViewer {
+
+
+ public PreviewSourceViewer(final Composite parent,
+ final boolean manageFont,
+ final IPreferenceStore preferenceStore) {
+ super(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+
+ setEditable(false);
+
+ final var textWidget= nonNullAssert(getTextWidget());
+ new SourceViewerEditorPreferenceUpdater(this, true, manageFont, preferenceStore);
+ if (!manageFont) {
+ textWidget.setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT));
+ }
+ }
+
+ public PreviewSourceViewer(final Composite parent,
+ final IPreferenceStore preferenceStore) {
+ this(parent, true, preferenceStore);
+ }
+
+ public PreviewSourceViewer(final Composite parent) {
+ this(parent, true, EditorsUI.getPreferenceStore());
+ }
+
+
+ @Override
+ protected StyledText createTextWidget(final Composite parent, final int styles) {
+ return EnhStyledText.forSourceEditor(parent, styles);
+ }
+
+
+}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/CustomSwtElementProvider.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/CustomSwtElementProvider.java
new file mode 100644
index 0000000..4799874
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/CustomSwtElementProvider.java
@@ -0,0 +1,45 @@
+/*=============================================================================#
+ # Copyright (c) 2021 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.internal.ltk.ui.css;
+
+import org.eclipse.e4.ui.css.core.dom.IElementProvider;
+import org.eclipse.e4.ui.css.core.engine.CSSEngine;
+
+import org.w3c.dom.Element;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ltk.ui.sourceediting.swt.EnhStyledText;
+
+
+@NonNullByDefault
+@SuppressWarnings("restriction")
+public class CustomSwtElementProvider implements IElementProvider {
+
+
+ public CustomSwtElementProvider() {
+ }
+
+
+ @Override
+ public @Nullable Element getElement(Object element, CSSEngine engine) {
+ if (element instanceof EnhStyledText) {
+ return new EnhStyledTextElement((EnhStyledText)element, engine);
+ }
+ return null;
+ }
+
+}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/EnhStyledTextElement.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/EnhStyledTextElement.java
new file mode 100644
index 0000000..11bd5f1
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/EnhStyledTextElement.java
@@ -0,0 +1,35 @@
+/*=============================================================================#
+ # Copyright (c) 2021 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.internal.ltk.ui.css;
+
+import org.eclipse.e4.ui.css.core.engine.CSSEngine;
+import org.eclipse.e4.ui.css.swt.dom.ControlElement;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.ltk.ui.sourceediting.swt.EnhStyledText;
+
+
+@NonNullByDefault
+@SuppressWarnings("restriction")
+public class EnhStyledTextElement extends ControlElement {
+
+
+ public EnhStyledTextElement(final EnhStyledText control, final CSSEngine engine) {
+ super(control, engine);
+ }
+
+
+}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/NoopCssPropertyHandler.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/NoopCssPropertyHandler.java
new file mode 100644
index 0000000..c97fcf6
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/internal/ltk/ui/css/NoopCssPropertyHandler.java
@@ -0,0 +1,43 @@
+/*=============================================================================#
+ # Copyright (c) 2021 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.internal.ltk.ui.css;
+
+import org.eclipse.e4.ui.css.core.dom.properties.ICSSPropertyHandler;
+import org.eclipse.e4.ui.css.core.engine.CSSEngine;
+
+import org.w3c.dom.css.CSSValue;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+
+@NonNullByDefault
+@SuppressWarnings("restriction")
+public class NoopCssPropertyHandler implements ICSSPropertyHandler {
+
+
+ public NoopCssPropertyHandler() {
+ }
+
+
+ @Override
+ public boolean applyCSSProperty(final Object element,
+ final String property, final CSSValue value, final @Nullable String pseudo,
+ final CSSEngine engine) throws Exception {
+ return true;
+ }
+
+
+}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ExtStyledText.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ExtStyledText.java
deleted file mode 100644
index 04e841a..0000000
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/ExtStyledText.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2021 Stephan Wahlbrink and others.
- #
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- #
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- #
- # Contributors:
- # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ltk.ui.sourceediting;
-
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Composite;
-
-import org.eclipse.statet.jcommons.lang.NonNullByDefault;
-import org.eclipse.statet.jcommons.lang.Nullable;
-
-
-@NonNullByDefault
-public class ExtStyledText extends StyledText {
-
-
- private @Nullable Color customBackgroundColor;
- private @Nullable Color customForegroundColor;
-
- private boolean inSetEnabled;
-
-
- public ExtStyledText(final Composite parent, final int style) {
- super(parent, style);
- }
-
-
- @Override
- public void setEnabled(final boolean enabled) {
- this.inSetEnabled= true;
- try {
- if (enabled) {
- super.setEnabled(true);
- applyCustomBackgroundColor();
- applyCustomForegroundColor();
- }
- else {
- super.setBackground(null);
- super.setForeground(null);
- super.setEnabled(false);
- }
- }
- finally {
- this.inSetEnabled= false;
- }
- }
-
- @Override
- public void setBackground(final @Nullable Color color) {
- if (this.inSetEnabled) {
- super.setBackground(color);
- }
- else {
- this.customBackgroundColor= color;
- if (isEnabled()) {
- applyCustomBackgroundColor();
- }
- }
- }
-
- private void applyCustomBackgroundColor() {
- super.setBackground(this.customBackgroundColor);
- if (this.customBackgroundColor == null) { // workaround for bug 573707
- super.setBackground(getBackground());
- }
- }
-
- @Override
- public void setForeground(final @Nullable Color color) {
- if (this.inSetEnabled) {
- super.setForeground(color);
- }
- else {
- this.customForegroundColor= color;
- if (isEnabled()) {
- applyCustomForegroundColor();
- }
- }
- }
-
- private void applyCustomForegroundColor() {
- super.setForeground(this.customForegroundColor);
- if (this.customForegroundColor == null) { // workaround for bug 573707
- super.setForeground(getForeground());
- }
- }
-
-}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java
index 8fed8ad..6ee3ad7 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SnippetEditor.java
@@ -50,8 +50,6 @@
import org.eclipse.statet.ecommons.commands.core.HandlerCollection;
import org.eclipse.statet.ecommons.preferences.ui.SettingsUpdater;
import org.eclipse.statet.ecommons.text.ui.TextViewerAction;
-import org.eclipse.statet.ecommons.text.ui.TextViewerEditorColorUpdater;
-import org.eclipse.statet.ecommons.text.ui.TextViewerJFaceUpdater;
import org.eclipse.statet.ecommons.ui.actions.ControlServicesUtil;
import org.eclipse.statet.ecommons.ui.components.WidgetToolsButton;
import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
@@ -59,6 +57,9 @@
import org.eclipse.statet.ecommons.ui.workbench.ContextHandlers;
import org.eclipse.statet.ecommons.ui.workbench.texteditor.ActionHandler;
+import org.eclipse.statet.ltk.ui.sourceediting.swt.EnhStyledText;
+import org.eclipse.statet.ltk.ui.sourceediting.util.SourceViewerEditorPreferenceUpdater;
+
/**
* Text snippet editor (no Eclipse editor) supporting {@link SourceEditorViewerConfigurator}.
@@ -215,9 +216,7 @@
final ViewerSourceEditorAdapter adapter= new ViewerSourceEditorAdapter(this.sourceViewer, this.configurator);
this.configurator.setTarget(adapter);
- new TextViewerJFaceUpdater(this.sourceViewer,
- this.configurator.getSourceViewerConfiguration().getPreferences() );
- new TextViewerEditorColorUpdater(this.sourceViewer,
+ new SourceViewerEditorPreferenceUpdater(this.sourceViewer,
this.configurator.getSourceViewerConfiguration().getPreferences() );
new SettingsUpdater(this.configurator, this.sourceViewer.getControl());
}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EnhStyledText.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/swt/EnhStyledText.java
similarity index 97%
rename from ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EnhStyledText.java
rename to ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/swt/EnhStyledText.java
index 16aabd0..ec7f6a7 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/EnhStyledText.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/swt/EnhStyledText.java
@@ -12,7 +12,7 @@
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
-package org.eclipse.statet.ltk.ui.sourceediting;
+package org.eclipse.statet.ltk.ui.sourceediting.swt;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Color;
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/util/SourceViewerEditorPreferenceUpdater.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/util/SourceViewerEditorPreferenceUpdater.java
new file mode 100644
index 0000000..72e7692
--- /dev/null
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/util/SourceViewerEditorPreferenceUpdater.java
@@ -0,0 +1,211 @@
+/*=============================================================================#
+ # Copyright (c) 2011, 2021 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ltk.ui.sourceediting.util;
+
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND;
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT;
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND;
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT;
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND;
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT;
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND;
+import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT;
+
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.RGB;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+
+@NonNullByDefault
+public class SourceViewerEditorPreferenceUpdater {
+
+
+ protected final ISourceViewer viewer;
+
+ private final boolean manageColors;
+ private final boolean manageFont;
+
+ protected final IPreferenceStore preferenceStore;
+ private @Nullable IPropertyChangeListener preferenceStoreListener;
+
+ private @Nullable IPropertyChangeListener fontRegistryListener;
+
+
+ public SourceViewerEditorPreferenceUpdater(final SourceViewer viewer,
+ final boolean manageColors, final boolean manageFont,
+ final IPreferenceStore preferenceStore ) {
+ this.viewer= nonNullAssert(viewer);
+
+ this.manageColors= manageColors;
+ this.manageFont= manageColors;
+
+ this.preferenceStore= nonNullAssert(preferenceStore);
+
+ final var textWidget= nonNullAssert(viewer.getTextWidget());
+ textWidget.addDisposeListener(new DisposeListener() {
+ @Override
+ public void widgetDisposed(final DisposeEvent e) {
+ dispose();
+ }
+ });
+
+ if (this.manageColors) {
+ final IPropertyChangeListener listener= new IPropertyChangeListener() {
+ @Override
+ public void propertyChange(final PropertyChangeEvent event) {
+ final String prefKey= event.getProperty();
+ final boolean updateColors= (SourceViewerEditorPreferenceUpdater.this.manageColors
+ && (PREFERENCE_COLOR_FOREGROUND.equals(prefKey)
+ || PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT.equals(prefKey)
+ || PREFERENCE_COLOR_BACKGROUND.equals(prefKey)
+ || PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(prefKey)
+ || PREFERENCE_COLOR_SELECTION_FOREGROUND.equals(prefKey)
+ || PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT.equals(prefKey)
+ || PREFERENCE_COLOR_SELECTION_BACKGROUND.equals(prefKey)
+ || PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT.equals(prefKey) ));
+ final boolean updateFont= false;
+ if (updateColors || updateFont) {
+ update(updateColors, updateFont);
+ }
+ }
+ };
+ this.preferenceStoreListener= listener;
+ this.preferenceStore.addPropertyChangeListener(listener);
+ }
+ if (this.manageFont) {
+ final var listener= new IPropertyChangeListener() {
+ @Override
+ public void propertyChange(final PropertyChangeEvent event) {
+ final String prefKey= event.getProperty();
+ final boolean updateFont= (getSymbolicFontName().equals(prefKey));
+ if (updateFont) {
+ update(false, updateFont);
+ }
+ }
+ };
+ this.fontRegistryListener= listener;
+ JFaceResources.getFontRegistry().addListener(listener);
+ }
+
+ update(this.manageColors, this.manageFont);
+ }
+
+ public SourceViewerEditorPreferenceUpdater(final SourceViewer viewer,
+ final IPreferenceStore preferenceStore) {
+ this(viewer, true, true, preferenceStore);
+ }
+
+
+ protected String getSymbolicFontName() {
+ return JFaceResources.TEXT_FONT;
+ }
+
+
+ protected void update(final boolean updateColors, final boolean updateFont) {
+ final var viewer= this.viewer;
+ final StyledText styledText= viewer.getTextWidget();
+ if (styledText != null && !styledText.isDisposed()) {
+ if (updateColors) {
+ updateColors(viewer, styledText);
+ }
+ if (updateFont) {
+ updateFont(viewer, styledText);
+ }
+ }
+ }
+
+ protected void updateColors(final ISourceViewer viewer, final StyledText styledText) {
+ { // foreground color
+ final Color color= this.preferenceStore.getBoolean(
+ PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT) ? null :
+ createColor(this.preferenceStore, PREFERENCE_COLOR_FOREGROUND);
+ styledText.setForeground(color);
+ }
+ { // background color
+ final Color color= this.preferenceStore.getBoolean(
+ PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT) ? null :
+ createColor(this.preferenceStore, PREFERENCE_COLOR_BACKGROUND);
+ styledText.setBackground(color);
+ }
+ { // selection foreground color
+ final Color color= this.preferenceStore.getBoolean(
+ PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT) ? null :
+ createColor(this.preferenceStore, PREFERENCE_COLOR_SELECTION_FOREGROUND);
+ styledText.setSelectionForeground(color);
+ }
+ { // selection background color
+ final Color color= this.preferenceStore.getBoolean(
+ PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT) ? null :
+ createColor(this.preferenceStore, PREFERENCE_COLOR_SELECTION_BACKGROUND);
+ styledText.setSelectionBackground(color);
+ }
+ }
+
+ protected @Nullable Color createColor(final IPreferenceStore store, final String key) {
+ final RGB rgb= PreferenceConverter.getColor(store, key);
+ return (rgb != null) ? new Color(rgb) : null;
+ }
+
+ protected void updateFont(final ISourceViewer viewer, final StyledText styledText) {
+ { final Font font= JFaceResources.getFont(getSymbolicFontName());
+ styledText.setFont(font);
+ }
+ }
+
+
+ protected void dispose() {
+ { final var listener= this.preferenceStoreListener;
+ if (listener != null) {
+ this.preferenceStoreListener= null;
+ this.preferenceStore.removePropertyChangeListener(listener);
+ }
+ }
+ { final var listener= this.fontRegistryListener;
+ if (listener != null) {
+ this.fontRegistryListener= null;
+ JFaceResources.getFontRegistry().removeListener(listener);
+ }
+ }
+
+ final var styledText= this.viewer.getTextWidget();
+ if (styledText != null && !styledText.isDisposed()) {
+ if (this.manageColors) {
+ styledText.setForeground(null);
+ styledText.setBackground(null);
+ styledText.setSelectionForeground(null);
+ styledText.setSelectionBackground(null);
+ }
+ if (this.manageFont) {
+ styledText.setFont(null);
+ }
+ }
+ }
+
+}
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java
index 6593053..9aa01b7 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/TemplatePreview.java
@@ -17,24 +17,22 @@
import java.util.Map;
import java.util.Set;
-import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateContextType;
-import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.text.templates.ContextTypeRegistry;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.statet.ecommons.preferences.ui.SettingsUpdater;
import org.eclipse.statet.ecommons.templates.TemplateVariableProcessor;
-import org.eclipse.statet.ecommons.text.ui.TextViewerEditorColorUpdater;
import org.eclipse.statet.ecommons.text.ui.TextViewerJFaceUpdater;
import org.eclipse.statet.ecommons.ui.ISettingsChangedHandler;
import org.eclipse.statet.ecommons.ui.util.UIAccess;
+import org.eclipse.statet.internal.ltk.ui.PreviewSourceViewer;
import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfigurator;
import org.eclipse.statet.ltk.ui.sourceediting.ViewerSourceEditorAdapter;
@@ -62,10 +60,8 @@
}
public SourceViewer createSourceViewer(final Composite parent) {
- final SourceViewer viewer= new SourceViewer(parent, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
- viewer.setEditable(false);
- viewer.getTextWidget().setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT));
- new TextViewerEditorColorUpdater(viewer, EditorsUI.getPreferenceStore());
+ final SourceViewer viewer= new PreviewSourceViewer(parent, false,
+ EditorsUI.getPreferenceStore() );
final IDocument document= new Document();
viewer.setDocument(document);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java
index 13c7e52..250820d 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractEditorTemplatesPage.java
@@ -21,7 +21,6 @@
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.AbstractDocument;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.BadPartitioningException;
@@ -33,9 +32,7 @@
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.templates.AbstractTemplatesPage;
import org.eclipse.ui.texteditor.templates.ITemplatesPage;
@@ -48,12 +45,12 @@
import org.eclipse.statet.ecommons.preferences.ui.SettingsUpdater;
import org.eclipse.statet.ecommons.templates.TemplateVariableProcessor;
import org.eclipse.statet.ecommons.text.core.util.TextUtils;
-import org.eclipse.statet.ecommons.text.ui.TextViewerEditorColorUpdater;
import org.eclipse.statet.ecommons.text.ui.TextViewerJFaceUpdater;
import org.eclipse.statet.ecommons.ui.ISettingsChangedHandler;
import org.eclipse.statet.ecommons.ui.util.UIAccess;
import org.eclipse.statet.internal.ltk.ui.LtkUIPlugin;
+import org.eclipse.statet.internal.ltk.ui.PreviewSourceViewer;
import org.eclipse.statet.ltk.model.core.ModelManager;
import org.eclipse.statet.ltk.ui.sourceediting.SourceEditor;
import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfigurator;
@@ -223,10 +220,7 @@
@Override
protected SourceViewer createPatternViewer(final Composite parent) {
- final SourceViewer viewer= new SourceViewer(parent, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
- viewer.setEditable(false);
- viewer.getTextWidget().setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT));
- new TextViewerEditorColorUpdater(viewer, EditorsUI.getPreferenceStore());
+ final SourceViewer viewer= new PreviewSourceViewer(parent);
final IDocument document= new Document();
viewer.setDocument(document);
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java
index e4e5fb4..4760543 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/templates/config/AbstractTemplatesPreferencePage.java
@@ -15,7 +15,6 @@
package org.eclipse.statet.ltk.ui.templates.config;
import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.AbstractDocument;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
@@ -24,16 +23,14 @@
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.text.templates.TemplatePersistenceData;
import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
import org.eclipse.statet.ecommons.preferences.ui.SettingsUpdater;
import org.eclipse.statet.ecommons.templates.TemplateVariableProcessor;
-import org.eclipse.statet.ecommons.text.ui.TextViewerEditorColorUpdater;
-import org.eclipse.statet.ecommons.text.ui.TextViewerJFaceUpdater;
+import org.eclipse.statet.internal.ltk.ui.PreviewSourceViewer;
import org.eclipse.statet.ltk.ui.sourceediting.SourceEditorViewerConfigurator;
import org.eclipse.statet.ltk.ui.sourceediting.ViewerSourceEditorAdapter;
import org.eclipse.statet.ltk.ui.templates.EnhTemplateStore;
@@ -82,18 +79,13 @@
@Override
protected SourceViewer createViewer(final Composite parent) {
- final SourceViewer viewer= new SourceViewer(parent, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
- viewer.setEditable(false);
- viewer.getTextWidget().setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT));
+ final SourceViewer viewer= new PreviewSourceViewer(parent,
+ this.viewerConfigurator.getSourceViewerConfiguration().getPreferences() );
final ViewerSourceEditorAdapter adapter= new ViewerSourceEditorAdapter(viewer, null);
this.viewerConfigurator.setTarget(adapter);
// updater
new SettingsUpdater(this.viewerConfigurator, viewer.getControl());
- new TextViewerJFaceUpdater(viewer,
- this.viewerConfigurator.getSourceViewerConfiguration().getPreferences() );
- new TextViewerEditorColorUpdater(viewer,
- this.viewerConfigurator.getSourceViewerConfiguration().getPreferences() );
final IDocument document= new Document();
this.viewerConfigurator.getDocumentSetupParticipant().setup(document);