Skip to content

Commit 66faf5d

Browse files
author
Cayci
committed
Render line numbers using TextAreaPainter
Fix the line number font rendering problem on the Mac. Now, the TextAreaLineNumbers class extends the TextAreaPainter and just overloads the paintLine method to make it render the line number instead of rendering the whole line. Other than that, the superclass' drawing code is used. So: the same drawing code that renders the source code text in the editor is now also being used to render the line numbers.
1 parent a2111fd commit 66faf5d

File tree

3 files changed

+51
-49
lines changed

3 files changed

+51
-49
lines changed

app/src/processing/app/Editor.java

-1
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,6 @@ protected void applyPreferences() {
452452
// apply changes to the font size for the editor
453453
//TextAreaPainter painter = textarea.getPainter();
454454
painter.setFont(Preferences.getFont("editor.font"));
455-
textarea.setLineNumbersFont(Preferences.getFont("editor.font"));
456455
//Font font = painter.getFont();
457456
//textarea.getPainter().setFont(new Font("Courier", Font.PLAIN, 36));
458457

app/src/processing/app/syntax/JEditTextArea.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public JEditTextArea(TextAreaDefaults defaults)
8787

8888
// Initialize some misc. stuff
8989
painter = new TextAreaPainter(this,defaults);
90-
editorLineNumbers = new TextAreaLineNumbers(defaults, (int) painter.getPreferredSize().getHeight());
90+
editorLineNumbers = new TextAreaLineNumbers(this,defaults);
9191
documentHandler = new DocumentHandler();
9292
eventListenerList = new EventListenerList();
9393
caretEvent = new MutableCaretEvent();
@@ -321,8 +321,10 @@ public void updateScrollBars() {
321321
}
322322

323323
private void updateLineNumbers() {
324-
editorLineNumbers.updateLineNumbers(getFirstLine() + 1, Math.min(getFirstLine() + getVisibleLines() + 1, getLineCount()));
325-
editorLineNumbers.updateWidthForNumDigits(String.valueOf(getLineCount()).length());
324+
if (editorLineNumbers != null) {
325+
editorLineNumbers.updateLineNumbers(getFirstLine() + 1, Math.min(getFirstLine() + getVisibleLines() + 1, getLineCount()));
326+
editorLineNumbers.updateWidthForNumDigits(String.valueOf(getLineCount()).length());
327+
}
326328
}
327329

328330
/**
@@ -803,7 +805,11 @@ public final int getDocumentLength()
803805
*/
804806
public final int getLineCount()
805807
{
806-
return document.getDefaultRootElement().getElementCount();
808+
if (document != null) {
809+
return document.getDefaultRootElement().getElementCount();
810+
} else {
811+
return 0;
812+
}
807813
}
808814

809815
/**
@@ -2431,8 +2437,4 @@ public boolean addEdit(UndoableEdit edit)
24312437
public void setDisplayLineNumbers(boolean displayLineNumbers) {
24322438
editorLineNumbers.setDisplayLineNumbers(displayLineNumbers);
24332439
}
2434-
2435-
public void setLineNumbersFont(Font font) {
2436-
editorLineNumbers.setTextFont(font);
2437-
}
24382440
}

app/src/processing/app/syntax/TextAreaLineNumbers.java

+41-40
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,12 @@
1010
package processing.app.syntax;
1111

1212
import java.awt.Color;
13-
import java.awt.Dimension;
14-
import java.awt.Font;
13+
import java.awt.Graphics;
1514
import java.awt.Rectangle;
1615

17-
import javax.swing.JTextPane;
1816
import 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

Comments
 (0)