diff options
| author | Stephan Wahlbrink | 2021-12-16 14:32:18 +0000 |
|---|---|---|
| committer | Stephan Wahlbrink | 2021-12-16 14:49:59 +0000 |
| commit | 33b56f177f75dc1e4e5fff580915556a99a9cf02 (patch) | |
| tree | e05f66fa877926a8045469f7bb7f75855ffb85cb | |
| parent | 9e105b14cd81a18b0751a3e9d3e7d5d1a45621e7 (diff) | |
| download | org.eclipse.statet-ltk-33b56f177f75dc1e4e5fff580915556a99a9cf02.tar.gz org.eclipse.statet-ltk-33b56f177f75dc1e4e5fff580915556a99a9cf02.tar.xz org.eclipse.statet-ltk-33b56f177f75dc1e4e5fff580915556a99a9cf02.zip | |
Bug 577852: [SourceEditor] Fix custom colors of editor overwritten by
CSS styling
- Add nullable annotations to SourceEditorViewer
Change-Id: Ifd6227da2c4d301d9e6e35f862d666ab8e49766b
| -rw-r--r-- | ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewer.java | 124 |
1 files changed, 74 insertions, 50 deletions
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewer.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewer.java index 50f88cb..c005886 100644 --- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewer.java +++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/SourceEditorViewer.java @@ -14,6 +14,9 @@ package org.eclipse.statet.ltk.ui.sourceediting; +import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert; +import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullLateInit; + import org.eclipse.core.runtime.Assert; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadPositionCategoryException; @@ -34,12 +37,15 @@ import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; -import org.eclipse.statet.jcommons.lang.NonNull; +import org.eclipse.statet.jcommons.lang.NonNullByDefault; import org.eclipse.statet.jcommons.lang.Nullable; import org.eclipse.statet.ecommons.text.core.util.NonDeletingPositionUpdater; +import org.eclipse.statet.ltk.ui.sourceediting.swt.EnhStyledText; + +@NonNullByDefault public class SourceEditorViewer extends ProjectionViewer { @@ -71,9 +77,9 @@ public class SourceEditorViewer extends ProjectionViewer { private int lastSentSelectionOffset; private int lastSentSelectionLength; - private IInformationPresenter sourceOutlinePresenter; - private IInformationPresenter elementOutlinePresenter; - private IInformationPresenter elementHierarchyPresenter; + private @Nullable IInformationPresenter sourceOutlinePresenter; + private @Nullable IInformationPresenter elementOutlinePresenter; + private @Nullable IInformationPresenter elementHierarchyPresenter; public SourceEditorViewer(final Composite parent, final IVerticalRuler ruler, @@ -104,6 +110,12 @@ public class SourceEditorViewer extends ProjectionViewer { @Override + protected StyledText createTextWidget(final Composite parent, final int styles) { + return EnhStyledText.forSourceEditor(parent, styles); + } + + + @Override protected void fireSelectionChanged(final SelectionChangedEvent event) { final ITextSelection selection= (ITextSelection) event.getSelection(); this.lastSentSelectionOffset= selection.getOffset(); @@ -113,7 +125,7 @@ public class SourceEditorViewer extends ProjectionViewer { } - private IInformationPresenter getPresenter(final int operation) { + private @Nullable IInformationPresenter getPresenter(final int operation) { switch (operation) { case SHOW_SOURCE_OUTLINE: return this.sourceOutlinePresenter; @@ -126,7 +138,7 @@ public class SourceEditorViewer extends ProjectionViewer { } } - private void setPresenter(final int operation, final IInformationPresenter presenter) { + private void setPresenter(final int operation, final @Nullable IInformationPresenter presenter) { switch (operation) { case SHOW_SOURCE_OUTLINE: this.sourceOutlinePresenter= presenter; @@ -202,9 +214,9 @@ public class SourceEditorViewer extends ProjectionViewer { super.unconfigure(); } - public @NonNull String @Nullable [] getDefaultPrefixes(final String contentType) { + public String @Nullable [] getDefaultPrefixes(final String contentType) { return (this.fDefaultPrefixChars != null) ? - (String[]) this.fDefaultPrefixChars.get(contentType) : + (String[])this.fDefaultPrefixChars.get(contentType) : null; } @@ -215,19 +227,20 @@ public class SourceEditorViewer extends ProjectionViewer { private final class ViewerState { /** The position tracking the selection. */ - private Position selection; + private @Nullable Position selectionPosition; /** The position tracking the visually stable line. */ - private Position stableLine; + private @Nullable Position stableLinePosition; /** The pixel offset of the stable line measured from the client area. */ private int stablePixel; - /** The position updater for {@link #selection} and {@link #stableLine}. */ - private IPositionUpdater updater; + //-- connect(Document) -- + /** The position updater for {@link #selectionPosition} and {@link #stableLinePosition}. */ + private IPositionUpdater updater= nonNullLateInit(); /** The document that the position updater and the positions are registered with. */ - private IDocument updaterDocument; + private IDocument updaterDocument= nonNullLateInit(); /** The position category used by {@link #updater}. */ - private String updaterCategory; + private String updaterCategory= nonNullLateInit(); private int topPixel; @@ -244,17 +257,19 @@ public class SourceEditorViewer extends ProjectionViewer { public void updateSelection(final int offset, final int length) { - if (this.selection == null) { - this.selection= new Position(offset, length); + var selectionPosition= this.selectionPosition; + if (selectionPosition == null) { + selectionPosition= new Position(offset, length); + this.selectionPosition= selectionPosition; if (isConnected()) { try { - this.updaterDocument.addPosition(this.updaterCategory, this.selection); + this.updaterDocument.addPosition(this.updaterCategory, selectionPosition); } catch (final BadLocationException | BadPositionCategoryException e) {} } } else { - updatePosition(this.selection, offset, length); + updatePosition(selectionPosition, offset, length); } } @@ -264,30 +279,35 @@ public class SourceEditorViewer extends ProjectionViewer { * selection has been updated while in redraw(false) mode, the new selection is revealed. */ private void updateViewport() { - final StyledText textWidget= getTextWidget(); - if (this.selection != null) { - textWidget.setTopPixel(this.topPixel); - revealRange(this.selection.getOffset(), this.selection.getLength()); - } - else if (this.stableLine != null) { - int stableLine; - try { - stableLine= this.updaterDocument.getLineOfOffset(this.stableLine.getOffset()); - } - catch (final BadLocationException x) { - // ignore and return silently + final StyledText textWidget= nonNullAssert(getTextWidget()); + { final Position selection= this.selectionPosition; + if (selection != null) { textWidget.setTopPixel(this.topPixel); + revealRange(selection.getOffset(), selection.getLength()); return; } - final int stableWidgetLine= getClosestWidgetLineForModelLine(stableLine); - if (stableWidgetLine == -1) { - textWidget.setTopPixel(this.topPixel); - return; + } + { final Position stableLinePosition= this.stableLinePosition; + if (stableLinePosition != null) { + int stableLine; + try { + stableLine= this.updaterDocument.getLineOfOffset(stableLinePosition.getOffset()); + } + catch (final BadLocationException x) { + // ignore and return silently + textWidget.setTopPixel(this.topPixel); + return; + } + final int stableWidgetLine= getClosestWidgetLineForModelLine(stableLine); + if (stableWidgetLine == -1) { + textWidget.setTopPixel(this.topPixel); + return; + } + final int linePixel= textWidget.getLinePixel(stableWidgetLine); + final int delta= this.stablePixel - linePixel; + final int topPixel= textWidget.getTopPixel(); + textWidget.setTopPixel(topPixel - delta); } - final int linePixel= textWidget.getLinePixel(stableWidgetLine); - final int delta= this.stablePixel - linePixel; - final int topPixel= textWidget.getTopPixel(); - textWidget.setTopPixel(topPixel - delta); } } @@ -301,7 +321,7 @@ public class SourceEditorViewer extends ProjectionViewer { Assert.isLegal(!isConnected()); this.updaterDocument= document; try { - final StyledText textWidget= getTextWidget(); + final StyledText textWidget= nonNullAssert(getTextWidget()); this.updaterCategory= "ViewerState-" + hashCode(); this.updater= new NonDeletingPositionUpdater(this.updaterCategory); this.updaterDocument.addPositionCategory(this.updaterCategory); @@ -311,8 +331,8 @@ public class SourceEditorViewer extends ProjectionViewer { final int stableWidgetLine= modelLine2WidgetLine(stableLine); this.stablePixel= textWidget.getLinePixel(stableWidgetLine); final IRegion stableLineInfo= this.updaterDocument.getLineInformation(stableLine); - this.stableLine= new Position(stableLineInfo.getOffset(), stableLineInfo.getLength()); - this.updaterDocument.addPosition(this.updaterCategory, this.stableLine); + this.updaterDocument.addPosition(this.updaterCategory, + this.stableLinePosition= new Position(stableLineInfo.getOffset(), stableLineInfo.getLength()) ); this.topPixel= textWidget.getTopPixel(); } @@ -342,7 +362,8 @@ public class SourceEditorViewer extends ProjectionViewer { */ private int getStableLine() { int stableLine; // the model line that we try to keep stable - final int caretLine= getTextWidget().getLineAtOffset(getTextWidget().getCaretOffset()); + final StyledText textWidget= nonNullAssert(getTextWidget()); + final int caretLine= textWidget.getLineAtOffset(textWidget.getCaretOffset()); if (caretLine < JFaceTextUtil.getPartialTopIndex(getTextWidget()) || caretLine > JFaceTextUtil.getPartialBottomIndex(getTextWidget())) { stableLine= JFaceTextUtil.getPartialTopIndex(SourceEditorViewer.this); } @@ -365,10 +386,11 @@ public class SourceEditorViewer extends ProjectionViewer { /** * Disconnects from the document. */ + @SuppressWarnings("null") private void disconnect() { if (isConnected()) { try { - this.updaterDocument.removePosition(this.updaterCategory, this.stableLine); + this.updaterDocument.removePosition(this.updaterCategory, this.stableLinePosition); this.updaterDocument.removePositionUpdater(this.updater); this.updater= null; this.updaterDocument.removePositionCategory(this.updaterCategory); @@ -383,7 +405,7 @@ public class SourceEditorViewer extends ProjectionViewer { } - private ViewerState viewerState; + private @Nullable ViewerState viewerState; @Override @@ -399,19 +421,21 @@ public class SourceEditorViewer extends ProjectionViewer { protected void enabledRedrawing(final int topIndex) { super.enabledRedrawing(topIndex); - if (this.viewerState != null) { - this.viewerState.disconnect(); + final var viewerState= this.viewerState; + if (viewerState != null) { + this.viewerState= null; + viewerState.disconnect(); if (topIndex == -1) { - this.viewerState.updateViewport(); + viewerState.updateViewport(); } - this.viewerState= null; } } @Override public void setSelectedRange(final int selectionOffset, final int selectionLength) { - if (this.viewerState != null && !redraws()) { - this.viewerState.updateSelection(selectionOffset, selectionLength); + final var viewerState= this.viewerState; + if (viewerState != null && !redraws()) { + viewerState.updateSelection(selectionOffset, selectionLength); return; } |
