From 66faf5d6c600127066b178e959c7a00f3ac6c31e Mon Sep 17 00:00:00 2001 From: Cayci Date: Sat, 2 Nov 2013 21:49:09 -0400 Subject: [PATCH] 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. --- app/src/processing/app/Editor.java | 1 - .../processing/app/syntax/JEditTextArea.java | 18 +++-- .../app/syntax/TextAreaLineNumbers.java | 81 ++++++++++--------- 3 files changed, 51 insertions(+), 49 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 1224cc760..61051f93c 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -452,7 +452,6 @@ public class Editor extends JFrame implements RunnerListener { // apply changes to the font size for the editor //TextAreaPainter painter = textarea.getPainter(); painter.setFont(Preferences.getFont("editor.font")); - textarea.setLineNumbersFont(Preferences.getFont("editor.font")); //Font font = painter.getFont(); //textarea.getPainter().setFont(new Font("Courier", Font.PLAIN, 36)); diff --git a/app/src/processing/app/syntax/JEditTextArea.java b/app/src/processing/app/syntax/JEditTextArea.java index 36fd20c7b..07628e85e 100644 --- a/app/src/processing/app/syntax/JEditTextArea.java +++ b/app/src/processing/app/syntax/JEditTextArea.java @@ -87,7 +87,7 @@ public class JEditTextArea extends JComponent // Initialize some misc. stuff painter = new TextAreaPainter(this,defaults); - editorLineNumbers = new TextAreaLineNumbers(defaults, (int) painter.getPreferredSize().getHeight()); + editorLineNumbers = new TextAreaLineNumbers(this,defaults); documentHandler = new DocumentHandler(); eventListenerList = new EventListenerList(); caretEvent = new MutableCaretEvent(); @@ -321,8 +321,10 @@ public class JEditTextArea extends JComponent } private void updateLineNumbers() { - editorLineNumbers.updateLineNumbers(getFirstLine() + 1, Math.min(getFirstLine() + getVisibleLines() + 1, getLineCount())); - editorLineNumbers.updateWidthForNumDigits(String.valueOf(getLineCount()).length()); + if (editorLineNumbers != null) { + editorLineNumbers.updateLineNumbers(getFirstLine() + 1, Math.min(getFirstLine() + getVisibleLines() + 1, getLineCount())); + editorLineNumbers.updateWidthForNumDigits(String.valueOf(getLineCount()).length()); + } } /** @@ -803,7 +805,11 @@ public class JEditTextArea extends JComponent */ public final int getLineCount() { - return document.getDefaultRootElement().getElementCount(); + if (document != null) { + return document.getDefaultRootElement().getElementCount(); + } else { + return 0; + } } /** @@ -2431,8 +2437,4 @@ public class JEditTextArea extends JComponent public void setDisplayLineNumbers(boolean displayLineNumbers) { editorLineNumbers.setDisplayLineNumbers(displayLineNumbers); } - - public void setLineNumbersFont(Font font) { - editorLineNumbers.setTextFont(font); - } } diff --git a/app/src/processing/app/syntax/TextAreaLineNumbers.java b/app/src/processing/app/syntax/TextAreaLineNumbers.java index e374062dc..39f7438f2 100644 --- a/app/src/processing/app/syntax/TextAreaLineNumbers.java +++ b/app/src/processing/app/syntax/TextAreaLineNumbers.java @@ -10,19 +10,12 @@ package processing.app.syntax; import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; +import java.awt.Graphics; import java.awt.Rectangle; -import javax.swing.JTextPane; import javax.swing.border.MatteBorder; -import javax.swing.text.AttributeSet; -import javax.swing.text.SimpleAttributeSet; -import javax.swing.text.StyleConstants; -import processing.app.Preferences; - -public class TextAreaLineNumbers extends JTextPane { +public class TextAreaLineNumbers extends TextAreaPainter { private final int LEFT_INDENT = 6; private final int RIGHT_INDENT = 6; @@ -37,29 +30,14 @@ public class TextAreaLineNumbers extends JTextPane { private int currEndNum = 0; private int currNumDigits = MIN_NUM_DIGITS; - public TextAreaLineNumbers(TextAreaDefaults defaults, int preferredHeight) { - setBackground(defaults.bgcolor); - setForeground(defaults.fgcolor); - setOpaque(true); - setEditable(false); - setEnabled(false); - setBorder(new MatteBorder(0, 0, 0, 1, new Color(240, 240, 240))); - setTextFont(Preferences.getFont("editor.font")); - + + + public TextAreaLineNumbers(JEditTextArea textArea, TextAreaDefaults defaults) { + super(textArea, defaults); DIGIT_WIDTH = getFontMetrics(getFont()).stringWidth("0"); MIN_WIDTH = DIGIT_WIDTH * MIN_NUM_DIGITS + PADDING_WIDTH; - - setPreferredSize(new Dimension(MIN_WIDTH, preferredHeight)); - } - - public void setTextFont(Font font) { - setFont(font); - SimpleAttributeSet attribs = new SimpleAttributeSet(); - StyleConstants.setAlignment(attribs , StyleConstants.ALIGN_RIGHT); - StyleConstants.setLeftIndent(attribs , 6); - StyleConstants.setRightIndent(attribs , 6); - StyleConstants.setFontSize(attribs, getFont().getSize()); - setParagraphAttributes(attribs,true); + setEnabled(false); + setBorder(new MatteBorder(0, 0, 0, RIGHT_BORDER_WIDTH, new Color(240, 240, 240))); } public void updateLineNumbers(int startNum, int endNum) { @@ -69,14 +47,30 @@ public class TextAreaLineNumbers extends JTextPane { currStartNum = startNum; currEndNum = endNum; - StringBuilder sb = new StringBuilder(); - for (int i = startNum; i < endNum; i++) { - sb.append(i).append("\n"); - } - sb.append(endNum); - setText(sb.toString()); - invalidate(); + repaint(); + } + + @Override + public void paint(Graphics gfx) { + super.paint(gfx); + getBorder().paintBorder(this, gfx, 0, 0, getSize().width, getSize().height); + } + + @Override + protected void paintLine(Graphics gfx, TokenMarker tokenMarker, + int line, int x) + { + currentLineIndex = line; + gfx.setFont(getFont()); + gfx.setColor(Color.GRAY); + int y = textArea.lineToY(line); + int startX = getBounds().x + getBounds().width; + if (line >= 0 && line < textArea.getLineCount()) { + String lineNumberString = String.valueOf(line+1); + int lineStartX = startX - RIGHT_BORDER_WIDTH - RIGHT_INDENT - fm.stringWidth(lineNumberString); + gfx.drawString(lineNumberString,lineStartX,y + fm.getHeight()); + } } public void updateWidthForNumDigits(int numDigits) { @@ -85,8 +79,11 @@ public class TextAreaLineNumbers extends JTextPane { } currNumDigits = numDigits; - updateBounds(); - invalidate(); + if (isVisible()) { + updateBounds(); + invalidate(); + repaint(); + } } public void setDisplayLineNumbers(boolean displayLineNumbers) { @@ -97,9 +94,13 @@ public class TextAreaLineNumbers extends JTextPane { setBounds(new Rectangle(0, getHeight())); } invalidate(); + repaint(); } private void updateBounds() { - setBounds(new Rectangle(Math.max(MIN_WIDTH, DIGIT_WIDTH * currNumDigits + PADDING_WIDTH), getHeight())); + if (isVisible()) { + setBounds(new Rectangle(Math.max(MIN_WIDTH, DIGIT_WIDTH * currNumDigits + PADDING_WIDTH), getHeight())); + textArea.validate(); + } } }