diff options
author | Mickael Istria | 2019-04-29 12:50:05 +0000 |
---|---|---|
committer | Mickael Istria - away until Apr 22nd | 2019-04-29 14:51:37 +0000 |
commit | b26b8782569616fcace8dcbd47a61c13ae694513 (patch) | |
tree | 84fd60f11a0c7debe839f9da112df36572b987ca /org.eclipse.jface.text.tests | |
parent | 54ad465f841c2c09437070d0234d1e3166301b89 (diff) | |
download | eclipse.platform.text-b26b8782569616fcace8dcbd47a61c13ae694513.tar.gz eclipse.platform.text-b26b8782569616fcace8dcbd47a61c13ae694513.tar.xz eclipse.platform.text-b26b8782569616fcace8dcbd47a61c13ae694513.zip |
Bug 546706 - multi-line code minings rendered erroneouslyI20190429-1800
Change-Id: I1a89962176d2583551e4fcd28b2511a69b62aa23
Signed-off-by: Mickael Istria <mistria@redhat.com>
Diffstat (limited to 'org.eclipse.jface.text.tests')
2 files changed, 71 insertions, 0 deletions
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningTest.java index cac5fde14ae..dbb7c0962d7 100644 --- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningTest.java +++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningTest.java @@ -13,6 +13,9 @@ *******************************************************************************/ package org.eclipse.jface.text.tests.codemining; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; import org.junit.After; @@ -24,16 +27,25 @@ import org.junit.Test; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; +import org.eclipse.core.runtime.IProgressMonitor; + import org.eclipse.jface.util.Util; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; +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.reconciler.DirtyRegion; import org.eclipse.jface.text.reconciler.IReconcilingStrategy; @@ -49,6 +61,7 @@ public class CodeMiningTest { private SourceViewer fViewer; private Shell fShell; + private int defaultCharWidth; @Rule public ScreenshotOnFailureRule rule = new ScreenshotOnFailureRule(); @@ -59,6 +72,9 @@ public class CodeMiningTest { fShell.setLayout(new FillLayout()); fViewer= new SourceViewer(fShell, null, SWT.NONE); final StyledText textWidget= fViewer.getTextWidget(); + textWidget.setText("a"); + defaultCharWidth = textWidget.getTextBounds(0, 0).width; + textWidget.setText(""); MonoReconciler reconciler = new MonoReconciler(new IReconcilingStrategy() { @Override public void setDocument(IDocument document) { @@ -180,4 +196,54 @@ public class CodeMiningTest { }.waitForCondition(fViewer.getControl().getDisplay(), 3000)); } + @Test + public void testCodeMiningMultiLine() throws BadLocationException { + fViewer.getDocument().set("a\nbc"); + fViewer.setCodeMiningProviders(new ICodeMiningProvider[] { new ICodeMiningProvider() { + @Override + public CompletableFuture<List<? extends ICodeMining>> provideCodeMinings(ITextViewer viewer, IProgressMonitor monitor) { + return CompletableFuture.completedFuture(Collections.singletonList(new StaticContentLineCodeMining(new Position(0, 3), "long enough code mining to be wider than actual text", this))); + } + + @Override + public void dispose() { + } + } }); + StyledText widget = fViewer.getTextWidget(); + Assert.assertFalse("Code mining is visible on 2nd line", new DisplayHelper() { + @Override + protected boolean condition() { + try { + return widget.getStyleRangeAtOffset(0) != null && widget.getStyleRangeAtOffset(0).metrics != null + && hasCodeMiningPrintedAfterTextOnLine(fViewer, 1); + } catch (BadLocationException e) { + e.printStackTrace(); + return true; + } + } + }.waitForCondition(fViewer.getTextWidget().getDisplay(), 1000)); + } + + private static boolean hasCodeMiningPrintedAfterTextOnLine(ITextViewer viewer, int line) throws BadLocationException { + StyledText widget = viewer.getTextWidget(); + IDocument document= viewer.getDocument(); + Rectangle secondLineBounds = widget.getTextBounds(document.getLineOffset(1), document.getLineOffset(line) + document.getLineLength(line) - 1); + Image image = new Image(widget.getDisplay(), widget.getSize().x, widget.getSize().y); + GC gc = new GC(widget); + gc.copyArea(image, 0, 0); + gc.dispose(); + ImageData imageData = image.getImageData(); + secondLineBounds.x += secondLineBounds.width; // look only area after text + for (int x = secondLineBounds.x + 1; x < image.getBounds().width && x < imageData.width; x++) { + for (int y = secondLineBounds.y; y < secondLineBounds.y + secondLineBounds.height && y < imageData.height; y++) { + if (!imageData.palette.getRGB(imageData.getPixel(x, y)).equals(widget.getBackground().getRGB())) { + // code mining printed + image.dispose(); + return true; + } + } + } + image.dispose(); + return false; + } } diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/StaticContentLineCodeMining.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/StaticContentLineCodeMining.java index 59ef8f6e6ce..726b7a698ca 100644 --- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/StaticContentLineCodeMining.java +++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/StaticContentLineCodeMining.java @@ -19,6 +19,11 @@ import org.eclipse.jface.text.codemining.LineContentCodeMining; public class StaticContentLineCodeMining extends LineContentCodeMining { + public StaticContentLineCodeMining(Position position, String message, ICodeMiningProvider provider) { + super(position, provider); + setLabel(message); + } + public StaticContentLineCodeMining(int i, char c, ICodeMiningProvider repeatLettersCodeMiningProvider) { super(new Position(i, 1), repeatLettersCodeMiningProvider); setLabel(Character.toString(c)); |