Path: blob/main/src/vs/workbench/contrib/accessibility/browser/editorAccessibilityHelp.ts
5248 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/actions/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);92content.push(AccessibilityHelpNLS.announceCursorPosition);939495const chatCommandInfo = getChatCommandInfo(this._keybindingService, this._contextKeyService);96if (chatCommandInfo) {97content.push(chatCommandInfo);98}99100const commentCommandInfo = getCommentCommandInfo(this._keybindingService, this._contextKeyService, this._editor);101if (commentCommandInfo) {102content.push(commentCommandInfo);103}104105content.push(AccessibilityHelpNLS.suggestActions);106content.push(AccessibilityHelpNLS.acceptSuggestAction);107content.push(AccessibilityHelpNLS.toggleSuggestionFocus);108109if (options.get(EditorOption.stickyScroll).enabled) {110content.push(AccessibilityHelpNLS.stickScroll);111}112113if (options.get(EditorOption.tabFocusMode)) {114content.push(AccessibilityHelpNLS.tabFocusModeOnMsg);115} else {116content.push(AccessibilityHelpNLS.tabFocusModeOffMsg);117}118content.push(AccessibilityHelpNLS.codeFolding);119content.push(AccessibilityHelpNLS.intellisense);120content.push(AccessibilityHelpNLS.showOrFocusHover);121content.push(AccessibilityHelpNLS.goToSymbol);122content.push(AccessibilityHelpNLS.startDebugging);123content.push(AccessibilityHelpNLS.setBreakpoint);124content.push(AccessibilityHelpNLS.debugExecuteSelection);125content.push(AccessibilityHelpNLS.addToWatch);126return content.join('\n');127}128}129130export function getCommentCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined {131const editorContext = contextKeyService.getContext(editor.getDomNode()!);132if (editorContext.getValue<boolean>(CommentContextKeys.activeEditorHasCommentingRange.key)) {133return [CommentAccessibilityHelpNLS.intro, CommentAccessibilityHelpNLS.addComment, CommentAccessibilityHelpNLS.nextCommentThread, CommentAccessibilityHelpNLS.previousCommentThread, CommentAccessibilityHelpNLS.nextRange, CommentAccessibilityHelpNLS.previousRange].join('\n');134}135return;136}137138export function getChatCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService): string | undefined {139if (ChatContextKeys.enabled.getValue(contextKeyService)) {140return [AccessibilityHelpNLS.quickChat, AccessibilityHelpNLS.startInlineChat].join('\n');141}142return;143}144145export function getChatEditInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined {146const editorContext = contextKeyService.getContext(editor.getDomNode()!);147if (editorContext.getValue<boolean>(ctxHasEditorModification.key)) {148return AccessibilityHelpNLS.chatEditorModification + '\n' + AccessibilityHelpNLS.chatEditActions;149} else if (editorContext.getValue<boolean>(ctxHasRequestInProgress.key)) {150return AccessibilityHelpNLS.chatEditorRequestInProgress;151}152return;153}154155156