Path: blob/main/src/vs/workbench/contrib/accessibility/browser/editorAccessibilityHelp.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Disposable } from '../../../../base/common/lifecycle.js';6import { ICodeEditor } from '../../../../editor/browser/editorBrowser.js';7import { ICodeEditorService } from '../../../../editor/browser/services/codeEditorService.js';8import { EditorOption } from '../../../../editor/common/config/editorOptions.js';9import { AccessibilityHelpNLS } from '../../../../editor/common/standaloneStrings.js';10import { ICommandService } from '../../../../platform/commands/common/commands.js';11import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';12import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';13import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';14import { AccessibilityHelpAction } from './accessibleViewActions.js';15import { ChatContextKeys } from '../../chat/common/chatContextKeys.js';16import { CommentAccessibilityHelpNLS } from '../../comments/browser/commentsAccessibility.js';17import { CommentContextKeys } from '../../comments/common/commentContextKeys.js';18import { NEW_UNTITLED_FILE_COMMAND_ID } from '../../files/browser/fileConstants.js';19import { IAccessibleViewService, IAccessibleViewContentProvider, AccessibleViewProviderId, IAccessibleViewOptions, AccessibleViewType } from '../../../../platform/accessibility/browser/accessibleView.js';20import { AccessibilityVerbositySettingId } from './accessibilityConfiguration.js';21import { ctxHasEditorModification, ctxHasRequestInProgress } from '../../chat/browser/chatEditing/chatEditingEditorContextKeys.js';22import { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';23import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';2425export class EditorAccessibilityHelpContribution extends Disposable {26static ID: 'editorAccessibilityHelpContribution';27constructor() {28super();29this._register(AccessibilityHelpAction.addImplementation(90, 'editor', async accessor => {30const codeEditorService = accessor.get(ICodeEditorService);31const accessibleViewService = accessor.get(IAccessibleViewService);32const instantiationService = accessor.get(IInstantiationService);33const commandService = accessor.get(ICommandService);34let codeEditor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor();35if (!codeEditor) {36await commandService.executeCommand(NEW_UNTITLED_FILE_COMMAND_ID);37codeEditor = codeEditorService.getActiveCodeEditor()!;38}39accessibleViewService.show(instantiationService.createInstance(EditorAccessibilityHelpProvider, codeEditor));40}));41}42}4344class EditorAccessibilityHelpProvider extends Disposable implements IAccessibleViewContentProvider {45id = AccessibleViewProviderId.Editor;46onClose() {47this._editor.focus();48}49options: IAccessibleViewOptions = { type: AccessibleViewType.Help, readMoreUrl: 'https://go.microsoft.com/fwlink/?linkid=851010' };50verbositySettingKey = AccessibilityVerbositySettingId.Editor;51constructor(52private readonly _editor: ICodeEditor,53@IKeybindingService private readonly _keybindingService: IKeybindingService,54@IContextKeyService private readonly _contextKeyService: IContextKeyService,55@IAccessibilityService private readonly accessibilityService: IAccessibilityService,56@IConfigurationService private readonly _configurationService: IConfigurationService,57) {58super();59}6061provideContent(): string {62const options = this._editor.getOptions();63const content = [];6465if (options.get(EditorOption.inDiffEditor)) {66if (options.get(EditorOption.readOnly)) {67content.push(AccessibilityHelpNLS.readonlyDiffEditor);68} else {69content.push(AccessibilityHelpNLS.editableDiffEditor);70}71} else {72if (options.get(EditorOption.readOnly)) {73content.push(AccessibilityHelpNLS.readonlyEditor);74} else {75content.push(AccessibilityHelpNLS.editableEditor);76}77}78if (this.accessibilityService.isScreenReaderOptimized() && this._configurationService.getValue('accessibility.windowTitleOptimized')) {79content.push(AccessibilityHelpNLS.defaultWindowTitleIncludesEditorState);80} else {81content.push(AccessibilityHelpNLS.defaultWindowTitleExcludingEditorState);82}83content.push(AccessibilityHelpNLS.toolbar);8485const chatEditInfo = getChatEditInfo(this._keybindingService, this._contextKeyService, this._editor);86if (chatEditInfo) {87content.push(chatEditInfo);88}8990content.push(AccessibilityHelpNLS.listSignalSounds);91content.push(AccessibilityHelpNLS.listAlerts);929394const chatCommandInfo = getChatCommandInfo(this._keybindingService, this._contextKeyService);95if (chatCommandInfo) {96content.push(chatCommandInfo);97}9899const commentCommandInfo = getCommentCommandInfo(this._keybindingService, this._contextKeyService, this._editor);100if (commentCommandInfo) {101content.push(commentCommandInfo);102}103104content.push(AccessibilityHelpNLS.suggestActions);105content.push(AccessibilityHelpNLS.acceptSuggestAction);106content.push(AccessibilityHelpNLS.toggleSuggestionFocus);107108if (options.get(EditorOption.stickyScroll).enabled) {109content.push(AccessibilityHelpNLS.stickScroll);110}111112if (options.get(EditorOption.tabFocusMode)) {113content.push(AccessibilityHelpNLS.tabFocusModeOnMsg);114} else {115content.push(AccessibilityHelpNLS.tabFocusModeOffMsg);116}117content.push(AccessibilityHelpNLS.codeFolding);118content.push(AccessibilityHelpNLS.intellisense);119content.push(AccessibilityHelpNLS.showOrFocusHover);120content.push(AccessibilityHelpNLS.goToSymbol);121content.push(AccessibilityHelpNLS.startDebugging);122content.push(AccessibilityHelpNLS.setBreakpoint);123content.push(AccessibilityHelpNLS.debugExecuteSelection);124content.push(AccessibilityHelpNLS.addToWatch);125return content.join('\n');126}127}128129export function getCommentCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined {130const editorContext = contextKeyService.getContext(editor.getDomNode()!);131if (editorContext.getValue<boolean>(CommentContextKeys.activeEditorHasCommentingRange.key)) {132return [CommentAccessibilityHelpNLS.intro, CommentAccessibilityHelpNLS.addComment, CommentAccessibilityHelpNLS.nextCommentThread, CommentAccessibilityHelpNLS.previousCommentThread, CommentAccessibilityHelpNLS.nextRange, CommentAccessibilityHelpNLS.previousRange].join('\n');133}134return;135}136137export function getChatCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService): string | undefined {138if (ChatContextKeys.enabled.getValue(contextKeyService)) {139return [AccessibilityHelpNLS.quickChat, AccessibilityHelpNLS.startInlineChat].join('\n');140}141return;142}143144export function getChatEditInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined {145const editorContext = contextKeyService.getContext(editor.getDomNode()!);146if (editorContext.getValue<boolean>(ctxHasEditorModification.key)) {147return AccessibilityHelpNLS.chatEditorModification + '\n' + AccessibilityHelpNLS.chatEditActions;148} else if (editorContext.getValue<boolean>(ctxHasRequestInProgress.key)) {149return AccessibilityHelpNLS.chatEditorRequestInProgress;150}151return;152}153154155