Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMickael Istria2021-10-26 14:46:09 +0000
committerMickael Istria2021-10-26 21:00:13 +0000
commita9c800075d8e561f64a07ab3f3f55afdd1b8d733 (patch)
tree45b9eca6a9ced3fbe98c9fc874f8fa61d50ca1ba
parente3323e3a0771f559fabb8df5360286b0f9cdd726 (diff)
downloadeclipse.platform.text-a9c800075d8e561f64a07ab3f3f55afdd1b8d733.tar.gz
eclipse.platform.text-a9c800075d8e561f64a07ab3f3f55afdd1b8d733.tar.xz
eclipse.platform.text-a9c800075d8e561f64a07ab3f3f55afdd1b8d733.zip
Bug 576716 - Code mining update that change scrolling cause completionI20211026-1800
popup to close on any keystroke Detect that some viewport changes still make the popup relevant and worth being kept open. Change-Id: I79f23a7aade5e73b07dc44da28fbef894dacc5a7 Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/186975 Tested-by: Platform Bot <platform-bot@eclipse.org> Reviewed-by: Mickael Istria <mistria@redhat.com>
-rw-r--r--org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java58
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java30
2 files changed, 85 insertions, 3 deletions
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java
index e4af1d0a71e..a9466262929 100644
--- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java
+++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningProjectionViewerTest.java
@@ -13,6 +13,8 @@
*/
package org.eclipse.jface.text.tests.codemining;
+import static org.junit.Assert.assertTrue;
+
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -28,6 +30,8 @@ import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.ILog;
@@ -38,18 +42,24 @@ import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.codemining.ICodeMining;
import org.eclipse.jface.text.codemining.ICodeMiningProvider;
import org.eclipse.jface.text.codemining.LineContentCodeMining;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.source.AnnotationPainter;
import org.eclipse.jface.text.source.IAnnotationAccess;
import org.eclipse.jface.text.source.ISharedTextColors;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
import org.eclipse.jface.text.source.projection.ProjectionSupport;
import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.jface.text.tests.contentassist.BarContentAssistProcessor;
import org.eclipse.jface.text.tests.source.inlined.LineContentBoundsDrawingTest.AccessAllAnnoations;
import org.eclipse.jface.text.tests.util.DisplayHelper;
@@ -82,7 +92,7 @@ public class CodeMiningProjectionViewerTest {
@Before
public void setUp() {
- fParent= new Shell();
+ fParent= new Shell(SWT.ON_TOP);
fParent.setSize(500, 200);
fParent.setLayout(new FillLayout());
fViewer= new ProjectionViewer(fParent, null, null, false, SWT.NONE);
@@ -140,4 +150,50 @@ public class CodeMiningProjectionViewerTest {
}
}
}
+
+ @Test
+ public void testCodeMiningDoesntAlterFocus() {
+ fViewer.configure(new SourceViewerConfiguration() {
+ @Override
+ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+ ContentAssistant contentAssistant= new ContentAssistant(true);
+ contentAssistant.addContentAssistProcessor(new BarContentAssistProcessor("1hi"), IDocument.DEFAULT_CONTENT_TYPE);
+ contentAssistant.addContentAssistProcessor(new BarContentAssistProcessor("1hello"), IDocument.DEFAULT_CONTENT_TYPE);
+ contentAssistant.setShowEmptyList(true);
+ return contentAssistant;
+ }
+ });
+ fViewer.setCodeMiningProviders(new ICodeMiningProvider[] {
+ new DelayedEchoCodeMiningProvider()
+ });
+ fViewer.getDocument().set("1a\n2a\n3a\n4a\n5a\n6a\n");
+ fParent.setSize(200, 4 * fViewer.getTextWidget().getLineHeight());
+ //fParent.pack(true);
+ fParent.open();
+ // ensure ViewportGuard is initialized
+ fViewer.getControl().notifyListeners(SWT.KeyUp, new Event());
+ fViewer.setSelectedRange(1, 0);
+ fViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
+ Display display= fParent.getDisplay();
+ assertTrue(new DisplayHelper() {
+ @Override
+ protected boolean condition() {
+ return display.getShells().length > 1;
+ }
+ }.waitForCondition(display, 1000));
+ Shell completionShell= display.getShells()[1];
+ // ↓ showing codeminings changing viewport while completion popup is open
+ fViewer.updateCodeMinings();
+ assertTrue(new DisplayHelper() {
+ @Override
+ protected boolean condition() {
+ return fViewer.getTextWidget().getLineVerticalIndent(0) > 0;
+ }
+ }.waitForCondition(display, 3000));
+ Event e= new Event();
+ e.widget= fViewer.getTextWidget();
+ e.keyCode= SWT.ARROW_DOWN;
+ fViewer.getTextWidget().notifyListeners(SWT.KeyDown, e);
+ assertTrue(completionShell.isVisible());
+ }
}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
index 21e307e286b..b9a6ff954a4 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
@@ -75,6 +75,7 @@ import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.JFacePreferences;
import org.eclipse.jface.util.Geometry;
import org.eclipse.jface.util.OpenStrategy;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
@@ -133,6 +134,12 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
*/
private Control fControl;
+ private Point fCaretLocation;
+
+ private int fCaretOffset;
+
+ private final ISelectionChangedListener fSelectionListener= e -> updateCurrentCaretInfo();
+
/**
* Installs this closer on it's viewer's text widget.
*/
@@ -154,8 +161,19 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
*/
control.addDisposeListener(this);
}
- if (fViewer != null)
+ if (fViewer != null) {
fViewer.addViewportListener(this);
+ fViewer.getSelectionProvider().addSelectionChangedListener(fSelectionListener);
+ updateCurrentCaretInfo();
+ }
+ }
+
+ private void updateCurrentCaretInfo() {
+ if (fViewer == null) {
+ return;
+ }
+ fCaretLocation= fViewer.getTextWidget().getCaret().getLocation();
+ fCaretOffset= fViewer.getSelectedRange().x;
}
/**
@@ -181,8 +199,10 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
control.removeDisposeListener(this);
}
- if (fViewer != null)
+ if (fViewer != null) {
fViewer.removeViewportListener(this);
+ fViewer.getSelectionProvider().removeSelectionChangedListener(fSelectionListener);
+ }
}
@Override
@@ -241,6 +261,12 @@ public class ContentAssistant implements IContentAssistant, IContentAssistantExt
@Override
public void viewportChanged(int topIndex) {
+ if (fViewer != null && fCaretLocation != null && //
+ fViewer.getTextWidget().getCaret().getLocation().equals(fCaretLocation) && //
+ fViewer.getSelectedRange().x == fCaretOffset) {
+ // Most likely some codemining altered viewport but didn't modify the caret position
+ return;
+ }
hide();
}
}

Back to the top