diff --git a/platform/platform-impl/api-dump-experimental.txt b/platform/platform-impl/api-dump-experimental.txt index 576dddf20b79..bc32974eeaa2 100644 --- a/platform/platform-impl/api-dump-experimental.txt +++ b/platform/platform-impl/api-dump-experimental.txt @@ -4,6 +4,9 @@ - a:addDecorations(java.util.Collection):V - a:getHoveredHyperlink():com.intellij.execution.impl.HyperlinkDecoration - a:removeDecorations(java.util.Collection):V +*:com.intellij.execution.impl.EditorTextDecorationApplierBuilder +- a:getConsumeOnlyOnCtrlClick():Z +- a:setConsumeOnlyOnCtrlClick(Z):V *f:com.intellij.execution.impl.EditorTextDecorationApplierKt - *sf:buildHighlighting(com.intellij.execution.impl.EditorTextDecorationId,I,I,com.intellij.openapi.editor.markup.TextAttributes,kotlin.jvm.functions.Function1):com.intellij.execution.impl.HighlightingDecoration - *bs:buildHighlighting$default(com.intellij.execution.impl.EditorTextDecorationId,I,I,com.intellij.openapi.editor.markup.TextAttributes,kotlin.jvm.functions.Function1,I,java.lang.Object):com.intellij.execution.impl.HighlightingDecoration @@ -11,8 +14,8 @@ - *bs:buildHyperlink$default(com.intellij.execution.impl.EditorTextDecorationId,I,I,kotlin.jvm.functions.Function1,kotlin.jvm.functions.Function1,I,java.lang.Object):com.intellij.execution.impl.HyperlinkDecoration - *sf:buildInlay(com.intellij.execution.impl.EditorTextDecorationId,I,com.intellij.execution.impl.InlayProvider,kotlin.jvm.functions.Function1):com.intellij.execution.impl.InlayDecoration - *bs:buildInlay$default(com.intellij.execution.impl.EditorTextDecorationId,I,com.intellij.execution.impl.InlayProvider,kotlin.jvm.functions.Function1,I,java.lang.Object):com.intellij.execution.impl.InlayDecoration -- *sf:createEditorTextDecorationApplier(com.intellij.openapi.editor.ex.EditorEx,com.intellij.openapi.Disposable,Z):com.intellij.execution.impl.EditorTextDecorationApplier -- *bs:createEditorTextDecorationApplier$default(com.intellij.openapi.editor.ex.EditorEx,com.intellij.openapi.Disposable,Z,I,java.lang.Object):com.intellij.execution.impl.EditorTextDecorationApplier +- *sf:createEditorTextDecorationApplier(com.intellij.openapi.editor.ex.EditorEx,com.intellij.openapi.Disposable,kotlin.jvm.functions.Function1):com.intellij.execution.impl.EditorTextDecorationApplier +- *bs:createEditorTextDecorationApplier$default(com.intellij.openapi.editor.ex.EditorEx,com.intellij.openapi.Disposable,kotlin.jvm.functions.Function1,I,java.lang.Object):com.intellij.execution.impl.EditorTextDecorationApplier - *sf:createTextDecorationId(J):com.intellij.execution.impl.EditorTextDecorationId *:com.intellij.execution.impl.EditorTextDecorationId - java.lang.Comparable diff --git a/platform/platform-impl/src/com/intellij/execution/impl/EditorTextDecorationApplier.kt b/platform/platform-impl/src/com/intellij/execution/impl/EditorTextDecorationApplier.kt index f2e9839ad4dc..c42f0927fbb2 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/EditorTextDecorationApplier.kt +++ b/platform/platform-impl/src/com/intellij/execution/impl/EditorTextDecorationApplier.kt @@ -60,19 +60,43 @@ sealed interface EditorTextDecorationApplier { * Creates a new decoration applier for the given editor. * * A parent disposable ensures that the applier unsubscribes from the editor listeners. - * - * @param consumeOnlyOnCtrlClick if `true`, a hyperlink click only consumes the mouse - * event when the modifier key (Cmd on macOS, Ctrl elsewhere) is pressed. - * Plain click on a visible link won't consume the mouse event and it will reach other listeners. - * Defaults to `false` - consume the mouse event it was somehow handled (either open the link or show the hint). */ @ApiStatus.Experimental fun createEditorTextDecorationApplier( editor: EditorEx, parentDisposable: Disposable, - consumeOnlyOnCtrlClick: Boolean = false, -): EditorTextDecorationApplier = - EditorTextDecorationApplierImpl(editor, parentDisposable, consumeOnlyOnCtrlClick) + builder: (EditorTextDecorationApplierBuilder.() -> Unit)? = null, +): EditorTextDecorationApplier = EditorTextDecorationApplierBuilderImpl(editor, parentDisposable).run { + builder?.invoke(this) + build() +} + +/** + * A builder to set optional attributes of an [EditorTextDecorationApplier] being created. + * + * An instance of a builder is passed to the function passed to [createEditorTextDecorationApplier] as the last parameter. + */ +@ApiStatus.Experimental +sealed interface EditorTextDecorationApplierBuilder { + /** + * If `true`, a hyperlink click only consumes the mouse + * event when the modifier key (Cmd on macOS, Ctrl elsewhere) is pressed. + * Plain click on a visible link won't consume the mouse event and it will reach other listeners. + * Defaults to `false` - consume the mouse event if it was somehow handled (either open the link or show the hint). + */ + var consumeOnlyOnCtrlClick: Boolean +} + +private class EditorTextDecorationApplierBuilderImpl( + private val editor: EditorEx, + private val parentDisposable: Disposable, +) : EditorTextDecorationApplierBuilder { + override var consumeOnlyOnCtrlClick: Boolean = false + + fun build(): EditorTextDecorationApplier { + return EditorTextDecorationApplierImpl(editor, parentDisposable, consumeOnlyOnCtrlClick) + } +} /** The base interface for editor decorations. */ @ApiStatus.Experimental diff --git a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt index f90bd5de76dd..b07ae4c2995c 100644 --- a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt +++ b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt @@ -260,9 +260,9 @@ class TerminalViewImpl( // Should be created before "configureOutputEditor" is called where mouse reporting is configured (TerminalMouseEventsHandlerImpl). // To make mouse events first handled by hyperlinks logic and only then reported to the process. - val alternateBufferDecorationApplier = createEditorTextDecorationApplier( - alternateBufferEditor, coroutineScope.asDisposable(), consumeOnlyOnCtrlClick = true, - ) + val alternateBufferDecorationApplier = createEditorTextDecorationApplier(alternateBufferEditor, coroutineScope.asDisposable()) { + consumeOnlyOnCtrlClick = true + } configureOutputEditor( project, editor = alternateBufferEditor, @@ -315,9 +315,9 @@ class TerminalViewImpl( // Should be created before "configureOutputEditor" is called where mouse reporting is configured (TerminalMouseEventsHandlerImpl). // To make mouse events first handled by hyperlinks logic and only then reported to the process. - outputEditorDecorationApplier = createEditorTextDecorationApplier( - outputEditor, coroutineScope.asDisposable(), consumeOnlyOnCtrlClick = true, - ) + outputEditorDecorationApplier = createEditorTextDecorationApplier(outputEditor, coroutineScope.asDisposable()) { + consumeOnlyOnCtrlClick = true + } configureOutputEditor( project, editor = outputEditor, diff --git a/plugins/terminal/tests/src/com/intellij/terminal/tests/reworked/hyperlinks/TerminalHyperlinksProcessingTest.kt b/plugins/terminal/tests/src/com/intellij/terminal/tests/reworked/hyperlinks/TerminalHyperlinksProcessingTest.kt index cb864d963c96..8a90f2f604b8 100644 --- a/plugins/terminal/tests/src/com/intellij/terminal/tests/reworked/hyperlinks/TerminalHyperlinksProcessingTest.kt +++ b/plugins/terminal/tests/src/com/intellij/terminal/tests/reworked/hyperlinks/TerminalHyperlinksProcessingTest.kt @@ -649,7 +649,7 @@ internal class TerminalHyperlinksProcessingTest : BasePlatformTestCase() { private val hyperlinkFacade = installHyperlinksProcessing( project = project, outputModel = outputModel, - decorationApplier = createEditorTextDecorationApplier(editor, coroutineScope.asDisposable(), consumeOnlyOnCtrlClick = true), + decorationApplier = createEditorTextDecorationApplier(editor, coroutineScope.asDisposable()) { consumeOnlyOnCtrlClick = true }, sessionModel = createSessionModel(), eelDescriptor = LocalEelDescriptor, coroutineScope = coroutineScope.childScope("HyperlinksProcessing")