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