diff --git a/app/src/processing/app/EditorButton.java b/app/src/processing/app/EditorButton.java index 841053b20..435e729eb 100644 --- a/app/src/processing/app/EditorButton.java +++ b/app/src/processing/app/EditorButton.java @@ -26,13 +26,13 @@ import java.awt.event.*; import javax.swing.*; -abstract public class EditorButton extends JComponent +abstract public class EditorButton extends JComponent implements MouseListener, MouseMotionListener, ActionListener { static public final int DIM = 35; - /** Button's description. */ + /** Button's description. */ protected String title; - /** Description of alternate behavior when shift is down. */ + /** Description of alternate behavior when shift is down. */ protected String titleShift; protected boolean pressed; @@ -40,36 +40,36 @@ implements MouseListener, MouseMotionListener, ActionListener { protected boolean rollover; protected JLabel rolloverLabel; protected boolean shift; - + protected Image enabledImage; protected Image disabledImage; protected Image selectedImage; protected Image rolloverImage; protected Image pressedImage; - + protected Image gradient; - + protected Mode mode; - - + + public EditorButton(Mode mode, String name, String title) { this(mode, name, title, title); } - + public EditorButton(Mode mode, String name, String title, String titleShift) { this.mode = mode; this.title = title; this.titleShift = titleShift; - + final int res = Toolkit.highResDisplay() ? 2 : 1; disabledImage = mode.loadImage(name + "-disabled-" + res + "x.png"); enabledImage = mode.loadImage(name + "-enabled-" + res + "x.png"); selectedImage = mode.loadImage(name + "-selected-" + res + "x.png"); pressedImage = mode.loadImage(name + "-pressed-" + res + "x.png"); rolloverImage = mode.loadImage(name + "-rollover-" + res + "x.png"); - - if (disabledImage == null) { + + if (disabledImage == null) { disabledImage = enabledImage; } if (selectedImage == null) { @@ -84,8 +84,8 @@ implements MouseListener, MouseMotionListener, ActionListener { addMouseListener(this); addMouseMotionListener(this); } - - + + @Override public void paintComponent(Graphics g) { Image image = enabledImage; @@ -103,8 +103,8 @@ implements MouseListener, MouseMotionListener, ActionListener { } g.drawImage(image, 0, 0, DIM, DIM, this); } - - + + // public String toString() { // switch (this) { // case DISABLED: return "disabled"; @@ -112,30 +112,30 @@ implements MouseListener, MouseMotionListener, ActionListener { // case SELECTED: return "selected"; // case ROLLOVER: return "rollover"; // case PRESSED: return "pressed"; -// +// //// for (State bs : State.values()) { //// Image image = mode.loadImage(bs.getFilename(name)); //// if (image != null) { //// imageMap.put(bs, image); //// } //// } -//// +//// //// enabled = true; //// //updateState(); //// setState(State.ENABLED); -// } - - +// } + + public void setReverse() { gradient = mode.getGradient("reversed", DIM, DIM); } - - + + // public void setGradient(Image gradient) { // this.gradient = gradient; // } - - + + public void setRolloverLabel(JLabel label) { rolloverLabel = label; } @@ -145,12 +145,12 @@ implements MouseListener, MouseMotionListener, ActionListener { public void mouseClicked(MouseEvent e) { if (isEnabled()) { shift = e.isShiftDown(); - actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, + actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null, e.getModifiers())); } } - - + + public boolean isShiftDown() { return shift; } @@ -166,8 +166,8 @@ implements MouseListener, MouseMotionListener, ActionListener { public void mouseReleased(MouseEvent e) { setPressed(false); } - - + + public void setPressed(boolean pressed) { if (isEnabled()) { this.pressed = pressed; @@ -176,6 +176,11 @@ implements MouseListener, MouseMotionListener, ActionListener { } + public void setSelected(boolean selected) { + this.selected = selected; + } + + @Override public void mouseEntered(MouseEvent e) { rollover = true; @@ -205,41 +210,41 @@ implements MouseListener, MouseMotionListener, ActionListener { abstract public void actionPerformed(ActionEvent e); - + // @Override -// public void actionPerformed(ActionEvent e) { +// public void actionPerformed(ActionEvent e) { // // To be overridden by all subclasses // } - - + + @Override public Dimension getPreferredSize() { return new Dimension(DIM, DIM); } - - + + @Override public Dimension getMinimumSize() { return getPreferredSize(); } - - + + @Override public Dimension getMaximumSize() { return getPreferredSize(); } - - + + // public Image getImage() { // return imageMap.get(state); // } // -// +// //// protected void updateState() { //// state = ButtonState.ENABLED; //// } -// -// +// +// // public void setEnabled(boolean enabled) { // this.enabled = enabled; // if (enabled) { @@ -252,8 +257,8 @@ implements MouseListener, MouseMotionListener, ActionListener { // } // } // } -// -// +// +// // public void setState(State state) { // this.state = state; // } @@ -261,16 +266,16 @@ implements MouseListener, MouseMotionListener, ActionListener { // public enum State { // DISABLED, ENABLED, SELECTED, ROLLOVER, PRESSED; -// -// /** -// * @param name the root name +// +// /** +// * @param name the root name // * @return // */ // public String getFilename(String name) { // final int res = Toolkit.highResDisplay() ? 2 : 1; -// return name + "-" + toString() + "-" + res + "x.png"; +// return name + "-" + toString() + "-" + res + "x.png"; // } -// +// // public String toString() { // switch (this) { // case DISABLED: return "disabled"; diff --git a/app/src/processing/app/EditorToolbar.java b/app/src/processing/app/EditorToolbar.java index 4fabda44c..1ce5e9f38 100644 --- a/app/src/processing/app/EditorToolbar.java +++ b/app/src/processing/app/EditorToolbar.java @@ -36,14 +36,14 @@ import javax.swing.JPopupMenu; * Run/Stop button plus Mode selection */ abstract public class EditorToolbar extends JPanel { - // haven't decided how to handle this/how to make public/consistency + // haven't decided how to handle this/how to make public/consistency // for components/does it live in theme.txt static final int HIGH = 53; // horizontal gap between buttons static final int GAP = 9; // gap from the run button to the sketch label static final int LABEL_GAP = GAP; - + protected Editor editor; protected Base base; protected Mode mode; @@ -51,113 +51,113 @@ abstract public class EditorToolbar extends JPanel { protected EditorButton runButton; protected EditorButton stopButton; // protected EditorButton currentButton; - + protected Box box; protected JLabel label; - + // int GRADIENT_TOP = 192; // int GRADIENT_BOTTOM = 246; protected Image gradient; // protected Image reverseGradient; - - + + public EditorToolbar(Editor editor) { this.editor = editor; base = editor.getBase(); mode = editor.getMode(); - + //setOpaque(false); //gradient = createGradient(); //System.out.println(gradient); - + gradient = mode.getGradient("toolbar", 400, HIGH); // reverseGradient = mode.getGradient("reversed", 100, EditorButton.DIM); - - runButton = new EditorButton(mode, + + runButton = new EditorButton(mode, "/lib/toolbar/run", - Language.text("toolbar.run"), + Language.text("toolbar.run"), Language.text("toolbar.present")) { - + @Override public void actionPerformed(ActionEvent e) { handleRun(e.getModifiers()); } }; - + stopButton = new EditorButton(mode, "/lib/toolbar/stop", - Language.text("toolbar.stop")) { - + Language.text("toolbar.stop")) { + @Override public void actionPerformed(ActionEvent e) { handleStop(); } }; - + box = Box.createHorizontalBox(); box.add(Box.createHorizontalStrut(Editor.LEFT_GUTTER)); - + box.add(runButton); box.add(Box.createHorizontalStrut(GAP)); box.add(stopButton); - + box.add(Box.createHorizontalStrut(LABEL_GAP)); label = new JLabel(); label.setFont(mode.getFont("toolbar.rollover.font")); label.setForeground(mode.getColor("toolbar.rollover.color")); box.add(label); // currentButton = runButton; - + runButton.setRolloverLabel(label); stopButton.setRolloverLabel(label); - + box.add(Box.createHorizontalGlue()); addModeButtons(box); // Component items = createModeButtons(); // if (items != null) { // box.add(items); // } - ModeSelector ms = new ModeSelector(); + ModeSelector ms = new ModeSelector(); box.add(ms); box.add(Box.createHorizontalStrut(Editor.RIGHT_GUTTER)); - + setLayout(new BorderLayout()); add(box, BorderLayout.CENTER); } - - + + // public void setReverse(EditorButton button) { // button.setGradient(reverseGradient); // } - - + + // public void setText(String text) { // label.setText(text); // } - - + + public void paintComponent(Graphics g) { // label.setText(editor.getSketch().getName()); // super.paintComponent(g); Dimension size = getSize(); g.drawImage(gradient, 0, 0, size.width, size.height, this); } - - + + public void addModeButtons(Box box) { } - - + + public void addGap(Box box) { box.add(Box.createHorizontalStrut(GAP)); } - - + + // public Component createModeSelector() { // return new ModeSelector(); // } - - + + // protected void swapButton(EditorButton replacement) { // if (currentButton != replacement) { // box.remove(currentButton); @@ -167,61 +167,63 @@ abstract public class EditorToolbar extends JPanel { // currentButton = replacement; // } // } - - - public void activateRun() { -// //runButton.setPressed(true); -//// Rectangle bounds = runButton.getBounds(); -//// remove(runButton); -// swapButton(stopButton); + + + public void activateRun() { + runButton.setSelected(true); + repaint(); } - - - public void deactivateRun() { - + + + public void deactivateRun() { + runButton.setSelected(false); + repaint(); } - - - public void activateStop() { + + + public void activateStop() { + stopButton.setSelected(true); + repaint(); } - - + + public void deactivateStop() { -// swapButton(runButton); + stopButton.setSelected(false); + repaint(); } - - + + abstract public void handleRun(int modifiers); - - + + abstract public void handleStop(); - + public Dimension getPreferredSize() { return new Dimension(super.getPreferredSize().width, HIGH); } - - + + public Dimension getMinimumSize() { return new Dimension(super.getMinimumSize().width, HIGH); } - - + + public Dimension getMaximumSize() { return new Dimension(super.getMaximumSize().width, HIGH); } - - + + class ModeSelector extends JPanel { Image offscreen; int width, height; - - String title; + + String title; Font titleFont; Color titleColor; int titleAscent; int titleWidth; - + final int MODE_GAP_WIDTH = 13; final int ARROW_GAP_WIDTH = 6; final int ARROW_WIDTH = 6; @@ -230,31 +232,31 @@ abstract public class EditorToolbar extends JPanel { int[] triangleX = new int[3]; int[] triangleY = new int[] { ARROW_TOP, ARROW_TOP, ARROW_BOTTOM }; - + // Image background; Color backgroundColor; - + @SuppressWarnings("deprecation") public ModeSelector() { title = mode.getTitle(); //.toUpperCase(); titleFont = mode.getFont("mode.title.font"); titleColor = mode.getColor("mode.title.color"); - + // getGraphics() is null and no offscreen yet titleWidth = getToolkit().getFontMetrics(titleFont).stringWidth(title); - + addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { JPopupMenu popup = editor.getModeMenu().getPopupMenu(); popup.show(ModeSelector.this, event.getX(), event.getY()); } }); - + //background = mode.getGradient("reversed", 100, EditorButton.DIM); backgroundColor = mode.getColor("mode.background.color"); } - + @Override public void paintComponent(Graphics screen) { // Toolkit.debugOpacity(this); @@ -270,52 +272,52 @@ abstract public class EditorToolbar extends JPanel { width = size.width; height = size.height; } - + Graphics g = offscreen.getGraphics(); /*Graphics2D g2 =*/ Toolkit.prepareGraphics(g); //Toolkit.clearGraphics(g, width, height); // g.clearRect(0, 0, width, height); // g.setColor(Color.GREEN); // g.fillRect(0, 0, width, height); - + g.setFont(titleFont); if (titleAscent == 0) { titleAscent = (int) Toolkit.getAscent(g); //metrics.getAscent(); } FontMetrics metrics = g.getFontMetrics(); titleWidth = metrics.stringWidth(title); - + //g.drawImage(background, 0, 0, width, height, this); g.setColor(backgroundColor); g.fillRect(0, 0, width, height); - + g.setColor(titleColor); g.drawString(title.toUpperCase(), MODE_GAP_WIDTH, (height + titleAscent) / 2); - + int x = MODE_GAP_WIDTH + titleWidth + ARROW_GAP_WIDTH; triangleX[0] = x; triangleX[1] = x + ARROW_WIDTH; triangleX[2] = x + ARROW_WIDTH/2; g.fillPolygon(triangleX, triangleY, 3); - + // screen.clearRect(0, 0, width, height); screen.drawImage(offscreen, 0, 0, width, height, this); // screen.setColor(Color.RED); // screen.drawRect(0, 0, width-1, height-1); } - + @Override public Dimension getPreferredSize() { - return new Dimension(MODE_GAP_WIDTH + titleWidth + - ARROW_GAP_WIDTH + ARROW_WIDTH + MODE_GAP_WIDTH, + return new Dimension(MODE_GAP_WIDTH + titleWidth + + ARROW_GAP_WIDTH + ARROW_WIDTH + MODE_GAP_WIDTH, EditorButton.DIM); } - + @Override public Dimension getMinimumSize() { return getPreferredSize(); } - + @Override public Dimension getMaximumSize() { return getPreferredSize(); diff --git a/java/src/processing/mode/java/Debugger.java b/java/src/processing/mode/java/Debugger.java index 7e6858232..9e90bf868 100644 --- a/java/src/processing/mode/java/Debugger.java +++ b/java/src/processing/mode/java/Debugger.java @@ -103,7 +103,7 @@ public class Debugger implements VMEventListener { public VirtualMachine vm() { if (runtime != null) { return runtime.vm(); - } + } return null; } @@ -121,7 +121,7 @@ public class Debugger implements VMEventListener { public ReferenceType getMainClass() { if (isStarted()) { return mainClass; - } + } return null; } @@ -191,7 +191,7 @@ public class Debugger implements VMEventListener { editor.prepareRun(); // after prepareRun, since this removes highlights - editor.activateDebug(); + editor.activateDebug(); try { Sketch sketch = editor.getSketch(); @@ -250,11 +250,11 @@ public class Debugger implements VMEventListener { } stopTrackingLineChanges(); started = false; - + editor.deactivateDebug(); editor.deactivateContinue(); editor.deactivateStep(); - + editor.statusEmpty(); } @@ -336,7 +336,7 @@ public class Debugger implements VMEventListener { /** - * Print fields of current {@code this}-object. + * Print fields of current {@code this}-object. * Outputs type, name and value of each field. */ public synchronized void printThis() { @@ -387,7 +387,7 @@ public class Debugger implements VMEventListener { log(Level.INFO, "set breakpoint on line {0}", line); } - + /** * Remove a breakpoint from the current line (if set). */ @@ -915,7 +915,7 @@ public class Debugger implements VMEventListener { return ""; } return t.frame(0).thisObject().referenceType().name(); - + } catch (IncompatibleThreadStateException ex) { log(Level.SEVERE, null, ex); return ""; @@ -1379,13 +1379,13 @@ public class Debugger implements VMEventListener { runtimeLineChanges.clear(); runtimeTabsTracked.clear(); } - + static private void log(Level level, String msg) { Logger.getLogger(Debugger.class.getName()).log(level, msg); } - + static private void log(Level level, String msg, Object obj) { Logger.getLogger(Debugger.class.getName()).log(level, msg, obj); } diff --git a/java/src/processing/mode/java/ErrorBar.java b/java/src/processing/mode/java/ErrorBar.java index 30321b144..9e18ebdb2 100644 --- a/java/src/processing/mode/java/ErrorBar.java +++ b/java/src/processing/mode/java/ErrorBar.java @@ -49,9 +49,9 @@ import processing.mode.java.pdex.Problem; * scrolls to the tab and location. Error messages displayed on hover. Markers * are not in sync with the error line. Similar to eclipse's right error bar * which displays the overall errors in a document - * + * * @author Manindra Moharana <me@mkmoharana.com> - * + * */ public class ErrorBar extends JPanel { /** @@ -121,32 +121,33 @@ public class ErrorBar extends JPanel { } } - + public Dimension getPreferredSize() { return new Dimension(preferredWidth, preferredHeight); } - + public Dimension getMinimumSize() { return getPreferredSize(); } - + public ErrorBar(JavaEditor editor, int height, JavaMode mode) { this.editor = editor; this.preferredHeight = height; this.errorCheckerService = editor.errorCheckerService; - + errorColor = mode.getColor("errorbar.errorcolor"); //, errorColor); warningColor = mode.getColor("errorbar.warningcolor"); //, warningColor); - backgroundColor = mode.getColor("errorbar.backgroundcolor"); //, backgroundColor); - + //backgroundColor = mode.getColor("errorbar.backgroundcolor"); //, backgroundColor); + backgroundColor = mode.getColor("gutter.bgcolor"); + addListeners(); } /** * Update error markers in the error bar. - * + * * @param problems * - List of problems. */ @@ -154,7 +155,7 @@ public class ErrorBar extends JPanel { // NOTE TO SELF: ErrorMarkers are calculated for the present tab only // Error Marker index in the arraylist is LOCALIZED for current tab. // Also, need to do the update in the UI thread via SwingWorker to prevent - // concurrency issues. + // concurrency issues. final int fheight = this.getHeight(); SwingWorker worker = new SwingWorker() { @@ -175,7 +176,7 @@ public class ErrorBar extends JPanel { errorPointsOld.add(marker); } errorPoints.clear(); - + // Each problem.getSourceLine() will have an extra line added // because of // class declaration in the beginning as well as default imports @@ -215,7 +216,7 @@ public class ErrorBar extends JPanel { /** * Check if new errors have popped up in the sketch since the last check - * + * * @return true - if errors have changed */ public boolean errorPointsChanged() { @@ -283,7 +284,7 @@ public class ErrorBar extends JPanel { protected Object doInBackground() throws Exception { for (ErrorMarker eMarker : errorPoints) { - if (evt.getY() >= eMarker.getY() - 2 && + if (evt.getY() >= eMarker.getY() - 2 && evt.getY() <= eMarker.getY() + 2 + errorMarkerHeight) { Problem p = eMarker.getProblem(); String msg = (p.isError() ? "Error: " : "Warning: ") + p.getMessage(); diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 4967857a5..102a2f31c 100755 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -195,12 +195,7 @@ public class JavaEditor extends Editor { JMenuItem runItem = Toolkit.newJMenuItem(Language.text("toolbar.run"), 'R'); runItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if (isDebuggerEnabled()) { - Logger.getLogger(JavaEditor.class.getName()).log(Level.INFO, "Invoked 'Debug' menu item"); - debugger.startDebug(); - } else { - handleRun(); - } + handleRun(); } }); @@ -1017,19 +1012,24 @@ public class JavaEditor extends Editor { public void handleRun() { - new Thread(new Runnable() { - public void run() { - prepareRun(); - try { -// toolbar.activate(JavaToolbar.RUN); - toolbar.activateRun(); - runtime = jmode.handleRun(sketch, JavaEditor.this); -// System.out.println("runtime now " + runtime); - } catch (Exception e) { - statusError(e); + if (isDebuggerEnabled()) { + // Don't start the sketch paused, continue until a breakpoint or error + // https://github.com/processing/processing/issues/3096 + debugger.continueDebug(); + + } else { + new Thread(new Runnable() { + public void run() { + prepareRun(); + try { + toolbar.activateRun(); + runtime = jmode.handleRun(sketch, JavaEditor.this); + } catch (Exception e) { + statusError(e); + } } - } - }).start(); + }).start(); + } } diff --git a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java index 6879c858a..6ba4a28fb 100644 --- a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java +++ b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java @@ -69,10 +69,10 @@ public class JavaTextAreaPainter extends TextAreaPainter public Color warningColor; // = new Color(0xFFC30E); public Color errorMarkerColor; // = new Color(0xED2630); public Color warningMarkerColor; // = new Color(0xFFC30E); - + protected Font gutterTextFont; protected Color gutterTextColor; - protected Color gutterTempColor; +// protected Color gutterTempColor; // static int ctrlMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); @@ -225,7 +225,7 @@ public class JavaTextAreaPainter extends TextAreaPainter gfx.setFont(gutterTextFont); FontMetrics gm = getFontMetrics(); //int tx = Editor.GUTTER_MARGIN + ; - int tx = Editor.LEFT_GUTTER - Editor.GUTTER_MARGIN - + int tx = Editor.LEFT_GUTTER - Editor.GUTTER_MARGIN - gm.charsWidth(txt, 0, txt.length); // Color textColor = getTextArea().getGutterTextColor(line); // if (textColor == null) { @@ -236,10 +236,10 @@ public class JavaTextAreaPainter extends TextAreaPainter gfx.setColor(gutterTextColor); int ty = textArea.lineToY(line) + fm.getHeight(); Utilities.drawTabbedText(new Segment(txt, 0, text.length()), - tx, ty, gfx, this, 0); + tx, ty, gfx, this, 0); } - - + + // /** // * Paint the gutter background (solid color). // * @@ -490,8 +490,8 @@ public class JavaTextAreaPainter extends TextAreaPainter warningColor = mode.getColor("editor.warningcolor"); //, warningColor); errorMarkerColor = mode.getColor("editor.errormarkercolor"); //, errorMarkerColor); warningMarkerColor = mode.getColor("editor.warningmarkercolor"); //, warningMarkerColor); - - gutterTextFont = mode.getFont("editor.gutter.text.font"); + + gutterTextFont = mode.getFont("editor.gutter.text.font"); gutterTextColor = mode.getColor("editor.gutter.text.color"); } diff --git a/java/theme/theme.txt b/java/theme/theme.txt index 18eec5aa0..b56886e15 100644 --- a/java/theme/theme.txt +++ b/java/theme/theme.txt @@ -29,8 +29,9 @@ editor.errormarkercolor = #ed2630 editor.warningmarkercolor = #ffc30e # ERROR BAR - error bar on the right that shows the markers -errorbar.errorcolor = #ed2630 +# formerly #ed2630, tickmark on right-hand side in comp is #c20102 +errorbar.errorcolor = #c20102 errorbar.warningcolor = #ffc30e -errorbar.backgroundcolor = #2c343d +# using gutter.bcolor in 3.0a6 +#errorbar.backgroundcolor = #2c343d -# color of error tickmark on right-hand side in comp: #c20102 diff --git a/todo.txt b/todo.txt index cdacf4398..692a1d298 100644 --- a/todo.txt +++ b/todo.txt @@ -25,8 +25,6 @@ X https://github.com/processing/processing/issues/3128 _ run button w/ debugger shouldn't require "continue" before actually starting _ https://github.com/processing/processing/issues/3096 -_ large window places the debugger window offscreen -_ https://github.com/processing/processing/issues/3091 _ how are we going to handle fonts for other languages? _ two new fonts have been added, other languages will need more @@ -203,6 +201,8 @@ _ remove deprecated methods gui _ finish the gui _ https://github.com/processing/processing/issues/3072 +_ large window places the debugger window offscreen +_ https://github.com/processing/processing/issues/3091 _ need 'actively pressed' version of 'play' and 'stop' _ could do rollover as well, but do other apps use them? _ iTunes has no rollover state but has a 'down' state