Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/accessibility/browser/accessibleViewActions.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 { Codicon } from '../../../../base/common/codicons.js';
7
import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
8
import { Command, MultiCommand, ServicesAccessor } from '../../../../editor/browser/editorExtensions.js';
9
import { localize } from '../../../../nls.js';
10
import { Action2, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';
11
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
12
import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';
13
import { AccessibilityCommandId } from '../common/accessibilityCommands.js';
14
import { accessibilityHelpIsShown, accessibleViewContainsCodeBlocks, accessibleViewCurrentProviderId, accessibleViewGoToSymbolSupported, accessibleViewHasAssignedKeybindings, accessibleViewHasUnassignedKeybindings, accessibleViewIsShown, accessibleViewSupportsNavigation, accessibleViewVerbosityEnabled } from './accessibilityConfiguration.js';
15
import { AccessibleViewProviderId, IAccessibleViewService } from '../../../../platform/accessibility/browser/accessibleView.js';
16
import { ICodeEditorService } from '../../../../editor/browser/services/codeEditorService.js';
17
import { InlineCompletionsController } from '../../../../editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js';
18
19
const accessibleViewMenu = {
20
id: MenuId.AccessibleView,
21
group: 'navigation',
22
when: accessibleViewIsShown
23
};
24
const commandPalette = {
25
id: MenuId.CommandPalette,
26
group: '',
27
order: 1
28
};
29
class AccessibleViewNextAction extends Action2 {
30
constructor() {
31
super({
32
id: AccessibilityCommandId.ShowNext,
33
precondition: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewSupportsNavigation),
34
keybinding: {
35
primary: KeyMod.Alt | KeyCode.BracketRight,
36
weight: KeybindingWeight.WorkbenchContrib
37
},
38
menu: [
39
commandPalette,
40
{
41
...accessibleViewMenu,
42
when: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewSupportsNavigation),
43
}],
44
icon: Codicon.arrowDown,
45
title: localize('editor.action.accessibleViewNext', "Show Next in Accessible View")
46
});
47
}
48
run(accessor: ServicesAccessor): void {
49
accessor.get(IAccessibleViewService).next();
50
}
51
}
52
registerAction2(AccessibleViewNextAction);
53
54
55
class AccessibleViewNextCodeBlockAction extends Action2 {
56
constructor() {
57
super({
58
id: AccessibilityCommandId.NextCodeBlock,
59
precondition: ContextKeyExpr.and(accessibleViewContainsCodeBlocks, ContextKeyExpr.or(ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.PanelChat), ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.InlineChat), ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.QuickChat))),
60
keybinding: {
61
primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown,
62
mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown, },
63
weight: KeybindingWeight.WorkbenchContrib,
64
},
65
icon: Codicon.arrowRight,
66
menu:
67
{
68
...accessibleViewMenu,
69
when: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewContainsCodeBlocks),
70
},
71
title: localize('editor.action.accessibleViewNextCodeBlock', "Accessible View: Next Code Block")
72
});
73
}
74
run(accessor: ServicesAccessor): void {
75
accessor.get(IAccessibleViewService).navigateToCodeBlock('next');
76
}
77
}
78
registerAction2(AccessibleViewNextCodeBlockAction);
79
80
81
class AccessibleViewPreviousCodeBlockAction extends Action2 {
82
constructor() {
83
super({
84
id: AccessibilityCommandId.PreviousCodeBlock,
85
precondition: ContextKeyExpr.and(accessibleViewContainsCodeBlocks, ContextKeyExpr.or(ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.PanelChat), ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.InlineChat), ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.QuickChat))),
86
keybinding: {
87
primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp,
88
mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp, },
89
weight: KeybindingWeight.WorkbenchContrib,
90
},
91
icon: Codicon.arrowLeft,
92
menu: {
93
...accessibleViewMenu,
94
when: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewContainsCodeBlocks),
95
},
96
title: localize('editor.action.accessibleViewPreviousCodeBlock', "Accessible View: Previous Code Block")
97
});
98
}
99
run(accessor: ServicesAccessor): void {
100
accessor.get(IAccessibleViewService).navigateToCodeBlock('previous');
101
}
102
}
103
registerAction2(AccessibleViewPreviousCodeBlockAction);
104
105
class AccessibleViewPreviousAction extends Action2 {
106
constructor() {
107
super({
108
id: AccessibilityCommandId.ShowPrevious,
109
precondition: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewSupportsNavigation),
110
keybinding: {
111
primary: KeyMod.Alt | KeyCode.BracketLeft,
112
weight: KeybindingWeight.WorkbenchContrib
113
},
114
icon: Codicon.arrowUp,
115
menu: [
116
commandPalette,
117
{
118
...accessibleViewMenu,
119
when: ContextKeyExpr.and(accessibleViewIsShown, accessibleViewSupportsNavigation),
120
}
121
],
122
title: localize('editor.action.accessibleViewPrevious', "Show Previous in Accessible View")
123
});
124
}
125
run(accessor: ServicesAccessor): void {
126
accessor.get(IAccessibleViewService).previous();
127
}
128
}
129
registerAction2(AccessibleViewPreviousAction);
130
131
132
class AccessibleViewGoToSymbolAction extends Action2 {
133
constructor() {
134
super({
135
id: AccessibilityCommandId.GoToSymbol,
136
precondition: ContextKeyExpr.and(ContextKeyExpr.or(accessibleViewIsShown, accessibilityHelpIsShown), accessibleViewGoToSymbolSupported),
137
keybinding: {
138
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyO,
139
secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Period],
140
weight: KeybindingWeight.WorkbenchContrib + 10
141
},
142
icon: Codicon.symbolMisc,
143
menu: [
144
commandPalette,
145
{
146
...accessibleViewMenu,
147
when: ContextKeyExpr.and(ContextKeyExpr.or(accessibleViewIsShown, accessibilityHelpIsShown), accessibleViewGoToSymbolSupported),
148
}
149
],
150
title: localize('editor.action.accessibleViewGoToSymbol', "Go To Symbol in Accessible View")
151
});
152
}
153
run(accessor: ServicesAccessor): void {
154
accessor.get(IAccessibleViewService).goToSymbol();
155
}
156
}
157
registerAction2(AccessibleViewGoToSymbolAction);
158
159
function registerCommand<T extends Command>(command: T): T {
160
command.register();
161
return command;
162
}
163
164
export const AccessibilityHelpAction = registerCommand(new MultiCommand({
165
id: AccessibilityCommandId.OpenAccessibilityHelp,
166
precondition: undefined,
167
kbOpts: {
168
primary: KeyMod.Alt | KeyCode.F1,
169
weight: KeybindingWeight.WorkbenchContrib,
170
linux: {
171
primary: KeyMod.Alt | KeyMod.Shift | KeyCode.F1,
172
secondary: [KeyMod.Alt | KeyCode.F1]
173
},
174
kbExpr: accessibilityHelpIsShown.toNegated()
175
},
176
menuOpts: [{
177
menuId: MenuId.CommandPalette,
178
group: '',
179
title: localize('editor.action.accessibilityHelp', "Open Accessibility Help"),
180
order: 1
181
}],
182
}));
183
184
185
export const AccessibleViewAction = registerCommand(new MultiCommand({
186
id: AccessibilityCommandId.OpenAccessibleView,
187
precondition: undefined,
188
kbOpts: {
189
primary: KeyMod.Alt | KeyCode.F2,
190
weight: KeybindingWeight.WorkbenchContrib,
191
linux: {
192
primary: KeyMod.Alt | KeyMod.Shift | KeyCode.F2,
193
secondary: [KeyMod.Alt | KeyCode.F2]
194
}
195
},
196
menuOpts: [{
197
menuId: MenuId.CommandPalette,
198
group: '',
199
title: localize('editor.action.accessibleView', "Open Accessible View"),
200
order: 1
201
}],
202
}));
203
204
class AccessibleViewDisableHintAction extends Action2 {
205
constructor() {
206
super({
207
id: AccessibilityCommandId.DisableVerbosityHint,
208
precondition: ContextKeyExpr.and(ContextKeyExpr.or(accessibleViewIsShown, accessibilityHelpIsShown), accessibleViewVerbosityEnabled),
209
keybinding: {
210
primary: KeyMod.Alt | KeyCode.F6,
211
weight: KeybindingWeight.WorkbenchContrib
212
},
213
icon: Codicon.bellSlash,
214
menu: [
215
commandPalette,
216
{
217
id: MenuId.AccessibleView,
218
group: 'navigation',
219
when: ContextKeyExpr.and(ContextKeyExpr.or(accessibleViewIsShown, accessibilityHelpIsShown), accessibleViewVerbosityEnabled),
220
}
221
],
222
title: localize('editor.action.accessibleViewDisableHint', "Disable Accessible View Hint")
223
});
224
}
225
run(accessor: ServicesAccessor): void {
226
accessor.get(IAccessibleViewService).disableHint();
227
}
228
}
229
registerAction2(AccessibleViewDisableHintAction);
230
231
class AccessibilityHelpConfigureKeybindingsAction extends Action2 {
232
constructor() {
233
super({
234
id: AccessibilityCommandId.AccessibilityHelpConfigureKeybindings,
235
precondition: ContextKeyExpr.and(accessibilityHelpIsShown, accessibleViewHasUnassignedKeybindings),
236
icon: Codicon.recordKeys,
237
keybinding: {
238
primary: KeyMod.Alt | KeyCode.KeyK,
239
weight: KeybindingWeight.WorkbenchContrib
240
},
241
menu: [
242
{
243
id: MenuId.AccessibleView,
244
group: 'navigation',
245
order: 3,
246
when: accessibleViewHasUnassignedKeybindings,
247
}
248
],
249
title: localize('editor.action.accessibilityHelpConfigureUnassignedKeybindings', "Accessibility Help Configure Unassigned Keybindings")
250
});
251
}
252
async run(accessor: ServicesAccessor): Promise<void> {
253
await accessor.get(IAccessibleViewService).configureKeybindings(true);
254
}
255
}
256
registerAction2(AccessibilityHelpConfigureKeybindingsAction);
257
258
class AccessibilityHelpConfigureAssignedKeybindingsAction extends Action2 {
259
constructor() {
260
super({
261
id: AccessibilityCommandId.AccessibilityHelpConfigureAssignedKeybindings,
262
precondition: ContextKeyExpr.and(accessibilityHelpIsShown, accessibleViewHasAssignedKeybindings),
263
icon: Codicon.recordKeys,
264
keybinding: {
265
primary: KeyMod.Alt | KeyCode.KeyA,
266
weight: KeybindingWeight.WorkbenchContrib
267
},
268
menu: [
269
{
270
id: MenuId.AccessibleView,
271
group: 'navigation',
272
order: 4,
273
when: accessibleViewHasAssignedKeybindings,
274
}
275
],
276
title: localize('editor.action.accessibilityHelpConfigureAssignedKeybindings', "Accessibility Help Configure Assigned Keybindings")
277
});
278
}
279
async run(accessor: ServicesAccessor): Promise<void> {
280
await accessor.get(IAccessibleViewService).configureKeybindings(false);
281
}
282
}
283
registerAction2(AccessibilityHelpConfigureAssignedKeybindingsAction);
284
285
286
class AccessibilityHelpOpenHelpLinkAction extends Action2 {
287
constructor() {
288
super({
289
id: AccessibilityCommandId.AccessibilityHelpOpenHelpLink,
290
precondition: ContextKeyExpr.and(accessibilityHelpIsShown),
291
keybinding: {
292
primary: KeyMod.Alt | KeyCode.KeyH,
293
weight: KeybindingWeight.WorkbenchContrib
294
},
295
title: localize('editor.action.accessibilityHelpOpenHelpLink', "Accessibility Help Open Help Link")
296
});
297
}
298
run(accessor: ServicesAccessor): void {
299
accessor.get(IAccessibleViewService).openHelpLink();
300
}
301
}
302
registerAction2(AccessibilityHelpOpenHelpLinkAction);
303
304
class AccessibleViewAcceptInlineCompletionAction extends Action2 {
305
constructor() {
306
super({
307
id: AccessibilityCommandId.AccessibleViewAcceptInlineCompletion,
308
precondition: ContextKeyExpr.and(accessibleViewIsShown, ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.InlineCompletions)),
309
keybinding: {
310
primary: KeyMod.CtrlCmd | KeyCode.Slash,
311
mac: { primary: KeyMod.WinCtrl | KeyCode.Slash },
312
weight: KeybindingWeight.WorkbenchContrib
313
},
314
icon: Codicon.check,
315
menu: [
316
commandPalette,
317
{
318
id: MenuId.AccessibleView,
319
group: 'navigation',
320
order: 0,
321
when: ContextKeyExpr.and(accessibleViewIsShown, ContextKeyExpr.equals(accessibleViewCurrentProviderId.key, AccessibleViewProviderId.InlineCompletions))
322
}],
323
title: localize('editor.action.accessibleViewAcceptInlineCompletionAction', "Accept Inline Completion")
324
});
325
}
326
async run(accessor: ServicesAccessor): Promise<void> {
327
const codeEditorService = accessor.get(ICodeEditorService);
328
const editor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor();
329
if (!editor) {
330
return;
331
}
332
const model = InlineCompletionsController.get(editor)?.model.get();
333
const state = model?.state.get();
334
if (!model || !state) {
335
return;
336
}
337
await model.accept(editor);
338
model.stop();
339
editor.focus();
340
}
341
}
342
registerAction2(AccessibleViewAcceptInlineCompletionAction);
343
344
345