mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[declarative-inlays] IJPL-164727 extract mouse action handling to a service
GitOrigin-RevId: 9d0d3ff10864b373ead5b9e86898740dd36d779e
This commit is contained in:
committed by
intellij-monorepo-bot
parent
231a9d0bb6
commit
31d71a40b0
+62
@@ -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)
|
||||
}
|
||||
}
|
||||
+3
-8
@@ -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)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-31
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user