Path: blob/main/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.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 { Codicon } from '../../../../base/common/codicons.js';6import { localize, localize2 } from '../../../../nls.js';7import { Action2, MenuId, MenuRegistry, registerAction2 } from '../../../../platform/actions/common/actions.js';8import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';9import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';10import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';11import { alert } from '../../../../base/browser/ui/aria/aria.js';12import { AuxiliaryBarMaximizedContext, AuxiliaryBarVisibleContext, IsAuxiliaryWindowContext } from '../../../common/contextkeys.js';13import { ViewContainerLocation, ViewContainerLocationToString } from '../../../common/views.js';14import { ActivityBarPosition, IWorkbenchLayoutService, LayoutSettings, Parts } from '../../../services/layout/browser/layoutService.js';15import { IPaneCompositePartService } from '../../../services/panecomposite/browser/panecomposite.js';16import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';17import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';18import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';19import { SwitchCompositeViewAction } from '../compositeBarActions.js';20import { closeIcon as panelCloseIcon } from '../panel/panelActions.js';2122const maximizeIcon = registerIcon('auxiliarybar-maximize', Codicon.screenFull, localize('maximizeIcon', 'Icon to maximize the secondary side bar.'));23const closeIcon = registerIcon('auxiliarybar-close', panelCloseIcon, localize('closeIcon', 'Icon to close the secondary side bar.'));2425const auxiliaryBarRightIcon = registerIcon('auxiliarybar-right-layout-icon', Codicon.layoutSidebarRight, localize('toggleAuxiliaryIconRight', 'Icon to toggle the secondary side bar off in its right position.'));26const auxiliaryBarRightOffIcon = registerIcon('auxiliarybar-right-off-layout-icon', Codicon.layoutSidebarRightOff, localize('toggleAuxiliaryIconRightOn', 'Icon to toggle the secondary side bar on in its right position.'));27const auxiliaryBarLeftIcon = registerIcon('auxiliarybar-left-layout-icon', Codicon.layoutSidebarLeft, localize('toggleAuxiliaryIconLeft', 'Icon to toggle the secondary side bar in its left position.'));28const auxiliaryBarLeftOffIcon = registerIcon('auxiliarybar-left-off-layout-icon', Codicon.layoutSidebarLeftOff, localize('toggleAuxiliaryIconLeftOn', 'Icon to toggle the secondary side bar on in its left position.'));2930export class ToggleAuxiliaryBarAction extends Action2 {3132static readonly ID = 'workbench.action.toggleAuxiliaryBar';33static readonly LABEL = localize2('toggleAuxiliaryBar', "Toggle Secondary Side Bar Visibility");3435constructor() {36super({37id: ToggleAuxiliaryBarAction.ID,38title: ToggleAuxiliaryBarAction.LABEL,39toggled: {40condition: AuxiliaryBarVisibleContext,41title: localize('closeSecondarySideBar', 'Hide Secondary Side Bar'),42icon: closeIcon,43mnemonicTitle: localize({ key: 'miCloseSecondarySideBar', comment: ['&& denotes a mnemonic'] }, "&&Secondary Side Bar"),44},45icon: closeIcon,46category: Categories.View,47metadata: {48description: localize('openAndCloseAuxiliaryBar', 'Open/Show and Close/Hide Secondary Side Bar'),49},50f1: true,51keybinding: {52weight: KeybindingWeight.WorkbenchContrib,53primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KeyB54},55menu: [56{57id: MenuId.LayoutControlMenuSubmenu,58group: '0_workbench_layout',59order: 160},61{62id: MenuId.MenubarAppearanceMenu,63group: '2_workbench_layout',64order: 265}66]67});68}6970override async run(accessor: ServicesAccessor): Promise<void> {71const layoutService = accessor.get(IWorkbenchLayoutService);72const isCurrentlyVisible = layoutService.isVisible(Parts.AUXILIARYBAR_PART);7374layoutService.setPartHidden(isCurrentlyVisible, Parts.AUXILIARYBAR_PART);7576// Announce visibility change to screen readers77const alertMessage = isCurrentlyVisible78? localize('auxiliaryBarHidden', "Secondary Side Bar hidden")79: localize('auxiliaryBarVisible', "Secondary Side Bar shown");80alert(alertMessage);81}82}8384registerAction2(ToggleAuxiliaryBarAction);8586MenuRegistry.appendMenuItem(MenuId.AuxiliaryBarTitle, {87command: {88id: ToggleAuxiliaryBarAction.ID,89title: localize('closeSecondarySideBar', 'Hide Secondary Side Bar'),90icon: closeIcon91},92group: 'navigation',93order: 2,94when: ContextKeyExpr.equals(`config.${LayoutSettings.ACTIVITY_BAR_LOCATION}`, ActivityBarPosition.DEFAULT)95});9697registerAction2(class extends Action2 {98constructor() {99super({100id: 'workbench.action.closeAuxiliaryBar',101title: localize2('closeSecondarySideBar', 'Hide Secondary Side Bar'),102category: Categories.View,103precondition: AuxiliaryBarVisibleContext,104f1: true,105});106}107run(accessor: ServicesAccessor) {108accessor.get(IWorkbenchLayoutService).setPartHidden(true, Parts.AUXILIARYBAR_PART);109}110});111112registerAction2(class FocusAuxiliaryBarAction extends Action2 {113114static readonly ID = 'workbench.action.focusAuxiliaryBar';115static readonly LABEL = localize2('focusAuxiliaryBar', "Focus into Secondary Side Bar");116117constructor() {118super({119id: FocusAuxiliaryBarAction.ID,120title: FocusAuxiliaryBarAction.LABEL,121category: Categories.View,122f1: true,123});124}125126override async run(accessor: ServicesAccessor): Promise<void> {127const paneCompositeService = accessor.get(IPaneCompositePartService);128const layoutService = accessor.get(IWorkbenchLayoutService);129130// Show auxiliary bar131if (!layoutService.isVisible(Parts.AUXILIARYBAR_PART)) {132layoutService.setPartHidden(false, Parts.AUXILIARYBAR_PART);133}134135// Focus into active composite136const composite = paneCompositeService.getActivePaneComposite(ViewContainerLocation.AuxiliaryBar);137composite?.focus();138}139});140141MenuRegistry.appendMenuItems([142{143id: MenuId.LayoutControlMenu,144item: {145group: '2_pane_toggles',146command: {147id: ToggleAuxiliaryBarAction.ID,148title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"),149toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarLeftIcon },150icon: auxiliaryBarLeftOffIcon,151},152when: ContextKeyExpr.and(153IsAuxiliaryWindowContext.negate(),154ContextKeyExpr.or(155ContextKeyExpr.equals('config.workbench.layoutControl.type', 'toggles'),156ContextKeyExpr.equals('config.workbench.layoutControl.type', 'both')),157ContextKeyExpr.equals('config.workbench.sideBar.location', 'right')158),159order: 0160}161}, {162id: MenuId.LayoutControlMenu,163item: {164group: '2_pane_toggles',165command: {166id: ToggleAuxiliaryBarAction.ID,167title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"),168toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarRightIcon },169icon: auxiliaryBarRightOffIcon,170},171when: ContextKeyExpr.and(172IsAuxiliaryWindowContext.negate(),173ContextKeyExpr.or(174ContextKeyExpr.equals('config.workbench.layoutControl.type', 'toggles'),175ContextKeyExpr.equals('config.workbench.layoutControl.type', 'both')),176ContextKeyExpr.equals('config.workbench.sideBar.location', 'left')177),178order: 2179}180}, {181id: MenuId.ViewContainerTitleContext,182item: {183group: '3_workbench_layout_move',184command: {185id: ToggleAuxiliaryBarAction.ID,186title: localize2('hideAuxiliaryBar', 'Hide Secondary Side Bar'),187},188when: ContextKeyExpr.and(AuxiliaryBarVisibleContext, ContextKeyExpr.equals('viewContainerLocation', ViewContainerLocationToString(ViewContainerLocation.AuxiliaryBar))),189order: 2190}191}192]);193194registerAction2(class extends SwitchCompositeViewAction {195constructor() {196super({197id: 'workbench.action.previousAuxiliaryBarView',198title: localize2('previousAuxiliaryBarView', 'Previous Secondary Side Bar View'),199category: Categories.View,200f1: true201}, ViewContainerLocation.AuxiliaryBar, -1);202}203});204205registerAction2(class extends SwitchCompositeViewAction {206constructor() {207super({208id: 'workbench.action.nextAuxiliaryBarView',209title: localize2('nextAuxiliaryBarView', 'Next Secondary Side Bar View'),210category: Categories.View,211f1: true212}, ViewContainerLocation.AuxiliaryBar, 1);213}214});215216// --- Maximized Mode217218class MaximizeAuxiliaryBar extends Action2 {219220static readonly ID = 'workbench.action.maximizeAuxiliaryBar';221222constructor() {223super({224id: MaximizeAuxiliaryBar.ID,225title: localize2('maximizeAuxiliaryBar', 'Maximize Secondary Side Bar'),226tooltip: localize('maximizeAuxiliaryBarTooltip', "Maximize Secondary Side Bar Size"),227category: Categories.View,228f1: true,229precondition: AuxiliaryBarMaximizedContext.negate(),230icon: maximizeIcon,231menu: {232id: MenuId.AuxiliaryBarTitle,233group: 'navigation',234order: 1,235when: AuxiliaryBarMaximizedContext.negate()236}237});238}239240run(accessor: ServicesAccessor) {241const layoutService = accessor.get(IWorkbenchLayoutService);242243layoutService.setAuxiliaryBarMaximized(true);244}245}246registerAction2(MaximizeAuxiliaryBar);247248class RestoreAuxiliaryBar extends Action2 {249250static readonly ID = 'workbench.action.restoreAuxiliaryBar';251252constructor() {253super({254id: RestoreAuxiliaryBar.ID,255title: localize2('restoreAuxiliaryBar', 'Restore Secondary Side Bar'),256tooltip: localize('restoreAuxiliaryBarTooltip', "Restore Secondary Side Bar Size"),257category: Categories.View,258f1: true,259precondition: AuxiliaryBarMaximizedContext,260toggled: AuxiliaryBarMaximizedContext,261icon: maximizeIcon,262menu: {263id: MenuId.AuxiliaryBarTitle,264group: 'navigation',265order: 1,266when: AuxiliaryBarMaximizedContext267}268});269}270271run(accessor: ServicesAccessor) {272const layoutService = accessor.get(IWorkbenchLayoutService);273274layoutService.setAuxiliaryBarMaximized(false);275}276}277registerAction2(RestoreAuxiliaryBar);278279class ToggleMaximizedAuxiliaryBar extends Action2 {280281static readonly ID = 'workbench.action.toggleMaximizedAuxiliaryBar';282283constructor() {284super({285id: ToggleMaximizedAuxiliaryBar.ID,286title: localize2('toggleMaximizedAuxiliaryBar', 'Toggle Maximized Secondary Side Bar'),287f1: true,288category: Categories.View289});290}291292run(accessor: ServicesAccessor) {293const layoutService = accessor.get(IWorkbenchLayoutService);294295layoutService.toggleMaximizedAuxiliaryBar();296}297}298registerAction2(ToggleMaximizedAuxiliaryBar);299300301