Path: blob/main/src/vs/sessions/contrib/editor/browser/editor.contribution.ts
13401 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 { localize2 } from '../../../../nls.js';6import { Codicon } from '../../../../base/common/codicons.js';7import { ServicesAccessor } from '../../../../editor/browser/editorExtensions.js';8import { Action2, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';9import { ICommandService } from '../../../../platform/commands/common/commands.js';10import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';11import { EditorPartModalContext, IsSessionsWindowContext } from '../../../../workbench/common/contextkeys.js';12import { IAgentWorkbenchLayoutService } from '../../../browser/workbench.js';13import { EditorMaximizedContext } from '../../../common/contextkeys.js';14import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js';15import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';16import { IEditorGroupsService } from '../../../../workbench/services/editor/common/editorGroupsService.js';17import { MultiDiffEditorInput } from '../../../../workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.js';18import { CHANGES_VIEW_ID } from '../../changes/common/changes.js';19import { ChangesViewPane } from '../../changes/browser/changesView.js';20import { prepareMoveCopyEditors } from '../../../../workbench/browser/parts/editor/editor.js';21import { Parts } from '../../../../workbench/services/layout/browser/layoutService.js';22import { MOVE_MODAL_EDITOR_TO_MAIN_COMMAND_ID } from '../../../../workbench/browser/parts/editor/editorCommands.js';23import { TERMINAL_VIEW_ID } from '../../../../workbench/contrib/terminal/common/terminal.js';2425const terminalPanelHiddenForMaximizedEditor = new WeakSet<IAgentWorkbenchLayoutService>();2627class MaximizeMainEditorPartAction extends Action2 {28static readonly ID = 'workbench.action.agentSessions.maximizeMainEditorPart';2930constructor() {31super({32id: MaximizeMainEditorPartAction.ID,33title: localize2('maximizeMainEditorPart', "Maximize Editor"),34icon: Codicon.screenFull,35f1: false,36menu: {37id: MenuId.EditorTitleLayout,38group: 'navigation',39order: 99,40when: ContextKeyExpr.and(41IsSessionsWindowContext,42EditorMaximizedContext.negate())43}44});45}4647async run(accessor: ServicesAccessor): Promise<void> {48const layoutService = accessor.get(IAgentWorkbenchLayoutService);49const viewsService = accessor.get(IViewsService);50let hidTerminalPanel = false;5152if (layoutService.isVisible(Parts.PANEL_PART) && viewsService.isViewVisible(TERMINAL_VIEW_ID)) {53layoutService.setPartHidden(true, Parts.PANEL_PART);54hidTerminalPanel = true;55}5657if (hidTerminalPanel) {58terminalPanelHiddenForMaximizedEditor.add(layoutService);59} else {60terminalPanelHiddenForMaximizedEditor.delete(layoutService);61}6263layoutService.setEditorMaximized(true);64}65}6667registerAction2(MaximizeMainEditorPartAction);6869class RestoreMainEditorPartAction extends Action2 {70static readonly ID = 'workbench.action.agentSessions.restoreMainEditorPart';7172constructor() {73super({74id: RestoreMainEditorPartAction.ID,75title: localize2('restoreMainEditorPart', "Restore Editor"),76icon: Codicon.screenNormal,77f1: false,78menu: {79id: MenuId.EditorTitleLayout,80group: 'navigation',81order: 99,82when: ContextKeyExpr.and(83IsSessionsWindowContext,84EditorMaximizedContext)85}86});87}8889async run(accessor: ServicesAccessor): Promise<void> {90const layoutService = accessor.get(IAgentWorkbenchLayoutService);91const shouldRestoreTerminalPanel = terminalPanelHiddenForMaximizedEditor.has(layoutService);9293layoutService.setEditorMaximized(false);9495if (shouldRestoreTerminalPanel && !layoutService.isVisible(Parts.PANEL_PART)) {96layoutService.setPartHidden(false, Parts.PANEL_PART);97}9899terminalPanelHiddenForMaximizedEditor.delete(layoutService);100}101}102103registerAction2(RestoreMainEditorPartAction);104105class CloseMainEditorPartAction extends Action2 {106static readonly ID = 'workbench.action.agentSessions.closeMainEditorPart';107108constructor() {109super({110id: CloseMainEditorPartAction.ID,111title: localize2('closeMainEditorPart', "Close Editor"),112icon: Codicon.close,113f1: false,114menu: {115id: MenuId.EditorTitleLayout,116group: 'navigation',117order: 100,118when: IsSessionsWindowContext119}120});121}122123async run(accessor: ServicesAccessor): Promise<void> {124const commandService = accessor.get(ICommandService);125await commandService.executeCommand('workbench.action.closeAllGroups');126}127}128129registerAction2(CloseMainEditorPartAction);130131class OpenEditorInModalEditorAction extends Action2 {132static readonly ID = 'workbench.action.agentSessions.openEditorInModal';133134constructor() {135super({136id: OpenEditorInModalEditorAction.ID,137title: localize2('openEditorInModal', "Open in Modal Editor"),138icon: Codicon.openInWindow,139f1: false,140menu: {141id: MenuId.EditorTitleLayout,142group: 'navigation',143order: 1,144when: IsSessionsWindowContext145}146});147}148149async run(accessor: ServicesAccessor): Promise<void> {150const viewsService = accessor.get(IViewsService);151const layoutService = accessor.get(IAgentWorkbenchLayoutService);152const configurationService = accessor.get(IConfigurationService);153const editorGroupsService = accessor.get(IEditorGroupsService);154155const isMaximized = layoutService.isEditorMaximized();156157// Set the `workbench.editor.useModal` setting to 'all'158await configurationService.updateValue('workbench.editor.useModal', 'all');159160// Move all editors from the active group to the modal editor161const activeGroup = editorGroupsService.mainPart.activeGroup;162163// Check for multi-file diff editor164const multiFileDiffEditor = activeGroup.editors165.find(editor => editor instanceof MultiDiffEditorInput);166167if (multiFileDiffEditor) {168// Reopen multi-file diff editor as the first editor in the modal editor169const view = viewsService.getViewWithId<ChangesViewPane>(CHANGES_VIEW_ID);170await view?.openChanges();171172// Close the multi-file diff editor173await activeGroup.closeEditor(multiFileDiffEditor);174}175176// Move all remaining editors to the modal editor177const modalPart = await editorGroupsService.createModalEditorPart();178const editorsToMove = prepareMoveCopyEditors(activeGroup, activeGroup.editors.slice(), true);179activeGroup.moveEditors(editorsToMove, modalPart.activeGroup);180181// Maximize182if (isMaximized) {183modalPart.toggleMaximized();184}185186// Focus187modalPart.activeGroup.focus();188}189}190191registerAction2(OpenEditorInModalEditorAction);192193class OpenModalEditorInEditorAction extends Action2 {194static readonly ID = 'workbench.action.agentSessions.openModalEditorInEditor';195196constructor() {197super({198id: OpenModalEditorInEditorAction.ID,199title: localize2('openModalEditorInEditor', "Open in Editor"),200icon: Codicon.openInWindow,201f1: false,202menu: {203id: MenuId.ModalEditorTitle,204group: 'navigation',205order: 98,206when: ContextKeyExpr.and(207IsSessionsWindowContext,208EditorPartModalContext)209}210});211}212213async run(accessor: ServicesAccessor): Promise<void> {214const viewsService = accessor.get(IViewsService);215const commandService = accessor.get(ICommandService);216const configurationService = accessor.get(IConfigurationService);217const editorGroupsService = accessor.get(IEditorGroupsService);218const layoutService = accessor.get(IAgentWorkbenchLayoutService);219220const activeEditorPart = editorGroupsService.activeModalEditorPart;221const activeGroup = activeEditorPart?.activeGroup;222if (!activeEditorPart || !activeGroup) {223return;224}225226const isMaximized = activeEditorPart.maximized;227228// Set the `workbench.editor.useModal` setting back to 'some'229await configurationService.updateValue('workbench.editor.useModal', 'some');230231// Show the main editor part232layoutService.setPartHidden(false, Parts.EDITOR_PART);233234// Check for navigation in the modal editor235const navigation = activeGroup.activeEditorPane?.options?.modal?.navigation;236if (navigation) {237const view = viewsService.getViewWithId<ChangesViewPane>(CHANGES_VIEW_ID);238const changes = view?.viewModel.activeSessionChangesObs.get();239240if (changes && navigation.current < changes.length) {241// Reopen multi-file diff editor for the current file242await view?.openChanges(changes[navigation.current].modifiedUri ?? changes[navigation.current].originalUri);243244// Close the editor in the modal editor (assume that the245// multi-file diff editor is the first editor in the modal246// editor)247await activeGroup.closeEditor(activeGroup.editors[0]);248}249}250251// Move all remaining editors to the main editor part252await commandService.executeCommand(MOVE_MODAL_EDITOR_TO_MAIN_COMMAND_ID);253254// Maximize255if (isMaximized) {256layoutService.setEditorMaximized(true);257}258259// Focus260editorGroupsService.activeGroup.focus();261}262}263264registerAction2(OpenModalEditorInEditorAction);265266267