Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/editor/browser/editor.contribution.ts
13401 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 { localize2 } from '../../../../nls.js';
7
import { Codicon } from '../../../../base/common/codicons.js';
8
import { ServicesAccessor } from '../../../../editor/browser/editorExtensions.js';
9
import { Action2, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';
10
import { ICommandService } from '../../../../platform/commands/common/commands.js';
11
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
12
import { EditorPartModalContext, IsSessionsWindowContext } from '../../../../workbench/common/contextkeys.js';
13
import { IAgentWorkbenchLayoutService } from '../../../browser/workbench.js';
14
import { EditorMaximizedContext } from '../../../common/contextkeys.js';
15
import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js';
16
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
17
import { IEditorGroupsService } from '../../../../workbench/services/editor/common/editorGroupsService.js';
18
import { MultiDiffEditorInput } from '../../../../workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.js';
19
import { CHANGES_VIEW_ID } from '../../changes/common/changes.js';
20
import { ChangesViewPane } from '../../changes/browser/changesView.js';
21
import { prepareMoveCopyEditors } from '../../../../workbench/browser/parts/editor/editor.js';
22
import { Parts } from '../../../../workbench/services/layout/browser/layoutService.js';
23
import { MOVE_MODAL_EDITOR_TO_MAIN_COMMAND_ID } from '../../../../workbench/browser/parts/editor/editorCommands.js';
24
import { TERMINAL_VIEW_ID } from '../../../../workbench/contrib/terminal/common/terminal.js';
25
26
const terminalPanelHiddenForMaximizedEditor = new WeakSet<IAgentWorkbenchLayoutService>();
27
28
class MaximizeMainEditorPartAction extends Action2 {
29
static readonly ID = 'workbench.action.agentSessions.maximizeMainEditorPart';
30
31
constructor() {
32
super({
33
id: MaximizeMainEditorPartAction.ID,
34
title: localize2('maximizeMainEditorPart', "Maximize Editor"),
35
icon: Codicon.screenFull,
36
f1: false,
37
menu: {
38
id: MenuId.EditorTitleLayout,
39
group: 'navigation',
40
order: 99,
41
when: ContextKeyExpr.and(
42
IsSessionsWindowContext,
43
EditorMaximizedContext.negate())
44
}
45
});
46
}
47
48
async run(accessor: ServicesAccessor): Promise<void> {
49
const layoutService = accessor.get(IAgentWorkbenchLayoutService);
50
const viewsService = accessor.get(IViewsService);
51
let hidTerminalPanel = false;
52
53
if (layoutService.isVisible(Parts.PANEL_PART) && viewsService.isViewVisible(TERMINAL_VIEW_ID)) {
54
layoutService.setPartHidden(true, Parts.PANEL_PART);
55
hidTerminalPanel = true;
56
}
57
58
if (hidTerminalPanel) {
59
terminalPanelHiddenForMaximizedEditor.add(layoutService);
60
} else {
61
terminalPanelHiddenForMaximizedEditor.delete(layoutService);
62
}
63
64
layoutService.setEditorMaximized(true);
65
}
66
}
67
68
registerAction2(MaximizeMainEditorPartAction);
69
70
class RestoreMainEditorPartAction extends Action2 {
71
static readonly ID = 'workbench.action.agentSessions.restoreMainEditorPart';
72
73
constructor() {
74
super({
75
id: RestoreMainEditorPartAction.ID,
76
title: localize2('restoreMainEditorPart', "Restore Editor"),
77
icon: Codicon.screenNormal,
78
f1: false,
79
menu: {
80
id: MenuId.EditorTitleLayout,
81
group: 'navigation',
82
order: 99,
83
when: ContextKeyExpr.and(
84
IsSessionsWindowContext,
85
EditorMaximizedContext)
86
}
87
});
88
}
89
90
async run(accessor: ServicesAccessor): Promise<void> {
91
const layoutService = accessor.get(IAgentWorkbenchLayoutService);
92
const shouldRestoreTerminalPanel = terminalPanelHiddenForMaximizedEditor.has(layoutService);
93
94
layoutService.setEditorMaximized(false);
95
96
if (shouldRestoreTerminalPanel && !layoutService.isVisible(Parts.PANEL_PART)) {
97
layoutService.setPartHidden(false, Parts.PANEL_PART);
98
}
99
100
terminalPanelHiddenForMaximizedEditor.delete(layoutService);
101
}
102
}
103
104
registerAction2(RestoreMainEditorPartAction);
105
106
class CloseMainEditorPartAction extends Action2 {
107
static readonly ID = 'workbench.action.agentSessions.closeMainEditorPart';
108
109
constructor() {
110
super({
111
id: CloseMainEditorPartAction.ID,
112
title: localize2('closeMainEditorPart', "Close Editor"),
113
icon: Codicon.close,
114
f1: false,
115
menu: {
116
id: MenuId.EditorTitleLayout,
117
group: 'navigation',
118
order: 100,
119
when: IsSessionsWindowContext
120
}
121
});
122
}
123
124
async run(accessor: ServicesAccessor): Promise<void> {
125
const commandService = accessor.get(ICommandService);
126
await commandService.executeCommand('workbench.action.closeAllGroups');
127
}
128
}
129
130
registerAction2(CloseMainEditorPartAction);
131
132
class OpenEditorInModalEditorAction extends Action2 {
133
static readonly ID = 'workbench.action.agentSessions.openEditorInModal';
134
135
constructor() {
136
super({
137
id: OpenEditorInModalEditorAction.ID,
138
title: localize2('openEditorInModal', "Open in Modal Editor"),
139
icon: Codicon.openInWindow,
140
f1: false,
141
menu: {
142
id: MenuId.EditorTitleLayout,
143
group: 'navigation',
144
order: 1,
145
when: IsSessionsWindowContext
146
}
147
});
148
}
149
150
async run(accessor: ServicesAccessor): Promise<void> {
151
const viewsService = accessor.get(IViewsService);
152
const layoutService = accessor.get(IAgentWorkbenchLayoutService);
153
const configurationService = accessor.get(IConfigurationService);
154
const editorGroupsService = accessor.get(IEditorGroupsService);
155
156
const isMaximized = layoutService.isEditorMaximized();
157
158
// Set the `workbench.editor.useModal` setting to 'all'
159
await configurationService.updateValue('workbench.editor.useModal', 'all');
160
161
// Move all editors from the active group to the modal editor
162
const activeGroup = editorGroupsService.mainPart.activeGroup;
163
164
// Check for multi-file diff editor
165
const multiFileDiffEditor = activeGroup.editors
166
.find(editor => editor instanceof MultiDiffEditorInput);
167
168
if (multiFileDiffEditor) {
169
// Reopen multi-file diff editor as the first editor in the modal editor
170
const view = viewsService.getViewWithId<ChangesViewPane>(CHANGES_VIEW_ID);
171
await view?.openChanges();
172
173
// Close the multi-file diff editor
174
await activeGroup.closeEditor(multiFileDiffEditor);
175
}
176
177
// Move all remaining editors to the modal editor
178
const modalPart = await editorGroupsService.createModalEditorPart();
179
const editorsToMove = prepareMoveCopyEditors(activeGroup, activeGroup.editors.slice(), true);
180
activeGroup.moveEditors(editorsToMove, modalPart.activeGroup);
181
182
// Maximize
183
if (isMaximized) {
184
modalPart.toggleMaximized();
185
}
186
187
// Focus
188
modalPart.activeGroup.focus();
189
}
190
}
191
192
registerAction2(OpenEditorInModalEditorAction);
193
194
class OpenModalEditorInEditorAction extends Action2 {
195
static readonly ID = 'workbench.action.agentSessions.openModalEditorInEditor';
196
197
constructor() {
198
super({
199
id: OpenModalEditorInEditorAction.ID,
200
title: localize2('openModalEditorInEditor', "Open in Editor"),
201
icon: Codicon.openInWindow,
202
f1: false,
203
menu: {
204
id: MenuId.ModalEditorTitle,
205
group: 'navigation',
206
order: 98,
207
when: ContextKeyExpr.and(
208
IsSessionsWindowContext,
209
EditorPartModalContext)
210
}
211
});
212
}
213
214
async run(accessor: ServicesAccessor): Promise<void> {
215
const viewsService = accessor.get(IViewsService);
216
const commandService = accessor.get(ICommandService);
217
const configurationService = accessor.get(IConfigurationService);
218
const editorGroupsService = accessor.get(IEditorGroupsService);
219
const layoutService = accessor.get(IAgentWorkbenchLayoutService);
220
221
const activeEditorPart = editorGroupsService.activeModalEditorPart;
222
const activeGroup = activeEditorPart?.activeGroup;
223
if (!activeEditorPart || !activeGroup) {
224
return;
225
}
226
227
const isMaximized = activeEditorPart.maximized;
228
229
// Set the `workbench.editor.useModal` setting back to 'some'
230
await configurationService.updateValue('workbench.editor.useModal', 'some');
231
232
// Show the main editor part
233
layoutService.setPartHidden(false, Parts.EDITOR_PART);
234
235
// Check for navigation in the modal editor
236
const navigation = activeGroup.activeEditorPane?.options?.modal?.navigation;
237
if (navigation) {
238
const view = viewsService.getViewWithId<ChangesViewPane>(CHANGES_VIEW_ID);
239
const changes = view?.viewModel.activeSessionChangesObs.get();
240
241
if (changes && navigation.current < changes.length) {
242
// Reopen multi-file diff editor for the current file
243
await view?.openChanges(changes[navigation.current].modifiedUri ?? changes[navigation.current].originalUri);
244
245
// Close the editor in the modal editor (assume that the
246
// multi-file diff editor is the first editor in the modal
247
// editor)
248
await activeGroup.closeEditor(activeGroup.editors[0]);
249
}
250
}
251
252
// Move all remaining editors to the main editor part
253
await commandService.executeCommand(MOVE_MODAL_EDITOR_TO_MAIN_COMMAND_ID);
254
255
// Maximize
256
if (isMaximized) {
257
layoutService.setEditorMaximized(true);
258
}
259
260
// Focus
261
editorGroupsService.activeGroup.focus();
262
}
263
}
264
265
registerAction2(OpenModalEditorInEditorAction);
266
267