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