1010package processing .app .syntax ;
1111
1212import java .awt .Color ;
13- import java .awt .Dimension ;
14- import java .awt .Font ;
13+ import java .awt .Graphics ;
1514import java .awt .Rectangle ;
1615
17- import javax .swing .JTextPane ;
1816import javax .swing .border .MatteBorder ;
19- import javax .swing .text .AttributeSet ;
20- import javax .swing .text .SimpleAttributeSet ;
21- import javax .swing .text .StyleConstants ;
2217
23- import processing .app .Preferences ;
24-
25- public class TextAreaLineNumbers extends JTextPane {
18+ public class TextAreaLineNumbers extends TextAreaPainter {
2619
2720 private final int LEFT_INDENT = 6 ;
2821 private final int RIGHT_INDENT = 6 ;
@@ -37,29 +30,14 @@ public class TextAreaLineNumbers extends JTextPane {
3730 private int currEndNum = 0 ;
3831 private int currNumDigits = MIN_NUM_DIGITS ;
3932
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 );
4937 DIGIT_WIDTH = getFontMetrics (getFont ()).stringWidth ("0" );
5038 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 )));
6341 }
6442
6543 public void updateLineNumbers (int startNum , int endNum ) {
@@ -69,14 +47,30 @@ public void updateLineNumbers(int startNum, int endNum) {
6947 currStartNum = startNum ;
7048 currEndNum = endNum ;
7149
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-
7950 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+ }
8074 }
8175
8276 public void updateWidthForNumDigits (int numDigits ) {
@@ -85,8 +79,11 @@ public void updateWidthForNumDigits(int numDigits) {
8579 }
8680 currNumDigits = numDigits ;
8781
88- updateBounds ();
89- invalidate ();
82+ if (isVisible ()) {
83+ updateBounds ();
84+ invalidate ();
85+ repaint ();
86+ }
9087 }
9188
9289 public void setDisplayLineNumbers (boolean displayLineNumbers ) {
@@ -97,9 +94,13 @@ public void setDisplayLineNumbers(boolean displayLineNumbers) {
9794 setBounds (new Rectangle (0 , getHeight ()));
9895 }
9996 invalidate ();
97+ repaint ();
10098 }
10199
102100 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+ }
104105 }
105106}
0 commit comments