From 938df21778126c189ab166514a15ebd08cf39571 Mon Sep 17 00:00:00 2001 From: tomneutens Date: Tue, 13 Dec 2016 11:51:27 +0100 Subject: [PATCH] Added a CompilerProgressListenerList to the EditorStatus class so you can add a listener for compiler progress from an external tool. To enable this the build method in the compiler class had to be changed --- app/src/processing/app/Editor.java | 5 +++++ app/src/processing/app/EditorStatus.java | 14 ++++++++++++++ app/src/processing/app/SketchController.java | 9 +++++---- arduino-core/src/cc/arduino/Compiler.java | 8 +++++++- .../cc/arduino/ProgressAwareMessageConsumer.java | 11 +++++++---- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 287d9fe4e..acc2345de 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -29,6 +29,7 @@ import cc.arduino.packages.uploaders.SerialUploader; import cc.arduino.view.GoToLineNumber; import cc.arduino.view.StubMenuListener; import cc.arduino.view.findreplace.FindReplace; +import cc.arduino.CompilerProgressListener; import com.jcraft.jsch.JSchException; import jssc.SerialPortException; import processing.app.debug.RunnerException; @@ -65,6 +66,7 @@ import java.util.List; import java.util.function.Predicate; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import java.util.ArrayList; import static processing.app.I18n.tr; import static processing.app.Theme.scale; @@ -2691,5 +2693,8 @@ public class Editor extends JFrame implements RunnerListener { lineStatus.repaint(); } + public void addCompilerProgressListener(CompilerProgressListener listener){ + this.status.addCompilerProgressListener(listener); + } } diff --git a/app/src/processing/app/EditorStatus.java b/app/src/processing/app/EditorStatus.java index 9c723e5e8..cda17fdc5 100644 --- a/app/src/processing/app/EditorStatus.java +++ b/app/src/processing/app/EditorStatus.java @@ -24,6 +24,7 @@ package processing.app; import processing.app.helpers.OSUtils; +import cc.arduino.CompilerProgressListener; import javax.swing.*; import java.awt.*; @@ -31,6 +32,7 @@ import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.util.ArrayList; import static processing.app.I18n.tr; import static processing.app.Theme.scale; @@ -88,12 +90,16 @@ public class EditorStatus extends JPanel { private JTextField editField; private JProgressBar progressBar; private JButton copyErrorButton; + + private ArrayList compilerProgressListeners; public EditorStatus(Editor editor) { this.editor = editor; this.message = NO_MESSAGE; this.mode = NOTICE; this.font = Theme.getFont("status.font"); + this.compilerProgressListeners = new ArrayList(); + this.compilerProgressListeners.add(this::progressUpdate); initialize(); } @@ -409,5 +415,13 @@ public class EditorStatus extends JPanel { public boolean isErr() { return mode == ERR; } + + public void addCompilerProgressListener(CompilerProgressListener listener){ + compilerProgressListeners.add(listener); + } + + public ArrayList getCompilerProgressListeners(){ + return compilerProgressListeners; + } } diff --git a/app/src/processing/app/SketchController.java b/app/src/processing/app/SketchController.java index 3448ad1a8..ae45e56b0 100644 --- a/app/src/processing/app/SketchController.java +++ b/app/src/processing/app/SketchController.java @@ -627,11 +627,12 @@ public class SketchController { */ public String build(boolean verbose, boolean save) throws RunnerException, PreferencesMapException, IOException { // run the preprocessor - editor.status.progressUpdate(20); + for (CompilerProgressListener progressListener : editor.status.getCompilerProgressListeners()){ + progressListener.progress(20); + } ensureExistence(); - - CompilerProgressListener progressListener = editor.status::progressUpdate; + boolean deleteTemp = false; File pathToSketch = sketch.getPrimaryFile().getFile(); @@ -643,7 +644,7 @@ public class SketchController { } try { - return new Compiler(pathToSketch, sketch).build(progressListener, save); + return new Compiler(pathToSketch, sketch).build(editor.status.getCompilerProgressListeners(), save); } finally { // Make sure we clean up any temporary sketch copy if (deleteTemp) diff --git a/arduino-core/src/cc/arduino/Compiler.java b/arduino-core/src/cc/arduino/Compiler.java index 224db27c2..e04f1a729 100644 --- a/arduino-core/src/cc/arduino/Compiler.java +++ b/arduino-core/src/cc/arduino/Compiler.java @@ -152,6 +152,12 @@ public class Compiler implements MessageConsumer { } public String build(CompilerProgressListener progListener, boolean exportHex) throws RunnerException, PreferencesMapException, IOException { + ArrayList listeners = new ArrayList(); + listeners.add(progListener); + return this.build(listeners, exportHex); + } + + public String build(ArrayList progListeners, boolean exportHex) throws RunnerException, PreferencesMapException, IOException { this.buildPath = sketch.getBuildPath().getAbsolutePath(); TargetBoard board = BaseNoGui.getTargetBoard(); @@ -165,7 +171,7 @@ public class Compiler implements MessageConsumer { PreferencesMap prefs = loadPreferences(board, platform, aPackage, vidpid); - MessageConsumerOutputStream out = new MessageConsumerOutputStream(new ProgressAwareMessageConsumer(new I18NAwareMessageConsumer(System.out, System.err), progListener), "\n"); + MessageConsumerOutputStream out = new MessageConsumerOutputStream(new ProgressAwareMessageConsumer(new I18NAwareMessageConsumer(System.out, System.err), progListeners), "\n"); MessageConsumerOutputStream err = new MessageConsumerOutputStream(new I18NAwareMessageConsumer(System.err, Compiler.this), "\n"); callArduinoBuilder(board, platform, aPackage, vidpid, BuilderAction.COMPILE, out, err); diff --git a/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java b/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java index 22768b04b..6432e0447 100644 --- a/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java +++ b/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java @@ -33,16 +33,17 @@ import cc.arduino.i18n.ExternalProcessOutputParser; import processing.app.debug.MessageConsumer; import java.util.Map; +import java.util.ArrayList; public class ProgressAwareMessageConsumer implements MessageConsumer { private final MessageConsumer parent; - private final CompilerProgressListener progressListener; + private ArrayList progressListeners; private final ExternalProcessOutputParser parser; - public ProgressAwareMessageConsumer(MessageConsumer parent, CompilerProgressListener progressListener) { + public ProgressAwareMessageConsumer(MessageConsumer parent, ArrayList progressListeners) { this.parent = parent; - this.progressListener = progressListener; + this.progressListeners = progressListeners; this.parser = new ExternalProcessOutputParser(); } @@ -51,7 +52,9 @@ public class ProgressAwareMessageConsumer implements MessageConsumer { if (s.startsWith("===info ||| Progress") || s.startsWith("===Progress")) { Map parsedMessage = parser.parse(s); Object[] args = (Object[]) parsedMessage.get("args"); - progressListener.progress(Double.valueOf(args[0].toString()).intValue()); + for (CompilerProgressListener progressListener : progressListeners){ + progressListener.progress(Double.valueOf(args[0].toString()).intValue()); + } return; }