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.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.scratch.ScratchFileLanguageProvider
import org.jetbrains.kotlin.idea.scratch.getScratchPanelFromSelectedEditor
class ClearScratchAction : ScratchAction(
KotlinBundle.message("scratch.clear.button"),
AllIcons.Actions.GC
) {
override fun actionPerformed(e: AnActionEvent) {
val editor = e.getData(CommonDataKeys.EDITOR) ?: return
val scratchFile = getScratchPanel(editor)?.scratchFile ?: return
val project = e.project ?: return
val scratchFile = getScratchPanelFromSelectedEditor(project)?.scratchFile ?: return
val psiFile = scratchFile.getPsiFile() ?: return
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.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.keymap.KeymapManager
import com.intellij.openapi.keymap.KeymapUtil
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.scratch.ScratchFile
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.printDebugMessage
import org.jetbrains.kotlin.idea.scratch.LOG as log
@@ -43,8 +43,7 @@ class RunScratchAction : ScratchAction(
override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return
val editor = e.getData(CommonDataKeys.EDITOR) ?: return
val scratchPanel = getScratchPanel(editor) ?: return
val scratchPanel = getScratchPanelFromSelectedEditor(project) ?: return
val scratchFile = scratchPanel.scratchFile
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.AnActionEvent
import com.intellij.openapi.editor.Editor
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 org.jetbrains.kotlin.idea.scratch.getScratchPanelFromSelectedEditor
import javax.swing.Icon
abstract class ScratchAction(message: String, icon: Icon) : AnAction(message, message, icon) {
override fun update(e: AnActionEvent) {
val presentation = e.presentation
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()
val scratchPanel = e.project?.let { getScratchPanelFromSelectedEditor(it) }
e.presentation.isVisible = scratchPanel != null
}
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.scratch
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.TextEditor
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
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
}
fun getScratchPanelFromSelectedEditor(project: Project): ScratchTopPanel? {
val editor = FileEditorManager.getInstance(project).selectedTextEditor ?: return null
return TextEditorProvider.getInstance().getTextEditor(editor).getScratchPanel()
}
fun TextEditor.getScratchPanel(): ScratchTopPanel? {
return scratchTopPanel
}