external system: add folding of greeting/farewell output lines of task console

This commit is contained in:
Vladislav.Soroka
2016-09-21 12:30:57 +03:00
committed by Vladislav.Soroka
parent 26ebf83ee5
commit 9dd021c5cc
@@ -5,7 +5,9 @@ import com.intellij.execution.*;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.configurations.LocatableConfigurationBase;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.console.DuplexConsoleView;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.impl.ConsoleViewImpl;
import com.intellij.execution.process.AnsiEscapeDecoder;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessOutputTypes;
@@ -14,6 +16,9 @@ import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.ui.ExecutionConsole;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.FoldRegion;
import com.intellij.openapi.editor.FoldingModel;
import com.intellij.openapi.externalSystem.execution.ExternalSystemExecutionConsoleManager;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings;
@@ -28,9 +33,11 @@ import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.options.SettingsEditorGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ExceptionUtil;
import com.intellij.util.containers.ContainerUtilRt;
import com.intellij.util.net.NetUtils;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.text.DateFormatUtil;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
@@ -195,6 +202,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase {
ExternalSystemBundle.message("run.text.starting.single.task", startDateTime, mySettings.toString());
}
processHandler.notifyTextAvailable(greeting, ProcessOutputTypes.SYSTEM);
foldGreetingOrFarewell(consoleView, greeting, true);
task.execute(new ExternalSystemTaskNotificationListenerAdapter() {
private boolean myResetGreeting = true;
@@ -230,6 +238,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase {
ExternalSystemBundle.message("run.text.ended.single.task", endDateTime, mySettings.toString());
}
processHandler.notifyTextAvailable(farewell, ProcessOutputTypes.SYSTEM);
foldGreetingOrFarewell(consoleView, farewell, false);
processHandler.notifyProcessTerminated(0);
}
});
@@ -238,6 +247,49 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase {
result.setRestartActions(consoleManager.getRestartActions(consoleView));
return result;
}
private static void foldGreetingOrFarewell(ExecutionConsole consoleView, String text, boolean isGreeting) {
int limit = 100;
if (text.length() < limit) {
return;
}
final ConsoleViewImpl consoleViewImpl;
if (consoleView instanceof ConsoleViewImpl) {
consoleViewImpl = (ConsoleViewImpl)consoleView;
}
else if (consoleView instanceof DuplexConsoleView) {
DuplexConsoleView duplexConsoleView = (DuplexConsoleView)consoleView;
if (duplexConsoleView.getPrimaryConsoleView() instanceof ConsoleViewImpl) {
consoleViewImpl = (ConsoleViewImpl)duplexConsoleView.getPrimaryConsoleView();
}
else if (duplexConsoleView.getSecondaryConsoleView() instanceof ConsoleViewImpl) {
consoleViewImpl = (ConsoleViewImpl)duplexConsoleView.getSecondaryConsoleView();
}
else {
consoleViewImpl = null;
}
}
else {
consoleViewImpl = null;
}
if (consoleViewImpl != null) {
consoleViewImpl.performWhenNoDeferredOutput(() -> {
Document document = consoleViewImpl.getEditor().getDocument();
int line = isGreeting ? 0 : document.getLineCount() - 2;
if (CharArrayUtil.regionMatches(document.getCharsSequence(), document.getLineStartOffset(line), text)) {
final FoldingModel foldingModel = consoleViewImpl.getEditor().getFoldingModel();
foldingModel.runBatchFoldingOperation(() -> {
FoldRegion region = foldingModel.addFoldRegion(document.getLineStartOffset(line),
document.getLineEndOffset(line),
StringUtil.trimLog(text, limit));
if (region != null) {
region.setExpanded(false);
}
});
}
});
}
}
}
private static class MyProcessHandler extends ProcessHandler implements AnsiEscapeDecoder.ColoredTextAcceptor {