Skip to content

Commit 30b7328

Browse files
committed
Implements action for CodeLens.. See
#181
1 parent 2ed121c commit 30b7328

File tree

14 files changed

+211
-166
lines changed

14 files changed

+211
-166
lines changed

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/codelens/CodeLens.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.eclipse.jface.text.provisional.codelens;
22

3-
public class CodeLens implements ICodeLens {
3+
public abstract class CodeLens implements ICodeLens {
44

55
private Range range;
66
private ICommand command;

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/codelens/ICodeLens.java

+2
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,7 @@ public interface ICodeLens {
2626
* The command this code lens represents.
2727
*/
2828
ICommand getCommand();
29+
30+
void open();
2931

3032
}

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/codelens/internal/CodeLens.java

+1-14
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,7 @@ public List<CodeLensData> computeIfNecessary(Object object) {
4949
}
5050

5151
public void updateCommands(List<ICodeLens> resolvedSymbols) {
52-
if (resolvedSymbols == null || resolvedSymbols.size() < 1) {
53-
zone.setText("no command");
54-
} else {
55-
StringBuilder text = new StringBuilder();
56-
int i = 0;
57-
for (ICodeLens codeLens : resolvedSymbols) {
58-
if (i > 0) {
59-
text.append(" | ");
60-
}
61-
text.append(codeLens.getCommand().getTitle());
62-
i++;
63-
}
64-
zone.setText(text.toString());
65-
}
52+
zone.updateCommands(resolvedSymbols);
6653
}
6754

6855
public void redraw(ViewZoneChangeAccessor accessor) {
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,158 @@
11
package org.eclipse.jface.text.provisional.codelens.internal;
22

3+
import java.util.List;
4+
5+
import org.eclipse.jface.text.provisional.codelens.ICodeLens;
36
import org.eclipse.jface.text.provisional.viewzones.ViewZone;
7+
import org.eclipse.swt.SWT;
8+
import org.eclipse.swt.custom.StyledText;
49
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;
514

615
public class CodeLensViewZone extends ViewZone {
716

8-
private String text;
917
private MouseEvent hover;
18+
private List<ICodeLens> resolvedSymbols;
19+
private ICodeLens hoveredCodeLens;
20+
private Integer hoveredCodeLensStartX;
21+
private Integer hoveredCodeLensEndX;
1022

1123
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);
2125
}
2226

2327
@Override
2428
public void mouseHover(MouseEvent event) {
2529
hover = event;
30+
StyledText styledText = getStyledText();
31+
styledText.setCursor(styledText.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
32+
2633
}
2734

2835
@Override
2936
public void mouseEnter(MouseEvent event) {
3037
hover = event;
38+
StyledText styledText = getStyledText();
39+
styledText.setCursor(styledText.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
3140
}
3241

3342
@Override
3443
public void mouseExit(MouseEvent event) {
3544
hover = null;
45+
StyledText styledText = getStyledText();
46+
styledText.setCursor(null);
3647
}
3748

3849
public MouseEvent getHover() {
3950
return hover;
4051
}
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+
41158
}

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/codelens/internal/CodeLensViewZoneRenderer.java

-70
This file was deleted.

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/viewzones/DefaultViewZone.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package org.eclipse.jface.text.provisional.viewzones;
22

3+
import org.eclipse.swt.SWT;
4+
import org.eclipse.swt.custom.StyledText;
5+
import org.eclipse.swt.graphics.Font;
6+
import org.eclipse.swt.graphics.GC;
7+
import org.eclipse.swt.graphics.Rectangle;
8+
39
public class DefaultViewZone extends ViewZone {
410

511
private String text;
612

713
public DefaultViewZone(int afterLineNumber, int height) {
8-
super(afterLineNumber, height, DefaultViewZoneRenderer.getInstance());
14+
super(afterLineNumber, height);
915
}
1016

1117
public DefaultViewZone(int afterLineNumber, int height, String text) {
@@ -21,4 +27,17 @@ public String getText() {
2127
return text;
2228
}
2329

30+
@Override
31+
public void draw(int paintX, int paintY, GC gc) {
32+
StyledText styledText = super.getStyledText();
33+
Rectangle client = styledText.getClientArea();
34+
gc.setBackground(styledText.getDisplay().getSystemColor(SWT.COLOR_WHITE));
35+
styledText.drawBackground(gc, paintX, paintY, client.width, super.getHeightInPx());
36+
gc.setForeground(styledText.getDisplay().getSystemColor(SWT.COLOR_GRAY));
37+
38+
Font font = new Font(styledText.getDisplay(), "Arial", 9, SWT.ITALIC);
39+
gc.setFont(font);
40+
gc.drawText(this.getText(), paintX, paintY + 4);
41+
}
42+
2443
}

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/viewzones/DefaultViewZoneRenderer.java

-29
This file was deleted.

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/viewzones/IViewZone.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.eclipse.swt.custom.StyledText;
44
import org.eclipse.swt.events.MouseEvent;
5+
import org.eclipse.swt.graphics.GC;
56

67
public interface IViewZone {
78

@@ -18,9 +19,7 @@ public interface IViewZone {
1819
int getHeightInPx();
1920

2021
void setStyledText(StyledText styledText);
21-
22-
IViewZoneRenderer getRenderer();
23-
22+
2423
boolean isDisposed();
2524

2625
void dispose();
@@ -31,4 +30,7 @@ public interface IViewZone {
3130

3231
void mouseEnter(MouseEvent event);
3332

33+
void onMouseClick(MouseEvent event);
34+
35+
void draw(int paintX, int paintY, GC gc);
3436
}

eclipse/codelens/org.eclipse.codelens/src/org/eclipse/jface/text/provisional/viewzones/IViewZoneRenderer.java

-10
This file was deleted.

0 commit comments

Comments
 (0)