38
38
* @since 3.13
39
39
*/
40
40
public class CodeMiningLineHeaderAnnotation extends LineHeaderAnnotation implements ICodeMiningAnnotation {
41
-
42
41
private static final String SEPARATOR = " | " ; //$NON-NLS-1$
43
42
44
43
/**
@@ -92,20 +91,19 @@ public CodeMiningLineHeaderAnnotation(Position position, ISourceViewer viewer, C
92
91
93
92
@ Override
94
93
public int getHeight () {
95
- return hasAtLeastOneResolvedMiningNotEmpty () ? getMultilineHeight (null ) : 0 ;
94
+ return hasAtLeastOneResolvedMiningNotEmpty (fMinings , fResolvedMinings ) ? getMultilineHeight (null , fMinings , super . getTextWidget (), super . getHeight () ) : 0 ;
96
95
}
97
96
98
97
public int getHeight (GC gc ) {
99
- return hasAtLeastOneResolvedMiningNotEmpty () ? getMultilineHeight (gc ) : 0 ;
98
+ return hasAtLeastOneResolvedMiningNotEmpty (fMinings , fResolvedMinings ) ? getMultilineHeight (gc , fMinings , super . getTextWidget (), super . getHeight () ) : 0 ;
100
99
}
101
100
102
- private int getMultilineHeight (GC gc ) {
101
+ static int getMultilineHeight (GC gc , List < ICodeMining > minings , StyledText styledText , int superHeight ) {
103
102
int numLinesOfAllMinings = 0 ;
104
- StyledText styledText = super .getTextWidget ();
105
103
boolean ignoreFirstLine = false ;
106
104
int sumLineHeight = 0 ;
107
- for (int i = 0 ; i < fMinings .size (); i ++) {
108
- ICodeMining mining = fMinings .get (i );
105
+ for (int i = 0 ; i < minings .size (); i ++) {
106
+ ICodeMining mining = minings .get (i );
109
107
String label = mining .getLabel ();
110
108
if (label == null ) {
111
109
continue ;
@@ -117,12 +115,12 @@ private int getMultilineHeight(GC gc) {
117
115
}
118
116
numLinesOfAllMinings += numLines ;
119
117
if (gc != null ) {
120
- sumLineHeight = calculateLineHeight (gc , styledText , ignoreFirstLine , sumLineHeight , i , splitted );
118
+ sumLineHeight = calculateLineHeight (minings , gc , styledText , ignoreFirstLine , sumLineHeight , i , splitted );
121
119
}
122
120
ignoreFirstLine = true ;
123
121
}
124
- if (sumLineHeight == 0 ) {
125
- return super . getHeight () ;
122
+ if (sumLineHeight == 0 && numLinesOfAllMinings == 0 ) {
123
+ return superHeight ;
126
124
}
127
125
if (gc != null ) {
128
126
return sumLineHeight ;
@@ -133,14 +131,14 @@ private int getMultilineHeight(GC gc) {
133
131
}
134
132
}
135
133
136
- private int calculateLineHeight (GC gc , StyledText styledText , boolean ignoreFirstLine , int sumLineHeight , int miningIndex , String [] splitted ) {
134
+ private static int calculateLineHeight (List < ICodeMining > minings , GC gc , StyledText styledText , boolean ignoreFirstLine , int sumLineHeight , int miningIndex , String [] splitted ) {
137
135
for (int j = 0 ; j < splitted .length ; j ++) {
138
136
String line = splitted [j ];
139
137
if (j == 0 && ignoreFirstLine ) {
140
138
continue ;
141
139
}
142
- if (j == splitted .length - 1 && miningIndex + 1 < fMinings .size ()) { // last line, take first line from next mining
143
- String nextLabel = fMinings .get (miningIndex + 1 ).getLabel ();
140
+ if (j == splitted .length - 1 && miningIndex + 1 < minings .size ()) { // last line, take first line from next mining
141
+ String nextLabel = minings .get (miningIndex + 1 ).getLabel ();
144
142
if (nextLabel != null ) {
145
143
String firstFromNext = nextLabel .split ("\\ r?\\ n|\\ r" )[0 ]; //$NON-NLS-1$
146
144
line += firstFromNext ;
@@ -159,15 +157,15 @@ private int calculateLineHeight(GC gc, StyledText styledText, boolean ignoreFirs
159
157
* @return <code>true</code> if the annotation has at least one resolved mining which have a
160
158
* label and <code>false</code> otherwise.
161
159
*/
162
- private boolean hasAtLeastOneResolvedMiningNotEmpty () {
163
- if (fMinings .stream ().anyMatch (m -> m .getLabel () != null && !m .getLabel ().isEmpty ())) {
160
+ static boolean hasAtLeastOneResolvedMiningNotEmpty (List < ICodeMining > minings , ICodeMining [] resolvedMinings ) {
161
+ if (minings .stream ().anyMatch (m -> m .getLabel () != null && !m .getLabel ().isEmpty ())) {
164
162
return true ; // will have a resolved mining.
165
163
}
166
164
167
- if (fResolvedMinings == null || fResolvedMinings .length == 0 ) {
165
+ if (resolvedMinings == null || resolvedMinings .length == 0 ) {
168
166
return false ;
169
167
}
170
- return Stream .of (fResolvedMinings ).anyMatch (CodeMiningManager ::isValidMining );
168
+ return Stream .of (resolvedMinings ).anyMatch (CodeMiningManager ::isValidMining );
171
169
}
172
170
173
171
@ Override
@@ -184,7 +182,7 @@ public void update(List<ICodeMining> minings, IProgressMonitor monitor) {
184
182
fResolvedMinings [i ]= mining ;
185
183
}
186
184
}
187
- disposeMinings ();
185
+ disposeMinings (fMinings );
188
186
fMonitor = monitor ;
189
187
fMinings .addAll (minings );
190
188
}
@@ -193,38 +191,51 @@ public void update(List<ICodeMining> minings, IProgressMonitor monitor) {
193
191
public void markDeleted (boolean deleted ) {
194
192
super .markDeleted (deleted );
195
193
if (deleted ) {
196
- disposeMinings ();
194
+ disposeMinings (fMinings );
197
195
fResolvedMinings = null ;
198
196
}
199
197
}
200
198
201
- private void disposeMinings () {
202
- fMinings .stream ().forEach (ICodeMining ::dispose );
203
- fMinings .clear ();
199
+ static void disposeMinings (List < ICodeMining > minings ) {
200
+ minings .stream ().forEach (ICodeMining ::dispose );
201
+ minings .clear ();
204
202
}
205
203
206
204
@ Override
207
205
public void draw (GC gc , StyledText textWidget , int offset , int length , Color color , int x , int y ) {
208
- List <ICodeMining > minings = new ArrayList <>(fMinings );
206
+ int singleLineHeight = super .getHeight ();
207
+ draw (fMinings , fBounds , singleLineHeight , fResolvedMinings , gc , textWidget , color , x , y , new Runnable () {
208
+
209
+ @ Override
210
+ public void run () {
211
+ redraw ();
212
+ }
213
+ });
214
+ }
215
+
216
+ static void draw (List <ICodeMining > pMinings , List <Rectangle > fBounds , int singleLineHeight , ICodeMining [] fResolvedMinings , GC gc , StyledText textWidget , Color color ,
217
+ int x , int y , Runnable redrawRunnable ) {
218
+ List <ICodeMining > minings = new ArrayList <>(pMinings );
209
219
int nbDraw = 0 ;
210
220
int separatorWidth = -1 ;
211
221
boolean redrawn = false ;
212
222
fBounds .clear ();
213
- int singleLineHeight = super .getHeight ();
214
223
int lineSpacing = textWidget .getLineSpacing ();
215
224
for (int i = 0 ; i < minings .size (); i ++) {
216
225
ICodeMining mining = minings .get (i );
217
226
// try to get the last resolved mining.
218
227
ICodeMining lastResolvedMining = (fResolvedMinings != null && fResolvedMinings .length > i ) ? fResolvedMinings [i ] : null ;
219
228
if (mining .getLabel () != null ) {
220
229
// mining is resolved without error, update the resolved mining list
221
- fResolvedMinings [i ]= mining ;
230
+ if (fResolvedMinings != null ) {
231
+ fResolvedMinings [i ]= mining ;
232
+ }
222
233
} else if (!mining .isResolved ()) {
223
234
// the mining is not resolved, draw the last resolved mining
224
235
mining = lastResolvedMining ;
225
236
if (!redrawn ) {
226
237
// redraw the annotation when mining is resolved.
227
- redraw ();
238
+ redrawRunnable . run ();
228
239
redrawn = true ;
229
240
}
230
241
} else {
0 commit comments