diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index c7e60c35f2f..c7cf4f50ce4 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -29,6 +29,7 @@ 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; @@ -66,6 +67,7 @@ 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; @@ -2748,5 +2750,8 @@ protected void onBoardOrPortChange() { 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 9c723e5e8f4..cda17fdc534 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.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 Dimension getMaximumSize() { 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 086d4dae928..289e3b3354b 100644 --- a/app/src/processing/app/SketchController.java +++ b/app/src/processing/app/SketchController.java @@ -624,11 +624,12 @@ public void importLibrary(UserLibrary lib) throws IOException { */ 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(); @@ -640,7 +641,7 @@ public String build(boolean verbose, boolean save) throws RunnerException, Prefe } 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 f2af0f739c5..c6cd64a819d 100644 --- a/arduino-core/src/cc/arduino/Compiler.java +++ b/arduino-core/src/cc/arduino/Compiler.java @@ -127,6 +127,12 @@ public Compiler(File pathToSketch, Sketch sketch) { } 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(); @@ -140,7 +146,7 @@ public String build(CompilerProgressListener progListener, boolean exportHex) th 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 22768b04b1c..6432e044774 100644 --- a/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java +++ b/arduino-core/src/cc/arduino/ProgressAwareMessageConsumer.java @@ -33,16 +33,17 @@ 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 void message(String s) { 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; }