Skip to content

Commit c4823cc

Browse files
committed
Merge branch 'master' into ide-1.5.x
2 parents be30113 + 89d6841 commit c4823cc

File tree

6 files changed

+174
-8
lines changed

6 files changed

+174
-8
lines changed

app/src/processing/app/Editor.java

+2
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ protected void applyPreferences() {
439439
textarea.setEditable(!external);
440440
saveMenuItem.setEnabled(!external);
441441
saveAsMenuItem.setEnabled(!external);
442+
443+
textarea.setDisplayLineNumbers(Preferences.getBoolean("editor.linenumbers"));
442444

443445
TextAreaPainter painter = textarea.getPainter();
444446
if (external) {

app/src/processing/app/Preferences.java

+12
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ public String toString() {
194194
JCheckBox exportSeparateBox;
195195
JCheckBox verboseCompilationBox;
196196
JCheckBox verboseUploadBox;
197+
JCheckBox displayLineNumbersBox;
197198
JCheckBox verifyUploadBox;
198199
JCheckBox externalEditorBox;
199200
JCheckBox memoryOverrideBox;
@@ -432,6 +433,15 @@ public void actionPerformed(ActionEvent e) {
432433
box.setBounds(left, top, d.width, d.height);
433434
top += d.height + GUI_BETWEEN;
434435

436+
// [ ] Display line numbers
437+
438+
displayLineNumbersBox = new JCheckBox(_("Display line numbers"));
439+
pain.add(displayLineNumbersBox);
440+
d = displayLineNumbersBox.getPreferredSize();
441+
displayLineNumbersBox.setBounds(left, top, d.width + 10, d.height);
442+
right = Math.max(right, left + d.width);
443+
top += d.height + GUI_BETWEEN;
444+
435445
// [ ] Verify code after upload
436446

437447
verifyUploadBox = new JCheckBox(_("Verify code after upload"));
@@ -625,6 +635,7 @@ protected void applyFrame() {
625635
// put each of the settings into the table
626636
setBoolean("build.verbose", verboseCompilationBox.isSelected());
627637
setBoolean("upload.verbose", verboseUploadBox.isSelected());
638+
setBoolean("editor.linenumbers", displayLineNumbersBox.isSelected());
628639
setBoolean("upload.verify", verifyUploadBox.isSelected());
629640

630641
// setBoolean("sketchbook.closing_last_window_quits",
@@ -693,6 +704,7 @@ protected void showFrame(Editor editor) {
693704
// set all settings entry boxes to their actual status
694705
verboseCompilationBox.setSelected(getBoolean("build.verbose"));
695706
verboseUploadBox.setSelected(getBoolean("upload.verbose"));
707+
displayLineNumbersBox.setSelected(getBoolean("editor.linenumbers"));
696708
verifyUploadBox.setSelected(getBoolean("upload.verify"));
697709

698710
//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
/**
@@ -1751,6 +1770,7 @@ public void processKeyEvent(KeyEvent evt) {
17511770
}
17521771

17531772
// protected members
1773+
protected static String LEFT = "left";
17541774
protected static String CENTER = "center";
17551775
protected static String RIGHT = "right";
17561776
protected static String BOTTOM = "bottom";
@@ -1759,6 +1779,7 @@ public void processKeyEvent(KeyEvent evt) {
17591779
protected static Timer caretTimer;
17601780

17611781
protected TextAreaPainter painter;
1782+
protected TextAreaLineNumbers editorLineNumbers;
17621783

17631784
//protected EditPopupMenu popup;
17641785
protected JPopupMenu popup;
@@ -1885,7 +1906,9 @@ class ScrollLayout implements LayoutManager
18851906

18861907
public void addLayoutComponent(String name, Component comp)
18871908
{
1888-
if(name.equals(CENTER))
1909+
if(name.equals(LEFT))
1910+
left = comp;
1911+
else if(name.equals(CENTER))
18891912
center = comp;
18901913
else if(name.equals(RIGHT))
18911914
right = comp;
@@ -1897,6 +1920,8 @@ else if(name.equals(LEFT_OF_SCROLLBAR))
18971920

18981921
public void removeLayoutComponent(Component comp)
18991922
{
1923+
if(left == comp)
1924+
left = null;
19001925
if(center == comp)
19011926
center = null;
19021927
if(right == comp)
@@ -1917,6 +1942,8 @@ public Dimension preferredLayoutSize(Container parent)
19171942
Dimension centerPref = center.getPreferredSize();
19181943
dim.width += centerPref.width;
19191944
dim.height += centerPref.height;
1945+
Dimension leftPref = left.getPreferredSize();
1946+
dim.width += leftPref.width;
19201947
Dimension rightPref = right.getPreferredSize();
19211948
dim.width += rightPref.width;
19221949
Dimension bottomPref = bottom.getPreferredSize();
@@ -1935,6 +1962,8 @@ public Dimension minimumLayoutSize(Container parent)
19351962
Dimension centerPref = center.getMinimumSize();
19361963
dim.width += centerPref.width;
19371964
dim.height += centerPref.height;
1965+
Dimension leftPref = left.getMinimumSize();
1966+
dim.width += leftPref.width;
19381967
Dimension rightPref = right.getMinimumSize();
19391968
dim.width += rightPref.width;
19401969
Dimension bottomPref = bottom.getMinimumSize();
@@ -1954,11 +1983,19 @@ public void layoutContainer(Container parent)
19541983
int ibottom = insets.bottom;
19551984
int iright = insets.right;
19561985

1986+
int leftWidth = left.getSize().width;
19571987
int rightWidth = right.getPreferredSize().width;
19581988
int bottomHeight = bottom.getPreferredSize().height;
1959-
int centerWidth = size.width - rightWidth - ileft - iright;
1989+
int centerWidth = size.width - leftWidth - rightWidth - ileft - iright;
19601990
int centerHeight = size.height - bottomHeight - itop - ibottom;
19611991

1992+
left.setBounds(ileft,
1993+
itop,
1994+
leftWidth,
1995+
centerHeight);
1996+
1997+
ileft += leftWidth;
1998+
19621999
center.setBounds(ileft, // + LEFT_EXTRA,
19632000
itop,
19642001
centerWidth, // - LEFT_EXTRA,
@@ -1988,6 +2025,7 @@ public void layoutContainer(Container parent)
19882025
}
19892026

19902027
// private members
2028+
private Component left;
19912029
private Component center;
19922030
private Component right;
19932031
private Component bottom;
@@ -2404,4 +2442,8 @@ public boolean addEdit(UndoableEdit edit)
24042442
caretTimer.setInitialDelay(500);
24052443
caretTimer.start();
24062444
}
2445+
2446+
public void setDisplayLineNumbers(boolean displayLineNumbers) {
2447+
editorLineNumbers.setDisplayLineNumbers(displayLineNumbers);
2448+
}
24072449
}
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

build/shared/revisions.txt

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ ARDUINO 1.5.5 BETA
1010
* Added warning message when opening sketches with additional files with illegal names
1111
* (windows) Upgraded embedded Java runtime to version 7: much faster startup
1212
* Improved files open/save dialogs
13+
* Added line numbers, can be enabled/disabled from preferences (Cayci Gorlitsky)
1314

1415
[libraries]
1516
* avr: Fixed buffer overflow in File::doBuffer() (dreggy)

0 commit comments

Comments
 (0)