Skip to content

Commit 1acae4f

Browse files
tobias-melchermickaelistria
authored andcommitted
draw code minings at end of line before eol character if possible
1 parent 954bc58 commit 1acae4f

File tree

3 files changed

+77
-16
lines changed

3 files changed

+77
-16
lines changed

bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/InlinedAnnotationDrawingStrategy.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@
1313
*/
1414
package org.eclipse.jface.text.source.inlined;
1515

16-
import org.eclipse.jface.text.ITextViewer;
17-
import org.eclipse.jface.text.source.Annotation;
18-
import org.eclipse.jface.text.source.AnnotationPainter.IDrawingStrategy;
1916
import org.eclipse.swt.SWT;
2017
import org.eclipse.swt.custom.StyleRange;
2118
import org.eclipse.swt.custom.StyledText;
@@ -27,6 +24,10 @@
2724
import org.eclipse.swt.graphics.Point;
2825
import org.eclipse.swt.graphics.Rectangle;
2926

27+
import org.eclipse.jface.text.ITextViewer;
28+
import org.eclipse.jface.text.source.Annotation;
29+
import org.eclipse.jface.text.source.AnnotationPainter.IDrawingStrategy;
30+
3031
/**
3132
* {@link IDrawingStrategy} implementation to render {@link AbstractInlinedAnnotation}.
3233
*
@@ -115,7 +116,7 @@ private boolean match(Font annotationFont, StyledText widget) {
115116
}
116117
int widgetFontHeight = widget.getFont().getFontData()[0].getHeight();
117118
int annotationFontHeight = annotationFont.getFontData()[0].getHeight();
118-
return annotationFontHeight == widgetFontHeight;
119+
return annotationFontHeight == widgetFontHeight;
119120
}
120121

121122
/**
@@ -201,7 +202,7 @@ private static void draw(LineHeaderAnnotation annotation, GC gc, StyledText text
201202
*/
202203
private static void draw(LineContentAnnotation annotation, GC gc, StyledText textWidget, int widgetOffset, int length,
203204
Color color) {
204-
if (annotation.isEndOfLine(widgetOffset, textWidget)) {
205+
if (annotation.isEmptyLine(widgetOffset, textWidget)) {
205206
drawAfterLine(annotation, gc, textWidget, widgetOffset, length, color);
206207
} else if (LineContentAnnotation.drawRightToPreviousChar(widgetOffset, textWidget)) {
207208
drawAsRightOfPreviousCharacter(annotation, gc, textWidget, widgetOffset, length, color);

bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/LineContentAnnotation.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,19 @@
1313
*/
1414
package org.eclipse.jface.text.source.inlined;
1515

16-
import org.eclipse.jface.text.ITextViewer;
17-
import org.eclipse.jface.text.ITextViewerExtension5;
18-
import org.eclipse.jface.text.Position;
19-
import org.eclipse.jface.text.TextPresentation;
20-
import org.eclipse.jface.text.source.ISourceViewer;
2116
import org.eclipse.swt.custom.StyleRange;
2217
import org.eclipse.swt.custom.StyledText;
2318
import org.eclipse.swt.graphics.Color;
2419
import org.eclipse.swt.graphics.FontMetrics;
2520
import org.eclipse.swt.graphics.GC;
2621
import org.eclipse.swt.graphics.GlyphMetrics;
2722

23+
import org.eclipse.jface.text.ITextViewer;
24+
import org.eclipse.jface.text.ITextViewerExtension5;
25+
import org.eclipse.jface.text.Position;
26+
import org.eclipse.jface.text.TextPresentation;
27+
import org.eclipse.jface.text.source.ISourceViewer;
28+
2829
/**
2930
* Inlined annotation which is drawn in the line content and which takes some place with a given
3031
* width.
@@ -162,14 +163,12 @@ static boolean drawRightToPreviousChar(int widgetOffset, StyledText textWidget)
162163
textWidget.getLineAtOffset(widgetOffset) == textWidget.getLineAtOffset(widgetOffset - 1);
163164
}
164165

165-
boolean isEndOfLine(int widgetOffset, StyledText text) {
166+
boolean isEmptyLine(int widgetOffset, StyledText text) {
166167
if (text.getCharCount() <= widgetOffset) { // Assuming widgetOffset >= 0
167168
return true;
168169
}
169170
int line= text.getLineAtOffset(widgetOffset);
170-
int startOfLine= text.getOffsetAtLine(line);
171-
int offsetInLine= widgetOffset - startOfLine;
172-
return offsetInLine >= text.getLine(line).length();
171+
String lineStr= text.getLine(line);
172+
return lineStr.length() == 0;
173173
}
174-
175174
}

tests/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/codemining/CodeMiningTest.java

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.junit.Test;
2727

2828
import org.eclipse.swt.SWT;
29+
import org.eclipse.swt.custom.StyleRange;
2930
import org.eclipse.swt.custom.StyledText;
3031
import org.eclipse.swt.graphics.GC;
3132
import org.eclipse.swt.graphics.Image;
@@ -194,6 +195,62 @@ protected boolean condition() {
194195
}.waitForCondition(fViewer.getControl().getDisplay(), 3000));
195196
}
196197

198+
@Test
199+
public void testCodeMiningEmptyLine() {
200+
fViewer.getDocument().set("\n");
201+
fViewer.setCodeMiningProviders(new ICodeMiningProvider[] { new ICodeMiningProvider() {
202+
@Override
203+
public CompletableFuture<List<? extends ICodeMining>> provideCodeMinings(ITextViewer viewer, IProgressMonitor monitor) {
204+
return CompletableFuture.completedFuture(Collections.singletonList(new StaticContentLineCodeMining(new Position(0, 1), "mining", this)));
205+
}
206+
207+
@Override
208+
public void dispose() {
209+
}
210+
} });
211+
StyledText widget= fViewer.getTextWidget();
212+
Assert.assertTrue("Code mining is not visible in 1st empty line after line break character", new DisplayHelper() {
213+
@Override
214+
protected boolean condition() {
215+
try {
216+
StyleRange range= widget.getStyleRangeAtOffset(0);
217+
return range == null && hasCodeMiningPrintedAfterTextOnLine(fViewer, 0);
218+
} catch (BadLocationException e) {
219+
e.printStackTrace();
220+
return false;
221+
}
222+
}
223+
}.waitForCondition(fViewer.getTextWidget().getDisplay(), 1000));
224+
}
225+
226+
@Test
227+
public void testCodeMiningEndOfLine() {
228+
fViewer.getDocument().set("a\n");
229+
fViewer.setCodeMiningProviders(new ICodeMiningProvider[] { new ICodeMiningProvider() {
230+
@Override
231+
public CompletableFuture<List<? extends ICodeMining>> provideCodeMinings(ITextViewer viewer, IProgressMonitor monitor) {
232+
return CompletableFuture.completedFuture(Collections.singletonList(new StaticContentLineCodeMining(new Position(1, 1), "mining", this)));
233+
}
234+
235+
@Override
236+
public void dispose() {
237+
}
238+
} });
239+
StyledText widget= fViewer.getTextWidget();
240+
Assert.assertTrue("Code mining is not visible in 1st line after character a before line break character", new DisplayHelper() {
241+
@Override
242+
protected boolean condition() {
243+
try {
244+
StyleRange range= widget.getStyleRangeAtOffset(0);
245+
return range != null && range.metrics != null && hasCodeMiningPrintedAfterTextOnLine(fViewer, 0) == false;
246+
} catch (BadLocationException e) {
247+
e.printStackTrace();
248+
return false;
249+
}
250+
}
251+
}.waitForCondition(fViewer.getTextWidget().getDisplay(), 1000));
252+
}
253+
197254
@Test
198255
public void testCodeMiningMultiLine() {
199256
fViewer.getDocument().set("a\nbc");
@@ -225,7 +282,11 @@ protected boolean condition() {
225282
private static boolean hasCodeMiningPrintedAfterTextOnLine(ITextViewer viewer, int line) throws BadLocationException {
226283
StyledText widget = viewer.getTextWidget();
227284
IDocument document= viewer.getDocument();
228-
Rectangle secondLineBounds = widget.getTextBounds(document.getLineOffset(1), document.getLineOffset(line) + document.getLineLength(line) - 1);
285+
int lineLength= document.getLineLength(line) - 1;
286+
if (lineLength < 0) {
287+
lineLength= 0;
288+
}
289+
Rectangle secondLineBounds= widget.getTextBounds(document.getLineOffset(line), document.getLineOffset(line) + lineLength);
229290
Image image = new Image(widget.getDisplay(), widget.getSize().x, widget.getSize().y);
230291
GC gc = new GC(widget);
231292
gc.copyArea(image, 0, 0);

0 commit comments

Comments
 (0)