21
21
import org .eclipse .swt .dnd .Clipboard ;
22
22
import org .eclipse .swt .dnd .TextTransfer ;
23
23
import org .eclipse .swt .layout .FillLayout ;
24
+ import org .eclipse .swt .widgets .Composite ;
24
25
import org .eclipse .swt .widgets .Shell ;
25
26
26
27
import org .eclipse .jface .text .BadLocationException ;
33
34
import org .eclipse .jface .text .Region ;
34
35
import org .eclipse .jface .text .source .Annotation ;
35
36
import org .eclipse .jface .text .source .AnnotationModel ;
37
+ import org .eclipse .jface .text .source .IOverviewRuler ;
38
+ import org .eclipse .jface .text .source .IVerticalRuler ;
36
39
import org .eclipse .jface .text .source .projection .IProjectionPosition ;
37
40
import org .eclipse .jface .text .source .projection .ProjectionAnnotation ;
38
41
import org .eclipse .jface .text .source .projection .ProjectionViewer ;
39
42
40
43
public class ProjectionViewerTest {
41
44
45
+ /**
46
+ * A {@link ProjectionViewer} that provides access to {@link #getVisibleDocument()}.
47
+ */
48
+ private final class TestProjectionViewer extends ProjectionViewer {
49
+ private TestProjectionViewer (Composite parent , IVerticalRuler ruler , IOverviewRuler overviewRuler , boolean showsAnnotationOverview , int styles ) {
50
+ super (parent , ruler , overviewRuler , showsAnnotationOverview , styles );
51
+ }
52
+
53
+ @ Override
54
+ public IDocument getVisibleDocument () {
55
+ return super .getVisibleDocument ();
56
+ }
57
+ }
58
+
42
59
private static final class ProjectionPosition extends Position implements IProjectionPosition {
43
60
44
61
public ProjectionPosition (IDocument document ) {
@@ -110,6 +127,33 @@ public void testVisibleRegionDoesNotChangeWithProjections() {
110
127
}
111
128
}
112
129
130
+ @ Test
131
+ public void testVisibleRegionProjectionCannotBeExpanded () {
132
+ Shell shell = new Shell ();
133
+ shell .setLayout (new FillLayout ());
134
+ TestProjectionViewer viewer = new TestProjectionViewer (shell , null , null , false , SWT .NONE );
135
+ String documentContent = """
136
+ Hello
137
+ World
138
+ 123
139
+ 456
140
+ """ ;
141
+ Document document = new Document (documentContent );
142
+ viewer .setDocument (document , new AnnotationModel ());
143
+ int secondLineStart = documentContent .indexOf ("World" );
144
+ int secondLineEnd = documentContent .indexOf ('\n' , secondLineStart );
145
+ viewer .setVisibleRegion (secondLineStart , secondLineEnd - secondLineStart );
146
+ viewer .enableProjection ();
147
+ shell .setVisible (true );
148
+ try {
149
+ assertEquals ("World" , viewer .getVisibleDocument ().get ());
150
+ viewer .getTextOperationTarget ().doOperation (ProjectionViewer .EXPAND_ALL );
151
+ assertEquals ("World" , viewer .getVisibleDocument ().get ());
152
+ } finally {
153
+ shell .dispose ();
154
+ }
155
+ }
156
+
113
157
@ Test
114
158
public void testVisibleRegionAddsProjectionAnnotationsIfProjectionsEnabled () {
115
159
testProjectionAnnotationsFromVisibleRegion (true );
@@ -123,7 +167,7 @@ public void testEnableProjectionAddsProjectionAnnotationsIfVisibleRegionEnabled(
123
167
private void testProjectionAnnotationsFromVisibleRegion (boolean enableProjectionFirst ) {
124
168
Shell shell = new Shell ();
125
169
shell .setLayout (new FillLayout ());
126
- ProjectionViewer viewer = new ProjectionViewer (shell , null , null , false , SWT .NONE );
170
+ TestProjectionViewer viewer = new TestProjectionViewer (shell , null , null , false , SWT .NONE );
127
171
String documentContent = """
128
172
Hello
129
173
World
@@ -149,6 +193,8 @@ private void testProjectionAnnotationsFromVisibleRegion(boolean enableProjection
149
193
int annotationCount = 0 ;
150
194
151
195
try {
196
+ assertEquals ("World" , viewer .getVisibleDocument ().get ().trim ());
197
+
152
198
for (Iterator <Annotation > it = viewer .getProjectionAnnotationModel ().getAnnotationIterator (); it .hasNext ();) {
153
199
Annotation annotation = it .next ();
154
200
assertEquals ("org.eclipse.jface.text.source.projection.ProjectionViewer.InvisibleCollapsedProjectionAnnotation" , annotation .getClass ().getCanonicalName ());
@@ -172,4 +218,32 @@ private void testProjectionAnnotationsFromVisibleRegion(boolean enableProjection
172
218
shell .dispose ();
173
219
}
174
220
}
221
+
222
+ @ Test
223
+ public void testInsertIntoVisibleRegion () throws BadLocationException {
224
+ Shell shell = new Shell ();
225
+ shell .setLayout (new FillLayout ());
226
+ TestProjectionViewer viewer = new TestProjectionViewer (shell , null , null , false , SWT .NONE );
227
+ String documentContent = """
228
+ Hello
229
+ World
230
+ 123
231
+ 456
232
+ """ ;
233
+ Document document = new Document (documentContent );
234
+ viewer .setDocument (document , new AnnotationModel ());
235
+ int secondLineStart = documentContent .indexOf ("World" );
236
+ int secondLineEnd = documentContent .indexOf ('\n' , secondLineStart );
237
+
238
+ shell .setVisible (true );
239
+
240
+ viewer .setVisibleRegion (secondLineStart , secondLineEnd - secondLineStart );
241
+ viewer .enableProjection ();
242
+
243
+ assertEquals ("World" , viewer .getVisibleDocument ().get ());
244
+
245
+ viewer .getDocument ().replace (documentContent .indexOf ("rld" ), 0 , "---" );
246
+
247
+ assertEquals ("Wo---rld" , viewer .getVisibleDocument ().get ());
248
+ }
175
249
}
0 commit comments