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
3296 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/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
94
95
const chatCommandInfo = getChatCommandInfo(this._keybindingService, this._contextKeyService);
96
if (chatCommandInfo) {
97
content.push(chatCommandInfo);
98
}
99
100
const commentCommandInfo = getCommentCommandInfo(this._keybindingService, this._contextKeyService, this._editor);
101
if (commentCommandInfo) {
102
content.push(commentCommandInfo);
103
}
104
105
content.push(AccessibilityHelpNLS.suggestActions);
106
content.push(AccessibilityHelpNLS.acceptSuggestAction);
107
content.push(AccessibilityHelpNLS.toggleSuggestionFocus);
108
109
if (options.get(EditorOption.stickyScroll).enabled) {
110
content.push(AccessibilityHelpNLS.stickScroll);
111
}
112
113
if (options.get(EditorOption.tabFocusMode)) {
114
content.push(AccessibilityHelpNLS.tabFocusModeOnMsg);
115
} else {
116
content.push(AccessibilityHelpNLS.tabFocusModeOffMsg);
117
}
118
content.push(AccessibilityHelpNLS.codeFolding);
119
content.push(AccessibilityHelpNLS.intellisense);
120
content.push(AccessibilityHelpNLS.showOrFocusHover);
121
content.push(AccessibilityHelpNLS.goToSymbol);
122
content.push(AccessibilityHelpNLS.startDebugging);
123
content.push(AccessibilityHelpNLS.setBreakpoint);
124
content.push(AccessibilityHelpNLS.debugExecuteSelection);
125
content.push(AccessibilityHelpNLS.addToWatch);
126
return content.join('\n');
127
}
128
}
129
130
export function getCommentCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined {
131
const editorContext = contextKeyService.getContext(editor.getDomNode()!);
132
if (editorContext.getValue<boolean>(CommentContextKeys.activeEditorHasCommentingRange.key)) {
133
return [CommentAccessibilityHelpNLS.intro, CommentAccessibilityHelpNLS.addComment, CommentAccessibilityHelpNLS.nextCommentThread, CommentAccessibilityHelpNLS.previousCommentThread, CommentAccessibilityHelpNLS.nextRange, CommentAccessibilityHelpNLS.previousRange].join('\n');
134
}
135
return;
136
}
137
138
export function getChatCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService): string | undefined {
139
if (ChatContextKeys.enabled.getValue(contextKeyService)) {
140
return [AccessibilityHelpNLS.quickChat, AccessibilityHelpNLS.startInlineChat].join('\n');
141
}
142
return;
143
}
144
145
export function getChatEditInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined {
146
const editorContext = contextKeyService.getContext(editor.getDomNode()!);
147
if (editorContext.getValue<boolean>(ctxHasEditorModification.key)) {
148
return AccessibilityHelpNLS.chatEditorModification + '\n' + AccessibilityHelpNLS.chatEditActions;
149
} else if (editorContext.getValue<boolean>(ctxHasRequestInProgress.key)) {
150
return AccessibilityHelpNLS.chatEditorRequestInProgress;
151
}
152
return;
153
}
154
155