Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/accessibility/browser/extensionAccesibilityHelp.contribution.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 { DisposableMap, IDisposable, DisposableStore, Disposable } from '../../../../base/common/lifecycle.js';
7
import { ServicesAccessor } from '../../../../editor/browser/editorExtensions.js';
8
import { AccessibleViewType, ExtensionContentProvider } from '../../../../platform/accessibility/browser/accessibleView.js';
9
import { AccessibleViewRegistry } from '../../../../platform/accessibility/browser/accessibleViewRegistry.js';
10
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
11
import { Registry } from '../../../../platform/registry/common/platform.js';
12
import { FocusedViewContext } from '../../../common/contextkeys.js';
13
import { IViewsRegistry, Extensions, IViewDescriptor } from '../../../common/views.js';
14
import { IViewsService } from '../../../services/views/common/viewsService.js';
15
16
export class ExtensionAccessibilityHelpDialogContribution extends Disposable {
17
static ID = 'extensionAccessibilityHelpDialogContribution';
18
private _viewHelpDialogMap = this._register(new DisposableMap<string, IDisposable>());
19
constructor(@IKeybindingService keybindingService: IKeybindingService) {
20
super();
21
this._register(Registry.as<IViewsRegistry>(Extensions.ViewsRegistry).onViewsRegistered(e => {
22
for (const view of e) {
23
for (const viewDescriptor of view.views) {
24
if (viewDescriptor.accessibilityHelpContent) {
25
this._viewHelpDialogMap.set(viewDescriptor.id, registerAccessibilityHelpAction(keybindingService, viewDescriptor));
26
}
27
}
28
}
29
}));
30
this._register(Registry.as<IViewsRegistry>(Extensions.ViewsRegistry).onViewsDeregistered(e => {
31
for (const viewDescriptor of e.views) {
32
if (viewDescriptor.accessibilityHelpContent) {
33
this._viewHelpDialogMap.get(viewDescriptor.id)?.dispose();
34
}
35
}
36
}));
37
}
38
}
39
40
function registerAccessibilityHelpAction(keybindingService: IKeybindingService, viewDescriptor: IViewDescriptor): IDisposable {
41
const disposableStore = new DisposableStore();
42
const content = viewDescriptor.accessibilityHelpContent?.value;
43
if (!content) {
44
throw new Error('No content provided for the accessibility help dialog');
45
}
46
disposableStore.add(AccessibleViewRegistry.register({
47
priority: 95,
48
name: viewDescriptor.id,
49
type: AccessibleViewType.Help,
50
when: FocusedViewContext.isEqualTo(viewDescriptor.id),
51
getProvider: (accessor: ServicesAccessor) => {
52
const viewsService = accessor.get(IViewsService);
53
return new ExtensionContentProvider(
54
viewDescriptor.id,
55
{ type: AccessibleViewType.Help },
56
() => content,
57
() => viewsService.openView(viewDescriptor.id, true),
58
);
59
},
60
}));
61
62
disposableStore.add(keybindingService.onDidUpdateKeybindings(() => {
63
disposableStore.clear();
64
disposableStore.add(registerAccessibilityHelpAction(keybindingService, viewDescriptor));
65
}));
66
return disposableStore;
67
}
68
69