diff options
author | Mickael Istria | 2021-10-26 14:46:09 +0000 |
---|---|---|
committer | Mickael Istria | 2021-10-26 21:00:13 +0000 |
commit | a9c800075d8e561f64a07ab3f3f55afdd1b8d733 (patch) | |
tree | 45b9eca6a9ced3fbe98c9fc874f8fa61d50ca1ba | |
parent | e3323e3a0771f559fabb8df5360286b0f9cdd726 (diff) | |
download | eclipse.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>
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(); } } |