1
1
package org .eclipse .jface .text .provisional .codelens .internal ;
2
2
3
+ import java .util .List ;
4
+
5
+ import org .eclipse .jface .text .provisional .codelens .ICodeLens ;
3
6
import org .eclipse .jface .text .provisional .viewzones .ViewZone ;
7
+ import org .eclipse .swt .SWT ;
8
+ import org .eclipse .swt .custom .StyledText ;
4
9
import org .eclipse .swt .events .MouseEvent ;
10
+ import org .eclipse .swt .graphics .Font ;
11
+ import org .eclipse .swt .graphics .GC ;
12
+ import org .eclipse .swt .graphics .Point ;
13
+ import org .eclipse .swt .graphics .Rectangle ;
5
14
6
15
public class CodeLensViewZone extends ViewZone {
7
16
8
- private String text ;
9
17
private MouseEvent hover ;
18
+ private List <ICodeLens > resolvedSymbols ;
19
+ private ICodeLens hoveredCodeLens ;
20
+ private Integer hoveredCodeLensStartX ;
21
+ private Integer hoveredCodeLensEndX ;
10
22
11
23
public CodeLensViewZone (int afterLineNumber , int height ) {
12
- super (afterLineNumber , height , CodeLensViewZoneRenderer .getInstance ());
13
- }
14
-
15
- public void setText (String text ) {
16
- this .text = text ;
17
- }
18
-
19
- public String getText () {
20
- return text ;
24
+ super (afterLineNumber , height );
21
25
}
22
26
23
27
@ Override
24
28
public void mouseHover (MouseEvent event ) {
25
29
hover = event ;
30
+ StyledText styledText = getStyledText ();
31
+ styledText .setCursor (styledText .getDisplay ().getSystemCursor (SWT .CURSOR_HAND ));
32
+
26
33
}
27
34
28
35
@ Override
29
36
public void mouseEnter (MouseEvent event ) {
30
37
hover = event ;
38
+ StyledText styledText = getStyledText ();
39
+ styledText .setCursor (styledText .getDisplay ().getSystemCursor (SWT .CURSOR_HAND ));
31
40
}
32
41
33
42
@ Override
34
43
public void mouseExit (MouseEvent event ) {
35
44
hover = null ;
45
+ StyledText styledText = getStyledText ();
46
+ styledText .setCursor (null );
36
47
}
37
48
38
49
public MouseEvent getHover () {
39
50
return hover ;
40
51
}
52
+
53
+ @ Override
54
+ public void onMouseClick (MouseEvent event ) {
55
+ if (hoveredCodeLens != null ) {
56
+ hoveredCodeLens .open ();
57
+ }
58
+ }
59
+
60
+ public void updateCommands (List <ICodeLens > resolvedSymbols ) {
61
+ this .resolvedSymbols = resolvedSymbols ;
62
+ }
63
+
64
+ @ Override
65
+ public void draw (int paintX , int paintY , GC gc ) {
66
+ StyledText styledText = super .getStyledText ();
67
+ Rectangle client = styledText .getClientArea ();
68
+ gc .setBackground (styledText .getDisplay ().getSystemColor (SWT .COLOR_WHITE ));
69
+ styledText .drawBackground (gc , paintX , paintY , client .width , this .getHeightInPx ());
70
+
71
+ gc .setForeground (styledText .getDisplay ().getSystemColor (SWT .COLOR_GRAY ));
72
+
73
+ String text = getText (gc );
74
+ if (text != null ) {
75
+ int leading = getLeadingSpaces (styledText .getLine (super .getAfterLineNumber ()));
76
+ if (leading > 0 ) {
77
+ Point topLeft = styledText .getLocationAtOffset (super .getOffsetAtLine () + leading );
78
+ paintX += topLeft .x ;
79
+ }
80
+ Font font = new Font (styledText .getDisplay (), "Arial" , 9 , SWT .ITALIC );
81
+ gc .setFont (font );
82
+ int x = paintX ;
83
+ int y = paintY + 4 ;
84
+ gc .drawText (text , x , y );
85
+
86
+ if (hoveredCodeLensEndX != null ) {
87
+ Point extent = gc .textExtent (text );
88
+ gc .drawLine (hoveredCodeLensStartX , y + extent .y - 1 , hoveredCodeLensEndX , y + extent .y - 1 );
89
+ }
90
+ // if (getHover() != null && resolvedSymbols != null &&
91
+ // resolvedSymbols.size() > 0) {
92
+ // int hoverX = getHover().x;
93
+ // StringBuilder s = new StringBuilder();
94
+ // for (ICodeLens symbol : resolvedSymbols) {
95
+ // Point extent = gc.textExtent(text);
96
+ // //symbol.getCommand().getTitle()
97
+ // }
98
+ // //
99
+ // styledText.setCursor(styledText.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
100
+ // Point extent = gc.textExtent(text);
101
+ // gc.drawLine(x - 1, y + extent.y - 1, x + extent.x - 1, y +
102
+ // extent.y - 1);
103
+ // } else {
104
+ // // styledText.setCursor(null);
105
+ // }
106
+ }
107
+ }
108
+
109
+ private static int getLeadingSpaces (String line ) {
110
+ int counter = 0 ;
111
+
112
+ char [] chars = line .toCharArray ();
113
+ for (char c : chars ) {
114
+ if (c == '\t' )
115
+ counter ++;
116
+ else if (c == ' ' )
117
+ counter ++;
118
+ else
119
+ break ;
120
+ }
121
+
122
+ return counter ;
123
+ }
124
+
125
+ public String getText (GC gc ) {
126
+ hoveredCodeLens = null ;
127
+ hoveredCodeLensStartX = null ;
128
+ hoveredCodeLensEndX = null ;
129
+ if (resolvedSymbols == null || resolvedSymbols .size () < 1 ) {
130
+ return "no command" ;
131
+ } else {
132
+ StringBuilder text = new StringBuilder ();
133
+ int i = 0 ;
134
+ boolean hasHover = hover != null ;
135
+ for (ICodeLens codeLens : resolvedSymbols ) {
136
+ if (i > 0 ) {
137
+ text .append (" | " );
138
+ }
139
+ Integer startX = null ;
140
+ if (hasHover && hoveredCodeLens == null ) {
141
+ startX = gc .textExtent (text .toString ()).x ;
142
+ }
143
+ text .append (codeLens .getCommand ().getTitle ());
144
+ if (hasHover && hoveredCodeLens == null ) {
145
+ int endX = gc .textExtent (text .toString ()).x ;
146
+ if (hover .x < endX ) {
147
+ hoveredCodeLensStartX = startX ;
148
+ hoveredCodeLensEndX = endX ;
149
+ hoveredCodeLens = codeLens ;
150
+ }
151
+ }
152
+ i ++;
153
+ }
154
+ return text .toString ();
155
+ }
156
+ }
157
+
41
158
}
0 commit comments