Path: blob/main/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts
5354 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';2021const maximizeIcon = registerIcon('auxiliarybar-maximize', Codicon.screenFull, localize('maximizeIcon', 'Icon to maximize the secondary side bar.'));22const closeIcon = registerIcon('auxiliarybar-close', Codicon.close, localize('closeIcon', 'Icon to close the secondary side bar.'));2324const auxiliaryBarRightIcon = registerIcon('auxiliarybar-right-layout-icon', Codicon.layoutSidebarRight, localize('toggleAuxiliaryIconRight', 'Icon to toggle the secondary side bar off in its right position.'));25const auxiliaryBarRightOffIcon = registerIcon('auxiliarybar-right-off-layout-icon', Codicon.layoutSidebarRightOff, localize('toggleAuxiliaryIconRightOn', 'Icon to toggle the secondary side bar on in its right position.'));26const auxiliaryBarLeftIcon = registerIcon('auxiliarybar-left-layout-icon', Codicon.layoutSidebarLeft, localize('toggleAuxiliaryIconLeft', 'Icon to toggle the secondary side bar in its left position.'));27const auxiliaryBarLeftOffIcon = registerIcon('auxiliarybar-left-off-layout-icon', Codicon.layoutSidebarLeftOff, localize('toggleAuxiliaryIconLeftOn', 'Icon to toggle the secondary side bar on in its left position.'));2829export class ToggleAuxiliaryBarAction extends Action2 {3031static readonly ID = 'workbench.action.toggleAuxiliaryBar';32static readonly LABEL = localize2('toggleAuxiliaryBar', "Toggle Secondary Side Bar Visibility");3334constructor() {35super({36id: ToggleAuxiliaryBarAction.ID,37title: ToggleAuxiliaryBarAction.LABEL,38toggled: {39condition: AuxiliaryBarVisibleContext,40title: localize('closeSecondarySideBar', 'Hide Secondary Side Bar'),41icon: closeIcon,42mnemonicTitle: localize({ key: 'miCloseSecondarySideBar', comment: ['&& denotes a mnemonic'] }, "&&Secondary Side Bar"),43},44icon: closeIcon,45category: Categories.View,46metadata: {47description: localize('openAndCloseAuxiliaryBar', 'Open/Show and Close/Hide Secondary Side Bar'),48},49f1: true,50keybinding: {51weight: KeybindingWeight.WorkbenchContrib,52primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KeyB53},54menu: [55{56id: MenuId.LayoutControlMenuSubmenu,57group: '0_workbench_layout',58order: 159},60{61id: MenuId.MenubarAppearanceMenu,62group: '2_workbench_layout',63order: 264}65]66});67}6869override async run(accessor: ServicesAccessor): Promise<void> {70const layoutService = accessor.get(IWorkbenchLayoutService);71const isCurrentlyVisible = layoutService.isVisible(Parts.AUXILIARYBAR_PART);7273layoutService.setPartHidden(isCurrentlyVisible, Parts.AUXILIARYBAR_PART);7475// Announce visibility change to screen readers76const alertMessage = isCurrentlyVisible77? localize('auxiliaryBarHidden', "Secondary Side Bar hidden")78: localize('auxiliaryBarVisible', "Secondary Side Bar shown");79alert(alertMessage);80}81}8283registerAction2(ToggleAuxiliaryBarAction);8485MenuRegistry.appendMenuItem(MenuId.AuxiliaryBarTitle, {86command: {87id: ToggleAuxiliaryBarAction.ID,88title: localize('closeSecondarySideBar', 'Hide Secondary Side Bar'),89icon: closeIcon90},91group: 'navigation',92order: 2,93when: ContextKeyExpr.equals(`config.${LayoutSettings.ACTIVITY_BAR_LOCATION}`, ActivityBarPosition.DEFAULT)94});9596registerAction2(class extends Action2 {97constructor() {98super({99id: 'workbench.action.closeAuxiliaryBar',100title: localize2('closeSecondarySideBar', 'Hide Secondary Side Bar'),101category: Categories.View,102precondition: AuxiliaryBarVisibleContext,103f1: true,104});105}106run(accessor: ServicesAccessor) {107accessor.get(IWorkbenchLayoutService).setPartHidden(true, Parts.AUXILIARYBAR_PART);108}109});110111registerAction2(class FocusAuxiliaryBarAction extends Action2 {112113static readonly ID = 'workbench.action.focusAuxiliaryBar';114static readonly LABEL = localize2('focusAuxiliaryBar', "Focus into Secondary Side Bar");115116constructor() {117super({118id: FocusAuxiliaryBarAction.ID,119title: FocusAuxiliaryBarAction.LABEL,120category: Categories.View,121f1: true,122});123}124125override async run(accessor: ServicesAccessor): Promise<void> {126const paneCompositeService = accessor.get(IPaneCompositePartService);127const layoutService = accessor.get(IWorkbenchLayoutService);128129// Show auxiliary bar130if (!layoutService.isVisible(Parts.AUXILIARYBAR_PART)) {131layoutService.setPartHidden(false, Parts.AUXILIARYBAR_PART);132}133134// Focus into active composite135const composite = paneCompositeService.getActivePaneComposite(ViewContainerLocation.AuxiliaryBar);136composite?.focus();137}138});139140MenuRegistry.appendMenuItems([141{142id: MenuId.LayoutControlMenu,143item: {144group: '2_pane_toggles',145command: {146id: ToggleAuxiliaryBarAction.ID,147title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"),148toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarLeftIcon },149icon: auxiliaryBarLeftOffIcon,150},151when: ContextKeyExpr.and(152IsAuxiliaryWindowContext.negate(),153ContextKeyExpr.or(154ContextKeyExpr.equals('config.workbench.layoutControl.type', 'toggles'),155ContextKeyExpr.equals('config.workbench.layoutControl.type', 'both')),156ContextKeyExpr.equals('config.workbench.sideBar.location', 'right')157),158order: 0159}160}, {161id: MenuId.LayoutControlMenu,162item: {163group: '2_pane_toggles',164command: {165id: ToggleAuxiliaryBarAction.ID,166title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"),167toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarRightIcon },168icon: auxiliaryBarRightOffIcon,169},170when: ContextKeyExpr.and(171IsAuxiliaryWindowContext.negate(),172ContextKeyExpr.or(173ContextKeyExpr.equals('config.workbench.layoutControl.type', 'toggles'),174ContextKeyExpr.equals('config.workbench.layoutControl.type', 'both')),175ContextKeyExpr.equals('config.workbench.sideBar.location', 'left')176),177order: 2178}179}, {180id: MenuId.ViewContainerTitleContext,181item: {182group: '3_workbench_layout_move',183command: {184id: ToggleAuxiliaryBarAction.ID,185title: localize2('hideAuxiliaryBar', 'Hide Secondary Side Bar'),186},187when: ContextKeyExpr.and(AuxiliaryBarVisibleContext, ContextKeyExpr.equals('viewContainerLocation', ViewContainerLocationToString(ViewContainerLocation.AuxiliaryBar))),188order: 2189}190}191]);192193registerAction2(class extends SwitchCompositeViewAction {194constructor() {195super({196id: 'workbench.action.previousAuxiliaryBarView',197title: localize2('previousAuxiliaryBarView', 'Previous Secondary Side Bar View'),198category: Categories.View,199f1: true200}, ViewContainerLocation.AuxiliaryBar, -1);201}202});203204registerAction2(class extends SwitchCompositeViewAction {205constructor() {206super({207id: 'workbench.action.nextAuxiliaryBarView',208title: localize2('nextAuxiliaryBarView', 'Next Secondary Side Bar View'),209category: Categories.View,210f1: true211}, ViewContainerLocation.AuxiliaryBar, 1);212}213});214215// --- Maximized Mode216217class MaximizeAuxiliaryBar extends Action2 {218219static readonly ID = 'workbench.action.maximizeAuxiliaryBar';220221constructor() {222super({223id: MaximizeAuxiliaryBar.ID,224title: localize2('maximizeAuxiliaryBar', 'Maximize Secondary Side Bar'),225tooltip: localize('maximizeAuxiliaryBarTooltip', "Maximize Secondary Side Bar"),226category: Categories.View,227f1: true,228precondition: AuxiliaryBarMaximizedContext.negate(),229});230}231232run(accessor: ServicesAccessor) {233const layoutService = accessor.get(IWorkbenchLayoutService);234235layoutService.setAuxiliaryBarMaximized(true);236}237}238registerAction2(MaximizeAuxiliaryBar);239240class RestoreAuxiliaryBar extends Action2 {241242static readonly ID = 'workbench.action.restoreAuxiliaryBar';243244constructor() {245super({246id: RestoreAuxiliaryBar.ID,247title: localize2('restoreAuxiliaryBar', 'Restore Secondary Side Bar'),248tooltip: localize('restoreAuxiliaryBar', 'Restore Secondary Side Bar'),249category: Categories.View,250f1: true,251precondition: AuxiliaryBarMaximizedContext,252keybinding: {253weight: KeybindingWeight.WorkbenchContrib,254primary: KeyMod.CtrlCmd | KeyCode.KeyW,255win: { primary: KeyMod.CtrlCmd | KeyCode.F4, secondary: [KeyMod.CtrlCmd | KeyCode.KeyW] },256}257});258}259260run(accessor: ServicesAccessor) {261const layoutService = accessor.get(IWorkbenchLayoutService);262263layoutService.setAuxiliaryBarMaximized(false);264}265}266registerAction2(RestoreAuxiliaryBar);267268class ToggleMaximizedAuxiliaryBar extends Action2 {269270static readonly ID = 'workbench.action.toggleMaximizedAuxiliaryBar';271272constructor() {273super({274id: ToggleMaximizedAuxiliaryBar.ID,275title: localize2('toggleMaximizedAuxiliaryBar', 'Toggle Maximized Secondary Side Bar'),276tooltip: localize('maximizeAuxiliaryBarTooltip2', "Maximize Secondary Side Bar"),277f1: true,278category: Categories.View,279icon: maximizeIcon,280toggled: {281condition: AuxiliaryBarMaximizedContext,282tooltip: localize('restoreAuxiliaryBar', 'Restore Secondary Side Bar'),283},284menu: {285id: MenuId.AuxiliaryBarTitle,286group: 'navigation',287order: 1,288}289});290}291292run(accessor: ServicesAccessor) {293const layoutService = accessor.get(IWorkbenchLayoutService);294295layoutService.toggleMaximizedAuxiliaryBar();296}297}298registerAction2(ToggleMaximizedAuxiliaryBar);299300301