From 88c81086c163ce63c8fe5dcd1fade040e63ecd3f Mon Sep 17 00:00:00 2001 From: "Michael michael.sytko" Date: Sat, 28 Jan 2017 10:49:23 +0100 Subject: [PATCH 1/5] added "clear output" button to serial monitor added "show timestamp" checkbox to serial monitor --- .../processing/app/AbstractTextMonitor.java | 48 ++++++++++++++++++- app/src/processing/app/SerialMonitor.java | 6 +++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/AbstractTextMonitor.java b/app/src/processing/app/AbstractTextMonitor.java index ab8f3080412..4d4410b6ef7 100644 --- a/app/src/processing/app/AbstractTextMonitor.java +++ b/app/src/processing/app/AbstractTextMonitor.java @@ -8,6 +8,8 @@ import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.text.SimpleDateFormat; +import java.util.Date; import javax.swing.Box; import javax.swing.BoxLayout; @@ -20,7 +22,9 @@ import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; +import javax.swing.text.BadLocationException; import javax.swing.text.DefaultCaret; +import javax.swing.text.Document; import cc.arduino.packages.BoardPort; @@ -32,12 +36,17 @@ public abstract class AbstractTextMonitor extends AbstractMonitor { protected JScrollPane scrollPane; protected JTextField textField; protected JButton sendButton; + protected JButton clearButton; protected JCheckBox autoscrollBox; + protected JCheckBox addTimeStampBox; protected JComboBox lineEndings; protected JComboBox serialRates; + private SimpleDateFormat logDateFormat; + public AbstractTextMonitor(BoardPort boardPort) { super(boardPort); + logDateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); } protected void onCreateWindow(Container mainPane) { @@ -67,6 +76,7 @@ protected void onCreateWindow(Container mainPane) { textField = new JTextField(40); sendButton = new JButton(tr("Send")); + clearButton = new JButton(tr("Clear output")); upperPane.add(textField); upperPane.add(Box.createRigidArea(new Dimension(4, 0))); @@ -79,6 +89,7 @@ protected void onCreateWindow(Container mainPane) { pane.setBorder(new EmptyBorder(4, 4, 4, 4)); autoscrollBox = new JCheckBox(tr("Autoscroll"), true); + addTimeStampBox = new JCheckBox(tr("Show timestamp"), false); noLineEndingAlert = new JLabel(I18n.format(tr("You've pressed {0} but nothing was sent. Should you select a line ending?"), tr("Send"))); noLineEndingAlert.setToolTipText(noLineEndingAlert.getText()); @@ -97,6 +108,15 @@ public void actionPerformed(ActionEvent event) { if (PreferencesData.get("serial.line_ending") != null) { lineEndings.setSelectedIndex(PreferencesData.getInteger("serial.line_ending")); } + if (PreferencesData.get("serial.show_timestamp") != null) { + addTimeStampBox.setSelected(PreferencesData.getBoolean("serial.show_timestamp")); + } + addTimeStampBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + PreferencesData.setBoolean("serial.show_timestamp", addTimeStampBox.isSelected()); + } + }); + lineEndings.setMaximumSize(lineEndings.getMinimumSize()); serialRates = new JComboBox(); @@ -107,6 +127,8 @@ public void actionPerformed(ActionEvent event) { serialRates.setMaximumSize(serialRates.getMinimumSize()); pane.add(autoscrollBox); + pane.add(addTimeStampBox); + pane.add(clearButton); pane.add(Box.createHorizontalGlue()); pane.add(noLineEndingAlert); pane.add(Box.createRigidArea(new Dimension(8, 0))); @@ -120,10 +142,12 @@ public void actionPerformed(ActionEvent event) { protected void onEnableWindow(boolean enable) { textArea.setEnabled(enable); + clearButton.setEnabled(enable); scrollPane.setEnabled(enable); textField.setEnabled(enable); sendButton.setEnabled(enable); autoscrollBox.setEnabled(enable); + addTimeStampBox.setEnabled(enable); lineEndings.setEnabled(enable); serialRates.setEnabled(enable); } @@ -132,6 +156,10 @@ public void onSendCommand(ActionListener listener) { textField.addActionListener(listener); sendButton.addActionListener(listener); } + + public void onClearCommand(ActionListener listener) { + clearButton.addActionListener(listener); + } public void onSerialRateChange(ActionListener listener) { serialRates.addActionListener(listener); @@ -140,7 +168,25 @@ public void onSerialRateChange(ActionListener listener) { public void message(final String s) { SwingUtilities.invokeLater(new Runnable() { public void run() { - textArea.append(s); + + if (addTimeStampBox.isSelected()) { + String[] lines = s.split("(?<=\\n)"); + Document doc = textArea.getDocument(); + for (String currentLine : lines) { + try { + if (doc.getLength() == 0 || ((int)doc.getText(doc.getLength() - 1, 1).charAt(0) == 10)) { + textArea.append(logDateFormat.format(new Date()) + " -> " + currentLine); + } else { + textArea.append(currentLine); + } + } catch (BadLocationException e) { + e.printStackTrace(); + } + } + } else { + textArea.append(s); + } + if (autoscrollBox.isSelected()) { textArea.setCaretPosition(textArea.getDocument().getLength()); } diff --git a/app/src/processing/app/SerialMonitor.java b/app/src/processing/app/SerialMonitor.java index bcf39ce9077..e55b1a09ca2 100644 --- a/app/src/processing/app/SerialMonitor.java +++ b/app/src/processing/app/SerialMonitor.java @@ -62,6 +62,12 @@ public void actionPerformed(ActionEvent e) { textField.setText(""); } }); + + onClearCommand(new ActionListener() { + public void actionPerformed(ActionEvent e) { + textArea.setText(""); + } + }); } private void send(String s) { From 88fb8e78a7d1be60cbef7b97f820a577fd194b1b Mon Sep 17 00:00:00 2001 From: "Michael michael.sytko" Date: Sat, 28 Jan 2017 12:05:20 +0100 Subject: [PATCH 2/5] configurable shortcut for comment / uncomment --- app/src/processing/app/Editor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index c7e60c35f2f..a0d43abf3e8 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -1344,8 +1344,8 @@ public void actionPerformed(ActionEvent e) { menu.add(gotoLine); menu.addSeparator(); - - JMenuItem commentItem = newJMenuItem(tr("Comment/Uncomment"), '/'); + + JMenuItem commentItem = newJMenuItem(tr("Comment/Uncomment"), PreferencesData.get("editor.keys.shortcut_comment", "/").charAt(0)); commentItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getCurrentTab().handleCommentUncomment(); From 0ced0f49c0d81ad912f7454a6e1b0597c26c6336 Mon Sep 17 00:00:00 2001 From: "Michael michael.sytko" Date: Sat, 28 Jan 2017 12:35:57 +0100 Subject: [PATCH 3/5] added setting to show always file extensions --- arduino-core/src/processing/app/SketchFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino-core/src/processing/app/SketchFile.java b/arduino-core/src/processing/app/SketchFile.java index 9d2a594bee1..0a6f4cc4d09 100644 --- a/arduino-core/src/processing/app/SketchFile.java +++ b/arduino-core/src/processing/app/SketchFile.java @@ -206,7 +206,7 @@ public String getFileName() { * others. */ public String getPrettyName() { - if (isExtension(Sketch.SKETCH_EXTENSIONS)) + if (!PreferencesData.getBoolean("editor.show_always_extensions") && isExtension(Sketch.SKETCH_EXTENSIONS)) return getBaseName(); else return getFileName(); From 619b0762d7c5be20bd42eed681628771e57bd939 Mon Sep 17 00:00:00 2001 From: "Michael michael.sytko" Date: Mon, 30 Jan 2017 22:36:33 +0100 Subject: [PATCH 4/5] added custom title format setting (editor.custom_title_format) --- app/src/processing/app/Editor.java | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index a0d43abf3e8..5c0dc56eed8 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -36,6 +36,7 @@ import processing.app.helpers.Keys; import processing.app.helpers.OSUtils; import processing.app.helpers.PreferencesMapException; +import processing.app.helpers.StringReplacer; import processing.app.legacy.PApplet; import processing.app.syntax.PdeKeywords; import processing.app.tools.MenuScroller; @@ -1992,12 +1993,27 @@ private void updateTitle() { return; } SketchFile current = getCurrentTab().getSketchFile(); - if (current.isPrimary()) { - setTitle(I18n.format(tr("{0} | Arduino {1}"), sketch.getName(), - BaseNoGui.VERSION_NAME_LONG)); + + String customFormat = PreferencesData.get("editor.custom_title_format"); + if (customFormat != null && !customFormat.trim().isEmpty()) { + + Map titleMap = new HashMap(); + titleMap.put("file", current.getFileName()); + String path = sketch.getFolder().getAbsolutePath(); + titleMap.put("folder", path); + titleMap.put("path", path); + titleMap.put("project", sketch.getName()); + titleMap.put("version", BaseNoGui.VERSION_NAME_LONG); + + setTitle(StringReplacer.replaceFromMapping(customFormat, titleMap)); } else { - setTitle(I18n.format(tr("{0} - {1} | Arduino {2}"), sketch.getName(), - current.getFileName(), BaseNoGui.VERSION_NAME_LONG)); + if (current.isPrimary()) { + setTitle(I18n.format(tr("{0} | Arduino {1}"), sketch.getName(), + BaseNoGui.VERSION_NAME_LONG)); + } else { + setTitle(I18n.format(tr("{0} - {1} | Arduino {2}"), sketch.getName(), + current.getFileName(), BaseNoGui.VERSION_NAME_LONG)); + } } } From 93655da8472357dc67ad35b372b5f678fe51b1d3 Mon Sep 17 00:00:00 2001 From: "Michael michael.sytko" Date: Wed, 1 Feb 2017 21:15:44 +0100 Subject: [PATCH 5/5] CHANGED: use cache for editor tools (don't create new instance for each menu item) ADDED: setting for autoformat before saving (editor.autoformat_currentfile_before_saving") CHANGED: move "clear ouput" button from left to right side (Serial Monitor) --- .../processing/app/AbstractTextMonitor.java | 3 ++- app/src/processing/app/Editor.java | 25 +++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/src/processing/app/AbstractTextMonitor.java b/app/src/processing/app/AbstractTextMonitor.java index 4d4410b6ef7..1b7a803017a 100644 --- a/app/src/processing/app/AbstractTextMonitor.java +++ b/app/src/processing/app/AbstractTextMonitor.java @@ -128,13 +128,14 @@ public void actionPerformed(ActionEvent e) { pane.add(autoscrollBox); pane.add(addTimeStampBox); - pane.add(clearButton); pane.add(Box.createHorizontalGlue()); pane.add(noLineEndingAlert); pane.add(Box.createRigidArea(new Dimension(8, 0))); pane.add(lineEndings); pane.add(Box.createRigidArea(new Dimension(8, 0))); pane.add(serialRates); + pane.add(Box.createRigidArea(new Dimension(8, 0))); + pane.add(clearButton); mainPane.add(pane, BorderLayout.SOUTH); } diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 5c0dc56eed8..1c0be548fa0 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -198,6 +198,8 @@ public boolean test(SketchController sketch) { Runnable exportHandler; private Runnable exportAppHandler; private Runnable timeoutUploadHandler; + + private Map internalToolCache = new HashMap(); public Editor(Base ibase, File file, int[] storedLocation, int[] defaultLocation, Platform platform) throws Exception { super("Arduino"); @@ -963,8 +965,7 @@ public void updateKeywords(PdeKeywords keywords) { JMenuItem createToolMenuItem(String className) { try { - Class toolClass = Class.forName(className); - final Tool tool = (Tool) toolClass.newInstance(); + final Tool tool = getOrCreateToolInstance(className); JMenuItem item = new JMenuItem(tool.getMenuTitle()); @@ -983,6 +984,20 @@ public void actionPerformed(ActionEvent e) { } } + private Tool getOrCreateToolInstance(String className) { + Tool internalTool = internalToolCache.get(className); + if (internalTool == null) { + try { + Class toolClass = Class.forName(className); + internalTool = (Tool) toolClass.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + internalToolCache.put(className, internalTool); + } + return internalTool; + } private void addInternalTools(JMenu menu) { JMenuItem item; @@ -2055,6 +2070,12 @@ private boolean handleSave2() { statusNotice(tr("Saving...")); boolean saved = false; try { + + if (PreferencesData.getBoolean("editor.autoformat_currentfile_before_saving")) { + Tool formatTool = getOrCreateToolInstance("cc.arduino.packages.formatter.AStyle"); + formatTool.run(); + } + boolean wasReadOnly = sketchController.isReadOnly(BaseNoGui.librariesIndexer.getInstalledLibraries(), BaseNoGui.getExamplesPath()); String previousMainFilePath = sketch.getMainFilePath(); saved = sketchController.save();