From ad90095dc7f7bd03effd2dea10c8e6041f16e742 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 12 Jan 2018 10:49:49 +0300 Subject: [PATCH] Show multple errors in scratch toolwindow --- .../output/InlayScratchOutputHandler.kt | 8 +-- .../scratch/ui/ScratchToolWindowFactory.kt | 67 +++++++++++++------ 2 files changed, 50 insertions(+), 25 deletions(-) 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 8cdef11516e..9871698f5e8 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 @@ -33,7 +33,7 @@ import com.intellij.ui.JBColor import com.intellij.util.ui.UIUtil import org.jetbrains.kotlin.idea.scratch.ScratchExpression import org.jetbrains.kotlin.idea.scratch.ScratchFile -import org.jetbrains.kotlin.idea.scratch.ui.showToolWindow +import org.jetbrains.kotlin.idea.scratch.ui.ScratchToolWindow import java.awt.Color import java.awt.Font import java.awt.Graphics @@ -41,7 +41,7 @@ import java.awt.Rectangle object InlayScratchOutputHandler : ScratchOutputHandler { override fun onStart(file: ScratchFile) { - clearInlays(file.psiFile.project, file.psiFile.virtualFile) + clear(file) } override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { @@ -55,8 +55,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler { } override fun error(file: ScratchFile, message: String) { - // todo multiple errors, clear, close - showToolWindow(file.psiFile.project, message, ConsoleViewContentType.ERROR_OUTPUT) + ScratchToolWindow.addMessageToToolWindow(file.psiFile.project, message, ConsoleViewContentType.ERROR_OUTPUT) } override fun onFinish(file: ScratchFile) { @@ -65,6 +64,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler { override fun clear(file: ScratchFile) { clearInlays(file.psiFile.project, file.psiFile.virtualFile) + ScratchToolWindow.clearToolWindow(file.psiFile.project) } private fun createInlay(project: Project, file: VirtualFile, offset: Int, inlayText: String, outputType: ScratchOutputType) { diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchToolWindowFactory.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchToolWindowFactory.kt index 9e3be09b440..102d21dc9d4 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchToolWindowFactory.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchToolWindowFactory.kt @@ -65,31 +65,56 @@ class ScratchToolWindowFactory : ToolWindowFactory { } } -fun showToolWindow( +object ScratchToolWindow { + + fun addMessageToToolWindow( project: Project, message: String, type: ConsoleViewContentType -) { - if (ApplicationManager.getApplication().isUnitTestMode) return + ) { + if (ApplicationManager.getApplication().isUnitTestMode) return - ApplicationManager.getApplication().invokeLater { - val toolWindowManager = ToolWindowManager.getInstance(project) - var window: ToolWindow? = toolWindowManager.getToolWindow(ScratchToolWindowFactory.ID) - if (window == null) { - toolWindowManager.registerToolWindow(ScratchToolWindowFactory.ID, true, ToolWindowAnchor.BOTTOM) - window = toolWindowManager.getToolWindow(ScratchToolWindowFactory.ID) - ScratchToolWindowFactory().createToolWindowContent(project, window!!) - } - - val contents = window.contentManager.contents - for (content in contents) { - val component = content.component - if (component is ConsoleViewImpl) { - component.clear() - component.print(message, type) - window.setAvailable(true, null) - window.show(null) + ApplicationManager.getApplication().invokeLater { + val toolWindow = getToolWindow(project) ?: createToolWindow(project) + val contents = toolWindow.contentManager.contents + for (content in contents) { + val component = content.component + if (component is ConsoleViewImpl) { + component.print("$message\n", type) + } + } + toolWindow.setAvailable(true, null) + toolWindow.show(null) } - } + } + + fun clearToolWindow(project: Project) { + if (ApplicationManager.getApplication().isUnitTestMode) return + + ApplicationManager.getApplication().invokeLater { + val toolWindow = getToolWindow(project) ?: return@invokeLater + val contents = toolWindow.contentManager.contents + for (content in contents) { + val component = content.component + if (component is ConsoleViewImpl) { + component.clear() + } + } + toolWindow.setAvailable(false, null) + toolWindow.hide(null) + } + } + + private fun getToolWindow(project: Project): ToolWindow? { + val toolWindowManager = ToolWindowManager.getInstance(project) + return toolWindowManager.getToolWindow(ScratchToolWindowFactory.ID) + } + + private fun createToolWindow(project: Project): ToolWindow { + val toolWindowManager = ToolWindowManager.getInstance(project) + toolWindowManager.registerToolWindow(ScratchToolWindowFactory.ID, true, ToolWindowAnchor.BOTTOM) + val window = toolWindowManager.getToolWindow(ScratchToolWindowFactory.ID) + ScratchToolWindowFactory().createToolWindowContent(project, window) + return window } } \ No newline at end of file