3838 * @since 3.13
3939 */
4040public class CodeMiningLineHeaderAnnotation extends LineHeaderAnnotation implements ICodeMiningAnnotation {
41-
4241 private static final String SEPARATOR = " | " ; //$NON-NLS-1$
4342
4443 /**
@@ -92,20 +91,19 @@ public CodeMiningLineHeaderAnnotation(Position position, ISourceViewer viewer, C
9291
9392 @ Override
9493 public int getHeight () {
95- return hasAtLeastOneResolvedMiningNotEmpty () ? getMultilineHeight (null ) : 0 ;
94+ return hasAtLeastOneResolvedMiningNotEmpty (fMinings , fResolvedMinings ) ? getMultilineHeight (null , fMinings , super . getTextWidget (), super . getHeight () ) : 0 ;
9695 }
9796
9897 public int getHeight (GC gc ) {
99- return hasAtLeastOneResolvedMiningNotEmpty () ? getMultilineHeight (gc ) : 0 ;
98+ return hasAtLeastOneResolvedMiningNotEmpty (fMinings , fResolvedMinings ) ? getMultilineHeight (gc , fMinings , super . getTextWidget (), super . getHeight () ) : 0 ;
10099 }
101100
102- private int getMultilineHeight (GC gc ) {
101+ static int getMultilineHeight (GC gc , List < ICodeMining > minings , StyledText styledText , int superHeight ) {
103102 int numLinesOfAllMinings = 0 ;
104- StyledText styledText = super .getTextWidget ();
105103 boolean ignoreFirstLine = false ;
106104 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 );
109107 String label = mining .getLabel ();
110108 if (label == null ) {
111109 continue ;
@@ -117,12 +115,12 @@ private int getMultilineHeight(GC gc) {
117115 }
118116 numLinesOfAllMinings += numLines ;
119117 if (gc != null ) {
120- sumLineHeight = calculateLineHeight (gc , styledText , ignoreFirstLine , sumLineHeight , i , splitted );
118+ sumLineHeight = calculateLineHeight (minings , gc , styledText , ignoreFirstLine , sumLineHeight , i , splitted );
121119 }
122120 ignoreFirstLine = true ;
123121 }
124- if (sumLineHeight == 0 ) {
125- return super . getHeight () ;
122+ if (sumLineHeight == 0 && numLinesOfAllMinings == 0 ) {
123+ return superHeight ;
126124 }
127125 if (gc != null ) {
128126 return sumLineHeight ;
@@ -133,14 +131,14 @@ private int getMultilineHeight(GC gc) {
133131 }
134132 }
135133
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 ) {
137135 for (int j = 0 ; j < splitted .length ; j ++) {
138136 String line = splitted [j ];
139137 if (j == 0 && ignoreFirstLine ) {
140138 continue ;
141139 }
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 ();
144142 if (nextLabel != null ) {
145143 String firstFromNext = nextLabel .split ("\\ r?\\ n|\\ r" )[0 ]; //$NON-NLS-1$
146144 line += firstFromNext ;
@@ -159,15 +157,15 @@ private int calculateLineHeight(GC gc, StyledText styledText, boolean ignoreFirs
159157 * @return <code>true</code> if the annotation has at least one resolved mining which have a
160158 * label and <code>false</code> otherwise.
161159 */
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 ())) {
164162 return true ; // will have a resolved mining.
165163 }
166164
167- if (fResolvedMinings == null || fResolvedMinings .length == 0 ) {
165+ if (resolvedMinings == null || resolvedMinings .length == 0 ) {
168166 return false ;
169167 }
170- return Stream .of (fResolvedMinings ).anyMatch (CodeMiningManager ::isValidMining );
168+ return Stream .of (resolvedMinings ).anyMatch (CodeMiningManager ::isValidMining );
171169 }
172170
173171 @ Override
@@ -184,7 +182,7 @@ public void update(List<ICodeMining> minings, IProgressMonitor monitor) {
184182 fResolvedMinings [i ]= mining ;
185183 }
186184 }
187- disposeMinings ();
185+ disposeMinings (fMinings );
188186 fMonitor = monitor ;
189187 fMinings .addAll (minings );
190188 }
@@ -193,38 +191,51 @@ public void update(List<ICodeMining> minings, IProgressMonitor monitor) {
193191 public void markDeleted (boolean deleted ) {
194192 super .markDeleted (deleted );
195193 if (deleted ) {
196- disposeMinings ();
194+ disposeMinings (fMinings );
197195 fResolvedMinings = null ;
198196 }
199197 }
200198
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 ();
204202 }
205203
206204 @ Override
207205 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 );
209219 int nbDraw = 0 ;
210220 int separatorWidth = -1 ;
211221 boolean redrawn = false ;
212222 fBounds .clear ();
213- int singleLineHeight = super .getHeight ();
214223 int lineSpacing = textWidget .getLineSpacing ();
215224 for (int i = 0 ; i < minings .size (); i ++) {
216225 ICodeMining mining = minings .get (i );
217226 // try to get the last resolved mining.
218227 ICodeMining lastResolvedMining = (fResolvedMinings != null && fResolvedMinings .length > i ) ? fResolvedMinings [i ] : null ;
219228 if (mining .getLabel () != null ) {
220229 // mining is resolved without error, update the resolved mining list
221- fResolvedMinings [i ]= mining ;
230+ if (fResolvedMinings != null ) {
231+ fResolvedMinings [i ]= mining ;
232+ }
222233 } else if (!mining .isResolved ()) {
223234 // the mining is not resolved, draw the last resolved mining
224235 mining = lastResolvedMining ;
225236 if (!redrawn ) {
226237 // redraw the annotation when mining is resolved.
227- redraw ();
238+ redrawRunnable . run ();
228239 redrawn = true ;
229240 }
230241 } else {
0 commit comments