X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=inline;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fconsole%2FAbstractCommandConsole.java;h=8039d4662a0d67c6c55a4e93b9fabb55ed8585fb;hb=e36d0cb0313ea18c76479e8dbfaf8499fa52db98;hp=b4260b47b4a07ea01fc2ee2d94a363ce3f22bdea;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git 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 b4260b47b..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 @@ -227,7 +227,7 @@ public abstract class AbstractCommandConsole extends Composite { public void modifyText(ModifyEvent e) { adjustInputSize(input.getText()); commandHistoryPos = commandHistory.size(); - asyncValidate(); + //asyncValidate(); } }); Listener hoverListener = new Listener() { @@ -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() { @@ -426,10 +452,12 @@ public abstract class AbstractCommandConsole extends Composite { return; // Add command to command history - commandHistory.add(command); - if(commandHistory.size() > COMMAND_HISTORY_SIZE*2) - commandHistory = new ArrayList( - commandHistory.subList(COMMAND_HISTORY_SIZE, COMMAND_HISTORY_SIZE*2)); + if(commandHistory.isEmpty() || !commandHistory.get(commandHistory.size()-1).equals(command)) { + commandHistory.add(command); + if(commandHistory.size() > COMMAND_HISTORY_SIZE*2) + commandHistory = new ArrayList( + commandHistory.subList(COMMAND_HISTORY_SIZE, COMMAND_HISTORY_SIZE*2)); + } commandHistoryPos = commandHistory.size(); // Print it into output area