Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Codicon } from '../../../../base/common/codicons.js';
7
import { localize, localize2 } from '../../../../nls.js';
8
import { Action2, MenuId, MenuRegistry, registerAction2 } from '../../../../platform/actions/common/actions.js';
9
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
10
import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';
11
import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';
12
import { alert } from '../../../../base/browser/ui/aria/aria.js';
13
import { AuxiliaryBarMaximizedContext, AuxiliaryBarVisibleContext, IsAuxiliaryWindowContext } from '../../../common/contextkeys.js';
14
import { ViewContainerLocation, ViewContainerLocationToString } from '../../../common/views.js';
15
import { ActivityBarPosition, IWorkbenchLayoutService, LayoutSettings, Parts } from '../../../services/layout/browser/layoutService.js';
16
import { IPaneCompositePartService } from '../../../services/panecomposite/browser/panecomposite.js';
17
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
18
import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';
19
import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
20
import { SwitchCompositeViewAction } from '../compositeBarActions.js';
21
import { closeIcon as panelCloseIcon } from '../panel/panelActions.js';
22
23
const maximizeIcon = registerIcon('auxiliarybar-maximize', Codicon.screenFull, localize('maximizeIcon', 'Icon to maximize the secondary side bar.'));
24
const closeIcon = registerIcon('auxiliarybar-close', panelCloseIcon, localize('closeIcon', 'Icon to close the secondary side bar.'));
25
26
const auxiliaryBarRightIcon = registerIcon('auxiliarybar-right-layout-icon', Codicon.layoutSidebarRight, localize('toggleAuxiliaryIconRight', 'Icon to toggle the secondary side bar off in its right position.'));
27
const auxiliaryBarRightOffIcon = registerIcon('auxiliarybar-right-off-layout-icon', Codicon.layoutSidebarRightOff, localize('toggleAuxiliaryIconRightOn', 'Icon to toggle the secondary side bar on in its right position.'));
28
const auxiliaryBarLeftIcon = registerIcon('auxiliarybar-left-layout-icon', Codicon.layoutSidebarLeft, localize('toggleAuxiliaryIconLeft', 'Icon to toggle the secondary side bar in its left position.'));
29
const auxiliaryBarLeftOffIcon = registerIcon('auxiliarybar-left-off-layout-icon', Codicon.layoutSidebarLeftOff, localize('toggleAuxiliaryIconLeftOn', 'Icon to toggle the secondary side bar on in its left position.'));
30
31
export class ToggleAuxiliaryBarAction extends Action2 {
32
33
static readonly ID = 'workbench.action.toggleAuxiliaryBar';
34
static readonly LABEL = localize2('toggleAuxiliaryBar', "Toggle Secondary Side Bar Visibility");
35
36
constructor() {
37
super({
38
id: ToggleAuxiliaryBarAction.ID,
39
title: ToggleAuxiliaryBarAction.LABEL,
40
toggled: {
41
condition: AuxiliaryBarVisibleContext,
42
title: localize('closeSecondarySideBar', 'Hide Secondary Side Bar'),
43
icon: closeIcon,
44
mnemonicTitle: localize({ key: 'miCloseSecondarySideBar', comment: ['&& denotes a mnemonic'] }, "&&Secondary Side Bar"),
45
},
46
icon: closeIcon,
47
category: Categories.View,
48
metadata: {
49
description: localize('openAndCloseAuxiliaryBar', 'Open/Show and Close/Hide Secondary Side Bar'),
50
},
51
f1: true,
52
keybinding: {
53
weight: KeybindingWeight.WorkbenchContrib,
54
primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KeyB
55
},
56
menu: [
57
{
58
id: MenuId.LayoutControlMenuSubmenu,
59
group: '0_workbench_layout',
60
order: 1
61
},
62
{
63
id: MenuId.MenubarAppearanceMenu,
64
group: '2_workbench_layout',
65
order: 2
66
}
67
]
68
});
69
}
70
71
override async run(accessor: ServicesAccessor): Promise<void> {
72
const layoutService = accessor.get(IWorkbenchLayoutService);
73
const isCurrentlyVisible = layoutService.isVisible(Parts.AUXILIARYBAR_PART);
74
75
layoutService.setPartHidden(isCurrentlyVisible, Parts.AUXILIARYBAR_PART);
76
77
// Announce visibility change to screen readers
78
const alertMessage = isCurrentlyVisible
79
? localize('auxiliaryBarHidden', "Secondary Side Bar hidden")
80
: localize('auxiliaryBarVisible', "Secondary Side Bar shown");
81
alert(alertMessage);
82
}
83
}
84
85
registerAction2(ToggleAuxiliaryBarAction);
86
87
MenuRegistry.appendMenuItem(MenuId.AuxiliaryBarTitle, {
88
command: {
89
id: ToggleAuxiliaryBarAction.ID,
90
title: localize('closeSecondarySideBar', 'Hide Secondary Side Bar'),
91
icon: closeIcon
92
},
93
group: 'navigation',
94
order: 2,
95
when: ContextKeyExpr.equals(`config.${LayoutSettings.ACTIVITY_BAR_LOCATION}`, ActivityBarPosition.DEFAULT)
96
});
97
98
registerAction2(class extends Action2 {
99
constructor() {
100
super({
101
id: 'workbench.action.closeAuxiliaryBar',
102
title: localize2('closeSecondarySideBar', 'Hide Secondary Side Bar'),
103
category: Categories.View,
104
precondition: AuxiliaryBarVisibleContext,
105
f1: true,
106
});
107
}
108
run(accessor: ServicesAccessor) {
109
accessor.get(IWorkbenchLayoutService).setPartHidden(true, Parts.AUXILIARYBAR_PART);
110
}
111
});
112
113
registerAction2(class FocusAuxiliaryBarAction extends Action2 {
114
115
static readonly ID = 'workbench.action.focusAuxiliaryBar';
116
static readonly LABEL = localize2('focusAuxiliaryBar', "Focus into Secondary Side Bar");
117
118
constructor() {
119
super({
120
id: FocusAuxiliaryBarAction.ID,
121
title: FocusAuxiliaryBarAction.LABEL,
122
category: Categories.View,
123
f1: true,
124
});
125
}
126
127
override async run(accessor: ServicesAccessor): Promise<void> {
128
const paneCompositeService = accessor.get(IPaneCompositePartService);
129
const layoutService = accessor.get(IWorkbenchLayoutService);
130
131
// Show auxiliary bar
132
if (!layoutService.isVisible(Parts.AUXILIARYBAR_PART)) {
133
layoutService.setPartHidden(false, Parts.AUXILIARYBAR_PART);
134
}
135
136
// Focus into active composite
137
const composite = paneCompositeService.getActivePaneComposite(ViewContainerLocation.AuxiliaryBar);
138
composite?.focus();
139
}
140
});
141
142
MenuRegistry.appendMenuItems([
143
{
144
id: MenuId.LayoutControlMenu,
145
item: {
146
group: '2_pane_toggles',
147
command: {
148
id: ToggleAuxiliaryBarAction.ID,
149
title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"),
150
toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarLeftIcon },
151
icon: auxiliaryBarLeftOffIcon,
152
},
153
when: ContextKeyExpr.and(
154
IsAuxiliaryWindowContext.negate(),
155
ContextKeyExpr.or(
156
ContextKeyExpr.equals('config.workbench.layoutControl.type', 'toggles'),
157
ContextKeyExpr.equals('config.workbench.layoutControl.type', 'both')),
158
ContextKeyExpr.equals('config.workbench.sideBar.location', 'right')
159
),
160
order: 0
161
}
162
}, {
163
id: MenuId.LayoutControlMenu,
164
item: {
165
group: '2_pane_toggles',
166
command: {
167
id: ToggleAuxiliaryBarAction.ID,
168
title: localize('toggleSecondarySideBar', "Toggle Secondary Side Bar"),
169
toggled: { condition: AuxiliaryBarVisibleContext, icon: auxiliaryBarRightIcon },
170
icon: auxiliaryBarRightOffIcon,
171
},
172
when: ContextKeyExpr.and(
173
IsAuxiliaryWindowContext.negate(),
174
ContextKeyExpr.or(
175
ContextKeyExpr.equals('config.workbench.layoutControl.type', 'toggles'),
176
ContextKeyExpr.equals('config.workbench.layoutControl.type', 'both')),
177
ContextKeyExpr.equals('config.workbench.sideBar.location', 'left')
178
),
179
order: 2
180
}
181
}, {
182
id: MenuId.ViewContainerTitleContext,
183
item: {
184
group: '3_workbench_layout_move',
185
command: {
186
id: ToggleAuxiliaryBarAction.ID,
187
title: localize2('hideAuxiliaryBar', 'Hide Secondary Side Bar'),
188
},
189
when: ContextKeyExpr.and(AuxiliaryBarVisibleContext, ContextKeyExpr.equals('viewContainerLocation', ViewContainerLocationToString(ViewContainerLocation.AuxiliaryBar))),
190
order: 2
191
}
192
}
193
]);
194
195
registerAction2(class extends SwitchCompositeViewAction {
196
constructor() {
197
super({
198
id: 'workbench.action.previousAuxiliaryBarView',
199
title: localize2('previousAuxiliaryBarView', 'Previous Secondary Side Bar View'),
200
category: Categories.View,
201
f1: true
202
}, ViewContainerLocation.AuxiliaryBar, -1);
203
}
204
});
205
206
registerAction2(class extends SwitchCompositeViewAction {
207
constructor() {
208
super({
209
id: 'workbench.action.nextAuxiliaryBarView',
210
title: localize2('nextAuxiliaryBarView', 'Next Secondary Side Bar View'),
211
category: Categories.View,
212
f1: true
213
}, ViewContainerLocation.AuxiliaryBar, 1);
214
}
215
});
216
217
// --- Maximized Mode
218
219
class MaximizeAuxiliaryBar extends Action2 {
220
221
static readonly ID = 'workbench.action.maximizeAuxiliaryBar';
222
223
constructor() {
224
super({
225
id: MaximizeAuxiliaryBar.ID,
226
title: localize2('maximizeAuxiliaryBar', 'Maximize Secondary Side Bar'),
227
tooltip: localize('maximizeAuxiliaryBarTooltip', "Maximize Secondary Side Bar Size"),
228
category: Categories.View,
229
f1: true,
230
precondition: AuxiliaryBarMaximizedContext.negate(),
231
icon: maximizeIcon,
232
menu: {
233
id: MenuId.AuxiliaryBarTitle,
234
group: 'navigation',
235
order: 1,
236
when: AuxiliaryBarMaximizedContext.negate()
237
}
238
});
239
}
240
241
run(accessor: ServicesAccessor) {
242
const layoutService = accessor.get(IWorkbenchLayoutService);
243
244
layoutService.setAuxiliaryBarMaximized(true);
245
}
246
}
247
registerAction2(MaximizeAuxiliaryBar);
248
249
class RestoreAuxiliaryBar extends Action2 {
250
251
static readonly ID = 'workbench.action.restoreAuxiliaryBar';
252
253
constructor() {
254
super({
255
id: RestoreAuxiliaryBar.ID,
256
title: localize2('restoreAuxiliaryBar', 'Restore Secondary Side Bar'),
257
tooltip: localize('restoreAuxiliaryBarTooltip', "Restore Secondary Side Bar Size"),
258
category: Categories.View,
259
f1: true,
260
precondition: AuxiliaryBarMaximizedContext,
261
toggled: AuxiliaryBarMaximizedContext,
262
icon: maximizeIcon,
263
menu: {
264
id: MenuId.AuxiliaryBarTitle,
265
group: 'navigation',
266
order: 1,
267
when: AuxiliaryBarMaximizedContext
268
}
269
});
270
}
271
272
run(accessor: ServicesAccessor) {
273
const layoutService = accessor.get(IWorkbenchLayoutService);
274
275
layoutService.setAuxiliaryBarMaximized(false);
276
}
277
}
278
registerAction2(RestoreAuxiliaryBar);
279
280
class ToggleMaximizedAuxiliaryBar extends Action2 {
281
282
static readonly ID = 'workbench.action.toggleMaximizedAuxiliaryBar';
283
284
constructor() {
285
super({
286
id: ToggleMaximizedAuxiliaryBar.ID,
287
title: localize2('toggleMaximizedAuxiliaryBar', 'Toggle Maximized Secondary Side Bar'),
288
f1: true,
289
category: Categories.View
290
});
291
}
292
293
run(accessor: ServicesAccessor) {
294
const layoutService = accessor.get(IWorkbenchLayoutService);
295
296
layoutService.toggleMaximizedAuxiliaryBar();
297
}
298
}
299
registerAction2(ToggleMaximizedAuxiliaryBar);
300
301