Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMickael Istria2019-06-24 13:04:05 +0000
committerMickael Istria2019-09-16 07:42:13 +0000
commitb706c681d2e1dedf9cff05eb1a366db762abc8be (patch)
tree14c8e47e2756a474ec2f6cdb0ff4c6cfb2b836d9 /org.eclipse.jface.text/src
parentac2adad7a6d0be0fc28293d34900f45781810acd (diff)
downloadeclipse.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')
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/BlockTextSelection.java25
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/ITextViewerExtension9.java38
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java31
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);
}

Back to the top