diff --git a/java/src/processing/mode/java/DebugToolbar.java b/java/src/processing/mode/java/DebugToolbar.java index 3229c4e0f..192d8075c 100644 --- a/java/src/processing/mode/java/DebugToolbar.java +++ b/java/src/processing/mode/java/DebugToolbar.java @@ -74,6 +74,8 @@ public class DebugToolbar extends JavaToolbar { public DebugToolbar(Editor editor, Base base) { super(editor, base); } + + public Image[][] loadDebugImages() { int res = Toolkit.highResDisplay() ? 2 : 1; diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index ab1cbd55e..2543e59e9 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -92,19 +92,19 @@ public class JavaEditor extends Editor { protected JScrollPane errorTableScrollPane; protected JPanel consoleProblemsPane; protected XQErrorTable errorTable; - + + // TODO how is this different from hasJavaTabs? public boolean compilationCheckEnabled = true; // protected JCheckBoxMenuItem showWarnings; - public JCheckBoxMenuItem problemWindowMenuCB; +// public JCheckBoxMenuItem problemWindowMenuCB; // protected JCheckBoxMenuItem debugMessagesEnabled; // protected JMenuItem showOutline; // protected JMenuItem showTabOutline; // protected JCheckBoxMenuItem writeErrorLog; // protected JCheckBoxMenuItem completionsEnabled; - // TODO no way should this be public; make an accessor or protected - public boolean hasJavaTabs; + private boolean hasJavaTabs; protected JavaEditor(Base base, String path, EditorState state, Mode mode) { @@ -161,7 +161,7 @@ public class JavaEditor extends Editor { } getSketch().setModified(false); // setting breakpoints will flag sketch as modified, so override this here - checkForJavaTabs(); + hasJavaTabs = checkForJavaTabs(); initializeErrorChecker(); getJavaTextArea().setECSandThemeforTextArea(errorCheckerService, jmode); @@ -2415,24 +2415,28 @@ public class JavaEditor extends Editor { } + public boolean hasJavaTabs() { + return hasJavaTabs; + } + + /** - * Checks if the sketch contains java tabs. If it does, the editor ain't built - * for it, yet. Also, user should really start looking at more powerful IDEs - * likeEclipse. Disable compilation check and some more features. + * Checks if the sketch contains java tabs. If it does, the editor ain't + * built for it, yet. Also, user should really start looking at a full IDE + * like Eclipse. Disable compilation check and some more features. */ - private void checkForJavaTabs() { - hasJavaTabs = false; - for (int i = 0; i < this.getSketch().getCodeCount(); i++) { - if (this.getSketch().getCode(i).getExtension().equals("java")) { + private boolean checkForJavaTabs() { + for (SketchCode code : getSketch().getCode()) { + if (code.getExtension().equals("java")) { compilationCheckEnabled = false; - hasJavaTabs = true; - JOptionPane.showMessageDialog(new Frame(), this - .getSketch().getName() - + " contains .java tabs. Some editor features are not supported " + - "for .java tabs and will be disabled."); - break; + final String msg = + getSketch().getName() + " contains .java tabs. Some editor " + + "features are not supported for .java tabs and will be disabled."; + Base.showWarning("Cannot debug advanced sketches", msg); + return true; } } + return false; } diff --git a/java/src/processing/mode/java/pdex/ASTGenerator.java b/java/src/processing/mode/java/pdex/ASTGenerator.java index 3bcdf2d8f..a5dd89225 100644 --- a/java/src/processing/mode/java/pdex/ASTGenerator.java +++ b/java/src/processing/mode/java/pdex/ASTGenerator.java @@ -2127,8 +2127,9 @@ public class ASTGenerator { editor.getTextArea().select(lineStartWSOffset, lineStartWSOffset + length); } - public void handleShowUsage(){ - if(editor.hasJavaTabs) return; // show usage disabled if java tabs + public void handleShowUsage() { + if (editor.hasJavaTabs()) return; // show usage disabled if java tabs + log("Last clicked word:" + lastClickedWord); if (lastClickedWord == null && getSelectedText() == null) { @@ -2383,8 +2384,9 @@ public class ASTGenerator { protected SketchOutline sketchOutline; - public void showSketchOutline(){ - if(editor.hasJavaTabs) return; // sketch outline disabled if java tabs + public void showSketchOutline() { + if (editor.hasJavaTabs()) return; + sketchOutline = new SketchOutline(codeTree, errorCheckerService); sketchOutline.show(); } @@ -2472,7 +2474,8 @@ public class ASTGenerator { } public void handleRefactor() { - if(editor.hasJavaTabs) return; // refactoring disabled if java tabs + if (editor.hasJavaTabs()) return; // refactoring disabled w/ java tabs + log("Last clicked word:" + lastClickedWord); if (lastClickedWord == null && getSelectedText() == null) { diff --git a/java/src/processing/mode/java/pdex/ErrorWindow.java b/java/src/processing/mode/java/pdex/ErrorWindow.java index 92c0ee539..d381ac6f4 100644 --- a/java/src/processing/mode/java/pdex/ErrorWindow.java +++ b/java/src/processing/mode/java/pdex/ErrorWindow.java @@ -167,7 +167,8 @@ public class ErrorWindow extends JFrame { @Override public void windowClosing(WindowEvent e) { - thisEditor.problemWindowMenuCB.setSelected(false); + // removing b/c this was the only use of problemWindowMenuCB [fry 150125] +// thisEditor.problemWindowMenuCB.setSelected(false); } @Override diff --git a/java/src/processing/mode/java/pdex/JavaTextArea.java b/java/src/processing/mode/java/pdex/JavaTextArea.java index f1317e457..9c3b88b9d 100644 --- a/java/src/processing/mode/java/pdex/JavaTextArea.java +++ b/java/src/processing/mode/java/pdex/JavaTextArea.java @@ -163,22 +163,21 @@ public class JavaTextArea extends JEditTextArea { /** - * Handles KeyEvents for TextArea - * Code completion begins from here. + * Handles KeyEvents for TextArea (code completion begins from here). */ public void processKeyEvent(KeyEvent evt) { - //if(Base.isMacOS() && evt.isControlDown()) System.out.println("Ctrl down: " + evt); - if(evt.getKeyCode() == KeyEvent.VK_ESCAPE){ - if(suggestion != null){ - if(suggestion.isVisible()){ + if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) { + if (suggestion != null){ + if (suggestion.isVisible()){ Base.log("esc key"); hideSuggestion(); evt.consume(); return; } } - } - else if(evt.getKeyCode() == KeyEvent.VK_ENTER && evt.getID() == KeyEvent.KEY_PRESSED){ + + } else if (evt.getKeyCode() == KeyEvent.VK_ENTER && + evt.getID() == KeyEvent.KEY_PRESSED) { if (suggestion != null) { if (suggestion.isVisible()) { if (suggestion.insertSelection(CompletionPanel.KEYBOARD_COMPLETION)) { @@ -228,62 +227,27 @@ public class JavaTextArea extends JEditTextArea { } super.processKeyEvent(evt); - if (editor.hasJavaTabs) return; // code completion disabled if java tabs - - if (evt.getID() == KeyEvent.KEY_TYPED) { - char keyChar = evt.getKeyChar(); - if (keyChar == KeyEvent.VK_ENTER || - keyChar == KeyEvent.VK_ESCAPE || - keyChar == KeyEvent.VK_TAB || - keyChar == KeyEvent.CHAR_UNDEFINED) { - return; - } - else if (keyChar == ')') { - hideSuggestion(); // See #2741 - return; - } - - final KeyEvent evt2 = evt; + // code completion disabled if java tabs + if (!editor.hasJavaTabs()) { + if (evt.getID() == KeyEvent.KEY_TYPED) { + processCompletionKeys(evt); - if (keyChar == '.') { - if (JavaMode.codeCompletionsEnabled) { - Base.log("[KeyEvent]" + KeyEvent.getKeyText(evt2.getKeyCode()) + " |Prediction started"); - Base.log("Typing: " + fetchPhrase(evt2)); - } - } else if (keyChar == ' ') { // Trigger on Ctrl-Space - if (!Base.isMacOS() && JavaMode.codeCompletionsEnabled && - (evt.isControlDown() || evt.isMetaDown())) { - SwingWorker worker = new SwingWorker() { - protected Object doInBackground() throws Exception { - // Provide completions only if it's enabled - if (JavaMode.codeCompletionsEnabled) { - getDocument().remove(getCaretPosition() - 1, 1); // Remove the typed space - Base.log("[KeyEvent]" + evt2.getKeyChar() + " |Prediction started"); - Base.log("Typing: " + fetchPhrase(evt2)); - } - return null; - } - }; - worker.execute(); - } else { - hideSuggestion(); // hide on spacebar - } - } else { - if (JavaMode.codeCompletionsEnabled) { - prepareSuggestions(evt2); - } + } else if (Base.isMacOS() && evt.getID() == KeyEvent.KEY_RELEASED) { + processControlSpace(evt); } } - // #2699 - Special case for OS X, where Ctrl-Space is not detected as Key_Typed -_- - else if (Base.isMacOS() && evt.getID() == KeyEvent.KEY_RELEASED - && evt.getKeyCode() == KeyEvent.VK_SPACE && evt.isControlDown()) { - final KeyEvent evt2 = evt; + } + + + // #2699 - Special case for OS X, where Ctrl-Space is not detected as Key_Typed -_- + private void processControlSpace(final KeyEvent event) { + if (event.getKeyCode() == KeyEvent.VK_SPACE && event.isControlDown()) { SwingWorker worker = new SwingWorker() { protected Object doInBackground() throws Exception { // Provide completions only if it's enabled if (JavaMode.codeCompletionsEnabled) { - Base.log("[KeyEvent]" + KeyEvent.getKeyText(evt2.getKeyCode()) + " |Prediction started"); - Base.log("Typing: " + fetchPhrase(evt2)); + Base.log("[KeyEvent]" + KeyEvent.getKeyText(event.getKeyCode()) + " |Prediction started"); + Base.log("Typing: " + fetchPhrase(event)); } return null; } @@ -292,10 +256,52 @@ public class JavaTextArea extends JEditTextArea { } } + + private void processCompletionKeys(final KeyEvent event) { + char keyChar = event.getKeyChar(); + if (keyChar == KeyEvent.VK_ENTER || + keyChar == KeyEvent.VK_ESCAPE || + keyChar == KeyEvent.VK_TAB || + keyChar == KeyEvent.CHAR_UNDEFINED) { + return; + + } else if (keyChar == ')') { + hideSuggestion(); // See #2741 + return; + } + + if (keyChar == '.') { + if (JavaMode.codeCompletionsEnabled) { + Base.log("[KeyEvent]" + KeyEvent.getKeyText(event.getKeyCode()) + " |Prediction started"); + Base.log("Typing: " + fetchPhrase(event)); + } + } else if (keyChar == ' ') { // Trigger on Ctrl-Space + if (!Base.isMacOS() && JavaMode.codeCompletionsEnabled && + (event.isControlDown() || event.isMetaDown())) { + SwingWorker worker = new SwingWorker() { + protected Object doInBackground() throws Exception { + // Provide completions only if it's enabled + if (JavaMode.codeCompletionsEnabled) { + getDocument().remove(getCaretPosition() - 1, 1); // Remove the typed space + Base.log("[KeyEvent]" + event.getKeyChar() + " |Prediction started"); + Base.log("Typing: " + fetchPhrase(event)); + } + return null; + } + }; + worker.execute(); + } else { + hideSuggestion(); // hide on spacebar + } + } else { + if (JavaMode.codeCompletionsEnabled) { + prepareSuggestions(event); + } + } + } + - /** - * Kickstart auto-complete suggestions - */ + /** Kickstart auto-complete suggestions */ private void prepareSuggestions(final KeyEvent evt){ SwingWorker worker = new SwingWorker() { protected Object doInBackground() throws Exception { @@ -315,7 +321,6 @@ public class JavaTextArea extends JEditTextArea { /** * Retrieves the word on which the mouse pointer is present * @param evt - the MouseEvent which triggered this method - * @return */ private String fetchPhrase(MouseEvent evt) { Base.log("--handle Mouse Right Click--"); @@ -726,7 +731,7 @@ public class JavaTextArea extends JEditTextArea { } if (me.getButton() == MouseEvent.BUTTON3) { - if(!editor.hasJavaTabs){ // tooltips, etc disabled for java tabs + if (!editor.hasJavaTabs()) { // tooltips, etc disabled for java tabs fetchPhrase(me); } } diff --git a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java index bd5d92f8d..31ee62da0 100644 --- a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java +++ b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java @@ -75,11 +75,10 @@ public class JavaTextAreaPainter extends TextAreaPainter public JavaTextAreaPainter(JavaTextArea textArea, TextAreaDefaults defaults) { super(textArea, defaults); -// ta = textArea; addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { - if (!hasJavaTabs()) { // Ctrl + Click disabled for java tabs + if (!getEditor().hasJavaTabs()) { // Ctrl + Click disabled for java tabs if (evt.getButton() == MouseEvent.BUTTON1) { if (evt.isControlDown() || evt.isMetaDown()) { handleCtrlClick(evt); @@ -453,87 +452,89 @@ public class JavaTextAreaPainter extends TextAreaPainter } - public String getToolTipText(java.awt.event.MouseEvent evt) { - if (hasJavaTabs()) { // disabled for java tabs - setToolTipText(null); - return super.getToolTipText(evt); - } - int off = textArea.xyToOffset(evt.getX(), evt.getY()); - if (off < 0) { - setToolTipText(null); - return super.getToolTipText(evt); - } - int line = textArea.getLineOfOffset(off); - if (line < 0) { - setToolTipText(null); - return super.getToolTipText(evt); - } - String s = textArea.getLineText(line); - if (s == "") - return evt.toString(); - else if (s.length() == 0) { - setToolTipText(null); - return super.getToolTipText(evt); - } else { - int x = textArea.xToOffset(line, evt.getX()), x2 = x + 1, x1 = x - 1; - int xLS = off - textArea.getLineStartNonWhiteSpaceOffset(line); - if (x < 0 || x >= s.length()) { + public String getToolTipText(MouseEvent event) { + if (!getEditor().hasJavaTabs()) { + int off = textArea.xyToOffset(event.getX(), event.getY()); + if (off < 0) { setToolTipText(null); - return super.getToolTipText(evt); + return super.getToolTipText(event); } - String word = s.charAt(x) + ""; - if (s.charAt(x) == ' ') { + int line = textArea.getLineOfOffset(off); + if (line < 0) { setToolTipText(null); - return super.getToolTipText(evt); + return super.getToolTipText(event); } - if (!(Character.isLetterOrDigit(s.charAt(x)) || s.charAt(x) == '_' || s - .charAt(x) == '$')) { + String s = textArea.getLineText(line); + if (s == "") { + return event.toString(); + + } else if (s.length() == 0) { setToolTipText(null); - return super.getToolTipText(evt); - } - int i = 0; - while (true) { - i++; - if (x1 >= 0 && x1 < s.length()) { - if (Character.isLetter(s.charAt(x1)) || s.charAt(x1) == '_') { - word = s.charAt(x1--) + word; - xLS--; + return super.getToolTipText(event); + + } else { + int x = textArea.xToOffset(line, event.getX()), x2 = x + 1, x1 = x - 1; + int xLS = off - textArea.getLineStartNonWhiteSpaceOffset(line); + if (x < 0 || x >= s.length()) { + setToolTipText(null); + return super.getToolTipText(event); + } + String word = s.charAt(x) + ""; + if (s.charAt(x) == ' ') { + setToolTipText(null); + return super.getToolTipText(event); + } + if (!(Character.isLetterOrDigit(s.charAt(x)) || + s.charAt(x) == '_' || s.charAt(x) == '$')) { + setToolTipText(null); + return super.getToolTipText(event); + } + int i = 0; + while (true) { + i++; + if (x1 >= 0 && x1 < s.length()) { + if (Character.isLetter(s.charAt(x1)) || s.charAt(x1) == '_') { + word = s.charAt(x1--) + word; + xLS--; + } else + x1 = -1; } else x1 = -1; - } else - x1 = -1; - if (x2 >= 0 && x2 < s.length()) { - if (Character.isLetterOrDigit(s.charAt(x2)) || s.charAt(x2) == '_' - || s.charAt(x2) == '$') - word = word + s.charAt(x2++); - else + if (x2 >= 0 && x2 < s.length()) { + if (Character.isLetterOrDigit(s.charAt(x2)) || s.charAt(x2) == '_' + || s.charAt(x2) == '$') + word = word + s.charAt(x2++); + else + x2 = -1; + } else x2 = -1; - } else - x2 = -1; - if (x1 < 0 && x2 < 0) - break; - if (i > 200) { - // time out! - // System.err.println("Whoopsy! :P"); - break; + if (x1 < 0 && x2 < 0) + break; + if (i > 200) { + // time out! + // System.err.println("Whoopsy! :P"); + break; + } + } + if (Character.isDigit(word.charAt(0))) { + setToolTipText(null); + return super.getToolTipText(event); + } + String tooltipText = errorCheckerService.getASTGenerator() + .getLabelForASTNode(line, word, xLS); + + // log(errorCheckerService.mainClassOffset + " MCO " + // + "|" + line + "| offset " + xLS + word + " <= offf: "+off+ "\n"); + if (tooltipText != null) { + return tooltipText; } } - if (Character.isDigit(word.charAt(0))) { - setToolTipText(null); - return super.getToolTipText(evt); - } - String tooltipText = errorCheckerService.getASTGenerator() - .getLabelForASTNode(line, word, xLS); - -// log(errorCheckerService.mainClassOffset + " MCO " -// + "|" + line + "| offset " + xLS + word + " <= offf: "+off+ "\n"); - if (tooltipText != null) - return tooltipText; } + // Used when there are Java tabs, but also the fall-through case from above setToolTipText(null); - return super.getToolTipText(evt); + return super.getToolTipText(event); } @@ -881,7 +882,7 @@ public class JavaTextAreaPainter extends TextAreaPainter // } - private boolean hasJavaTabs() { - return getEditor().hasJavaTabs; - } +// private boolean hasJavaTabs() { +// return getEditor().hasJavaTabs(); +// } } diff --git a/todo.txt b/todo.txt index ce7bed5a1..50d805471 100644 --- a/todo.txt +++ b/todo.txt @@ -89,8 +89,11 @@ X rename TextArea and TextAreaPainter to JavaTextArea X DebugEditor.createTextArea() is copy & pasted from JavaEditor X this whole setup is really gross at the moment X finish Ant task to download JRE and JDK from Oracle +X remove public 'ta' object in DebugEditor, also dmode -_ remove public 'ta' object in DebugEditor, also dmode +_ fix hasJavaTabs() function +_ almost always used as a negative, or tied to a 'return' from fxn +_ name isn't tied to its function, but the symptom _ crashed on startup w/ JavaScript mode as default b/c PdeKeyListener not found _ because it's in the other ClassLoader, can no longer rely on it