diff --git a/pdex/src/processing/mode/experimental/ErrorCheckerService.java b/pdex/src/processing/mode/experimental/ErrorCheckerService.java index 888542b3a..b1d663418 100644 --- a/pdex/src/processing/mode/experimental/ErrorCheckerService.java +++ b/pdex/src/processing/mode/experimental/ErrorCheckerService.java @@ -715,6 +715,7 @@ public class ErrorCheckerService implements Runnable{ } problemsList.add(p); } + calcPDEOffsetsForProbList(); } } catch (ClassNotFoundException e) { System.err.println("Compiltation Checker files couldn't be found! " @@ -742,15 +743,37 @@ public class ErrorCheckerService implements Runnable{ // log("Compilecheck, Done."); } + /** + * Calculates PDE Offsets from Java Offsets for Problems + */ private void calcPDEOffsetsForProbList() { PlainDocument javaSource = new PlainDocument(); - try { + // Code in pde tabs stored as PlainDocument + PlainDocument pdeTabs[] = new PlainDocument[editor.getSketch() + .getCodeCount()]; + + try { javaSource.insertString(0, sourceCode, null); + for (int i = 0; i < pdeTabs.length; i++) { + SketchCode sc = editor.getSketch().getCode(i); + pdeTabs[i] = new PlainDocument(); + if (editor.getSketch().getCurrentCode().equals(sc)) { + pdeTabs[i].insertString(0, + sc.getDocument().getText(0, + sc.getDocument() + .getLength()), + null); + } else { + pdeTabs[i].insertString(0, + sc.getProgram(), + null); + } + } int pkgNameOffset = ("package " + className + ";\n").length(); for (Problem p : problemsList) { int javaLineNumber = p.getIProblem().getSourceLineNumber(); Element lineElement = javaSource.getDefaultRootElement() - .getElement(javaLineNumber - 1); + .getElement(javaLineNumber - 2); if (lineElement == null) { log("calcPDEOffsetsForProbList(): Couldn't fetch javalinenum " + javaLineNumber); @@ -761,11 +784,19 @@ public class ErrorCheckerService implements Runnable{ - lineElement.getStartOffset()); int prbStart = p.getIProblem().getSourceStart() - pkgNameOffset, prbEnd = p .getIProblem().getSourceEnd() - pkgNameOffset; - - OffsetMatcher ofm = new OffsetMatcher( - astGenerator - .getPDESourceCodeLine(javaLineNumber), - javaLine); + Element pdeLineElement = pdeTabs[p.getTabIndex()] + .getDefaultRootElement().getElement(p.getLineNumber()-1); + if (pdeLineElement == null) { + log("calcPDEOffsetsForProbList(): Couldn't fetch pdelinenum " + + javaLineNumber); + continue; + } + String pdeLine = pdeTabs[p.getTabIndex()] + .getText(pdeLineElement.getStartOffset(), pdeLineElement.getEndOffset() + - pdeLineElement.getStartOffset()); + log("calcPDEOffsetsForProbList(): P " + pdeLine); + log("calcPDEOffsetsForProbList(): J " + javaLine); + OffsetMatcher ofm = new OffsetMatcher(pdeLine, javaLine); //log(""); int pdeOffset = ofm.getPdeOffForJavaOff(prbStart - lineElement.getStartOffset(), (prbEnd - p diff --git a/pdex/src/processing/mode/experimental/Problem.java b/pdex/src/processing/mode/experimental/Problem.java index 174c4894d..96da4ee1d 100644 --- a/pdex/src/processing/mode/experimental/Problem.java +++ b/pdex/src/processing/mode/experimental/Problem.java @@ -89,10 +89,19 @@ public class Problem { lineStartOffset = startOffset; lineStopOffset = stopOffset; } + + public int getPDELineStartOffset(){ + return lineStartOffset; + } + + public int getPDELineStopOffset(){ + return lineStopOffset; + } public String toString() { - return new String("TAB " + tabIndex + ",LN " + lineNumber + ",PROB: " - + message); + return new String("TAB " + tabIndex + ",LN " + lineNumber + "LN START OFF: " + + lineStartOffset + ",LN STOP OFF: " + lineStopOffset + ",PROB: " + + message); } public boolean isError(){ diff --git a/pdex/src/processing/mode/experimental/TextAreaPainter.java b/pdex/src/processing/mode/experimental/TextAreaPainter.java index 8b7f5e9dc..4a5c62849 100644 --- a/pdex/src/processing/mode/experimental/TextAreaPainter.java +++ b/pdex/src/processing/mode/experimental/TextAreaPainter.java @@ -314,7 +314,8 @@ public class TextAreaPainter extends processing.app.syntax.TextAreaPainter { boolean notFound = true; boolean isWarning = false; - + Problem problem = null; + // Check if current line contains an error. If it does, find if it's an // error or warning for (ErrorMarker emarker : errorCheckerService.getEditor().errorBar.errorPoints) { @@ -323,6 +324,8 @@ public class TextAreaPainter extends processing.app.syntax.TextAreaPainter { if (emarker.getType() == ErrorMarker.Warning) { isWarning = true; } + problem = emarker.getProblem(); + log(problem.toString()); break; } } @@ -337,15 +340,15 @@ public class TextAreaPainter extends processing.app.syntax.TextAreaPainter { int y = ta.lineToY(line); y += fm.getLeading() + fm.getMaxDescent(); int height = fm.getHeight(); - int start = ta.getLineStartOffset(line); - + int start = ta.getLineStartOffset(line) + problem.getPDELineStartOffset(); + int pLength = problem.getPDELineStopOffset() + 1 + - problem.getPDELineStartOffset(); try { String linetext = null; try { - linetext = ta.getDocument().getText(start, - ta.getLineStopOffset(line) - start - - 1); + linetext = ta.getDocument().getText(start, pLength); + log("paintErrorLine() LineText: " + linetext); } catch (BadLocationException bl) { // Error in the import statements or end of code. // System.out.print("BL caught. " + ta.getLineCount() + " ,"