diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 4f4cdaa28..a5aded5af 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -144,29 +144,26 @@ public abstract class Editor extends JFrame implements RunnerListener { // When bringing a window to front, let the Base know addWindowListener(new WindowAdapter() { +// int importIndex; + public void windowActivated(WindowEvent e) { -// EditorConsole.systemOut.println("editor window activated"); base.handleActivated(Editor.this); -// mode.handleActivated(Editor.this); -// fileMenu.insert(base.getSketchbookMenu(), 2); fileMenu.insert(base.getRecentMenu(), 2); -// fileMenu.insert(mode.getExamplesMenu(), 3); Toolkit.setMenuMnemsInside(fileMenu); - sketchMenu.insert(mode.getImportMenu(), 4); + //sketchMenu.insert(mode.getImportMenu(), 5); + mode.insertImportMenu(sketchMenu); + //sketchMenu.insert(mode.getImportMenu(), importIndex); Toolkit.setMenuMnemsInside(sketchMenu); mode.insertToolbarRecentMenu(); } - // added for 1.0.5 - // http://dev.processing.org/bugs/show_bug.cgi?id=1260 public void windowDeactivated(WindowEvent e) { -// EditorConsole.systemErr.println("editor window deactivated"); -// mode.handleDeactivated(Editor.this); -// fileMenu.remove(base.getSketchbookMenu()); fileMenu.remove(base.getRecentMenu()); -// fileMenu.remove(mode.getExamplesMenu()); - sketchMenu.remove(mode.getImportMenu()); +// JMenu importMenu = mode.getImportMenu(); +// importIndex = sketchMenu.getComponentZOrder(mode.getImportMenu()); +// sketchMenu.remove(mode.getImportMenu()); + mode.removeImportMenu(sketchMenu); mode.removeToolbarRecentMenu(); } }); diff --git a/app/src/processing/app/EditorHeader.java b/app/src/processing/app/EditorHeader.java index 1b5c50517..05ddef57d 100644 --- a/app/src/processing/app/EditorHeader.java +++ b/app/src/processing/app/EditorHeader.java @@ -215,16 +215,6 @@ public class EditorHeader extends JComponent { public void paintComponent(Graphics screen) { setOpaque(false); -// Component parent = getParent(); -// while (parent != null) { -// //EditorConsole.systemOut.println("parent is " + parent + " " + parent.isOpaque()); -// EditorConsole.systemOut.println(//"parent is " + -// parent.getClass().getName() + " " + (parent.isOpaque() ? "OPAQUE" : "")); -// parent = parent.getParent(); -// } -// System.out.println(); -// if (true) return; - if (screen == null) return; Sketch sketch = editor.getSketch(); diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index b0af64bfc..6d7bd8260 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -442,6 +442,40 @@ public abstract class Mode { } + protected int importMenuIndex = -1; + + /** + * Rather than re-building the library menu for every open sketch (very slow + * and prone to bugs when updating libs, particularly with the contribs mgr), + * share a single instance across all windows. + * @since 3.0a6 + * @param sketchMenu the Sketch menu that's currently active + */ + public void removeImportMenu(JMenu sketchMenu) { + JMenu importMenu = getImportMenu(); + //importMenuIndex = sketchMenu.getComponentZOrder(importMenu); + importMenuIndex = Toolkit.getMenuItemIndex(sketchMenu, importMenu); + sketchMenu.remove(importMenu); + } + + + /** + * Re-insert the Import Library menu. Added function so that other modes + * need not have an 'import' menu. + * @since 3.0a6 + * @param sketchMenu the Sketch menu that's currently active + */ + public void insertImportMenu(JMenu sketchMenu) { + // hard-coded as 4 in 3.0a5, change to 5 for 3.0a6, but... yuck + //sketchMenu.insert(mode.getImportMenu(), 4); + // This is -1 on when the editor window is first shown, but that's fine + // because the import menu has just been added in the Editor constructor. + if (importMenuIndex != -1) { + sketchMenu.insert(getImportMenu(), importMenuIndex); + } + } + + public JMenu getImportMenu() { if (importMenu == null) { rebuildImportMenu(); diff --git a/app/src/processing/app/Toolkit.java b/app/src/processing/app/Toolkit.java index ed5597732..961c0bfb7 100644 --- a/app/src/processing/app/Toolkit.java +++ b/app/src/processing/app/Toolkit.java @@ -758,4 +758,28 @@ public class Toolkit { //return new TextLayout("H", font, frc).getBounds().getHeight(); return new TextLayout("H", g.getFont(), frc).getBounds().getHeight(); } + + + /** Do not use or rely upon presence of this method: not approved as final API. */ + static public void debugOpacity(Component comp) { + Component parent = comp.getParent(); + while (parent != null) { + //EditorConsole.systemOut.println("parent is " + parent + " " + parent.isOpaque()); + EditorConsole.systemOut.println(parent.getClass().getName() + " " + (parent.isOpaque() ? "OPAQUE" : "")); + parent = parent.getParent(); + } + EditorConsole.systemOut.println(); + } + + + static public int getMenuItemIndex(JMenu menu, JMenuItem item) { + int index = 0; + for (Component comp : menu.getMenuComponents()) { + if (comp == item) { + return index; + } + index++; + } + return -1; + } } diff --git a/core/todo.txt b/core/todo.txt index 907a1dbbd..e5e421b3a 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -17,6 +17,11 @@ X size(640,360 , P3D) doesn't work properly X https://github.com/processing/processing/issues/2924 X https://github.com/processing/processing/issues/2925 +contribs +X saveFrame() doesn't save opaque PNG files +X https://github.com/processing/processing/issues/3031 +X https://github.com/processing/processing/pull/3067 + data X Add exceptions for FloatList and IntList when using add() w/o enough elements X https://github.com/processing/processing/pull/3053 diff --git a/java/src/processing/mode/java/DebugTray.java b/java/src/processing/mode/java/DebugTray.java index ab0fa6a52..870fc13f5 100644 --- a/java/src/processing/mode/java/DebugTray.java +++ b/java/src/processing/mode/java/DebugTray.java @@ -176,6 +176,8 @@ public class DebugTray extends JFrame { box.add(Box.createHorizontalGlue()); box.setBorder(new EmptyBorder(GAP, GAP, GAP, GAP)); + // prevent the toolbar from getting taller than its default + box.setMaximumSize(new Dimension(getMaximumSize().width, getPreferredSize().height)); return box; } @@ -256,32 +258,49 @@ public class DebugTray extends JFrame { class EditorFollower implements ComponentListener { @Override - public void componentShown(ComponentEvent e) { - setVisible(true); + public void componentShown(ComponentEvent e) { + if (editor.isDebuggerEnabled()) { +// updateBounds(); + setVisible(true); + } } @Override - public void componentHidden(ComponentEvent e) { - setVisible(false); + public void componentHidden(ComponentEvent e) { + if (isVisible()) { + setVisible(false); + } } @Override public void componentResized(ComponentEvent e) { - updateBounds(e); + if (isVisible()) { + updateBounds(); + } } @Override public void componentMoved(ComponentEvent e) { - updateBounds(e); + if (isVisible()) { + updateBounds(); + } } - - private void updateBounds(ComponentEvent e) { - // System.out.println(e); - setBounds(editor.getX() + editor.getWidth(), - editor.getY() + VERTICAL_OFFSET, - getPreferredSize().width, - editor.getHeight() - VERTICAL_OFFSET*2); + } + + + private void updateBounds() { + setBounds(editor.getX() + editor.getWidth(), + editor.getY() + VERTICAL_OFFSET, + getPreferredSize().width, + editor.getHeight() - VERTICAL_OFFSET*2); + } + + + public void setVisible(boolean visible) { + if (visible) { + updateBounds(); } + super.setVisible(visible); } diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 77b09c80d..e93ca1536 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -60,7 +60,7 @@ public class JavaEditor extends Editor { protected final String breakpointMarkerComment = " //<>//"; // breakpoint marker comment protected JMenu debugMenu; - JCheckBoxMenuItem toggleDebugger; + JCheckBoxMenuItem enableDebug; protected Debugger debugger; protected DebugTray tray; @@ -191,10 +191,15 @@ public class JavaEditor extends Editor { JMenuItem runItem = Toolkit.newJMenuItem(JavaToolbar.getTitle(JavaToolbar.RUN, false), 'R'); runItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - handleRun(); + if (isDebuggerEnabled()) { + Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Debug' menu item"); + debugger.startDebug(); + } else { + handleRun(); + } } }); - + JMenuItem presentItem = Toolkit.newJMenuItemShift(JavaToolbar.getTitle(JavaToolbar.RUN, true), 'R'); presentItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -205,7 +210,12 @@ public class JavaEditor extends Editor { JMenuItem stopItem = new JMenuItem(JavaToolbar.getTitle(JavaToolbar.STOP, false)); stopItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - handleStop(); + if (isDebuggerEnabled()) { + Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Stop' menu item"); + debugger.stopDebug(); + } else { + handleStop(); + } } }); @@ -1155,26 +1165,6 @@ public class JavaEditor extends Editor { } - /** - * Deactivate the Run button. This is called by Runner to notify that the - * sketch has stopped running, usually in response to an error (or maybe - * the sketch completing and exiting?) Tools should not call this function. - * To initiate a "stop" action, call handleStop() instead. - */ - public void deactivateRun() { -// if (toolbar instanceof DebugToolbar){ -// toolbar.deactivate(DebugToolbar.RUN); -// } else { - toolbar.deactivate(JavaToolbar.RUN); -// } - } - - -// public void deactivateExport() { -// toolbar.deactivate(JavaToolbar.EXPORT); -// } - - public void internalCloseRunner() { // Added temporarily to dump error log. TODO: Remove this later [mk29] if (JavaMode.errorLogsEnabled) { @@ -1387,24 +1377,30 @@ public class JavaEditor extends Editor { debugMenu = new JMenu(Language.text("menu.debug")); JMenuItem item; - toggleDebugger = new JCheckBoxMenuItem("Use the Debugger"); + // "use the debugger" sounds too colloquial, and "enable" sounds too technical + enableDebug = Toolkit.newJCheckBoxMenuItem("Enable Debugger", KeyEvent.VK_D); //new JCheckBoxMenuItem(Language.text("menu.debug.show_debug_toolbar")); - toggleDebugger.setSelected(false); - toggleDebugger.addActionListener(new ActionListener() { + enableDebug.setSelected(false); + enableDebug.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - //switchToolbars(); + updateDebugToggle(); } }); - debugMenu.add(toggleDebugger); +// toggleDebugger.addChangeListener(new ChangeListener() { +// public void stateChanged(ChangeEvent e) { +// } +// }); + debugMenu.add(enableDebug); + debugMenu.addSeparator(); - item = Toolkit.newJMenuItemAlt(Language.text("menu.debug.debug"), KeyEvent.VK_R); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Debug' menu item"); - debugger.startDebug(); - } - }); - debugMenu.add(item); +// item = Toolkit.newJMenuItemAlt(Language.text("menu.debug.debug"), KeyEvent.VK_R); +// item.addActionListener(new ActionListener() { +// public void actionPerformed(ActionEvent e) { +// Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Debug' menu item"); +// debugger.startDebug(); +// } +// }); +// debugMenu.add(item); item = Toolkit.newJMenuItem(Language.text("menu.debug.continue"), KeyEvent.VK_U); item.addActionListener(new ActionListener() { @@ -1415,37 +1411,14 @@ public class JavaEditor extends Editor { }); debugMenu.add(item); - item = new JMenuItem(Language.text("menu.debug.stop")); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Stop' menu item"); - debugger.stopDebug(); - } - }); - debugMenu.add(item); - - debugMenu.addSeparator(); - - item = - Toolkit.newJMenuItem(Language.text("menu.debug.toggle_breakpoint"), KeyEvent.VK_B); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Toggle Breakpoint' menu item"); - debugger.toggleBreakpoint(); - } - }); - debugMenu.add(item); - - item = new JMenuItem(Language.text("menu.debug.list_breakpoints")); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'List Breakpoints' menu item"); - debugger.listBreakpoints(); - } - }); - debugMenu.add(item); - - debugMenu.addSeparator(); +// item = new JMenuItem(Language.text("menu.debug.stop")); +// item.addActionListener(new ActionListener() { +// public void actionPerformed(ActionEvent e) { +// Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Stop' menu item"); +// debugger.stopDebug(); +// } +// }); +// debugMenu.add(item); item = Toolkit.newJMenuItem(Language.text("menu.debug.step"), KeyEvent.VK_J); item.addActionListener(new ActionListener() { @@ -1476,6 +1449,27 @@ public class JavaEditor extends Editor { debugMenu.addSeparator(); + item = + Toolkit.newJMenuItem(Language.text("menu.debug.toggle_breakpoint"), KeyEvent.VK_B); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Toggle Breakpoint' menu item"); + debugger.toggleBreakpoint(); + } + }); + debugMenu.add(item); + + item = new JMenuItem(Language.text("menu.debug.list_breakpoints")); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'List Breakpoints' menu item"); + debugger.listBreakpoints(); + } + }); + debugMenu.add(item); + + debugMenu.addSeparator(); + item = new JMenuItem(Language.text("menu.debug.print_stack_trace")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -1523,14 +1517,14 @@ public class JavaEditor extends Editor { debugMenu.addSeparator(); - item = Toolkit.newJMenuItem(Language.text("menu.debug.toggle_variable_inspector"), KeyEvent.VK_I); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Toggle Variable Inspector' menu item"); - toggleVariableInspector(); - } - }); - debugMenu.add(item); +// item = Toolkit.newJMenuItem(Language.text("menu.debug.toggle_variable_inspector"), KeyEvent.VK_I); +// item.addActionListener(new ActionListener() { +// public void actionPerformed(ActionEvent e) { +// Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Toggle Variable Inspector' menu item"); +// toggleVariableInspector(); +// } +// }); +// debugMenu.add(item); item = Toolkit.newJMenuItem(Language.text("menu.debug.show_sketch_outline"), KeyEvent.VK_L); item.addActionListener(new ActionListener() { @@ -1552,6 +1546,11 @@ public class JavaEditor extends Editor { return debugMenu; } + + + protected boolean isDebuggerEnabled() { + return enableDebug.isSelected(); + } @Override @@ -1946,8 +1945,25 @@ public class JavaEditor extends Editor { protected void activateRun() { + enableDebug.setEnabled(false); toolbar.activate(JavaToolbar.RUN); } + + + /** + * Deactivate the Run button. This is called by Runner to notify that the + * sketch has stopped running, usually in response to an error (or maybe + * the sketch completing and exiting?) Tools should not call this function. + * To initiate a "stop" action, call handleStop() instead. + */ + public void deactivateRun() { +// if (toolbar instanceof DebugToolbar){ +// toolbar.deactivate(DebugToolbar.RUN); +// } else { + toolbar.deactivate(JavaToolbar.RUN); + enableDebug.setEnabled(true); +// } + } protected void activateDebug() { @@ -1981,32 +1997,49 @@ public class JavaEditor extends Editor { } - public void showVariableInspector() { - tray.setVisible(true); - } - - - /** - * Set visibility of the variable inspector window. - * @param visible true to set the variable inspector visible, - * false for invisible. - */ - public void showVariableInspector(boolean visible) { - tray.setVisible(visible); - } - - - public void hideVariableInspector() { - tray.setVisible(true); - } - - - /** Toggle visibility of the variable inspector window. */ - public void toggleVariableInspector() { - tray.setFocusableWindowState(false); // to not get focus when set visible - tray.setVisible(!tray.isVisible()); - tray.setFocusableWindowState(true); // allow to get focus again + public void updateDebugToggle() { + final boolean enabled = enableDebug.isSelected(); + if (enabled) { + tray.setFocusableWindowState(false); // to not get focus when set visible + tray.setVisible(true); + tray.setFocusableWindowState(true); // allow to get focus again + } else { + tray.setVisible(false); + } + for (Component item : debugMenu.getMenuComponents()) { + if (item instanceof JMenuItem && item != enableDebug) { + ((JMenuItem) item).setEnabled(enabled); + } + } } + + +// public void showVariableInspector() { +// tray.setVisible(true); +// } +// +// +// /** +// * Set visibility of the variable inspector window. +// * @param visible true to set the variable inspector visible, +// * false for invisible. +// */ +// public void showVariableInspector(boolean visible) { +// tray.setVisible(visible); +// } +// +// +// public void hideVariableInspector() { +// tray.setVisible(true); +// } +// +// +// /** Toggle visibility of the variable inspector window. */ +// public void toggleVariableInspector() { +// tray.setFocusableWindowState(false); // to not get focus when set visible +// tray.setVisible(!tray.isVisible()); +// tray.setFocusableWindowState(true); // allow to get focus again +// } /** diff --git a/todo.txt b/todo.txt index a2edf48b5..ae5c651d6 100644 --- a/todo.txt +++ b/todo.txt @@ -82,7 +82,9 @@ X https://github.com/processing/processing/issues/2984 X https://github.com/processing/processing/pull/3046 X File change detection rewrite X https://github.com/processing/processing/pull/3048 - +X broken Windows build due to launch4j .jar not updated +X https://github.com/processing/processing/issues/3062 +X https://github.com/processing/processing/pull/3066 integration of pdex X changed JLS4 to JLS8 (but make sure it doesn't introduce anything too weird) @@ -93,6 +95,9 @@ 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 +update ld and windres: https://github.com/processing/processing/tree/master/java/application/launch4j/bin +also xstream.jar https://github.com/processing/processing/tree/master/java/application/launch4j/lib + _ 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 @@ -101,6 +106,12 @@ X how does it relate to compilationCheckEnabled? X removed, seems to be duplicate/used the same way _ 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 +_ remove JavaMode.errorLogsEnabled and JavaEditor.writeErrorsToFile() + +_ disable the debug toggle menu while running +_ otherwise could run in one mode, then try to stop in another +_ show debug window when running, hide when stopped +_ can we animate its appearance? _ do the right thing on passing around List vs ArrayList and others @@ -111,6 +122,8 @@ _ iTunes has no rollover state but has a 'down' state _ swaps to stop after release _ need unavailable/deactivate state for debug toolbar items _ or hide the tray when not debugging? Debug just a menu checkbox? +_ using svg images for res-indep icons/gui +_ http://stackoverflow.com/questions/2495501/swing-batik-create-an-imageicon-from-an-svg-file jre download/install _ update build scripts for Windows and Linux to use JRE downloader Ant Task