UNPKG

monaco-editor

Version:
138 lines (137 loc) 7 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { ActionBar } from '../actionbar/actionbar.js'; import { DropdownMenuActionViewItem } from '../dropdown/dropdownActionViewItem.js'; import { Action, SubmenuAction } from '../../../common/actions.js'; import { Codicon } from '../../../common/codicons.js'; import { ThemeIcon } from '../../../common/themables.js'; import { EventMultiplexer } from '../../../common/event.js'; import { Disposable, DisposableStore } from '../../../common/lifecycle.js'; import './toolbar.css'; import * as nls from '../../../../nls.js'; /** * A widget that combines an action bar for primary actions and a dropdown for secondary actions. */ export class ToolBar extends Disposable { constructor(container, contextMenuProvider, options = { orientation: 0 /* ActionsOrientation.HORIZONTAL */ }) { super(); this.submenuActionViewItems = []; this.hasSecondaryActions = false; this._onDidChangeDropdownVisibility = this._register(new EventMultiplexer()); this.onDidChangeDropdownVisibility = this._onDidChangeDropdownVisibility.event; this.disposables = this._register(new DisposableStore()); this.options = options; this.lookupKeybindings = typeof this.options.getKeyBinding === 'function'; this.toggleMenuAction = this._register(new ToggleMenuAction(() => { var _a; return (_a = this.toggleMenuActionViewItem) === null || _a === void 0 ? void 0 : _a.show(); }, options.toggleMenuTitle)); this.element = document.createElement('div'); this.element.className = 'monaco-toolbar'; container.appendChild(this.element); this.actionBar = this._register(new ActionBar(this.element, { orientation: options.orientation, ariaLabel: options.ariaLabel, actionRunner: options.actionRunner, allowContextMenu: options.allowContextMenu, highlightToggledItems: options.highlightToggledItems, actionViewItemProvider: (action, viewItemOptions) => { var _a; if (action.id === ToggleMenuAction.ID) { this.toggleMenuActionViewItem = new DropdownMenuActionViewItem(action, action.menuActions, contextMenuProvider, { actionViewItemProvider: this.options.actionViewItemProvider, actionRunner: this.actionRunner, keybindingProvider: this.options.getKeyBinding, classNames: ThemeIcon.asClassNameArray((_a = options.moreIcon) !== null && _a !== void 0 ? _a : Codicon.toolBarMore), anchorAlignmentProvider: this.options.anchorAlignmentProvider, menuAsChild: !!this.options.renderDropdownAsChildElement, skipTelemetry: this.options.skipTelemetry, isMenu: true }); this.toggleMenuActionViewItem.setActionContext(this.actionBar.context); this.disposables.add(this._onDidChangeDropdownVisibility.add(this.toggleMenuActionViewItem.onDidChangeVisibility)); return this.toggleMenuActionViewItem; } if (options.actionViewItemProvider) { const result = options.actionViewItemProvider(action, viewItemOptions); if (result) { return result; } } if (action instanceof SubmenuAction) { const result = new DropdownMenuActionViewItem(action, action.actions, contextMenuProvider, { actionViewItemProvider: this.options.actionViewItemProvider, actionRunner: this.actionRunner, keybindingProvider: this.options.getKeyBinding, classNames: action.class, anchorAlignmentProvider: this.options.anchorAlignmentProvider, menuAsChild: !!this.options.renderDropdownAsChildElement, skipTelemetry: this.options.skipTelemetry }); result.setActionContext(this.actionBar.context); this.submenuActionViewItems.push(result); this.disposables.add(this._onDidChangeDropdownVisibility.add(result.onDidChangeVisibility)); return result; } return undefined; } })); } set actionRunner(actionRunner) { this.actionBar.actionRunner = actionRunner; } get actionRunner() { return this.actionBar.actionRunner; } getElement() { return this.element; } getItemAction(indexOrElement) { return this.actionBar.getAction(indexOrElement); } setActions(primaryActions, secondaryActions) { this.clear(); const primaryActionsToSet = primaryActions ? primaryActions.slice(0) : []; // Inject additional action to open secondary actions if present this.hasSecondaryActions = !!(secondaryActions && secondaryActions.length > 0); if (this.hasSecondaryActions && secondaryActions) { this.toggleMenuAction.menuActions = secondaryActions.slice(0); primaryActionsToSet.push(this.toggleMenuAction); } primaryActionsToSet.forEach(action => { this.actionBar.push(action, { icon: true, label: false, keybinding: this.getKeybindingLabel(action) }); }); } getKeybindingLabel(action) { var _a, _b, _c; const key = this.lookupKeybindings ? (_b = (_a = this.options).getKeyBinding) === null || _b === void 0 ? void 0 : _b.call(_a, action) : undefined; return (_c = key === null || key === void 0 ? void 0 : key.getLabel()) !== null && _c !== void 0 ? _c : undefined; } clear() { this.submenuActionViewItems = []; this.disposables.clear(); this.actionBar.clear(); } dispose() { this.clear(); this.disposables.dispose(); super.dispose(); } } export class ToggleMenuAction extends Action { constructor(toggleDropdownMenu, title) { title = title || nls.localize('moreActions', "More Actions..."); super(ToggleMenuAction.ID, title, undefined, true); this._menuActions = []; this.toggleDropdownMenu = toggleDropdownMenu; } async run() { this.toggleDropdownMenu(); } get menuActions() { return this._menuActions; } set menuActions(actions) { this._menuActions = actions; } } ToggleMenuAction.ID = 'toolbar.toggle.more';