From 9deb01df504be7108c8d2aa79aec5ebe3eefa5ef Mon Sep 17 00:00:00 2001 From: Aiday Marlen Kyzy Date: Fri, 12 Apr 2024 10:38:37 +0200 Subject: [PATCH] Extract hover actions and hover contribution point into separate files (#210219) * extracting actions into a separate file and contribution into a separate file * updating the imports of the hover controller * adding correct contribution point in editor.all.ts file --- .../colorPicker/browser/colorContributions.ts | 2 +- .../contrib/hover/browser/hoverActions.ts | 419 +++++++++++++++++ .../hover/browser/hoverContribution.ts | 38 ++ .../browser/{hover.ts => hoverController.ts} | 440 +----------------- .../browser/stickyScrollModelProvider.ts | 1 - src/vs/editor/editor.all.ts | 2 +- .../browser/accessibleViewContributions.ts | 2 +- .../contrib/chat/browser/chatInputPart.ts | 2 +- .../contrib/chat/browser/codeBlockPart.ts | 2 +- .../comments/browser/simpleCommentEditor.ts | 2 +- .../debug/browser/debugEditorContribution.ts | 2 +- .../interactive/browser/interactiveEditor.ts | 2 +- .../contrib/scm/browser/scmViewPane.ts | 2 +- 13 files changed, 468 insertions(+), 448 deletions(-) create mode 100644 src/vs/editor/contrib/hover/browser/hoverActions.ts create mode 100644 src/vs/editor/contrib/hover/browser/hoverContribution.ts rename src/vs/editor/contrib/hover/browser/{hover.ts => hoverController.ts} (51%) diff --git a/src/vs/editor/contrib/colorPicker/browser/colorContributions.ts b/src/vs/editor/contrib/colorPicker/browser/colorContributions.ts index d6ff1d4d2301..e7642a17e7dc 100644 --- a/src/vs/editor/contrib/colorPicker/browser/colorContributions.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorContributions.ts @@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ColorDecorationInjectedTextMarker } from 'vs/editor/contrib/colorPicker/browser/colorDetector'; import { ColorHoverParticipant } from 'vs/editor/contrib/colorPicker/browser/colorHoverParticipant'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; import { HoverStartMode, HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; diff --git a/src/vs/editor/contrib/hover/browser/hoverActions.ts b/src/vs/editor/contrib/hover/browser/hoverActions.ts new file mode 100644 index 000000000000..ef6b64e87d8a --- /dev/null +++ b/src/vs/editor/contrib/hover/browser/hoverActions.ts @@ -0,0 +1,419 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { Range } from 'vs/editor/common/core/range'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition'; +import { HoverStartMode, HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; +import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; +import * as nls from 'vs/nls'; +import 'vs/css!./hover'; + +enum HoverFocusBehavior { + NoAutoFocus = 'noAutoFocus', + FocusIfVisible = 'focusIfVisible', + AutoFocusImmediately = 'autoFocusImmediately' +} + +export class ShowOrFocusHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.showHover', + label: nls.localize({ + key: 'showOrFocusHover', + comment: [ + 'Label for action that will trigger the showing/focusing of a hover in the editor.', + 'If the hover is not visible, it will show the hover.', + 'This allows for users to show the hover without using the mouse.' + ] + }, "Show or Focus Hover"), + metadata: { + description: nls.localize2('showOrFocusHoverDescription', 'Show or focus the editor hover which shows documentation, references, and other content for a symbol at the current cursor position.'), + args: [{ + name: 'args', + schema: { + type: 'object', + properties: { + 'focus': { + description: 'Controls if and when the hover should take focus upon being triggered by this action.', + enum: [HoverFocusBehavior.NoAutoFocus, HoverFocusBehavior.FocusIfVisible, HoverFocusBehavior.AutoFocusImmediately], + enumDescriptions: [ + nls.localize('showOrFocusHover.focus.noAutoFocus', 'The hover will not automatically take focus.'), + nls.localize('showOrFocusHover.focus.focusIfVisible', 'The hover will take focus only if it is already visible.'), + nls.localize('showOrFocusHover.focus.autoFocusImmediately', 'The hover will automatically take focus when it appears.'), + ], + default: HoverFocusBehavior.FocusIfVisible, + } + }, + } + }] + }, + alias: 'Show or Focus Hover', + precondition: undefined, + kbOpts: { + kbExpr: EditorContextKeys.editorTextFocus, + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyI), + weight: KeybindingWeight.EditorContrib + } + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { + if (!editor.hasModel()) { + return; + } + + const controller = HoverController.get(editor); + if (!controller) { + return; + } + + const focusArgument = args?.focus; + let focusOption = HoverFocusBehavior.FocusIfVisible; + if (Object.values(HoverFocusBehavior).includes(focusArgument)) { + focusOption = focusArgument; + } else if (typeof focusArgument === 'boolean' && focusArgument) { + focusOption = HoverFocusBehavior.AutoFocusImmediately; + } + + const showContentHover = (focus: boolean) => { + const position = editor.getPosition(); + const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); + controller.showContentHover(range, HoverStartMode.Immediate, HoverStartSource.Keyboard, focus); + }; + + const accessibilitySupportEnabled = editor.getOption(EditorOption.accessibilitySupport) === AccessibilitySupport.Enabled; + + if (controller.isHoverVisible) { + if (focusOption !== HoverFocusBehavior.NoAutoFocus) { + controller.focus(); + } else { + showContentHover(accessibilitySupportEnabled); + } + } else { + showContentHover(accessibilitySupportEnabled || focusOption === HoverFocusBehavior.AutoFocusImmediately); + } + } +} + +export class ShowDefinitionPreviewHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.showDefinitionPreviewHover', + label: nls.localize({ + key: 'showDefinitionPreviewHover', + comment: [ + 'Label for action that will trigger the showing of definition preview hover in the editor.', + 'This allows for users to show the definition preview hover without using the mouse.' + ] + }, "Show Definition Preview Hover"), + alias: 'Show Definition Preview Hover', + precondition: undefined, + metadata: { + description: nls.localize2('showDefinitionPreviewHoverDescription', 'Show the definition preview hover in the editor.'), + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + const position = editor.getPosition(); + + if (!position) { + return; + } + + const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); + const goto = GotoDefinitionAtPositionEditorContribution.get(editor); + if (!goto) { + return; + } + + const promise = goto.startFindDefinitionFromCursor(position); + promise.then(() => { + controller.showContentHover(range, HoverStartMode.Immediate, HoverStartSource.Keyboard, true); + }); + } +} + +export class ScrollUpHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.scrollUpHover', + label: nls.localize({ + key: 'scrollUpHover', + comment: [ + 'Action that allows to scroll up in the hover widget with the up arrow when the hover widget is focused.' + ] + }, "Scroll Up Hover"), + alias: 'Scroll Up Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.UpArrow, + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('scrollUpHoverDescription', 'Scroll up the editor hover.') + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.scrollUp(); + } +} + +export class ScrollDownHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.scrollDownHover', + label: nls.localize({ + key: 'scrollDownHover', + comment: [ + 'Action that allows to scroll down in the hover widget with the up arrow when the hover widget is focused.' + ] + }, "Scroll Down Hover"), + alias: 'Scroll Down Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.DownArrow, + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('scrollDownHoverDescription', 'Scroll down the editor hover.'), + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.scrollDown(); + } +} + +export class ScrollLeftHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.scrollLeftHover', + label: nls.localize({ + key: 'scrollLeftHover', + comment: [ + 'Action that allows to scroll left in the hover widget with the left arrow when the hover widget is focused.' + ] + }, "Scroll Left Hover"), + alias: 'Scroll Left Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.LeftArrow, + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('scrollLeftHoverDescription', 'Scroll left the editor hover.'), + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.scrollLeft(); + } +} + +export class ScrollRightHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.scrollRightHover', + label: nls.localize({ + key: 'scrollRightHover', + comment: [ + 'Action that allows to scroll right in the hover widget with the right arrow when the hover widget is focused.' + ] + }, "Scroll Right Hover"), + alias: 'Scroll Right Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.RightArrow, + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('scrollRightHoverDescription', 'Scroll right the editor hover.') + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.scrollRight(); + } +} + +export class PageUpHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.pageUpHover', + label: nls.localize({ + key: 'pageUpHover', + comment: [ + 'Action that allows to page up in the hover widget with the page up command when the hover widget is focused.' + ] + }, "Page Up Hover"), + alias: 'Page Up Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.PageUp, + secondary: [KeyMod.Alt | KeyCode.UpArrow], + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('pageUpHoverDescription', 'Page up the editor hover.'), + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.pageUp(); + } +} + +export class PageDownHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.pageDownHover', + label: nls.localize({ + key: 'pageDownHover', + comment: [ + 'Action that allows to page down in the hover widget with the page down command when the hover widget is focused.' + ] + }, "Page Down Hover"), + alias: 'Page Down Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.PageDown, + secondary: [KeyMod.Alt | KeyCode.DownArrow], + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('pageDownHoverDescription', 'Page down the editor hover.'), + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.pageDown(); + } +} + +export class GoToTopHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.goToTopHover', + label: nls.localize({ + key: 'goToTopHover', + comment: [ + 'Action that allows to go to the top of the hover widget with the home command when the hover widget is focused.' + ] + }, "Go To Top Hover"), + alias: 'Go To Bottom Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.Home, + secondary: [KeyMod.CtrlCmd | KeyCode.UpArrow], + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('goToTopHoverDescription', 'Go to the top of the editor hover.'), + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.goToTop(); + } +} + + +export class GoToBottomHoverAction extends EditorAction { + + constructor() { + super({ + id: 'editor.action.goToBottomHover', + label: nls.localize({ + key: 'goToBottomHover', + comment: [ + 'Action that allows to go to the bottom in the hover widget with the end command when the hover widget is focused.' + ] + }, "Go To Bottom Hover"), + alias: 'Go To Bottom Hover', + precondition: EditorContextKeys.hoverFocused, + kbOpts: { + kbExpr: EditorContextKeys.hoverFocused, + primary: KeyCode.End, + secondary: [KeyMod.CtrlCmd | KeyCode.DownArrow], + weight: KeybindingWeight.EditorContrib + }, + metadata: { + description: nls.localize2('goToBottomHoverDescription', 'Go to the bottom of the editor hover.') + }, + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + const controller = HoverController.get(editor); + if (!controller) { + return; + } + controller.goToBottom(); + } +} diff --git a/src/vs/editor/contrib/hover/browser/hoverContribution.ts b/src/vs/editor/contrib/hover/browser/hoverContribution.ts new file mode 100644 index 000000000000..7bae393a8e01 --- /dev/null +++ b/src/vs/editor/contrib/hover/browser/hoverContribution.ts @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { GoToBottomHoverAction, GoToTopHoverAction, PageDownHoverAction, PageUpHoverAction, ScrollDownHoverAction, ScrollLeftHoverAction, ScrollRightHoverAction, ScrollUpHoverAction, ShowDefinitionPreviewHoverAction, ShowOrFocusHoverAction } from 'vs/editor/contrib/hover/browser/hoverActions'; +import { EditorContributionInstantiation, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; +import { editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; +import { MarkerHoverParticipant } from 'vs/editor/contrib/hover/browser/markerHoverParticipant'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; +import 'vs/css!./hover'; + +registerEditorContribution(HoverController.ID, HoverController, EditorContributionInstantiation.BeforeFirstInteraction); +registerEditorAction(ShowOrFocusHoverAction); +registerEditorAction(ShowDefinitionPreviewHoverAction); +registerEditorAction(ScrollUpHoverAction); +registerEditorAction(ScrollDownHoverAction); +registerEditorAction(ScrollLeftHoverAction); +registerEditorAction(ScrollRightHoverAction); +registerEditorAction(PageUpHoverAction); +registerEditorAction(PageDownHoverAction); +registerEditorAction(GoToTopHoverAction); +registerEditorAction(GoToBottomHoverAction); +HoverParticipantRegistry.register(MarkdownHoverParticipant); +HoverParticipantRegistry.register(MarkerHoverParticipant); + +// theming +registerThemingParticipant((theme, collector) => { + const hoverBorder = theme.getColor(editorHoverBorder); + if (hoverBorder) { + collector.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${hoverBorder.transparent(0.5)}; }`); + } +}); diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hoverController.ts similarity index 51% rename from src/vs/editor/contrib/hover/browser/hover.ts rename to src/vs/editor/contrib/hover/browser/hoverController.ts index 8c3c20de365b..65a40127778f 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hoverController.ts @@ -4,31 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor, IEditorMouseEvent, IPartialEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; -import { EditorAction, EditorContributionInstantiation, registerEditorAction, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution, IScrollEvent } from 'vs/editor/common/editorCommon'; -import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition'; import { HoverStartMode, HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; import { ContentHoverWidget, ContentHoverController } from 'vs/editor/contrib/hover/browser/contentHover'; import { MarginHoverWidget } from 'vs/editor/contrib/hover/browser/marginHover'; -import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { HoverParticipantRegistry, IHoverWidget } from 'vs/editor/contrib/hover/browser/hoverTypes'; -import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; -import { MarkerHoverParticipant } from 'vs/editor/contrib/hover/browser/markerHoverParticipant'; +import { IHoverWidget } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { InlineSuggestionHintsContentWidget } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ResultKind } from 'vs/platform/keybinding/common/keybindingResolver'; import { RunOnceScheduler } from 'vs/base/common/async'; -import * as nls from 'vs/nls'; import 'vs/css!./hover'; // sticky hover widget which doesn't disappear on focus out and such @@ -465,429 +455,3 @@ export class HoverController extends Disposable implements IEditorContribution { this._contentWidget?.dispose(); } } - -enum HoverFocusBehavior { - NoAutoFocus = 'noAutoFocus', - FocusIfVisible = 'focusIfVisible', - AutoFocusImmediately = 'autoFocusImmediately' -} - -class ShowOrFocusHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.showHover', - label: nls.localize({ - key: 'showOrFocusHover', - comment: [ - 'Label for action that will trigger the showing/focusing of a hover in the editor.', - 'If the hover is not visible, it will show the hover.', - 'This allows for users to show the hover without using the mouse.' - ] - }, "Show or Focus Hover"), - metadata: { - description: nls.localize2('showOrFocusHoverDescription', 'Show or focus the editor hover which shows documentation, references, and other content for a symbol at the current cursor position.'), - args: [{ - name: 'args', - schema: { - type: 'object', - properties: { - 'focus': { - description: 'Controls if and when the hover should take focus upon being triggered by this action.', - enum: [HoverFocusBehavior.NoAutoFocus, HoverFocusBehavior.FocusIfVisible, HoverFocusBehavior.AutoFocusImmediately], - enumDescriptions: [ - nls.localize('showOrFocusHover.focus.noAutoFocus', 'The hover will not automatically take focus.'), - nls.localize('showOrFocusHover.focus.focusIfVisible', 'The hover will take focus only if it is already visible.'), - nls.localize('showOrFocusHover.focus.autoFocusImmediately', 'The hover will automatically take focus when it appears.'), - ], - default: HoverFocusBehavior.FocusIfVisible, - } - }, - } - }] - }, - alias: 'Show or Focus Hover', - precondition: undefined, - kbOpts: { - kbExpr: EditorContextKeys.editorTextFocus, - primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyI), - weight: KeybindingWeight.EditorContrib - } - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { - if (!editor.hasModel()) { - return; - } - - const controller = HoverController.get(editor); - if (!controller) { - return; - } - - const focusArgument = args?.focus; - let focusOption = HoverFocusBehavior.FocusIfVisible; - if (Object.values(HoverFocusBehavior).includes(focusArgument)) { - focusOption = focusArgument; - } else if (typeof focusArgument === 'boolean' && focusArgument) { - focusOption = HoverFocusBehavior.AutoFocusImmediately; - } - - const showContentHover = (focus: boolean) => { - const position = editor.getPosition(); - const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); - controller.showContentHover(range, HoverStartMode.Immediate, HoverStartSource.Keyboard, focus); - }; - - const accessibilitySupportEnabled = editor.getOption(EditorOption.accessibilitySupport) === AccessibilitySupport.Enabled; - - if (controller.isHoverVisible) { - if (focusOption !== HoverFocusBehavior.NoAutoFocus) { - controller.focus(); - } else { - showContentHover(accessibilitySupportEnabled); - } - } else { - showContentHover(accessibilitySupportEnabled || focusOption === HoverFocusBehavior.AutoFocusImmediately); - } - } -} - -class ShowDefinitionPreviewHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.showDefinitionPreviewHover', - label: nls.localize({ - key: 'showDefinitionPreviewHover', - comment: [ - 'Label for action that will trigger the showing of definition preview hover in the editor.', - 'This allows for users to show the definition preview hover without using the mouse.' - ] - }, "Show Definition Preview Hover"), - alias: 'Show Definition Preview Hover', - precondition: undefined, - metadata: { - description: nls.localize2('showDefinitionPreviewHoverDescription', 'Show the definition preview hover in the editor.'), - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - const position = editor.getPosition(); - - if (!position) { - return; - } - - const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); - const goto = GotoDefinitionAtPositionEditorContribution.get(editor); - if (!goto) { - return; - } - - const promise = goto.startFindDefinitionFromCursor(position); - promise.then(() => { - controller.showContentHover(range, HoverStartMode.Immediate, HoverStartSource.Keyboard, true); - }); - } -} - -class ScrollUpHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.scrollUpHover', - label: nls.localize({ - key: 'scrollUpHover', - comment: [ - 'Action that allows to scroll up in the hover widget with the up arrow when the hover widget is focused.' - ] - }, "Scroll Up Hover"), - alias: 'Scroll Up Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.UpArrow, - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('scrollUpHoverDescription', 'Scroll up the editor hover.') - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.scrollUp(); - } -} - -class ScrollDownHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.scrollDownHover', - label: nls.localize({ - key: 'scrollDownHover', - comment: [ - 'Action that allows to scroll down in the hover widget with the up arrow when the hover widget is focused.' - ] - }, "Scroll Down Hover"), - alias: 'Scroll Down Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.DownArrow, - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('scrollDownHoverDescription', 'Scroll down the editor hover.'), - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.scrollDown(); - } -} - -class ScrollLeftHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.scrollLeftHover', - label: nls.localize({ - key: 'scrollLeftHover', - comment: [ - 'Action that allows to scroll left in the hover widget with the left arrow when the hover widget is focused.' - ] - }, "Scroll Left Hover"), - alias: 'Scroll Left Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.LeftArrow, - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('scrollLeftHoverDescription', 'Scroll left the editor hover.'), - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.scrollLeft(); - } -} - -class ScrollRightHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.scrollRightHover', - label: nls.localize({ - key: 'scrollRightHover', - comment: [ - 'Action that allows to scroll right in the hover widget with the right arrow when the hover widget is focused.' - ] - }, "Scroll Right Hover"), - alias: 'Scroll Right Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.RightArrow, - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('scrollRightHoverDescription', 'Scroll right the editor hover.') - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.scrollRight(); - } -} - -class PageUpHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.pageUpHover', - label: nls.localize({ - key: 'pageUpHover', - comment: [ - 'Action that allows to page up in the hover widget with the page up command when the hover widget is focused.' - ] - }, "Page Up Hover"), - alias: 'Page Up Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.PageUp, - secondary: [KeyMod.Alt | KeyCode.UpArrow], - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('pageUpHoverDescription', 'Page up the editor hover.'), - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.pageUp(); - } -} - - -class PageDownHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.pageDownHover', - label: nls.localize({ - key: 'pageDownHover', - comment: [ - 'Action that allows to page down in the hover widget with the page down command when the hover widget is focused.' - ] - }, "Page Down Hover"), - alias: 'Page Down Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.PageDown, - secondary: [KeyMod.Alt | KeyCode.DownArrow], - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('pageDownHoverDescription', 'Page down the editor hover.'), - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.pageDown(); - } -} - -class GoToTopHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.goToTopHover', - label: nls.localize({ - key: 'goToTopHover', - comment: [ - 'Action that allows to go to the top of the hover widget with the home command when the hover widget is focused.' - ] - }, "Go To Top Hover"), - alias: 'Go To Bottom Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.Home, - secondary: [KeyMod.CtrlCmd | KeyCode.UpArrow], - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('goToTopHoverDescription', 'Go to the top of the editor hover.'), - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.goToTop(); - } -} - - -class GoToBottomHoverAction extends EditorAction { - - constructor() { - super({ - id: 'editor.action.goToBottomHover', - label: nls.localize({ - key: 'goToBottomHover', - comment: [ - 'Action that allows to go to the bottom in the hover widget with the end command when the hover widget is focused.' - ] - }, "Go To Bottom Hover"), - alias: 'Go To Bottom Hover', - precondition: EditorContextKeys.hoverFocused, - kbOpts: { - kbExpr: EditorContextKeys.hoverFocused, - primary: KeyCode.End, - secondary: [KeyMod.CtrlCmd | KeyCode.DownArrow], - weight: KeybindingWeight.EditorContrib - }, - metadata: { - description: nls.localize2('goToBottomHoverDescription', 'Go to the bottom of the editor hover.') - }, - }); - } - - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const controller = HoverController.get(editor); - if (!controller) { - return; - } - controller.goToBottom(); - } -} - -registerEditorContribution(HoverController.ID, HoverController, EditorContributionInstantiation.BeforeFirstInteraction); -registerEditorAction(ShowOrFocusHoverAction); -registerEditorAction(ShowDefinitionPreviewHoverAction); -registerEditorAction(ScrollUpHoverAction); -registerEditorAction(ScrollDownHoverAction); -registerEditorAction(ScrollLeftHoverAction); -registerEditorAction(ScrollRightHoverAction); -registerEditorAction(PageUpHoverAction); -registerEditorAction(PageDownHoverAction); -registerEditorAction(GoToTopHoverAction); -registerEditorAction(GoToBottomHoverAction); -HoverParticipantRegistry.register(MarkdownHoverParticipant); -HoverParticipantRegistry.register(MarkerHoverParticipant); - -// theming -registerThemingParticipant((theme, collector) => { - const hoverBorder = theme.getColor(editorHoverBorder); - if (hoverBorder) { - collector.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); - collector.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); - collector.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${hoverBorder.transparent(0.5)}; }`); - } -}); diff --git a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollModelProvider.ts b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollModelProvider.ts index 48b0bf1d76b9..22cfdb013a7b 100644 --- a/src/vs/editor/contrib/stickyScroll/browser/stickyScrollModelProvider.ts +++ b/src/vs/editor/contrib/stickyScroll/browser/stickyScrollModelProvider.ts @@ -308,7 +308,6 @@ class StickyModelFromCandidateOutlineProvider extends StickyModelCandidateProvid return res; } } - } abstract class StickyModelFromCandidateFoldingProvider extends StickyModelCandidateProvider { diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index a84a6bdcb3f7..8c50e8dcf362 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -31,7 +31,7 @@ import 'vs/editor/contrib/inlineProgress/browser/inlineProgress'; import 'vs/editor/contrib/gotoSymbol/browser/goToCommands'; import 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition'; import 'vs/editor/contrib/gotoError/browser/gotoError'; -import 'vs/editor/contrib/hover/browser/hover'; +import 'vs/editor/contrib/hover/browser/hoverContribution'; import 'vs/editor/contrib/indentation/browser/indentation'; import 'vs/editor/contrib/inlayHints/browser/inlayHintsContribution'; import 'vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace'; diff --git a/src/vs/workbench/contrib/accessibility/browser/accessibleViewContributions.ts b/src/vs/workbench/contrib/accessibility/browser/accessibleViewContributions.ts index 30756d739840..5c5b9f413f3e 100644 --- a/src/vs/workbench/contrib/accessibility/browser/accessibleViewContributions.ts +++ b/src/vs/workbench/contrib/accessibility/browser/accessibleViewContributions.ts @@ -15,7 +15,6 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { AccessibilityVerbositySettingId, AccessibleViewProviderId, accessibleViewIsShown } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import * as strings from 'vs/base/common/strings'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { getNotificationFromContext } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; @@ -33,6 +32,7 @@ import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions import { InlineCompletionContextKeys } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { AccessibilitySignal, IAccessibilitySignalService } from 'vs/platform/accessibilitySignal/browser/accessibilitySignalService'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; export function descriptionForCommand(commandId: string, msg: string, noKbMsg: string, keybindingService: IKeybindingService): string { const kb = keybindingService.lookupKeybinding(commandId); diff --git a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts index a67a7826b040..211619b3336e 100644 --- a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts @@ -22,7 +22,7 @@ import { IDimension } from 'vs/editor/common/core/dimension'; import { IPosition } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; import { localize } from 'vs/nls'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; diff --git a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts index ac7e422821b9..4003af338f55 100644 --- a/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts +++ b/src/vs/workbench/contrib/chat/browser/codeBlockPart.ts @@ -24,7 +24,6 @@ import { IResolvedTextEditorModel, ITextModelContentProvider, ITextModelService import { BracketMatchingController } from 'vs/editor/contrib/bracketMatching/browser/bracketMatching'; import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; import { ViewportSemanticTokensContribution } from 'vs/editor/contrib/semanticTokens/browser/viewportSemanticTokens'; import { SmartSelectController } from 'vs/editor/contrib/smartSelect/browser/smartSelect'; import { WordHighlighterContribution } from 'vs/editor/contrib/wordHighlighter/browser/wordHighlighter'; @@ -50,6 +49,7 @@ import { ChatTreeItem } from 'vs/workbench/contrib/chat/browser/chat'; import { TextEdit } from 'vs/editor/common/languages'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; const $ = dom.$; diff --git a/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts b/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts index 157c6746b39a..bad0ff2cab0e 100644 --- a/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts +++ b/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts @@ -31,12 +31,12 @@ import { clamp } from 'vs/base/common/numbers'; import { CopyPasteController } from 'vs/editor/contrib/dropOrPasteInto/browser/copyPasteController'; import { CodeActionController } from 'vs/editor/contrib/codeAction/browser/codeActionController'; import { DropIntoEditorController } from 'vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController'; import { LinkDetector } from 'vs/editor/contrib/links/browser/links'; import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; import { MenuId } from 'vs/platform/actions/common/actions'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; export const ctxCommentEditorFocused = new RawContextKey('commentEditorFocused', false); export const MIN_EDITOR_HEIGHT = 5 * 18; diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts index 5fe8f03018c7..c13e82fd187d 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts @@ -36,7 +36,7 @@ import { IModelDeltaDecoration, ITextModel, InjectedTextCursorStops } from 'vs/e import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { IModelService } from 'vs/editor/common/services/model'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; import { HoverStartMode, HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation'; import * as nls from 'vs/nls'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index f73c8992ec27..ba994f540b6e 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -48,7 +48,6 @@ import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/con import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { TabCompletionController } from 'vs/workbench/contrib/snippets/browser/tabCompletion'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; import { MarkerController } from 'vs/editor/contrib/gotoError/browser/gotoError'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; @@ -63,6 +62,7 @@ import { INTERACTIVE_WINDOW_EDITOR_ID } from 'vs/workbench/contrib/notebook/comm import 'vs/css!./interactiveEditor'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { deepClone } from 'vs/base/common/objects'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; const DECORATION_KEY = 'interactiveInputDecoration'; const INTERACTIVE_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'InteractiveEditorViewState'; diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 81a523c81af7..21a67b91962f 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -58,7 +58,6 @@ import { compare, format } from 'vs/base/common/strings'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { HoverController } from 'vs/editor/contrib/hover/browser/hover'; import { ColorDetector } from 'vs/editor/contrib/colorPicker/browser/colorDetector'; import { LinkDetector } from 'vs/editor/contrib/links/browser/links'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -112,6 +111,7 @@ import { MarkdownString } from 'vs/base/common/htmlContent'; import type { IUpdatableHover, IUpdatableHoverTooltipMarkdownString } from 'vs/base/browser/ui/hover/hover'; import { IHoverService } from 'vs/platform/hover/browser/hover'; import { OpenScmGroupAction } from 'vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver'; +import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController'; // type SCMResourceTreeNode = IResourceNode; // type SCMHistoryItemChangeResourceTreeNode = IResourceNode;