diff options
author | Mickael Istria | 2019-06-24 13:04:05 +0000 |
---|---|---|
committer | Mickael Istria | 2019-09-16 07:42:13 +0000 |
commit | b706c681d2e1dedf9cff05eb1a366db762abc8be (patch) | |
tree | 14c8e47e2756a474ec2f6cdb0ff4c6cfb2b836d9 /org.eclipse.jface.text/src | |
parent | ac2adad7a6d0be0fc28293d34900f45781810acd (diff) | |
download | eclipse.platform.text-b706c681d2e1dedf9cff05eb1a366db762abc8be.tar.gz eclipse.platform.text-b706c681d2e1dedf9cff05eb1a366db762abc8be.tar.xz eclipse.platform.text-b706c681d2e1dedf9cff05eb1a366db762abc8be.zip |
Bug 547683 - Add non-UI Thread access to last known selection
Adds ITextViewerExtension9.getLastKnownSelection() method that gives
access to
last known value for the selection without requiring UI Thread.
The new Generic Editor test case shows how this can be leveraged in
ContentAssistProcessors.
Change-Id: I8a4831c08f7ff1ade07f2a12ad8d0d2c682a372c
Signed-off-by: Mickael Istria <mistria@redhat.com>
Diffstat (limited to 'org.eclipse.jface.text/src')
3 files changed, 93 insertions, 1 deletions
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/BlockTextSelection.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/BlockTextSelection.java index 473695266c2..d75a296aaed 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/BlockTextSelection.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/BlockTextSelection.java @@ -159,4 +159,29 @@ public class BlockTextSelection extends TextSelection implements IBlockTextSelec } return new IRegion[] {new Region(getOffset(), getLength())}; } + + /** + * @since 3.16 + */ + @Override + public String toString() { + StringBuilder sb= new StringBuilder(); + sb.append("BlockTextSelection [offset: ").append(getOffset()); //$NON-NLS-1$ + sb.append(", startLine: ").append(fStartLine); //$NON-NLS-1$ + if (fEndLine != fStartLine) { + sb.append(", endLine: ").append(fEndLine); //$NON-NLS-1$ + } + sb.append(", startColumn: ").append(fStartColumn); //$NON-NLS-1$ + if (fEndColumn != fStartColumn) { + sb.append(", endColumn").append(fEndColumn); //$NON-NLS-1$ + } + if (getLength() != 0) { + sb.append(", text: ").append(getText()); //$NON-NLS-1$ + } + if (getDocument() != null) { + sb.append(", document: ").append(getDocument()); //$NON-NLS-1$ + } + sb.append("]"); //$NON-NLS-1$ + return sb.toString(); + } } diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension9.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension9.java new file mode 100644 index 00000000000..c26d7e82060 --- /dev/null +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension9.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2019 Red Hat Inc. and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.jface.text; + +import org.eclipse.jface.viewers.ISelectionProvider; + +/** + * Extension interface for {@link org.eclipse.jface.text.ITextViewer}. Adds the ability to retrieve + * the last known selection from outside of the UI Thread. + * + * @since 3.16 + */ +public interface ITextViewerExtension9 { + + + /** + * Returns the last known selection from a cache, without polling widget. + * <p> + * This may <strong>not</strong> be the current selection. Indeed, operations that change the + * selection without sending related events may not refresh the returned value. + * </p> + * <p> + * As opposed to {@link ISelectionProvider#getSelection()} that usually requires UI Thread, this + * method can run from any thread. + * </p> + * + * @return the last known selection. + */ + public ITextSelection getLastKnownSelection(); +} diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java index 27ae2c3b094..9a274e3d94b 100644 --- a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java +++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java @@ -113,7 +113,7 @@ import org.eclipse.jface.text.projection.ChildDocumentManager; * @noextend This class is not intended to be subclassed by clients. */ public class TextViewer extends Viewer implements - ITextViewer, ITextViewerExtension, ITextViewerExtension2, ITextViewerExtension4, ITextViewerExtension6, ITextViewerExtension7, ITextViewerExtension8, + ITextViewer, ITextViewerExtension, ITextViewerExtension2, ITextViewerExtension4, ITextViewerExtension6, ITextViewerExtension7, ITextViewerExtension8, ITextViewerExtension9, IEditingSupportRegistry, ITextOperationTarget, ITextOperationTargetExtension, IWidgetTokenOwner, IWidgetTokenOwnerExtension, IPostSelectionProvider { @@ -1752,6 +1752,12 @@ public class TextViewer extends Viewer implements selectionChanged(event.x, event.y - event.x); } }); + fTextWidget.addCaretListener(e -> { + // caret listener is invoked before widget actually performs the caret (and selection) + // change. So we can't update the selection synchronously on event, instead, we + // delay the selection update. + fTextWidget.getDisplay().asyncExec(() -> selectionChanged(e.caretOffset, 0)); + }); fCursorListener= new CursorListener(); fCursorListener.install(); @@ -2234,6 +2240,21 @@ public class TextViewer extends Viewer implements //---- Selection + /** + * Caches the selection value. Is only modified from inside UI Thread. Can be accessed from any + * thread. + */ + private volatile ITextSelection cachedSelection= TextSelection.emptySelection(); + + private void updateSelectionCache() { + cachedSelection= computeSelection(); + } + + @Override + public ITextSelection getLastKnownSelection() { + return cachedSelection; + } + @Override public Point getSelectedRange() { @@ -2272,6 +2293,7 @@ public class TextViewer extends Viewer implements selectionChanged(selectionRange[0], selectionRange[1]); } } + updateSelectionCache(); } /** @@ -2410,6 +2432,12 @@ public class TextViewer extends Viewer implements @Override public ISelection getSelection() { + final ITextSelection res= computeSelection(); + cachedSelection= res; + return res; + } + + private ITextSelection computeSelection() { if (fTextWidget != null && fTextWidget.getBlockSelection()) { int[] ranges= fTextWidget.getSelectionRanges(); int startOffset= ranges[0]; @@ -2574,6 +2602,7 @@ public class TextViewer extends Viewer implements * @param length the length of the newly selected range in the visible document */ protected void selectionChanged(int offset, int length) { + updateSelectionCache(); queuePostSelectionChanged(true); fireSelectionChanged(offset, length); } |