User: joe Date: 19 Feb 25 00:50 Revision: 54f729be21bb904f0f96a12fc18cc3769430d870 Summary: Convert find mixins dialog to popup, check Navigatable.canNavigate() TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=9827&personal=false Index: src/main/kotlin/platform/mixin/action/FindMixinsAction.kt =================================================================== --- src/main/kotlin/platform/mixin/action/FindMixinsAction.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9) +++ src/main/kotlin/platform/mixin/action/FindMixinsAction.kt (revision 54f729be21bb904f0f96a12fc18cc3769430d870) @@ -26,6 +26,7 @@ import com.demonwav.mcdev.util.findReferencedClass import com.demonwav.mcdev.util.fullQualifiedName import com.demonwav.mcdev.util.invokeLater +import com.intellij.codeInsight.navigation.getPsiElementPopup import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys.CARET @@ -36,23 +37,15 @@ import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.runBackgroundableTask import com.intellij.openapi.project.Project -import com.intellij.openapi.wm.ToolWindow -import com.intellij.openapi.wm.ToolWindowFactory -import com.intellij.openapi.wm.ToolWindowManager +import com.intellij.openapi.ui.popup.JBPopup import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.searches.AnnotatedElementsSearch import com.intellij.psi.util.PsiModificationTracker -import com.intellij.ui.content.ContentFactory class FindMixinsAction : AnAction() { - - class TWFactory : ToolWindowFactory { - override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { - } - } - companion object { private const val TOOL_WINDOW_ID = "Find Mixins" @@ -87,7 +80,12 @@ } } - fun openFindMixinsUI(project: Project, targetClass: PsiClass, filter: (PsiClass) -> Boolean = { true }) { + fun openFindMixinsUI( + project: Project, + targetClass: PsiClass, + showPopup: JBPopup.() -> Unit, + filter: (PsiClass) -> Boolean = { true } + ) { ApplicationManager.getApplication().assertIsDispatchThread() runBackgroundableTask("Searching for Mixins", project, true) run@{ indicator -> @@ -112,16 +110,12 @@ invokeLater { if (classes.size == 1) { - classes.single().navigate(true) + val mixinClass = classes.single() + if (mixinClass.canNavigate()) { + mixinClass.navigate(true) + } } else { - val twManager = ToolWindowManager.getInstance(project) - val window = twManager.getToolWindow(TOOL_WINDOW_ID)!! - val component = FindMixinsComponent(classes) - val content = ContentFactory.getInstance().createContent(component.panel, null, false) - content.displayName = targetClass.qualifiedName ?: targetClass.name - window.contentManager.addContent(content) - - window.activate(null) + getPsiElementPopup(classes.toTypedArray(), "Choose mixin").showPopup() } } } @@ -137,7 +131,7 @@ val classOfElement = element.findReferencedClass() ?: return invokeLater { - openFindMixinsUI(project, classOfElement) + openFindMixinsUI(project, classOfElement, { showInBestPositionFor(e.dataContext) }) } } } Index: src/main/kotlin/platform/mixin/action/FindMixinsComponent.kt =================================================================== --- src/main/kotlin/platform/mixin/action/FindMixinsComponent.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9) +++ src/main/kotlin/platform/mixin/action/FindMixinsComponent.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9) @@ -1,48 +0,0 @@ -/* - * Minecraft Development for IntelliJ - * - * https://mcdev.io/ - * - * Copyright (C) 2025 minecraft-dev - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation, version 3.0 only. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.demonwav.mcdev.platform.mixin.action - -import com.intellij.ide.util.PsiClassListCellRenderer -import com.intellij.psi.PsiClass -import com.intellij.ui.components.JBList -import com.intellij.ui.dsl.builder.Align -import com.intellij.ui.dsl.builder.panel -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent -import javax.swing.JPanel - -class FindMixinsComponent(classes: List) : MouseAdapter() { - - private val classList = JBList(classes).apply { - cellRenderer = PsiClassListCellRenderer() - addMouseListener(this@FindMixinsComponent) - } - - val panel: JPanel = panel { - row { - cell(classList).align(Align.FILL) - } - } - - override fun mouseClicked(e: MouseEvent) { - classList.selectedValue?.takeIf(PsiClass::canNavigate)?.navigate(true) - } -} Index: src/main/kotlin/platform/mixin/insight/target/AccessorTargetCodeVisionProvider.kt =================================================================== --- src/main/kotlin/platform/mixin/insight/target/AccessorTargetCodeVisionProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9) +++ src/main/kotlin/platform/mixin/insight/target/AccessorTargetCodeVisionProvider.kt (revision 54f729be21bb904f0f96a12fc18cc3769430d870) @@ -29,6 +29,7 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile +import com.intellij.ui.awt.RelativePoint import java.awt.event.MouseEvent class AccessorTargetCodeVisionProvider : AbstractMixinTargetCodeVisionProvider() { @@ -54,6 +55,18 @@ override fun handleClick(editor: Editor, element: PsiElement, event: MouseEvent?) { val project = editor.project ?: return val targetClass = element.findReferencedClass() ?: return - FindMixinsAction.openFindMixinsUI(project, targetClass) { it.isAccessorMixin } + FindMixinsAction.openFindMixinsUI( + project, + targetClass, + { + if (event != null) { + show(RelativePoint(event)) + } else { + showInBestPositionFor(editor) - } -} + } + } + ) { + it.isAccessorMixin + } + } +} Index: src/main/kotlin/platform/mixin/insight/target/MixinTargetCodeVisionProvider.kt =================================================================== --- src/main/kotlin/platform/mixin/insight/target/MixinTargetCodeVisionProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9) +++ src/main/kotlin/platform/mixin/insight/target/MixinTargetCodeVisionProvider.kt (revision 54f729be21bb904f0f96a12fc18cc3769430d870) @@ -28,6 +28,7 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile +import com.intellij.ui.awt.RelativePoint import java.awt.event.MouseEvent class MixinTargetCodeVisionProvider : AbstractMixinTargetCodeVisionProvider() { @@ -54,6 +55,18 @@ override fun handleClick(editor: Editor, element: PsiElement, event: MouseEvent?) { val project = editor.project ?: return val targetClass = element.findReferencedClass() ?: return - FindMixinsAction.openFindMixinsUI(project, targetClass) { !it.isAccessorMixin } + FindMixinsAction.openFindMixinsUI( + project, + targetClass, + { + if (event != null) { + show(RelativePoint(event)) + } else { + showInBestPositionFor(editor) - } -} + } + } + ) { + !it.isAccessorMixin + } + } +} Index: src/main/kotlin/platform/mixin/insight/target/MixinTargetLineMarkerProvider.kt =================================================================== --- src/main/kotlin/platform/mixin/insight/target/MixinTargetLineMarkerProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9) +++ src/main/kotlin/platform/mixin/insight/target/MixinTargetLineMarkerProvider.kt (revision 54f729be21bb904f0f96a12fc18cc3769430d870) @@ -29,6 +29,7 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiIdentifier +import com.intellij.ui.awt.RelativePoint import java.awt.event.MouseEvent class MixinTargetLineMarkerProvider : LineMarkerProviderDescriptor(), GutterIconNavigationHandler { @@ -67,6 +68,6 @@ override fun navigate(e: MouseEvent, elt: PsiIdentifier) { val targetClass = elt.parent as? PsiClass ?: return - FindMixinsAction.openFindMixinsUI(targetClass.project, targetClass) + FindMixinsAction.openFindMixinsUI(targetClass.project, targetClass, { show(RelativePoint(e)) }) } }