Scratch: get scratch panel from selected editor

CommonDataKeys.EDITOR key isn't present for some events (for example when user click on isRepl checkbox on scratch panel or there isn't any file open in the editor)
^KT-28045 Fixed
This commit is contained in:
Natalia Selezneva
2018-12-11 10:14:16 +03:00
parent 59a32ff94d
commit d403514cee
4 changed files with 14 additions and 22 deletions
@@ -18,17 +18,17 @@ package org.jetbrains.kotlin.idea.scratch.actions
import com.intellij.icons.AllIcons import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.scratch.ScratchFileLanguageProvider import org.jetbrains.kotlin.idea.scratch.ScratchFileLanguageProvider
import org.jetbrains.kotlin.idea.scratch.getScratchPanelFromSelectedEditor
class ClearScratchAction : ScratchAction( class ClearScratchAction : ScratchAction(
KotlinBundle.message("scratch.clear.button"), KotlinBundle.message("scratch.clear.button"),
AllIcons.Actions.GC AllIcons.Actions.GC
) { ) {
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
val editor = e.getData(CommonDataKeys.EDITOR) ?: return val project = e.project ?: return
val scratchFile = getScratchPanel(editor)?.scratchFile ?: return val scratchFile = getScratchPanelFromSelectedEditor(project)?.scratchFile ?: return
val psiFile = scratchFile.getPsiFile() ?: return val psiFile = scratchFile.getPsiFile() ?: return
ScratchFileLanguageProvider.get(psiFile.language)?.getOutputHandler()?.clear(scratchFile) ScratchFileLanguageProvider.get(psiFile.language)?.getOutputHandler()?.clear(scratchFile)
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.scratch.actions
import com.intellij.icons.AllIcons import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.keymap.KeymapManager import com.intellij.openapi.keymap.KeymapManager
import com.intellij.openapi.keymap.KeymapUtil import com.intellij.openapi.keymap.KeymapUtil
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
@@ -26,6 +25,7 @@ import com.intellij.task.ProjectTaskManager
import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.scratch.ScratchFile import org.jetbrains.kotlin.idea.scratch.ScratchFile
import org.jetbrains.kotlin.idea.scratch.ScratchFileLanguageProvider import org.jetbrains.kotlin.idea.scratch.ScratchFileLanguageProvider
import org.jetbrains.kotlin.idea.scratch.getScratchPanelFromSelectedEditor
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutputHandlerAdapter import org.jetbrains.kotlin.idea.scratch.output.ScratchOutputHandlerAdapter
import org.jetbrains.kotlin.idea.scratch.printDebugMessage import org.jetbrains.kotlin.idea.scratch.printDebugMessage
import org.jetbrains.kotlin.idea.scratch.LOG as log import org.jetbrains.kotlin.idea.scratch.LOG as log
@@ -43,8 +43,7 @@ class RunScratchAction : ScratchAction(
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return val project = e.project ?: return
val editor = e.getData(CommonDataKeys.EDITOR) ?: return val scratchPanel = getScratchPanelFromSelectedEditor(project) ?: return
val scratchPanel = getScratchPanel(editor) ?: return
val scratchFile = scratchPanel.scratchFile val scratchFile = scratchPanel.scratchFile
val psiFile = scratchFile.getPsiFile() ?: return val psiFile = scratchFile.getPsiFile() ?: return
@@ -7,25 +7,12 @@ package org.jetbrains.kotlin.idea.scratch.actions
import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.editor.Editor import org.jetbrains.kotlin.idea.scratch.getScratchPanelFromSelectedEditor
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider
import org.jetbrains.kotlin.idea.scratch.getScratchPanel
import org.jetbrains.kotlin.idea.scratch.ui.ScratchTopPanel
import javax.swing.Icon import javax.swing.Icon
abstract class ScratchAction(message: String, icon: Icon) : AnAction(message, message, icon) { abstract class ScratchAction(message: String, icon: Icon) : AnAction(message, message, icon) {
override fun update(e: AnActionEvent) { override fun update(e: AnActionEvent) {
val presentation = e.presentation val scratchPanel = e.project?.let { getScratchPanelFromSelectedEditor(it) }
e.presentation.isVisible = scratchPanel != null
val project = e.project ?: return
val editor = FileEditorManager.getInstance(project).selectedTextEditor ?: return
val scratchPanel = getScratchPanel(editor)
presentation.isVisible = scratchPanel != null
}
protected fun getScratchPanel(editor: Editor): ScratchTopPanel? {
return TextEditorProvider.getInstance().getTextEditor(editor).getScratchPanel()
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.scratch
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.TextEditor import com.intellij.openapi.fileEditor.TextEditor
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.Key import com.intellij.openapi.util.Key
@@ -38,6 +39,11 @@ fun getAllEditorsWithScratchPanel(project: Project): List<Pair<TextEditor, Scrat
if (panel != null) it to panel else null if (panel != null) it to panel else null
} }
fun getScratchPanelFromSelectedEditor(project: Project): ScratchTopPanel? {
val editor = FileEditorManager.getInstance(project).selectedTextEditor ?: return null
return TextEditorProvider.getInstance().getTextEditor(editor).getScratchPanel()
}
fun TextEditor.getScratchPanel(): ScratchTopPanel? { fun TextEditor.getScratchPanel(): ScratchTopPanel? {
return scratchTopPanel return scratchTopPanel
} }