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

This commit is contained in:
tomneutens 2016-12-13 11:51:27 +01:00 committed by Cristian Maglie
parent 9f0eaafed4
commit 938df21778
5 changed files with 38 additions and 9 deletions

View File

@ -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);
}
}

View File

@ -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<CompilerProgressListener> 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<CompilerProgressListener>();
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<CompilerProgressListener> getCompilerProgressListeners(){
return compilerProgressListeners;
}
}

View File

@ -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)

View File

@ -152,6 +152,12 @@ public class Compiler implements MessageConsumer {
}
public String build(CompilerProgressListener progListener, boolean exportHex) throws RunnerException, PreferencesMapException, IOException {
ArrayList<CompilerProgressListener> listeners = new ArrayList<CompilerProgressListener>();
listeners.add(progListener);
return this.build(listeners, exportHex);
}
public String build(ArrayList<CompilerProgressListener> 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);

View File

@ -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<CompilerProgressListener> progressListeners;
private final ExternalProcessOutputParser parser;
public ProgressAwareMessageConsumer(MessageConsumer parent, CompilerProgressListener progressListener) {
public ProgressAwareMessageConsumer(MessageConsumer parent, ArrayList<CompilerProgressListener> 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<String, Object> 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;
}