[declarative-inlays] IJPL-164727 extract mouse action handling to a service

GitOrigin-RevId: 9d0d3ff10864b373ead5b9e86898740dd36d779e
This commit is contained in:
Vojtech Balik
2025-02-22 18:10:11 +00:00
committed by intellij-monorepo-bot
parent 231a9d0bb6
commit 31d71a40b0
4 changed files with 69 additions and 39 deletions
@@ -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<out InlayActionHandler>) {
InlayActionHandlerUsagesCollector.clickHandled(handlerId, handlerClass)
}
}
@@ -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<DeclarativeInlayActionService>().invokeActionHandler(actionData, e)
}
}
if (parentIndexToSwitch != (-1).toByte()) {
@@ -118,4 +113,4 @@ class TextInlayPresentationEntry(
override fun toString(): String {
return "TextInlayPresentationEntry(text='$text', parentIndexToSwitch=$parentIndexToSwitch)"
}
}
}
@@ -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<DeclarativeInlayActionService>().invokeInlayMenu(model, e)
}
private val marginAndPadding: Pair<Int, Int> get() = MARGIN_PADDING_BY_FORMAT[model.hintFormat.horizontalMarginPadding]!!
@@ -279,4 +251,4 @@ private val MARGIN_PADDING_BY_FORMAT = enumMapOf<HintMarginPadding, Pair<Int, In
}
private const val ARC_WIDTH = 8
private const val ARC_HEIGHT = 8
private const val BACKGROUND_ALPHA: Float = 0.55f
private const val BACKGROUND_ALPHA: Float = 0.55f
@@ -482,6 +482,7 @@
implementation="com.intellij.codeInsight.hints.declarative.impl.DeclarativeInlayHintsMouseMotionListener"/>
<highlightingPassFactory implementation="com.intellij.codeInsight.daemon.impl.InlayHintsPassFactoryInternal"/>
<highlightingPassFactory implementation="com.intellij.codeInsight.hints.declarative.impl.DeclarativeInlayHintsPassFactory"/>
<applicationService serviceImplementation="com.intellij.codeInsight.hints.declarative.impl.DeclarativeInlayActionService"/>
<projectConfigurable provider="com.intellij.codeInsight.hints.settings.InlaySettingsConfigurableProvider"
id="inlay.hints"