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