From d0b6eb3ece11cc0ea46bce6d84be2c5161bc621d Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 29 Sep 2015 17:05:31 -0400 Subject: [PATCH] implement the editor gradient, excising sketch outline, other visual tweaks --- build/shared/lib/theme.txt | 4 +- java/src/processing/mode/java/JavaEditor.java | 1 - .../processing/mode/java/MarkerColumn.java | 10 +-- .../mode/java/pdex/ASTGenerator.java | 2 + .../mode/java/pdex/JavaTextArea.java | 26 ++++--- .../mode/java/pdex/JavaTextAreaPainter.java | 26 +++---- .../mode/java/pdex/SketchOutline.java | 70 +++++++++---------- todo.txt | 16 ++--- 8 files changed, 82 insertions(+), 73 deletions(-) diff --git a/build/shared/lib/theme.txt b/build/shared/lib/theme.txt index 0cc8f3243..8db97b7b7 100644 --- a/build/shared/lib/theme.txt +++ b/build/shared/lib/theme.txt @@ -42,8 +42,8 @@ console.error.color = #d9211e buttons.bgcolor = #000000 # for the debug and mode buttons -reversed.gradient.top = #10212f -reversed.gradient.bottom = #122637 +#reversed.gradient.top = #10212f +#reversed.gradient.bottom = #122637 ## size of divider between editing area and the console #divider.size = 0 diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 1d15991ca..d02a61fc0 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -2324,7 +2324,6 @@ public class JavaEditor extends Editor { */ @Override public void setCode(SketchCode code) { - //System.out.println("tab switch: " + code.getFileName()); // set the new document in the textarea, etc. need to do this first super.setCode(code); diff --git a/java/src/processing/mode/java/MarkerColumn.java b/java/src/processing/mode/java/MarkerColumn.java index 875388b2c..e96acfa74 100644 --- a/java/src/processing/mode/java/MarkerColumn.java +++ b/java/src/processing/mode/java/MarkerColumn.java @@ -60,7 +60,8 @@ public class MarkerColumn extends JPanel { private Color errorColor; private Color warningColor; - private Color backgroundColor; +// private Color backgroundColor; +// private Image gutterGradient; // Stores error markers displayed PER TAB along the error bar. private List errorPoints = @@ -73,7 +74,8 @@ public class MarkerColumn extends JPanel { Mode mode = editor.getMode(); errorColor = mode.getColor("editor.column.error.color"); warningColor = mode.getColor("editor.column.warning.color"); - backgroundColor = mode.getColor("editor.gutter.bgcolor"); +// backgroundColor = mode.getColor("editor.gutter.bgcolor"); +// gutterGradient = mode.makeGradient("editor", Editor.RIGHT_GUTTER, height); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { @@ -96,8 +98,8 @@ public class MarkerColumn extends JPanel { } public void paintComponent(Graphics g) { - g.setColor(backgroundColor); - g.fillRect(0, 0, getWidth(), getHeight()); + g.drawImage(editor.getJavaTextArea().getGutterGradient(), + 0, 0, getWidth(), getHeight(), this); for (LineMarker m : errorPoints) { if (m.getType() == LineMarker.ERROR) { diff --git a/java/src/processing/mode/java/pdex/ASTGenerator.java b/java/src/processing/mode/java/pdex/ASTGenerator.java index f20c51edc..4269b013c 100644 --- a/java/src/processing/mode/java/pdex/ASTGenerator.java +++ b/java/src/processing/mode/java/pdex/ASTGenerator.java @@ -2403,6 +2403,7 @@ public class ASTGenerator { } + /* protected SketchOutline sketchOutline; public void showSketchOutline() { @@ -2411,6 +2412,7 @@ public class ASTGenerator { sketchOutline = new SketchOutline(codeTree, errorCheckerService); sketchOutline.show(); } + */ public void showTabOutline() { diff --git a/java/src/processing/mode/java/pdex/JavaTextArea.java b/java/src/processing/mode/java/pdex/JavaTextArea.java index dfe5c8377..f542a8a85 100644 --- a/java/src/processing/mode/java/pdex/JavaTextArea.java +++ b/java/src/processing/mode/java/pdex/JavaTextArea.java @@ -68,7 +68,8 @@ public class JavaTextArea extends JEditTextArea { // [px] space added to the left and right of gutter chars protected int gutterPadding; // = 3; - protected Color gutterBgColor; // = new Color(252, 252, 252); // gutter background color + protected Image gutterGradient; +// protected Color gutterBgColor; // = new Color(252, 252, 252); // gutter background color protected Color gutterLineColor; // = new Color(233, 233, 233); // color of vertical separation line /// the text marker for highlighting breakpoints in the gutter @@ -126,12 +127,10 @@ public class JavaTextArea extends JEditTextArea { // load settings from theme.txt Mode mode = editor.getMode(); - gutterBgColor = mode.getColor("editor.gutter.bgcolor"); //, gutterBgColor); - gutterLineColor = mode.getColor("editor.gutter.linecolor"); //, gutterLineColor); + gutterGradient = mode.makeGradient("editor", Editor.LEFT_GUTTER, 500); + //gutterBgColor = mode.getColor("editor.gutter.bgcolor"); + gutterLineColor = mode.getColor("editor.gutter.linecolor"); gutterPadding = mode.getInteger("editor.gutter.padding"); -// breakpointMarker = mode.getString("editor.gutter.breakpoint.marker"); //, breakpointMarker); -// breakpointMarker = "\u2666"; -// currentLineMarker = mode.getString("editor.gutter.currentline.marker"); //, currentLineMarker); // TweakMode code prevCompListeners = painter.getComponentListeners(); @@ -459,12 +458,12 @@ public class JavaTextArea extends JEditTextArea { if (suggestionRequested) return null; - // don't show completions when the outline is visible - boolean showSuggestions = astGenerator.sketchOutline == null || - !astGenerator.sketchOutline.isVisible(); +// // don't show completions when the outline is visible +// boolean showSuggestions = +// astGenerator.sketchOutline == null || !astGenerator.sketchOutline.isVisible(); - if (showSuggestions && phrase != null && - candidates != null && !candidates.isEmpty()) { +// if (showSuggestions && phrase != null && + if (phrase != null && candidates != null && !candidates.isEmpty()) { Collections.sort(candidates); defListModel = ASTGenerator.filterPredictions(candidates); Messages.log("Got: " + candidates.size() + " candidates, " + defListModel.size() + " filtered"); @@ -669,6 +668,11 @@ public class JavaTextArea extends JEditTextArea { } + public Image getGutterGradient() { + return gutterGradient; + } + + /** * Set the gutter text of a specific line. * diff --git a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java index af994350e..f51e79193 100644 --- a/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java +++ b/java/src/processing/mode/java/pdex/JavaTextAreaPainter.java @@ -102,9 +102,9 @@ public class JavaTextAreaPainter extends TextAreaPainter long thisTime = event.getWhen(); if (thisTime - lastTime > 100) { if (event.getX() < Editor.LEFT_GUTTER) { - int offset = getTextArea().xyToOffset(event.getX(), event.getY()); + int offset = getJavaTextArea().xyToOffset(event.getX(), event.getY()); if (offset >= 0) { - int lineIndex = getTextArea().getLineOfOffset(offset); + int lineIndex = getJavaTextArea().getLineOfOffset(offset); javaEditor.toggleBreakpoint(lineIndex); } } @@ -135,8 +135,8 @@ public class JavaTextAreaPainter extends TextAreaPainter int startOffset = Math.max(errorStart, lineStart) - lineStart; int stopOffset = Math.min(errorEnd, lineEnd) - lineStart; - if (x >= getTextArea().offsetToX(line, startOffset) && - x <= getTextArea().offsetToX(line, stopOffset)) { + if (x >= getJavaTextArea().offsetToX(line, startOffset) && + x <= getJavaTextArea().offsetToX(line, stopOffset)) { setToolTipText(problem.getMessage()); evt.consume(); } @@ -256,18 +256,20 @@ public class JavaTextAreaPainter extends TextAreaPainter * @param x horizontal position */ protected void paintLeftGutter(Graphics gfx, int line, int x) { -// gfx.setColor(Color.ORANGE); int y = textArea.lineToY(line) + fm.getLeading() + fm.getMaxDescent(); if (line == textArea.getSelectionStopLine()) { gfx.setColor(gutterLineHighlightColor); + gfx.fillRect(0, y, Editor.LEFT_GUTTER, fm.getHeight()); } else { - gfx.setColor(getTextArea().gutterBgColor); + //gfx.setColor(getJavaTextArea().gutterBgColor); + gfx.setClip(0, y, Editor.LEFT_GUTTER, fm.getHeight()); + gfx.drawImage(getJavaTextArea().getGutterGradient(), 0, 0, getWidth(), getHeight(), this); + gfx.setClip(null); // reset } - gfx.fillRect(0, y, Editor.LEFT_GUTTER, fm.getHeight()); String text = null; if (getJavaEditor().isDebuggerEnabled()) { - text = getTextArea().getGutterText(line); + text = getJavaTextArea().getGutterText(line); } gfx.setColor(gutterTextColor); @@ -342,19 +344,19 @@ public class JavaTextAreaPainter extends TextAreaPainter * @param line * 0-based line number * @param x - */ - protected void paintLineBgColor(Graphics gfx, int line, int x) { + private void paintLineBgColor(Graphics gfx, int line, int x) { int y = textArea.lineToY(line); y += fm.getLeading() + fm.getMaxDescent(); int height = fm.getHeight(); - Color col = getTextArea().getLineBgColor(line); + Color col = getJavaTextArea().getLineBgColor(line); if (col != null) { // paint line background gfx.setColor(col); gfx.fillRect(0, y, getWidth(), height); } } + */ /** @@ -888,7 +890,7 @@ public class JavaTextAreaPainter extends TextAreaPainter } - private JavaTextArea getTextArea() { + private JavaTextArea getJavaTextArea() { return (JavaTextArea) textArea; } } diff --git a/java/src/processing/mode/java/pdex/SketchOutline.java b/java/src/processing/mode/java/pdex/SketchOutline.java index d5432101c..77de4e5d1 100644 --- a/java/src/processing/mode/java/pdex/SketchOutline.java +++ b/java/src/processing/mode/java/pdex/SketchOutline.java @@ -72,7 +72,7 @@ public class SketchOutline { ImageIcon classIcon, fieldIcon, methodIcon; - + public SketchOutline(DefaultMutableTreeNode codeTree, ErrorCheckerService ecs) { errorCheckerService = ecs; editor = ecs.getEditor(); @@ -81,7 +81,7 @@ public class SketchOutline { soNode = (DefaultMutableTreeNode) soNode.getChildAt(0); tempNode = soNode; soTree = new JTree(soNode); - + Mode mode = editor.getMode(); classIcon = mode.loadIcon("theme/icon_class_obj.png"); methodIcon = mode.loadIcon("theme/icon_methpub_obj.png"); @@ -89,15 +89,15 @@ public class SketchOutline { createGUI(); } - - + + private void createGUI(){ frmOutlineView = new JFrame(); frmOutlineView.setAlwaysOnTop(true); frmOutlineView.setUndecorated(true); Point tp = errorCheckerService.getEditor().getTextArea().getLocationOnScreen(); - int minWidth = (int) (editor.getMinimumSize().width * 0.7f); + int minWidth = (int) (editor.getMinimumSize().width * 0.7f); int maxWidth = (int) (editor.getMinimumSize().width * 0.9f); frmOutlineView.setLayout(new BoxLayout(frmOutlineView.getContentPane(), BoxLayout.Y_AXIS)); @@ -109,7 +109,7 @@ public class SketchOutline { panelTop.add(searchField); jsp = new JScrollPane(); - + soTree.getSelectionModel() .setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); soTree.setRootVisible(false); @@ -118,13 +118,13 @@ public class SketchOutline { soTree.expandRow(i); } soTree.setSelectionRow(0); - + jsp.setViewportView(soTree); jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); jsp.setMinimumSize(new Dimension(minWidth, editor.getTextArea().getHeight() - 10)); - jsp.setMaximumSize(new Dimension(maxWidth, editor.getTextArea().getHeight() - 10)); - + jsp.setMaximumSize(new Dimension(maxWidth, editor.getTextArea().getHeight() - 10)); + panelBottom.add(jsp); frmOutlineView.add(panelTop); frmOutlineView.add(panelBottom); @@ -132,13 +132,13 @@ public class SketchOutline { frmOutlineView.pack(); frmOutlineView.setBounds(tp.x + errorCheckerService.getEditor().getTextArea().getWidth() - minWidth, tp.y, minWidth, Math.min(editor.getTextArea().getHeight(), frmOutlineView.getHeight())); - frmOutlineView.setMinimumSize(new Dimension(minWidth, Math.min(errorCheckerService.getEditor().getTextArea().getHeight(), frmOutlineView.getHeight()))); + frmOutlineView.setMinimumSize(new Dimension(minWidth, Math.min(errorCheckerService.getEditor().getTextArea().getHeight(), frmOutlineView.getHeight()))); frmOutlineView.setLocation(tp.x + errorCheckerService.getEditor().getTextArea().getWidth()/2 - frmOutlineView.getWidth()/2, frmOutlineView.getY() + (editor.getTextArea().getHeight() - frmOutlineView.getHeight()) / 2); addListeners(); } - + protected void addListeners() { searchField.addKeyListener(new KeyAdapter() { @@ -147,10 +147,10 @@ public class SketchOutline { return; internalSelection = true; - + if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) { close(); - + } else if (evt.getKeyCode() == KeyEvent.VK_ENTER) { if (soTree.getLastSelectedPathComponent() != null) { DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) soTree @@ -162,13 +162,13 @@ public class SketchOutline { close(); } } - + } else if (evt.getKeyCode() == KeyEvent.VK_UP) { if (soTree.getLastSelectedPathComponent() == null) { soTree.setSelectionRow(0); return; } - + int x = soTree.getLeadSelectionRow() - 1; int step = jsp.getVerticalScrollBar().getMaximum() / soTree.getRowCount(); @@ -180,7 +180,7 @@ public class SketchOutline { .getValue() - step)); } soTree.setSelectionRow(x); - + } else if (evt.getKeyCode() == KeyEvent.VK_DOWN) { if (soTree.getLastSelectedPathComponent() == null) { soTree.setSelectionRow(0); @@ -201,7 +201,7 @@ public class SketchOutline { } } }); - + searchField.getDocument().addDocumentListener(new DocumentListener() { public void insertUpdate(DocumentEvent e) { @@ -215,7 +215,7 @@ public class SketchOutline { public void changedUpdate(DocumentEvent e) { updateSelection(); } - + private void updateSelection(){ SwingWorker worker = new SwingWorker() { protected Object doInBackground() throws Exception { @@ -225,7 +225,7 @@ public class SketchOutline { return null; } - protected void done() { + protected void done() { soTree.setModel(new DefaultTreeModel(tempNode)); ((DefaultTreeModel) soTree.getModel()).reload(); for (int i = 0; i < soTree.getRowCount(); i++) { @@ -260,15 +260,15 @@ public class SketchOutline { scrollToNode(); } }); - + soTree.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { scrollToNode(); } }); } - - + + private void scrollToNode() { SwingWorker worker = new SwingWorker() { @@ -294,7 +294,7 @@ public class SketchOutline { worker.execute(); } - + protected boolean filterTree(String prefix, DefaultMutableTreeNode tree, DefaultMutableTreeNode mainTree) { if (mainTree.isLeaf()) { @@ -315,7 +315,7 @@ public class SketchOutline { } return found; } - + @SuppressWarnings("unchecked") protected void generateSketchOutlineTree(DefaultMutableTreeNode node, @@ -342,7 +342,7 @@ public class SketchOutline { FieldDeclaration fd = (FieldDeclaration) awnode.getNode(); for (VariableDeclarationFragment vdf : (List) fd.fragments()) { final String text = new CompletionCandidate(vdf).toString(); - DefaultMutableTreeNode newNode = + DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(new ASTNodeWrapper(vdf.getName(), text)); node.add(newNode); } @@ -358,27 +358,27 @@ public class SketchOutline { } } - + public void show() { frmOutlineView.setVisible(true); } - - + + public void close(){ frmOutlineView.setVisible(false); frmOutlineView.dispose(); } - - + + public boolean isVisible(){ return frmOutlineView.isVisible(); } - - + + protected class CustomCellRenderer extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, - boolean sel, boolean expanded, + boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, sel, expanded, @@ -391,9 +391,9 @@ public class SketchOutline { public Icon getTreeIcon(Object o) { if (((DefaultMutableTreeNode) o).getUserObject() instanceof ASTNodeWrapper) { - ASTNodeWrapper awrap = (ASTNodeWrapper) + ASTNodeWrapper awrap = (ASTNodeWrapper) ((DefaultMutableTreeNode) o).getUserObject(); - + int type = awrap.getNode().getParent().getNodeType(); if (type == ASTNode.METHOD_DECLARATION) { return methodIcon; diff --git a/todo.txt b/todo.txt index 04d842da8..df2c05392 100644 --- a/todo.txt +++ b/todo.txt @@ -13,6 +13,9 @@ X https://github.com/processing/processing/issues/3882 X https://github.com/processing/processing/pull/3884 X Hide useless error in error checker X https://github.com/processing/processing/pull/3887 +X clean up statusMessage() inside JavaEditor +o do we want to bring back the delays? +X implement side gradient on the editor gui X distinguish errors and warnings @@ -25,6 +28,8 @@ X list with contrib types separated is really wonky o do we keep the list? o does it even work for different contrib types? X cleaned this up in the last release +X remove the dated releases from download.processing.org +X new Android release (EditorButton constructor changed) known issues @@ -37,16 +42,8 @@ _ http://www.excelsiorjet.com/kb/35/howto-create-a-single-exe-from-your-java-a _ mouse events (i.e. toggle breakpoint) seem to be firing twice -beta 7 -_ remove the dated releases from download.processing.org -_ new Android release (EditorButton constructor changed) - - 3.0 final _ https://github.com/processing/processing/milestones/3.0%20final -X clean up statusMessage() inside JavaEditor -o do we want to bring back the delays? -_ gradient on editor is not working _ JavaEditor has several null colors, remove color support _ once the design is complete and we for sure do not need color _ grab bag of CM work from Jakub @@ -56,6 +53,9 @@ _ error list tab _ when moving away from an error/warning line, de-select it below _ selecting a warning should also show the warning in the status area _ clicking an error or warning should give the focus back to the editor +_ if fewer lines in sketch than can be shown in window, show ticks adjacent +_ MarkerColumn.recalculateMarkerPositions() + gui / James _ Fix placement and visual design when showing error on hover