10
10
package processing .app .syntax ;
11
11
12
12
import java .awt .Color ;
13
- import java .awt .Dimension ;
14
- import java .awt .Font ;
13
+ import java .awt .Graphics ;
15
14
import java .awt .Rectangle ;
16
15
17
- import javax .swing .JTextPane ;
18
16
import javax .swing .border .MatteBorder ;
19
- import javax .swing .text .AttributeSet ;
20
- import javax .swing .text .SimpleAttributeSet ;
21
- import javax .swing .text .StyleConstants ;
22
17
23
- import processing .app .Preferences ;
24
-
25
- public class TextAreaLineNumbers extends JTextPane {
18
+ public class TextAreaLineNumbers extends TextAreaPainter {
26
19
27
20
private final int LEFT_INDENT = 6 ;
28
21
private final int RIGHT_INDENT = 6 ;
@@ -37,29 +30,14 @@ public class TextAreaLineNumbers extends JTextPane {
37
30
private int currEndNum = 0 ;
38
31
private int currNumDigits = MIN_NUM_DIGITS ;
39
32
40
- public TextAreaLineNumbers (TextAreaDefaults defaults , int preferredHeight ) {
41
- setBackground (defaults .bgcolor );
42
- setForeground (defaults .fgcolor );
43
- setOpaque (true );
44
- setEditable (false );
45
- setEnabled (false );
46
- setBorder (new MatteBorder (0 , 0 , 0 , 1 , new Color (240 , 240 , 240 )));
47
- setTextFont (Preferences .getFont ("editor.font" ));
48
-
33
+
34
+
35
+ public TextAreaLineNumbers (JEditTextArea textArea , TextAreaDefaults defaults ) {
36
+ super (textArea , defaults );
49
37
DIGIT_WIDTH = getFontMetrics (getFont ()).stringWidth ("0" );
50
38
MIN_WIDTH = DIGIT_WIDTH * MIN_NUM_DIGITS + PADDING_WIDTH ;
51
-
52
- setPreferredSize (new Dimension (MIN_WIDTH , preferredHeight ));
53
- }
54
-
55
- public void setTextFont (Font font ) {
56
- setFont (font );
57
- SimpleAttributeSet attribs = new SimpleAttributeSet ();
58
- StyleConstants .setAlignment (attribs , StyleConstants .ALIGN_RIGHT );
59
- StyleConstants .setLeftIndent (attribs , 6 );
60
- StyleConstants .setRightIndent (attribs , 6 );
61
- StyleConstants .setFontSize (attribs , getFont ().getSize ());
62
- setParagraphAttributes (attribs ,true );
39
+ setEnabled (false );
40
+ setBorder (new MatteBorder (0 , 0 , 0 , RIGHT_BORDER_WIDTH , new Color (240 , 240 , 240 )));
63
41
}
64
42
65
43
public void updateLineNumbers (int startNum , int endNum ) {
@@ -69,14 +47,30 @@ public void updateLineNumbers(int startNum, int endNum) {
69
47
currStartNum = startNum ;
70
48
currEndNum = endNum ;
71
49
72
- StringBuilder sb = new StringBuilder ();
73
- for (int i = startNum ; i < endNum ; i ++) {
74
- sb .append (i ).append ("\n " );
75
- }
76
- sb .append (endNum );
77
- setText (sb .toString ());
78
-
79
50
invalidate ();
51
+ repaint ();
52
+ }
53
+
54
+ @ Override
55
+ public void paint (Graphics gfx ) {
56
+ super .paint (gfx );
57
+ getBorder ().paintBorder (this , gfx , 0 , 0 , getSize ().width , getSize ().height );
58
+ }
59
+
60
+ @ Override
61
+ protected void paintLine (Graphics gfx , TokenMarker tokenMarker ,
62
+ int line , int x )
63
+ {
64
+ currentLineIndex = line ;
65
+ gfx .setFont (getFont ());
66
+ gfx .setColor (Color .GRAY );
67
+ int y = textArea .lineToY (line );
68
+ int startX = getBounds ().x + getBounds ().width ;
69
+ if (line >= 0 && line < textArea .getLineCount ()) {
70
+ String lineNumberString = String .valueOf (line +1 );
71
+ int lineStartX = startX - RIGHT_BORDER_WIDTH - RIGHT_INDENT - fm .stringWidth (lineNumberString );
72
+ gfx .drawString (lineNumberString ,lineStartX ,y + fm .getHeight ());
73
+ }
80
74
}
81
75
82
76
public void updateWidthForNumDigits (int numDigits ) {
@@ -85,8 +79,11 @@ public void updateWidthForNumDigits(int numDigits) {
85
79
}
86
80
currNumDigits = numDigits ;
87
81
88
- updateBounds ();
89
- invalidate ();
82
+ if (isVisible ()) {
83
+ updateBounds ();
84
+ invalidate ();
85
+ repaint ();
86
+ }
90
87
}
91
88
92
89
public void setDisplayLineNumbers (boolean displayLineNumbers ) {
@@ -97,9 +94,13 @@ public void setDisplayLineNumbers(boolean displayLineNumbers) {
97
94
setBounds (new Rectangle (0 , getHeight ()));
98
95
}
99
96
invalidate ();
97
+ repaint ();
100
98
}
101
99
102
100
private void updateBounds () {
103
- setBounds (new Rectangle (Math .max (MIN_WIDTH , DIGIT_WIDTH * currNumDigits + PADDING_WIDTH ), getHeight ()));
101
+ if (isVisible ()) {
102
+ setBounds (new Rectangle (Math .max (MIN_WIDTH , DIGIT_WIDTH * currNumDigits + PADDING_WIDTH ), getHeight ()));
103
+ textArea .validate ();
104
+ }
104
105
}
105
106
}
0 commit comments