}
private static final int HYPERLINK_LAYER = HighlighterLayer.SELECTION - 123;
- private final Alarm mySpareTimeAlarm = new Alarm();
+ private final Alarm mySpareTimeAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, this);
private final CopyOnWriteArraySet<ChangeListener> myListeners = new CopyOnWriteArraySet<ChangeListener>();
private final Set<ConsoleViewContentType> myDeferredTypes = new HashSet<ConsoleViewContentType>();
private String myHelpId;
- private final Alarm myFlushAlarm = new Alarm();
-
+ private final Alarm myFlushUserInputAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, this);
+ private final Alarm myFlushAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, this);
private final Runnable myFlushDeferredRunnable = new Runnable() {
public void run() {
flushDeferredText();
private final ArrayList<ConsoleInputListener> myConsoleInputListeners = new ArrayList<ConsoleInputListener>();
- private final Alarm myFoldingAlarm;
+ private final Alarm myFoldingAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, this);
private final List<FoldRegion> myPendingFoldRegions = new ArrayList<FoldRegion>();
public void addConsoleUserInputLestener(ConsoleInputListener consoleInputListener) {
}
Disposer.register(project, this);
- myFoldingAlarm = new Alarm(this);
}
public void attachToProcess(final ProcessHandler processHandler){
}
private void flushDeferredUserInput() {
- if (myState.isRunning()){
- final String text = myDeferredUserInput.substring(0, myDeferredUserInput.length());
- final int index = Math.max(text.lastIndexOf('\n'), text.lastIndexOf('\r'));
- if (index < 0) return;
- try{
- myState.sendUserInput(text.substring(0, index + 1));
- }
- catch(IOException e){
- return;
+ final String text = myDeferredUserInput.substring(0, myDeferredUserInput.length());
+ final int index = Math.max(text.lastIndexOf('\n'), text.lastIndexOf('\r'));
+ if (index < 0) return;
+ final String textToSend = text.substring(0, index + 1);
+ myDeferredUserInput.setLength(0);
+ myDeferredUserInput.append(text.substring(index + 1));
+ myFlushUserInputAlarm.addRequest(new Runnable() {
+ public void run() {
+ if (myState.isRunning()) {
+ try {
+ // this may block forever, see IDEA-54340
+ myState.sendUserInput(textToSend);
+ }
+ catch (IOException e) {
+ return;
+ }
+ }
}
- myDeferredUserInput.setLength(0);
- myDeferredUserInput.append(text.substring(index + 1));
- }
+ }, 0);
}
public Object getData(final String dataId) {
}
document.insertString(startOffset, s);
- editor.getCaretModel().moveToOffset(startOffset + s.length());
+ // Math.max is needed when cyclic buffer is used
+ editor.getCaretModel().moveToOffset(Math.min(startOffset + s.length(), document.getTextLength()));
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
}