From 20e7f1308220d4f5ad24f34614ff8783aac0d9ad Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Sun, 24 Nov 2024 15:43:40 +0800 Subject: [PATCH] feat(shirelang): add SonarLint action and tool window integration --- .../shirecore/config/ShireActionLocation.kt | 3 ++ .../shirelang/ShireActionStartupActivity.kt | 30 +++++++++++++++ .../actions/external/ShireSonarLintAction.kt | 38 +++++++++++++++++++ .../main/resources/com.phodal.shirelang.xml | 8 ++++ 4 files changed, 79 insertions(+) create mode 100644 shirelang/src/main/kotlin/com/phodal/shirelang/actions/external/ShireSonarLintAction.kt diff --git a/core/src/main/kotlin/com/phodal/shirecore/config/ShireActionLocation.kt b/core/src/main/kotlin/com/phodal/shirecore/config/ShireActionLocation.kt index 94a7940be..d10212b51 100644 --- a/core/src/main/kotlin/com/phodal/shirecore/config/ShireActionLocation.kt +++ b/core/src/main/kotlin/com/phodal/shirecore/config/ShireActionLocation.kt @@ -10,6 +10,9 @@ enum class ShireActionLocation(val location: String, val description: String) { DATABASE_MENU("DatabaseMenu", "Show in Database panel menu bar"), CONSOLE_MENU("ConsoleMenu", "Show in Console panel menu bar"), VCS_LOG_MENU("VcsLogMenu", "Show in VCS Log panel menu bar"), + + /// external plugins + EXT_SONARQUBE_MENU("ExtSonarQubeMenu", "Show in SonarQube panel menu bar"), ; companion object { diff --git a/shirelang/src/main/kotlin/com/phodal/shirelang/ShireActionStartupActivity.kt b/shirelang/src/main/kotlin/com/phodal/shirelang/ShireActionStartupActivity.kt index 9d05ec9ad..fec8e633d 100644 --- a/shirelang/src/main/kotlin/com/phodal/shirelang/ShireActionStartupActivity.kt +++ b/shirelang/src/main/kotlin/com/phodal/shirelang/ShireActionStartupActivity.kt @@ -1,13 +1,19 @@ package com.phodal.shirelang import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.ActionToolbar import com.intellij.openapi.actionSystem.Constraints import com.intellij.openapi.actionSystem.DefaultActionGroup import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.smartReadAction import com.intellij.openapi.project.Project import com.intellij.openapi.startup.ProjectActivity +import com.intellij.openapi.ui.SimpleToolWindowPanel +import com.intellij.openapi.util.Key import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.wm.ToolWindow +import com.intellij.openapi.wm.ToolWindowManager +import com.intellij.openapi.wm.ex.ToolWindowManagerListener import com.intellij.psi.PsiManager import com.intellij.psi.search.FileTypeIndex import com.intellij.psi.search.ProjectScope @@ -36,6 +42,7 @@ class ShireActionStartupActivity : ProjectActivity { attachTerminalAction() attachDatabaseAction(project) + attachSonarLintAction(project) } } @@ -70,6 +77,11 @@ class ShireActionStartupActivity : ProjectActivity { } } + private fun attachSonarLintAction(project: Project) { + project.getMessageBus().connect() + .subscribe(ToolWindowManagerListener.TOPIC, SonarLintToolWindowListener(project)); + } + companion object { private fun obtainShireFiles(project: Project): List { ApplicationManager.getApplication().assertReadAccessAllowed() @@ -99,3 +111,21 @@ class ShireActionStartupActivity : ProjectActivity { } } + +class SonarLintToolWindowListener(private val project: Project) : ToolWindowManagerListener { + override fun toolWindowShown(toolWindow: ToolWindow) { + if (toolWindow.id != "SonarLint") return + val action = ActionManager.getInstance().getAction("ShireSonarLintAction") + + val contentManager = toolWindow.contentManager + val content = contentManager.getContent(0) ?: return + + val simpleToolWindowPanel = content.component as? SimpleToolWindowPanel + val actionToolbar = simpleToolWindowPanel?.toolbar?.components?.get(0) as? ActionToolbar ?: return + val actionGroup = actionToolbar.actionGroup as? DefaultActionGroup + + if (actionGroup?.containsAction(action) == false) { + actionGroup?.add(action) + } + } +} diff --git a/shirelang/src/main/kotlin/com/phodal/shirelang/actions/external/ShireSonarLintAction.kt b/shirelang/src/main/kotlin/com/phodal/shirelang/actions/external/ShireSonarLintAction.kt new file mode 100644 index 000000000..940876119 --- /dev/null +++ b/shirelang/src/main/kotlin/com/phodal/shirelang/actions/external/ShireSonarLintAction.kt @@ -0,0 +1,38 @@ +package com.phodal.shirelang.actions.external + +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.Project +import com.phodal.shirecore.config.ShireActionLocation +import com.phodal.shirecore.variable.template.VariableActionEventDataHolder +import com.phodal.shirelang.actions.ShireRunFileAction +import com.phodal.shirelang.actions.base.DynamicShireActionService + +class ShireSonarLintAction : AnAction() { + override fun getActionUpdateThread() = ActionUpdateThread.EDT + + private fun shireActionConfigs(project: Project) = + DynamicShireActionService.getInstance(project).getActions(ShireActionLocation.EXT_SONARQUBE_MENU) + + override fun update(e: AnActionEvent) { + val project = e.project ?: return + val isOnlyOneConfig = shireActionConfigs(project).size == 1 + + val hobbitHole = shireActionConfigs(project).firstOrNull()?.hole + e.presentation.isVisible = isOnlyOneConfig + e.presentation.isEnabled = hobbitHole != null && hobbitHole.enabled + if (hobbitHole != null) { + e.presentation.text = hobbitHole.name ?: "" + } + } + + override fun actionPerformed(e: AnActionEvent) { + val project = e.project ?: return + + VariableActionEventDataHolder.putData(VariableActionEventDataHolder(e.dataContext)) + + val config = shireActionConfigs(project).firstOrNull() ?: return + ShireRunFileAction.executeShireFile(project, config, null) + } +} diff --git a/shirelang/src/main/resources/com.phodal.shirelang.xml b/shirelang/src/main/resources/com.phodal.shirelang.xml index c938ecd5e..4a731519b 100644 --- a/shirelang/src/main/resources/com.phodal.shirelang.xml +++ b/shirelang/src/main/resources/com.phodal.shirelang.xml @@ -165,6 +165,14 @@ + + + +