Path: blob/main/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts
4797 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 * as dom from '../../../../base/browser/dom.js';6import { ActionBar, IActionViewItemProvider } from '../../../../base/browser/ui/actionbar/actionbar.js';7import { IAction } from '../../../../base/common/actions.js';8import { DisposableStore } from '../../../../base/common/lifecycle.js';9import { MenuEntryActionViewItem, TextOnlyMenuEntryActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';10import { IMenuService, MenuId, MenuItemAction } from '../../../../platform/actions/common/actions.js';11import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';12import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';1314export interface ISuggestWidgetStatusOptions {15/**16* Whether to show icons instead of text where possible and avoid17* keybindings all together.18*/19readonly showIconsNoKeybindings?: boolean;20}2122export class SuggestWidgetStatus {2324readonly element: HTMLElement;2526private readonly _leftActions: ActionBar;27private readonly _rightActions: ActionBar;28private readonly _menuDisposables = new DisposableStore();2930constructor(31container: HTMLElement,32private readonly _menuId: MenuId,33options: ISuggestWidgetStatusOptions | undefined,34@IInstantiationService instantiationService: IInstantiationService,35@IMenuService private _menuService: IMenuService,36@IContextKeyService private _contextKeyService: IContextKeyService,37) {38this.element = dom.append(container, dom.$('.suggest-status-bar'));3940const actionViewItemProvider = <IActionViewItemProvider>(action => {41if (options?.showIconsNoKeybindings) {42return action instanceof MenuItemAction ? instantiationService.createInstance(MenuEntryActionViewItem, action, undefined) : undefined;43} else {44return action instanceof MenuItemAction ? instantiationService.createInstance(TextOnlyMenuEntryActionViewItem, action, { useComma: false }) : undefined;45}46});47this._leftActions = new ActionBar(this.element, { actionViewItemProvider });48this._rightActions = new ActionBar(this.element, { actionViewItemProvider });4950this._leftActions.domNode.classList.add('left');51this._rightActions.domNode.classList.add('right');52}5354dispose(): void {55this._menuDisposables.dispose();56this._leftActions.dispose();57this._rightActions.dispose();58this.element.remove();59}6061show(): void {62const menu = this._menuService.createMenu(this._menuId, this._contextKeyService);63const renderMenu = () => {64const left: IAction[] = [];65const right: IAction[] = [];66for (const [group, actions] of menu.getActions()) {67if (group === 'left') {68left.push(...actions);69} else {70right.push(...actions);71}72}73this._leftActions.clear();74this._leftActions.push(left);75this._rightActions.clear();76this._rightActions.push(right);77};78this._menuDisposables.add(menu.onDidChange(() => renderMenu()));79this._menuDisposables.add(menu);80}8182hide(): void {83this._menuDisposables.clear();84}85}868788