diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt index 3d0c41bce37..a7d59fe6e6f 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/InlayScratchOutputHandler.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.scratch.output -import com.intellij.execution.ui.ConsoleViewContentType import com.intellij.openapi.fileEditor.TextEditor import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.text.StringUtil @@ -35,7 +34,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler { override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { val inlayText = StringUtil.shortenTextWithEllipsis(output.text.substringBefore("\n"), 50, 0) if (inlayText != output.text) { - ScratchToolWindow.addMessageToToolWindow(file.project, output.text, ConsoleViewContentType.NORMAL_OUTPUT) + ToolWindowScratchOutputHandler.handle(file, expression, output) } createInlay(file, expression.lineStart, inlayText, output.type) @@ -46,7 +45,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler { } override fun error(file: ScratchFile, message: String) { - ScratchToolWindow.addMessageToToolWindow(file.project, message, ConsoleViewContentType.ERROR_OUTPUT) + ToolWindowScratchOutputHandler.error(file, message) } override fun onFinish(file: ScratchFile) { @@ -55,7 +54,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler { override fun clear(file: ScratchFile) { clearInlays(file.editor) - ScratchToolWindow.clearToolWindow(file.project) + ToolWindowScratchOutputHandler.clear(file) } private fun createInlay(file: ScratchFile, line: Int, inlayText: String, outputType: ScratchOutputType) { diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ScratchToolWindowFactory.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ScratchToolWindowFactory.kt index 9bd2e019499..4d9c0c9e125 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ScratchToolWindowFactory.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/output/ScratchToolWindowFactory.kt @@ -18,18 +18,17 @@ package org.jetbrains.kotlin.idea.scratch.output import com.intellij.execution.impl.ConsoleViewImpl import com.intellij.execution.ui.ConsoleViewContentType +import com.intellij.ide.scratch.ScratchFileType import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.ex.EditorEx -import com.intellij.openapi.fileEditor.FileEditorManager -import com.intellij.openapi.fileEditor.FileEditorManagerEvent -import com.intellij.openapi.fileEditor.FileEditorManagerListener import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer -import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.wm.ToolWindow import com.intellij.openapi.wm.ToolWindowAnchor import com.intellij.openapi.wm.ToolWindowFactory import com.intellij.openapi.wm.ToolWindowManager +import org.jetbrains.kotlin.idea.scratch.ScratchExpression +import org.jetbrains.kotlin.idea.scratch.ScratchFile class ScratchToolWindowFactory : ToolWindowFactory { companion object { @@ -39,6 +38,7 @@ class ScratchToolWindowFactory : ToolWindowFactory { override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { val consoleView = ConsoleViewImpl(project, true) toolWindow.isToHideOnEmptyContent = true + toolWindow.icon = ScratchFileType.INSTANCE.icon val contentManager = toolWindow.contentManager val content = contentManager.factory.createContent(consoleView.component, null, false) @@ -49,29 +49,24 @@ class ScratchToolWindowFactory : ToolWindowFactory { } Disposer.register(project, consoleView) - project.messageBus.connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, getFileEditorManagerListener(toolWindow)) - } - - private fun getFileEditorManagerListener(toolWindow: ToolWindow): FileEditorManagerListener { - return object : FileEditorManagerListener { - override fun fileClosed(source: FileEditorManager, file: VirtualFile) { - toolWindow.setAvailable(false, {}) - } - - override fun selectionChanged(event: FileEditorManagerEvent) { - toolWindow.setAvailable(false, {}) - } - } } } -object ScratchToolWindow { +object ToolWindowScratchOutputHandler : ScratchOutputHandlerAdapter() { - fun addMessageToToolWindow( - project: Project, - message: String, - type: ConsoleViewContentType - ) { + override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { + printToConsole(file.project) { + print(output.text, output.type.convert()) + } + } + + override fun error(file: ScratchFile, message: String) { + printToConsole(file.project) { + print(message, ConsoleViewContentType.ERROR_OUTPUT) + } + } + + private fun printToConsole(project: Project, print: ConsoleViewImpl.() -> Unit) { if (ApplicationManager.getApplication().isUnitTestMode) return ApplicationManager.getApplication().invokeLater { @@ -80,7 +75,8 @@ object ScratchToolWindow { for (content in contents) { val component = content.component if (component is ConsoleViewImpl) { - component.print("$message\n", type) + component.print() + component.print("\n", ConsoleViewContentType.NORMAL_OUTPUT) } } toolWindow.setAvailable(true, null) @@ -88,11 +84,11 @@ object ScratchToolWindow { } } - fun clearToolWindow(project: Project) { + override fun clear(file: ScratchFile) { if (ApplicationManager.getApplication().isUnitTestMode) return ApplicationManager.getApplication().invokeLater { - val toolWindow = getToolWindow(project) ?: return@invokeLater + val toolWindow = getToolWindow(file.project) ?: return@invokeLater val contents = toolWindow.contentManager.contents for (content in contents) { val component = content.component @@ -105,6 +101,12 @@ object ScratchToolWindow { } } + private fun ScratchOutputType.convert() = when (this) { + ScratchOutputType.OUTPUT -> ConsoleViewContentType.SYSTEM_OUTPUT + ScratchOutputType.RESULT -> ConsoleViewContentType.NORMAL_OUTPUT + ScratchOutputType.ERROR -> ConsoleViewContentType.ERROR_OUTPUT + } + private fun getToolWindow(project: Project): ToolWindow? { val toolWindowManager = ToolWindowManager.getInstance(project) return toolWindowManager.getToolWindow(ScratchToolWindowFactory.ID)