Skip to content

Commit 89d6841

Browse files
committed
Merge branch 'cayci-master'
2 parents ae265a9 + 66faf5d commit 89d6841

File tree

5 files changed

+173
-8
lines changed

5 files changed

+173
-8
lines changed

app/src/processing/app/Editor.java

+2
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,8 @@ protected void applyPreferences() {
430430
textarea.setEditable(!external);
431431
saveMenuItem.setEnabled(!external);
432432
saveAsMenuItem.setEnabled(!external);
433+
434+
textarea.setDisplayLineNumbers(Preferences.getBoolean("editor.linenumbers"));
433435

434436
TextAreaPainter painter = textarea.getPainter();
435437
if (external) {

app/src/processing/app/Preferences.java

+12
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ public class Preferences {
177177
JCheckBox exportSeparateBox;
178178
JCheckBox verboseCompilationBox;
179179
JCheckBox verboseUploadBox;
180+
JCheckBox displayLineNumbersBox;
180181
JCheckBox verifyUploadBox;
181182
JCheckBox externalEditorBox;
182183
JCheckBox memoryOverrideBox;
@@ -382,6 +383,15 @@ public void actionPerformed(ActionEvent e) {
382383
box.setBounds(left, top, d.width, d.height);
383384
top += d.height + GUI_BETWEEN;
384385

386+
// [ ] Display line numbers
387+
388+
displayLineNumbersBox = new JCheckBox(_("Display line numbers"));
389+
pain.add(displayLineNumbersBox);
390+
d = displayLineNumbersBox.getPreferredSize();
391+
displayLineNumbersBox.setBounds(left, top, d.width + 10, d.height);
392+
right = Math.max(right, left + d.width);
393+
top += d.height + GUI_BETWEEN;
394+
385395
// [ ] Verify code after upload
386396

387397
verifyUploadBox = new JCheckBox(_("Verify code after upload"));
@@ -571,6 +581,7 @@ protected void applyFrame() {
571581
// put each of the settings into the table
572582
setBoolean("build.verbose", verboseCompilationBox.isSelected());
573583
setBoolean("upload.verbose", verboseUploadBox.isSelected());
584+
setBoolean("editor.linenumbers", displayLineNumbersBox.isSelected());
574585
setBoolean("upload.verify", verifyUploadBox.isSelected());
575586

576587
// setBoolean("sketchbook.closing_last_window_quits",
@@ -634,6 +645,7 @@ protected void showFrame(Editor editor) {
634645
// set all settings entry boxes to their actual status
635646
verboseCompilationBox.setSelected(getBoolean("build.verbose"));
636647
verboseUploadBox.setSelected(getBoolean("upload.verbose"));
648+
displayLineNumbersBox.setSelected(getBoolean("editor.linenumbers"));
637649
verifyUploadBox.setSelected(getBoolean("upload.verify"));
638650

639651
//closingLastQuitsBox.

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

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

8888
// Initialize some misc. stuff
8989
painter = new TextAreaPainter(this,defaults);
90+
editorLineNumbers = new TextAreaLineNumbers(this,defaults);
9091
documentHandler = new DocumentHandler();
9192
eventListenerList = new EventListenerList();
9293
caretEvent = new MutableCaretEvent();
@@ -96,6 +97,7 @@ public JEditTextArea(TextAreaDefaults defaults)
9697

9798
// Initialize the GUI
9899
setLayout(new ScrollLayout());
100+
add(LEFT, editorLineNumbers);
99101
add(CENTER, painter);
100102
add(RIGHT, vertical = new JScrollBar(JScrollBar.VERTICAL));
101103
add(BOTTOM, horizontal = new JScrollBar(JScrollBar.HORIZONTAL));
@@ -315,6 +317,14 @@ public void updateScrollBars() {
315317
horizontal.setUnitIncrement(charWidth);
316318
horizontal.setBlockIncrement(width / 2);
317319
}
320+
updateLineNumbers();
321+
}
322+
323+
private void updateLineNumbers() {
324+
if (editorLineNumbers != null) {
325+
editorLineNumbers.updateLineNumbers(getFirstLine() + 1, Math.min(getFirstLine() + getVisibleLines() + 1, getLineCount()));
326+
editorLineNumbers.updateWidthForNumDigits(String.valueOf(getLineCount()).length());
327+
}
318328
}
319329

320330
/**
@@ -335,7 +345,7 @@ public void setFirstLine(int firstLine) {
335345
if (firstLine != vertical.getValue()) {
336346
updateScrollBars();
337347
}
338-
painter.repaint();
348+
repaintEditor();
339349
}
340350

341351
/**
@@ -377,7 +387,7 @@ public void setHorizontalOffset(int horizontalOffset)
377387
this.horizontalOffset = horizontalOffset;
378388
if(horizontalOffset != horizontal.getValue())
379389
updateScrollBars();
380-
painter.repaint();
390+
repaintEditor();
381391
}
382392

383393
/**
@@ -407,12 +417,17 @@ public boolean setOrigin(int firstLine, int horizontalOffset)
407417
if(changed)
408418
{
409419
updateScrollBars();
410-
painter.repaint();
420+
repaintEditor();
411421
}
412422

413423
return changed;
414424
}
415425

426+
private void repaintEditor() {
427+
painter.repaint();
428+
updateLineNumbers();
429+
}
430+
416431
/**
417432
* Ensures that the caret is visible by scrolling the text area if
418433
* necessary.
@@ -732,7 +747,7 @@ public void setDocument(SyntaxDocument document) {
732747

733748
select(0, 0);
734749
updateScrollBars();
735-
painter.repaint();
750+
repaintEditor();
736751
}
737752

738753

@@ -753,7 +768,7 @@ public void setDocument(SyntaxDocument document,
753768
select(start, stop);
754769
updateScrollBars();
755770
setScrollPosition(scroll);
756-
painter.repaint();
771+
repaintEditor();
757772
}
758773

759774

@@ -790,7 +805,11 @@ public final int getDocumentLength()
790805
*/
791806
public final int getLineCount()
792807
{
793-
return document.getDefaultRootElement().getElementCount();
808+
if (document != null) {
809+
return document.getDefaultRootElement().getElementCount();
810+
} else {
811+
return 0;
812+
}
794813
}
795814

796815
/**
@@ -1747,6 +1766,7 @@ public void processKeyEvent(KeyEvent evt) {
17471766
}
17481767

17491768
// protected members
1769+
protected static String LEFT = "left";
17501770
protected static String CENTER = "center";
17511771
protected static String RIGHT = "right";
17521772
protected static String BOTTOM = "bottom";
@@ -1755,6 +1775,7 @@ public void processKeyEvent(KeyEvent evt) {
17551775
protected static Timer caretTimer;
17561776

17571777
protected TextAreaPainter painter;
1778+
protected TextAreaLineNumbers editorLineNumbers;
17581779

17591780
//protected EditPopupMenu popup;
17601781
protected JPopupMenu popup;
@@ -1881,7 +1902,9 @@ class ScrollLayout implements LayoutManager
18811902

18821903
public void addLayoutComponent(String name, Component comp)
18831904
{
1884-
if(name.equals(CENTER))
1905+
if(name.equals(LEFT))
1906+
left = comp;
1907+
else if(name.equals(CENTER))
18851908
center = comp;
18861909
else if(name.equals(RIGHT))
18871910
right = comp;
@@ -1893,6 +1916,8 @@ else if(name.equals(LEFT_OF_SCROLLBAR))
18931916

18941917
public void removeLayoutComponent(Component comp)
18951918
{
1919+
if(left == comp)
1920+
left = null;
18961921
if(center == comp)
18971922
center = null;
18981923
if(right == comp)
@@ -1913,6 +1938,8 @@ public Dimension preferredLayoutSize(Container parent)
19131938
Dimension centerPref = center.getPreferredSize();
19141939
dim.width += centerPref.width;
19151940
dim.height += centerPref.height;
1941+
Dimension leftPref = left.getPreferredSize();
1942+
dim.width += leftPref.width;
19161943
Dimension rightPref = right.getPreferredSize();
19171944
dim.width += rightPref.width;
19181945
Dimension bottomPref = bottom.getPreferredSize();
@@ -1931,6 +1958,8 @@ public Dimension minimumLayoutSize(Container parent)
19311958
Dimension centerPref = center.getMinimumSize();
19321959
dim.width += centerPref.width;
19331960
dim.height += centerPref.height;
1961+
Dimension leftPref = left.getMinimumSize();
1962+
dim.width += leftPref.width;
19341963
Dimension rightPref = right.getMinimumSize();
19351964
dim.width += rightPref.width;
19361965
Dimension bottomPref = bottom.getMinimumSize();
@@ -1950,11 +1979,19 @@ public void layoutContainer(Container parent)
19501979
int ibottom = insets.bottom;
19511980
int iright = insets.right;
19521981

1982+
int leftWidth = left.getSize().width;
19531983
int rightWidth = right.getPreferredSize().width;
19541984
int bottomHeight = bottom.getPreferredSize().height;
1955-
int centerWidth = size.width - rightWidth - ileft - iright;
1985+
int centerWidth = size.width - leftWidth - rightWidth - ileft - iright;
19561986
int centerHeight = size.height - bottomHeight - itop - ibottom;
19571987

1988+
left.setBounds(ileft,
1989+
itop,
1990+
leftWidth,
1991+
centerHeight);
1992+
1993+
ileft += leftWidth;
1994+
19581995
center.setBounds(ileft, // + LEFT_EXTRA,
19591996
itop,
19601997
centerWidth, // - LEFT_EXTRA,
@@ -1984,6 +2021,7 @@ public void layoutContainer(Container parent)
19842021
}
19852022

19862023
// private members
2024+
private Component left;
19872025
private Component center;
19882026
private Component right;
19892027
private Component bottom;
@@ -2395,4 +2433,8 @@ public boolean addEdit(UndoableEdit edit)
23952433
caretTimer.setInitialDelay(500);
23962434
caretTimer.start();
23972435
}
2436+
2437+
public void setDisplayLineNumbers(boolean displayLineNumbers) {
2438+
editorLineNumbers.setDisplayLineNumbers(displayLineNumbers);
2439+
}
23982440
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* TextAreaLineNumbers.java - Show line numbers for the open file in the editor
3+
* Copyright (C) 2013 Cayci Gorlitsky
4+
*
5+
* You may use and modify this package for any purpose. Redistribution is
6+
* permitted, in both source and binary form, provided that this notice
7+
* remains intact in all source distributions of this package.
8+
*/
9+
10+
package processing.app.syntax;
11+
12+
import java.awt.Color;
13+
import java.awt.Graphics;
14+
import java.awt.Rectangle;
15+
16+
import javax.swing.border.MatteBorder;
17+
18+
public class TextAreaLineNumbers extends TextAreaPainter {
19+
20+
private final int LEFT_INDENT = 6;
21+
private final int RIGHT_INDENT = 6;
22+
private final int RIGHT_BORDER_WIDTH = 1;
23+
private final int PADDING_WIDTH = LEFT_INDENT + RIGHT_INDENT + RIGHT_BORDER_WIDTH;
24+
25+
private final int MIN_WIDTH;
26+
private final int DIGIT_WIDTH;
27+
private final int MIN_NUM_DIGITS = 2;
28+
29+
private int currStartNum = 0;
30+
private int currEndNum = 0;
31+
private int currNumDigits = MIN_NUM_DIGITS;
32+
33+
34+
35+
public TextAreaLineNumbers(JEditTextArea textArea, TextAreaDefaults defaults) {
36+
super(textArea, defaults);
37+
DIGIT_WIDTH = getFontMetrics(getFont()).stringWidth("0");
38+
MIN_WIDTH = DIGIT_WIDTH * MIN_NUM_DIGITS + PADDING_WIDTH;
39+
setEnabled(false);
40+
setBorder(new MatteBorder(0, 0, 0, RIGHT_BORDER_WIDTH, new Color(240, 240, 240)));
41+
}
42+
43+
public void updateLineNumbers(int startNum, int endNum) {
44+
if (currStartNum == startNum && currEndNum == endNum) {
45+
return;
46+
}
47+
currStartNum = startNum;
48+
currEndNum = endNum;
49+
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+
}
74+
}
75+
76+
public void updateWidthForNumDigits(int numDigits) {
77+
if (currNumDigits == numDigits) {
78+
return;
79+
}
80+
currNumDigits = numDigits;
81+
82+
if (isVisible()) {
83+
updateBounds();
84+
invalidate();
85+
repaint();
86+
}
87+
}
88+
89+
public void setDisplayLineNumbers(boolean displayLineNumbers) {
90+
setVisible(displayLineNumbers);
91+
if (displayLineNumbers) {
92+
updateBounds();
93+
} else {
94+
setBounds(new Rectangle(0, getHeight()));
95+
}
96+
invalidate();
97+
repaint();
98+
}
99+
100+
private void updateBounds() {
101+
if (isVisible()) {
102+
setBounds(new Rectangle(Math.max(MIN_WIDTH, DIGIT_WIDTH * currNumDigits + PADDING_WIDTH), getHeight()));
103+
textArea.validate();
104+
}
105+
}
106+
}

build/shared/lib/preferences.txt

+3
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ editor.caret.blink=true
104104
# area that's not in use by the text (replaced with tildes)
105105
editor.invalid=false
106106

107+
# show line numbers in editor
108+
editor.linenumbers = false
109+
107110
# enable ctrl-ins, shift-ins, shift-delete for cut/copy/paste
108111
# on windows and linux, but disable on the mac
109112
editor.keys.alternative_cut_copy_paste = true

0 commit comments

Comments
 (0)