diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/DeclarativeInlayActionService.kt b/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/DeclarativeInlayActionService.kt new file mode 100644 index 000000000000..79d09c11ec16 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/DeclarativeInlayActionService.kt @@ -0,0 +1,62 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.codeInsight.hints.declarative.impl + +import com.intellij.codeInsight.hints.declarative.InlayActionData +import com.intellij.codeInsight.hints.declarative.InlayActionHandler +import com.intellij.codeInsight.hints.declarative.InlayHintsProvider +import com.intellij.codeInsight.hints.declarative.InlayHintsProviderFactory +import com.intellij.openapi.actionSystem.ActionGroup +import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.CommonDataKeys +import com.intellij.openapi.actionSystem.impl.SimpleDataContext +import com.intellij.openapi.editor.event.EditorMouseEvent +import com.intellij.openapi.ui.popup.JBPopupFactory +import com.intellij.psi.PsiDocumentManager +import com.intellij.ui.awt.RelativePoint +import org.jetbrains.annotations.ApiStatus + +@ApiStatus.Internal +open class DeclarativeInlayActionService { + open fun invokeInlayMenu(hintData: InlayData, e: EditorMouseEvent, relativePoint: RelativePoint) { + val project = e.editor.project ?: return + val document = e.editor.document + val psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document) ?: return + val providerId = hintData.providerId + val providerInfo = InlayHintsProviderFactory.getProviderInfo(psiFile.language, providerId) ?: return + val providerName = providerInfo.providerName + + val inlayMenu: AnAction = ActionManager.getInstance().getAction("InlayMenu") + val inlayMenuActionGroup = inlayMenu as ActionGroup + //val popupMenu = ActionManager.getInstance().createActionPopupMenu("InlayMenuPopup", inlayMenuActionGroup) + val dataContext = SimpleDataContext.builder() + .add(CommonDataKeys.PROJECT, project) + .add(CommonDataKeys.PSI_FILE, psiFile) + .add(CommonDataKeys.EDITOR, e.editor) + .add(InlayHintsProvider.PROVIDER_ID, providerId) + .add(InlayHintsProvider.PROVIDER_NAME, providerName) + .add(InlayHintsProvider.INLAY_PAYLOADS, hintData.payloads?.associate { it.payloadName to it.payload }) + .build() + //popupMenu.setDataContext { + // dataContext + //} + // + //JBPopupMenu.showByEvent(e.mouseEvent, popupMenu.component) + + val popupMenu = JBPopupFactory.getInstance().createActionGroupPopup(null, inlayMenuActionGroup, dataContext, JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false) + popupMenu.show(relativePoint) + } + + fun invokeActionHandler(actionData: InlayActionData, e: EditorMouseEvent) { + val handlerId = actionData.handlerId + val handler = InlayActionHandler.getActionHandler(handlerId) + if (handler != null) { + logActionHandlerInvoked(handlerId, handler.javaClass) + handler.handleClick(e, actionData.payload) + } + } + + open fun logActionHandlerInvoked(handlerId: String, handlerClass: Class) { + InlayActionHandlerUsagesCollector.clickHandled(handlerId, handlerClass) + } +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationEntries.kt b/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationEntries.kt index fe124b639201..c6f8e755739c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationEntries.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationEntries.kt @@ -1,9 +1,9 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInsight.hints.declarative.impl -import com.intellij.codeInsight.hints.declarative.InlayActionHandler import com.intellij.codeInsight.hints.presentation.InlayTextMetrics import com.intellij.ide.ui.AntialiasingType +import com.intellij.openapi.components.service import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.event.EditorMouseEvent import com.intellij.openapi.editor.markup.TextAttributes @@ -52,12 +52,7 @@ class TextInlayPresentationEntry( if (clickArea != null && project != null) { val actionData = clickArea.actionData if (controlDown) { - val handlerId = actionData.handlerId - val handler = InlayActionHandler.getActionHandler(handlerId) - if (handler != null) { - InlayActionHandlerUsagesCollector.clickHandled(handlerId, handler.javaClass) - handler.handleClick(e, actionData.payload) - } + service().invokeActionHandler(actionData, e) } } if (parentIndexToSwitch != (-1).toByte()) { @@ -118,4 +113,4 @@ class TextInlayPresentationEntry( override fun toString(): String { return "TextInlayPresentationEntry(text='$text', parentIndexToSwitch=$parentIndexToSwitch)" } -} \ No newline at end of file +} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationList.kt b/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationList.kt index 0fd9d45045b8..0a0c528fc30a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationList.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/declarative/impl/InlayPresentationList.kt @@ -7,19 +7,13 @@ import com.intellij.codeInsight.hints.declarative.impl.views.DeclarativeHintView import com.intellij.codeInsight.hints.presentation.InlayTextMetrics import com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage import com.intellij.codeInsight.hints.presentation.PresentationFactory -import com.intellij.openapi.actionSystem.ActionGroup -import com.intellij.openapi.actionSystem.ActionManager -import com.intellij.openapi.actionSystem.AnAction -import com.intellij.openapi.actionSystem.CommonDataKeys -import com.intellij.openapi.actionSystem.impl.SimpleDataContext +import com.intellij.openapi.components.service import com.intellij.openapi.editor.DefaultLanguageHighlighterColors import com.intellij.openapi.editor.Inlay import com.intellij.openapi.editor.colors.EditorColors import com.intellij.openapi.editor.event.EditorMouseEvent import com.intellij.openapi.editor.impl.EditorImpl import com.intellij.openapi.editor.markup.TextAttributes -import com.intellij.openapi.ui.JBPopupMenu -import com.intellij.psi.PsiDocumentManager import com.intellij.ui.LightweightHint import com.intellij.util.SlowOperations import com.intellij.util.concurrency.annotations.RequiresEdt @@ -90,29 +84,7 @@ class InlayPresentationList( pointInsideInlay: Point, fontMetricsStorage: InlayTextMetricsStorage, ) { - val project = e.editor.project ?: return - val document = e.editor.document - val psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document) ?: return - val providerId = model.providerId - val providerInfo = InlayHintsProviderFactory.getProviderInfo(psiFile.language, providerId) ?: return - val providerName = providerInfo.providerName - - val inlayMenu: AnAction = ActionManager.getInstance().getAction("InlayMenu") - val inlayMenuActionGroup = inlayMenu as ActionGroup - val popupMenu = ActionManager.getInstance().createActionPopupMenu("InlayMenuPopup", inlayMenuActionGroup) - val dataContext = SimpleDataContext.builder() - .add(CommonDataKeys.PROJECT, project) - .add(CommonDataKeys.PSI_FILE, psiFile) - .add(CommonDataKeys.EDITOR, e.editor) - .add(InlayHintsProvider.PROVIDER_ID, providerId) - .add(InlayHintsProvider.PROVIDER_NAME, providerName) - .add(InlayHintsProvider.INLAY_PAYLOADS, model.payloads?.associate { it.payloadName to it.payload }) - .build() - popupMenu.setDataContext { - dataContext - } - - JBPopupMenu.showByEvent(e.mouseEvent, popupMenu.component) + service().invokeInlayMenu(model, e) } private val marginAndPadding: Pair get() = MARGIN_PADDING_BY_FORMAT[model.hintFormat.horizontalMarginPadding]!! @@ -279,4 +251,4 @@ private val MARGIN_PADDING_BY_FORMAT = enumMapOf +