From 9dd021c5ccd86c81d3bb11b0e72bfb4277b2e6f0 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Tue, 19 Jul 2016 20:33:06 +0300 Subject: [PATCH] external system: add folding of greeting/farewell output lines of task console --- .../ExternalSystemRunConfiguration.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java index d90e6560e4ad..d05bf7a385dd 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java @@ -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 {