From 0dbbd8e08c814c345e7cf3edeedcff34c22d79bf Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 22 Feb 2019 17:38:28 +0300 Subject: [PATCH] Introduce ScratchPanelListener to set module in the created panel (KT-30049) ^KT-30049 Fixed --- .../scratch/ScratchFileModuleInfoProvider.kt | 80 +++++++++---------- .../kotlin/idea/scratch/scratchUtils.kt | 3 + .../kotlin/idea/scratch/ui/ScratchTopPanel.kt | 11 ++- 3 files changed, 49 insertions(+), 45 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ScratchFileModuleInfoProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ScratchFileModuleInfoProvider.kt index c9c3eb927dd..365248c6009 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ScratchFileModuleInfoProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ScratchFileModuleInfoProvider.kt @@ -17,18 +17,15 @@ package org.jetbrains.kotlin.idea.scratch import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer -import com.intellij.ide.scratch.ScratchFileService import com.intellij.openapi.components.ProjectComponent import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.fileEditor.FileEditorManager -import com.intellij.openapi.fileEditor.FileEditorManagerListener import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project -import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiManager import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker import org.jetbrains.kotlin.idea.core.script.scriptRelatedModuleName +import org.jetbrains.kotlin.idea.scratch.ui.ScratchPanelListener +import org.jetbrains.kotlin.idea.scratch.ui.ScratchTopPanel import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_EXT import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_SUFFIX @@ -38,48 +35,43 @@ class ScratchFileModuleInfoProvider(val project: Project) : ProjectComponent { private val LOG = Logger.getInstance(this.javaClass) override fun projectOpened() { - project.messageBus.connect(project).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, ScratchFileModuleListener()) - } + project.messageBus.connect().subscribe(ScratchPanelListener.TOPIC, object : ScratchPanelListener { + override fun panelAdded(panel: ScratchTopPanel) { + val ktFile = panel.scratchFile.getPsiFile() as? KtFile ?: return + val file = ktFile.virtualFile ?: return - private inner class ScratchFileModuleListener : FileEditorManagerListener { - override fun fileOpened(source: FileEditorManager, file: VirtualFile) { - if (!file.isValid) return - if (!ScratchFileService.isInScratchRoot(file)) return - - val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return - - // BUNCH: 181 scratch files are created with .kt extension - if (file.extension == KotlinFileType.EXTENSION) { - runWriteAction { - var newName = file.nameWithoutExtension + STD_SCRIPT_EXT - var i = 1 - while (file.parent.findChild(newName) != null) { - newName = file.nameWithoutExtension + "_" + i + STD_SCRIPT_EXT - i++ + // BUNCH: 181 scratch files are created with .kt extension + if (file.extension == KotlinFileType.EXTENSION) { + runWriteAction { + var newName = file.nameWithoutExtension + STD_SCRIPT_EXT + var i = 1 + while (file.parent.findChild(newName) != null) { + newName = file.nameWithoutExtension + "_" + i + STD_SCRIPT_EXT + i++ + } + file.rename(this, newName) } - file.rename(this, newName) + } + + if (file.extension != STD_SCRIPT_SUFFIX) { + LOG.error("Kotlin Scratch file should have .kts extension. Cannot add scratch panel for ${file.path}") + return + } + + panel.addModuleListener { psiFile, module -> + psiFile.virtualFile.scriptRelatedModuleName = module?.name + + // Drop caches for old module + ScriptDependenciesModificationTracker.getInstance(project).incModificationCount() + // Force re-highlighting + DaemonCodeAnalyzer.getInstance(project).restart(psiFile) + } + + val module = ktFile.virtualFile.scriptRelatedModuleName?.let { ModuleManager.getInstance(project).findModuleByName(it) } + if (module != null) { + panel.setModule(module) } } - - if (file.extension != STD_SCRIPT_SUFFIX) { - LOG.error("Kotlin Scratch file should have .kts extension. Cannot add scratch panel for ${file.path}") - return - } - - val scratchPanel = getEditorWithScratchPanel(source, file)?.second - scratchPanel?.addModuleListener { psiFile, module -> - psiFile.virtualFile.scriptRelatedModuleName = module?.name - - // Drop caches for old module - ScriptDependenciesModificationTracker.getInstance(project).incModificationCount() - // Force re-highlighting - DaemonCodeAnalyzer.getInstance(project).restart(psiFile) - } - - val module = ktFile.virtualFile.scriptRelatedModuleName?.let { ModuleManager.getInstance(project).findModuleByName(it) } - if (module != null) { - scratchPanel?.setModule(module) - } - } + }) } } \ No newline at end of file diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt index 0b08a6da958..f6ee8ee3876 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt @@ -13,7 +13,9 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Key import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.idea.scratch.ui.ScratchPanelListener import org.jetbrains.kotlin.idea.scratch.ui.ScratchTopPanel +import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck import org.jetbrains.kotlin.psi.UserDataProperty internal val LOG = Logger.getInstance("#org.jetbrains.kotlin.idea.scratch") @@ -53,6 +55,7 @@ fun TextEditor.addScratchPanel(panel: ScratchTopPanel) { FileEditorManager.getInstance(panel.scratchFile.project).addTopComponent(this, panel) Disposer.register(this, panel) + panel.scratchFile.project.syncPublisherWithDisposeCheck(ScratchPanelListener.TOPIC).panelAdded(panel) } fun TextEditor.removeScratchPanel() { diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchTopPanel.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchTopPanel.kt index 4a225574b36..8910407e6ce 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchTopPanel.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/ui/ScratchTopPanel.kt @@ -33,6 +33,7 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager import com.intellij.ui.components.panels.HorizontalLayout +import com.intellij.util.messages.Topic import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo import org.jetbrains.kotlin.idea.caches.project.testSourceInfo @@ -178,4 +179,12 @@ class ScratchTopPanel private constructor(val scratchFile: ScratchFile) : JPanel allowEmptySelection(ConfigurationModuleSelector.NO_MODULE_TEXT) } } -} \ No newline at end of file +} + +interface ScratchPanelListener { + fun panelAdded(panel: ScratchTopPanel) + + companion object { + val TOPIC = Topic.create("ScratchPanelListener", ScratchPanelListener::class.java) + } +}