Skip to content

Commit f4a08a2

Browse files
Deleted code minings in invisible area need to be redrawn
so that StyleRange and LineVerticalIndent on StyledTexxt control are removed. Fixes #3120
1 parent 0c268ac commit f4a08a2

File tree

5 files changed

+72
-3
lines changed

5 files changed

+72
-3
lines changed

bundles/org.eclipse.jface.text/src/org/eclipse/jface/internal/text/codemining/CodeMiningManager.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.eclipse.jface.text.codemining.ICodeMiningProvider;
4848
import org.eclipse.jface.text.codemining.LineContentCodeMining;
4949
import org.eclipse.jface.text.codemining.LineHeaderCodeMining;
50+
import org.eclipse.jface.text.source.Annotation;
5051
import org.eclipse.jface.text.source.ISourceViewer;
5152
import org.eclipse.jface.text.source.inlined.AbstractInlinedAnnotation;
5253
import org.eclipse.jface.text.source.inlined.InlinedAnnotationSupport;
@@ -349,4 +350,14 @@ private static ICodeMining getCodeValidMiningAtIndex(ICodeMining[] minings, int
349350
}
350351
return null;
351352
}
353+
354+
/**
355+
* returns true if the given annotation is a deleted {@link ICodeMiningAnnotation}
356+
*/
357+
public static boolean isDeletedCodeMining(Annotation annotation) {
358+
if (annotation.isMarkedDeleted() && annotation instanceof ICodeMiningAnnotation) {
359+
return true;
360+
}
361+
return false;
362+
}
352363
}

bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import org.eclipse.core.runtime.Assert;
4242
import org.eclipse.core.runtime.Platform;
4343

44+
import org.eclipse.jface.internal.text.codemining.CodeMiningManager;
45+
4446
import org.eclipse.jface.text.BadLocationException;
4547
import org.eclipse.jface.text.IDocument;
4648
import org.eclipse.jface.text.IPaintPositionManager;
@@ -1425,7 +1427,7 @@ private void drawDecoration(Decoration pp, GC gc, Annotation annotation, IRegion
14251427
// textWidget.redrawRange with length 0 is ignored and no redraw takes place
14261428
paintLength= lineDelimiter.length();
14271429
}
1428-
if (paintLength >= 0 && regionsTouchOrOverlap(paintStart, paintLength, clippingOffset, clippingLength)) {
1430+
if ((paintLength >= 0 && regionsTouchOrOverlap(paintStart, paintLength, clippingOffset, clippingLength) || CodeMiningManager.isDeletedCodeMining(annotation))) {
14291431
// otherwise inside a line delimiter
14301432
IRegion widgetRange= getWidgetRange(paintStart, paintLength);
14311433
if (widgetRange != null) {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.eclipse.jface.internal.text.codemining.CodeMiningDocumentFooterAnnotation;
2828
import org.eclipse.jface.internal.text.codemining.CodeMiningLineContentAnnotation;
2929
import org.eclipse.jface.internal.text.codemining.CodeMiningLineHeaderAnnotation;
30+
import org.eclipse.jface.internal.text.codemining.CodeMiningManager;
3031

3132
import org.eclipse.jface.text.ITextViewer;
3233
import org.eclipse.jface.text.Position;
@@ -79,7 +80,8 @@ public void draw(Annotation annotation, GC gc, StyledText textWidget, int widget
7980
}
8081
InlinedAnnotationSupport support = InlinedAnnotationSupport.getSupport(textWidget);
8182
inlinedAnnotation.setSupport(support);
82-
if (support.isInVisibleLines(inlinedAnnotation.getPosition().offset) && inlinedAnnotation.isFirstVisibleOffset(widgetOffset, viewer)) {
83+
if ((support.isInVisibleLines(inlinedAnnotation.getPosition().offset) || CodeMiningManager.isDeletedCodeMining(annotation))
84+
&& inlinedAnnotation.isFirstVisibleOffset(widgetOffset, viewer)) {
8385
GCConfig initialGCConfig = GCConfig.fromGC(gc);
8486
GCConfig annotationGCConfig = new GCConfig(color, textWidget.getBackground(), getAnnotationFont(textWidget));
8587
annotationGCConfig.applyTo(gc);

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
*******************************************************************************/
1111
package org.eclipse.jface.text.tests.codemining;
1212

13+
import static org.junit.Assert.assertTrue;
14+
1315
import java.io.ByteArrayInputStream;
1416
import java.text.SimpleDateFormat;
1517
import java.util.Date;
@@ -22,6 +24,7 @@
2224
import org.junit.BeforeClass;
2325
import org.junit.Test;
2426

27+
import org.eclipse.swt.custom.StyleRange;
2528
import org.eclipse.swt.custom.StyledText;
2629
import org.eclipse.swt.graphics.GC;
2730
import org.eclipse.swt.graphics.Image;
@@ -108,6 +111,57 @@ public void run(IProgressMonitor monitor) throws CoreException {
108111
}, new NullProgressMonitor());
109112
}
110113

114+
@Test
115+
public void testClearCodeMiningTextEditorDecorationIfInInvisibleArea() throws Exception {
116+
IFile file = project.getFile("test.testprojectionviewer");
117+
if (file.exists()) {
118+
file.delete(true, new NullProgressMonitor());
119+
}
120+
StringBuilder b = new StringBuilder();
121+
for (int i = 0; i < 100; i++) {
122+
b.append("line ").append(i).append("\n");
123+
}
124+
String source = b.toString();
125+
file.create(new ByteArrayInputStream(source.getBytes("UTF-8")), true, new NullProgressMonitor());
126+
CodeMiningTestProvider.provideHeaderMiningAtLine = 96;
127+
CodeMiningTestProvider.lineHeaderMiningText = "first line header\n secone line header\n third line header";
128+
int offsetAtLine95 = source.indexOf("95");
129+
CodeMiningTestProvider.provideContentMiningAtOffset = offsetAtLine95;
130+
IEditorPart editor = IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), file);
131+
drainEventQueue();
132+
ISourceViewer viewer = (ISourceViewer) editor.getAdapter(ITextViewer.class);
133+
StyledText styledText = viewer.getTextWidget();
134+
viewer.setSelectedRange(offsetAtLine95, 0);
135+
viewer.revealRange(offsetAtLine95, 1);
136+
drainEventQueue();
137+
// assert line vertical height and styleRange is created by rendering
138+
// the codeminings
139+
waitForCondition(Display.getDefault(), 10_000, new Callable<Boolean>() {
140+
141+
@Override
142+
public Boolean call() throws Exception {
143+
return styledText.getLineVerticalIndent(CodeMiningTestProvider.provideHeaderMiningAtLine) > 0;
144+
}
145+
});
146+
StyleRange style = styledText.getStyleRangeAtOffset(offsetAtLine95 - 1);
147+
assertTrue(style.metrics.width > 0);
148+
// scroll to top so that code minings are not in visible area
149+
viewer.setSelectedRange(0, 0);
150+
viewer.revealRange(0, 1);
151+
// remove code minings and call update
152+
CodeMiningTestProvider.provideContentMiningAtOffset = -1;
153+
CodeMiningTestProvider.provideHeaderMiningAtLine = -1;
154+
((ISourceViewerExtension5) viewer).updateCodeMinings();
155+
drainEventQueue();
156+
// assert that line vertical height and styleRange was removed after
157+
// deleting the codeminings
158+
for (int i = 0; i < 100; i++) {
159+
assertTrue("line vertical indent not zeri at line index " + i, styledText.getLineVerticalIndent(i) == 0);
160+
}
161+
style = styledText.getStyleRangeAtOffset(offsetAtLine95 - 1);
162+
assertTrue(style == null);
163+
}
164+
111165
@Test
112166
public void testInlinedAnnotationSupportIsInLinesReturnsValidResultAfterDocumentChange() throws Exception {
113167
IFile file = project.getFile("test.testprojectionviewer");

tests/org.eclipse.ui.genericeditor.tests/src/org/eclipse/ui/genericeditor/tests/HighlightTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ private void waitForAnnotations(int count) {
170170
protected boolean condition() {
171171
return getAnnotationsFromAnnotationModel().size() == count;
172172
}
173-
}.waitForCondition(Display.getDefault(), 2000);
173+
}.waitForCondition(Display.getDefault(), 20_000);
174174
}
175175

176176
private List<Annotation> getAnnotationsFromAnnotationModel() {

0 commit comments

Comments
 (0)