X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fconsole%2FAbstractCommandConsole.java;h=8039d4662a0d67c6c55a4e93b9fabb55ed8585fb;hp=388c87806ee7a5e8b1cd6b2d47794f51db2cb1c1;hb=afa02bc122a8a9954fd357aa284ec3eae8ba27c6;hpb=70f4424a186f1df8e7cb195e41504b9312828e92 diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/AbstractCommandConsole.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/AbstractCommandConsole.java index 388c87806..8039d4662 100644 --- a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/AbstractCommandConsole.java +++ b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/console/AbstractCommandConsole.java @@ -400,24 +400,50 @@ public abstract class AbstractCommandConsole extends Composite { AbstractCommandConsole.this.layout(true); } + private StringBuilder outputBuffer = new StringBuilder(); + private ArrayList styleRanges = new ArrayList(); + private volatile boolean outputScheduled = false; + public void appendOutput(final String text, final Color foreground, final Color background) { - final Display display = Display.getDefault(); - if(display.isDisposed()) return; - display.asyncExec(new Runnable() { - @Override - public void run() { - if(output.isDisposed()) return; - int pos = output.getCharCount(); - outputModiLock = true; - output.replaceTextRange(pos, 0, text); - outputModiLock = false; - output.setStyleRange(new StyleRange(pos, text.length(), - foreground, background)); - output.setCaretOffset(output.getCharCount()); - output.showSelection(); - } + synchronized (outputBuffer) { + styleRanges.add(new StyleRange(outputBuffer.length(), text.length(), foreground, background)); + outputBuffer.append(text); + } + if(!outputScheduled) { + outputScheduled = true; + final Display display = Display.getDefault(); + if(display.isDisposed()) return; + display.asyncExec(new Runnable() { + @Override + public void run() { + if(output.isDisposed()) return; + String outputText; + StyleRange[] styleRangeArray; + synchronized(outputBuffer) { + outputScheduled = false; + + outputText = outputBuffer.toString(); + outputBuffer = new StringBuilder(); + + styleRangeArray = styleRanges.toArray(new StyleRange[styleRanges.size()]); + styleRanges.clear(); + } + int pos = output.getCharCount(); - }); + outputModiLock = true; + output.replaceTextRange(pos, 0, outputText); + outputModiLock = false; + + for(StyleRange styleRange : styleRangeArray) { + styleRange.start += pos; + output.setStyleRange(styleRange); + } + + output.setCaretOffset(output.getCharCount()); + output.showSelection(); + } + }); + } } private void execute() {