From 75e05c6e7cfa432e5b3827d6589965d74af6c634 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Fri, 6 Nov 2015 23:21:02 +0100 Subject: [PATCH 1/6] Prevent out of bounds exception when matching bracket --- app/src/processing/app/syntax/Brackets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/processing/app/syntax/Brackets.java b/app/src/processing/app/syntax/Brackets.java index 1fd46ec27..2d7bcaaff 100644 --- a/app/src/processing/app/syntax/Brackets.java +++ b/app/src/processing/app/syntax/Brackets.java @@ -16,7 +16,7 @@ public class Brackets { } public int findMatchingBracket(final String text, final int pos) { - if (pos < 0 || pos > text.length()) + if (pos < 0 || pos >= text.length()) return -1; final char alpha = text.charAt(pos); From 84d922ee5000cb382649d921d6238484c70a7c02 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sat, 7 Nov 2015 10:45:21 +0100 Subject: [PATCH 2/6] Prevent out of bounds exception in xToOffset --- app/src/processing/app/syntax/JEditTextArea.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/processing/app/syntax/JEditTextArea.java b/app/src/processing/app/syntax/JEditTextArea.java index 79726a878..5fb7392db 100644 --- a/app/src/processing/app/syntax/JEditTextArea.java +++ b/app/src/processing/app/syntax/JEditTextArea.java @@ -755,6 +755,9 @@ public class JEditTextArea extends JComponent // ", i = " + i + // ", length = " + length + // ", array len = " + segmentArray.length); + if (segmentOffset + offset + i >= segmentArray.length) { + return segmentArray.length - segmentOffset - 1; + } char c = segmentArray[segmentOffset + offset + i]; int charWidth; if (c == '\t') { From 921099df04df6fd4375a3215ca98676d45481519 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Sat, 7 Nov 2015 11:16:20 +0100 Subject: [PATCH 3/6] Make tooltips saner --- .../mode/java/pdex/JavaTextAreaPainter.java | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java index 74ae6f714..8cec53216 100644 --- a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java +++ b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java @@ -26,6 +26,7 @@ import processing.mode.java.tweak.*; import java.awt.Color; import java.awt.Cursor; import java.awt.Font; +import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; @@ -114,39 +115,6 @@ public class JavaTextAreaPainter extends TextAreaPainter } }); - addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(final MouseEvent evt) { - int line = textArea.yToLine(evt.getY()); - int x = evt.getX(); - - LineMarker marker = getJavaEditor().findError(line); - if (marker != null) { - Problem problem = marker.getProblem(); - - int lineOffset = textArea.getLineStartOffset(problem.getLineNumber()); - - int lineStart = textArea.getLineStartOffset(line); - int lineEnd = textArea.getLineStopOffset(line); - - int errorStart = lineOffset + problem.getPDELineStartOffset(); - int errorEnd = lineOffset + problem.getPDELineStopOffset() + 1; - - int startOffset = Math.max(errorStart, lineStart) - lineStart; - int stopOffset = Math.min(errorEnd, lineEnd) - lineStart; - - if (x >= getJavaTextArea().offsetToX(line, startOffset) && - x <= getJavaTextArea().offsetToX(line, stopOffset)) { - //setToolTipText(problem.getMessage()); - getJavaEditor().statusToolTip(JavaTextAreaPainter.this, - problem.getMessage(), - problem.isError()); - evt.consume(); - } - } - } - }); - // TweakMode code tweakMode = false; cursorType = Cursor.DEFAULT_CURSOR; @@ -476,6 +444,43 @@ public class JavaTextAreaPainter extends TextAreaPainter } + @Override + public String getToolTipText(MouseEvent evt) { + int line = evt.getY() / getFontMetrics().getHeight() + textArea.getFirstLine(); + if (line < 0 || line > textArea.getLineCount() - 1) { + return null; + } + + LineMarker marker = getJavaEditor().findError(line); + if (marker != null) { + Problem problem = marker.getProblem(); + + int lineOffset = textArea.getLineStartOffset(problem.getLineNumber()); + + int lineStart = textArea.getLineStartOffset(line); + int lineEnd = textArea.getLineStopOffset(line); + + int errorStart = lineOffset + problem.getPDELineStartOffset(); + int errorEnd = lineOffset + problem.getPDELineStopOffset() + 1; + + int startOffset = Math.max(errorStart, lineStart) - lineStart; + int stopOffset = Math.min(errorEnd, lineEnd) - lineStart; + + int x = evt.getX(); + + if (x >= getJavaTextArea().offsetToX(line, startOffset) && + x <= getJavaTextArea().offsetToX(line, stopOffset)) { + getJavaEditor().statusToolTip(JavaTextAreaPainter.this, + problem.getMessage(), + problem.isError()); + return super.getToolTipText(); + } + } + return null; + } + + + /* @Override public String getToolTipText(MouseEvent event) { if (!getJavaEditor().hasJavaTabs()) { @@ -564,6 +569,7 @@ public class JavaTextAreaPainter extends TextAreaPainter // setToolTipText(null); return super.getToolTipText(event); } + */ // TweakMode code From 0e5bfdf29d3da869add88fe23589299dbc301747 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Mon, 9 Nov 2015 13:29:14 +0100 Subject: [PATCH 4/6] Prevent NPEs in ToolTipManager Might get rid of #3286 --- .../mode/java/pdex/JavaTextAreaPainter.java | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java index 8cec53216..80f88dedb 100644 --- a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java +++ b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java @@ -447,36 +447,35 @@ public class JavaTextAreaPainter extends TextAreaPainter @Override public String getToolTipText(MouseEvent evt) { int line = evt.getY() / getFontMetrics().getHeight() + textArea.getFirstLine(); - if (line < 0 || line > textArea.getLineCount() - 1) { - return null; - } + if (line >= 0 || line < textArea.getLineCount()) { + LineMarker marker = getJavaEditor().findError(line); + if (marker != null) { + Problem problem = marker.getProblem(); - LineMarker marker = getJavaEditor().findError(line); - if (marker != null) { - Problem problem = marker.getProblem(); + int lineOffset = textArea.getLineStartOffset(problem.getLineNumber()); - int lineOffset = textArea.getLineStartOffset(problem.getLineNumber()); + int lineStart = textArea.getLineStartOffset(line); + int lineEnd = textArea.getLineStopOffset(line); - int lineStart = textArea.getLineStartOffset(line); - int lineEnd = textArea.getLineStopOffset(line); + int errorStart = lineOffset + problem.getPDELineStartOffset(); + int errorEnd = lineOffset + problem.getPDELineStopOffset() + 1; - int errorStart = lineOffset + problem.getPDELineStartOffset(); - int errorEnd = lineOffset + problem.getPDELineStopOffset() + 1; + int startOffset = Math.max(errorStart, lineStart) - lineStart; + int stopOffset = Math.min(errorEnd, lineEnd) - lineStart; - int startOffset = Math.max(errorStart, lineStart) - lineStart; - int stopOffset = Math.min(errorEnd, lineEnd) - lineStart; + int x = evt.getX(); - int x = evt.getX(); - - if (x >= getJavaTextArea().offsetToX(line, startOffset) && - x <= getJavaTextArea().offsetToX(line, stopOffset)) { - getJavaEditor().statusToolTip(JavaTextAreaPainter.this, - problem.getMessage(), - problem.isError()); - return super.getToolTipText(); + if (x >= getJavaTextArea().offsetToX(line, startOffset) && + x <= getJavaTextArea().offsetToX(line, stopOffset)) { + getJavaEditor().statusToolTip(JavaTextAreaPainter.this, + problem.getMessage(), + problem.isError()); + return super.getToolTipText(evt); + } } } - return null; + setToolTipText(null); + return super.getToolTipText(evt); } From 129ffb5f6cdf1c215428e1afe52c04d6c058a585 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Mon, 9 Nov 2015 13:35:47 +0100 Subject: [PATCH 5/6] Run Tooltip code in Marker Column on AWT --- .../processing/mode/java/MarkerColumn.java | 30 +++++++------------ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/java/src/processing/mode/java/MarkerColumn.java b/java/src/processing/mode/java/MarkerColumn.java index cbc6fcc11..ae883004c 100644 --- a/java/src/processing/mode/java/MarkerColumn.java +++ b/java/src/processing/mode/java/MarkerColumn.java @@ -155,15 +155,10 @@ public class MarkerColumn extends JPanel { /** Find out which error/warning the user has clicked and scroll to it */ private void scrollToMarkerAt(final int y) { try { - new SwingWorker() { - protected Object doInBackground() throws Exception { - LineMarker m = findClosestMarker(y); - if (m != null) { - editor.getErrorChecker().scrollToErrorLine(m.getProblem()); - } - return null; - } - }.execute(); + LineMarker m = findClosestMarker(y); + if (m != null) { + editor.getErrorChecker().scrollToErrorLine(m.getProblem()); + } } catch (Exception ex) { ex.printStackTrace(); } @@ -181,21 +176,16 @@ public class MarkerColumn extends JPanel { /** Show tooltip on hover. */ private void showMarkerHover(final int y) { try { - new SwingWorker() { - protected Object doInBackground() throws Exception { - LineMarker m = findClosestMarker(y); - if (m != null) { - Problem p = m.getProblem(); + LineMarker m = findClosestMarker(y); + if (m != null) { + Problem p = m.getProblem(); // String kind = p.isError() ? // Language.text("editor.status.error") : // Language.text("editor.status.warning"); // setToolTipText(kind + ": " + p.getMessage()); - editor.statusToolTip(MarkerColumn.this, p.getMessage(), p.isError()); - setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - return null; - } - }.execute(); + editor.statusToolTip(MarkerColumn.this, p.getMessage(), p.isError()); + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } } catch (Exception ex) { ex.printStackTrace(); } From 925306d95f2aa58b608b6c5765a939387f68f69b Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Mon, 9 Nov 2015 13:56:28 +0100 Subject: [PATCH 6/6] Reindex brackets if there is invalid offset Fixes #1940 --- app/src/processing/app/syntax/Brackets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/processing/app/syntax/Brackets.java b/app/src/processing/app/syntax/Brackets.java index 2d7bcaaff..d351ef6b1 100644 --- a/app/src/processing/app/syntax/Brackets.java +++ b/app/src/processing/app/syntax/Brackets.java @@ -51,7 +51,7 @@ public class Brackets { return -1; } - if (offsets == null) + if (offsets == null || offsets.get(offsets.size()-1) >= text.length()) parse(text); // find this bracket