diff options
| author | Stephan Wahlbrink | 2021-08-06 12:50:54 +0000 |
|---|---|---|
| committer | Stephan Wahlbrink | 2021-08-07 10:18:32 +0000 |
| commit | a938d97bf5e57f490bf4885ff198724d54729213 (patch) | |
| tree | e72b68c50837191a9d5afd8c1d0262bddc5d2ca8 | |
| parent | 6665015d5ba28f44fbd5e9d79ac6e5649d7961f7 (diff) | |
| download | org.eclipse.statet-ltk-a938d97bf5e57f490bf4885ff198724d54729213.tar.gz org.eclipse.statet-ltk-a938d97bf5e57f490bf4885ff198724d54729213.tar.xz org.eclipse.statet-ltk-a938d97bf5e57f490bf4885ff198724d54729213.zip | |
Bug 575277: [SourceEditor] Fix background color for preview and snippet
editors in dark theme
Change-Id: I35df96e427bc02a7f8bcd995fb2ad3a1d54587ff
14 files changed, 351 insertions, 176 deletions
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 @@ Require-Bundle: org.eclipse.statet.ecommons.runtime.core;bundle-version="[4.5.0, 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 @@ Export-Package: org.eclipse.statet.ecommons.templates, 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/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.OverlayStoreConfigurationBlock 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; 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 @@ public abstract class AbstractTextStylesConfigurationBlock extends OverlayStoreC 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.BasicHandlerCollection; 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.util.UIAccess; 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 @@ public class SnippetEditor extends Object { 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 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/ecommons/text/ui/TextViewerEditorColorUpdater.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/util/SourceViewerEditorPreferenceUpdater.java index 30b2e3a..72e7692 100644 --- 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/ltk/ui/sourceediting/util/SourceViewerEditorPreferenceUpdater.java @@ -12,7 +12,7 @@ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation #=============================================================================*/ -package org.eclipse.statet.ecommons.text.ui; +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; @@ -23,8 +23,11 @@ import static org.eclipse.ui.texteditor.AbstractTextEditor.PREFERENCE_COLOR_SELE 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; @@ -33,68 +36,112 @@ 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; -import org.eclipse.statet.ecommons.ui.util.UIAccess; - @NonNullByDefault -public class TextViewerEditorColorUpdater { +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 listener; + private @Nullable IPropertyChangeListener fontRegistryListener; - public TextViewerEditorColorUpdater(final SourceViewer viewer, final IPreferenceStore preferenceStore) { - assert (viewer != null); - assert (preferenceStore != null); + public SourceViewerEditorPreferenceUpdater(final SourceViewer viewer, + final boolean manageColors, final boolean manageFont, + final IPreferenceStore preferenceStore ) { + this.viewer= nonNullAssert(viewer); - this.viewer= viewer; - this.preferenceStore= preferenceStore; + this.manageColors= manageColors; + this.manageFont= manageColors; - viewer.getTextWidget().addDisposeListener(new DisposeListener() { + this.preferenceStore= nonNullAssert(preferenceStore); + + final var textWidget= nonNullAssert(viewer.getTextWidget()); + textWidget.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(); + 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.preferenceStore.addPropertyChangeListener(this.listener); + }; + 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); + } - updateColors(); + 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 updateColors() { + protected void update(final boolean updateColors, final boolean updateFont) { final var viewer= this.viewer; final StyledText styledText= viewer.getTextWidget(); if (styledText != null && !styledText.isDisposed()) { - update(viewer, styledText); + if (updateColors) { + updateColors(viewer, styledText); + } + if (updateFont) { + updateFont(viewer, styledText); + } } } - protected void update(final ISourceViewer viewer, final StyledText styledText) { + protected void updateColors(final ISourceViewer viewer, final StyledText styledText) { { // foreground color final Color color= this.preferenceStore.getBoolean( PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT) ? null : @@ -126,21 +173,38 @@ public class TextViewerEditorColorUpdater { 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.listener; + { final var listener= this.preferenceStoreListener; if (listener != null) { - this.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 StyledText styledText= this.viewer.getTextWidget(); - if (UIAccess.isOkToUse(styledText)) { - styledText.setForeground(null); - styledText.setBackground(null); - styledText.setSelectionForeground(null); - styledText.setSelectionBackground(null); + 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 @@ package org.eclipse.statet.ltk.ui.templates; 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 class TemplatePreview { } 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 java.util.Set; 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.Template; 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.jcommons.text.core.TextRegion; 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 @@ public abstract class AbstractEditorTemplatesPage extends AbstractTemplatesPage @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.Template; 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 @@ public abstract class AbstractTemplatesPreferencePage extends TemplatePreference @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); |
