Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningTest.java')
-rw-r--r--org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningTest.java66
1 files changed, 66 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;
+ }
}

Back to the top