From 41c37e30539d5155833f90bfd1ca538e705e0adc Mon Sep 17 00:00:00 2001 From: Maksim Kurnikov Date: Mon, 21 Oct 2024 20:45:14 +0200 Subject: [PATCH] Aptos tool window node go-to-def (#212) * MouseAdapter -> MouseListener * navigate to psi elements in the aptos tool window --- .../toolwindow/MoveEntrypointMouseAdapter.kt | 45 ------------- .../move/cli/toolwindow/MoveProjectsTree.kt | 2 +- .../toolwindow/ProjectsTreeMouseListener.kt | 66 +++++++++++++++++++ 3 files changed, 67 insertions(+), 46 deletions(-) delete mode 100644 src/main/kotlin/org/move/cli/toolwindow/MoveEntrypointMouseAdapter.kt create mode 100644 src/main/kotlin/org/move/cli/toolwindow/ProjectsTreeMouseListener.kt diff --git a/src/main/kotlin/org/move/cli/toolwindow/MoveEntrypointMouseAdapter.kt b/src/main/kotlin/org/move/cli/toolwindow/MoveEntrypointMouseAdapter.kt deleted file mode 100644 index b7e20b898..000000000 --- a/src/main/kotlin/org/move/cli/toolwindow/MoveEntrypointMouseAdapter.kt +++ /dev/null @@ -1,45 +0,0 @@ -package org.move.cli.toolwindow - -import com.intellij.diagnostic.PluginException -import com.intellij.execution.Location -import com.intellij.execution.PsiLocation -import com.intellij.execution.actions.RunContextAction -import com.intellij.execution.executors.DefaultRunExecutor -import com.intellij.openapi.actionSystem.ActionPlaces -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.impl.SimpleDataContext -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent -import javax.swing.SwingUtilities -import javax.swing.tree.DefaultMutableTreeNode - -class MoveEntrypointMouseAdapter : MouseAdapter() { - override fun mouseClicked(e: MouseEvent) { - if (e.clickCount < 2 || !SwingUtilities.isLeftMouseButton(e)) return - - val tree = e.source as? MoveProjectsTree ?: return - val node = tree.selectionModel.selectionPath - ?.lastPathComponent as? DefaultMutableTreeNode ?: return - val userObject = node.userObject - val function = when (userObject) { - is MoveProjectsTreeStructure.MoveSimpleNode.Entrypoint -> userObject.function - is MoveProjectsTreeStructure.MoveSimpleNode.View -> userObject.function - else -> return - } - - val functionLocation = - try { - PsiLocation.fromPsiElement(function) ?: return - } catch (e: PluginException) { - // TODO: figure out why this exception is raised - return - } - val dataContext = - SimpleDataContext.getSimpleContext(Location.DATA_KEY, functionLocation) - val actionEvent = - AnActionEvent.createFromDataContext(ActionPlaces.TOOLWINDOW_CONTENT, null, dataContext) - - val executor = DefaultRunExecutor.getRunExecutorInstance() - RunContextAction(executor).actionPerformed(actionEvent) - } -} diff --git a/src/main/kotlin/org/move/cli/toolwindow/MoveProjectsTree.kt b/src/main/kotlin/org/move/cli/toolwindow/MoveProjectsTree.kt index 037512fd0..ac4875598 100644 --- a/src/main/kotlin/org/move/cli/toolwindow/MoveProjectsTree.kt +++ b/src/main/kotlin/org/move/cli/toolwindow/MoveProjectsTree.kt @@ -20,6 +20,6 @@ class MoveProjectsTree : SimpleTree() { showsRootHandles = true emptyText.text = "There are no Move projects to display." selectionModel.selectionMode = TreeSelectionModel.SINGLE_TREE_SELECTION - addMouseListener(MoveEntrypointMouseAdapter()) + addMouseListener(ProjectsTreeMouseListener()) } } diff --git a/src/main/kotlin/org/move/cli/toolwindow/ProjectsTreeMouseListener.kt b/src/main/kotlin/org/move/cli/toolwindow/ProjectsTreeMouseListener.kt new file mode 100644 index 000000000..38444a52d --- /dev/null +++ b/src/main/kotlin/org/move/cli/toolwindow/ProjectsTreeMouseListener.kt @@ -0,0 +1,66 @@ +package org.move.cli.toolwindow + +import com.intellij.diagnostic.PluginException +import com.intellij.execution.Location +import com.intellij.execution.PsiLocation +import com.intellij.execution.actions.RunContextAction +import com.intellij.execution.executors.DefaultRunExecutor +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.impl.SimpleDataContext +import com.intellij.openapi.diagnostic.LogLevel.WARNING +import com.intellij.openapi.diagnostic.logger +import com.intellij.psi.NavigatablePsiElement +import com.intellij.psi.PsiElement +import org.move.cli.toolwindow.MoveProjectsTreeStructure.MoveSimpleNode +import org.move.ide.notifications.logOrShowBalloon +import java.awt.event.MouseAdapter +import java.awt.event.MouseEvent +import javax.swing.SwingUtilities +import javax.swing.tree.DefaultMutableTreeNode + +class ProjectsTreeMouseListener: MouseAdapter() { + override fun mouseClicked(e: MouseEvent) { + // trigger listener only with left double-click + if (!SwingUtilities.isLeftMouseButton(e) || e.clickCount < 2) return + + val projectsTree = e.source as? MoveProjectsTree ?: return + val treeNode = projectsTree.selectionModel + .selectionPath?.lastPathComponent as? DefaultMutableTreeNode ?: return + val userNode = treeNode.userObject + when (userNode) { + is MoveSimpleNode.Entrypoint -> navigateToPsiElement(userNode.function) + is MoveSimpleNode.View -> navigateToPsiElement(userNode.function) + is MoveSimpleNode.Module -> navigateToPsiElement(userNode.module) + } + } + + private fun executeContextAction(psiElement: PsiElement) { + val psiLocation = + try { + PsiLocation.fromPsiElement(psiElement) ?: return + } catch (e: PluginException) { + // TODO: figure out why this exception is raised + LOG.logOrShowBalloon(e.message, productionLevel = WARNING) + return + } + val dataContext = + SimpleDataContext.getSimpleContext(Location.DATA_KEY, psiLocation) + val actionEvent = + AnActionEvent.createFromDataContext(ActionPlaces.TOOLWINDOW_CONTENT, null, dataContext) + + val executor = DefaultRunExecutor.getRunExecutorInstance() + RunContextAction(executor).actionPerformed(actionEvent) + } + + private fun navigateToPsiElement(psiElement: PsiElement) { + val navigationElement = psiElement.navigationElement as? NavigatablePsiElement ?: return + if (navigationElement.canNavigate()) { + navigationElement.navigate(true) + } + } + + companion object { + private val LOG = logger() + } +}