Path: blob/main/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts
3296 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 { URI } from '../../../../base/common/uri.js';7import { Selection } from '../../../../editor/common/core/selection.js';8import { localize2 } from '../../../../nls.js';9import { Action2, MenuId } from '../../../../platform/actions/common/actions.js';10import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';11import { ITextEditorOptions, TextEditorSelectionRevealType } from '../../../../platform/editor/common/editor.js';12import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';13import { IListService } from '../../../../platform/list/browser/listService.js';14import { resolveCommandsContext } from '../../../browser/parts/editor/editorCommandsContext.js';15import { MultiDiffEditor } from './multiDiffEditor.js';16import { MultiDiffEditorInput } from './multiDiffEditorInput.js';17import { IEditorGroupsService } from '../../../services/editor/common/editorGroupsService.js';18import { IEditorService } from '../../../services/editor/common/editorService.js';19import { ActiveEditorContext } from '../../../common/contextkeys.js';2021export class GoToFileAction extends Action2 {22constructor() {23super({24id: 'multiDiffEditor.goToFile',25title: localize2('goToFile', 'Open File'),26icon: Codicon.goToFile,27precondition: ActiveEditorContext.isEqualTo(MultiDiffEditor.ID),28menu: {29when: ActiveEditorContext.isEqualTo(MultiDiffEditor.ID),30id: MenuId.MultiDiffEditorFileToolbar,31order: 22,32group: 'navigation',33},34});35}3637async run(accessor: ServicesAccessor, ...args: any[]): Promise<void> {38const uri = args[0] as URI;39const editorService = accessor.get(IEditorService);40const activeEditorPane = editorService.activeEditorPane;41let selections: Selection[] | undefined = undefined;42if (!(activeEditorPane instanceof MultiDiffEditor)) {43return;44}4546const editor = activeEditorPane.tryGetCodeEditor(uri);47if (editor) {48selections = editor.editor.getSelections() ?? undefined;49}5051let targetUri = uri;52const item = activeEditorPane.findDocumentDiffItem(uri);53if (item && item.goToFileUri) {54targetUri = item.goToFileUri;55}5657await editorService.openEditor({58label: item?.goToFileEditorTitle,59resource: targetUri,60options: {61selection: selections?.[0],62selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport,63} satisfies ITextEditorOptions,64});65}66}6768export class CollapseAllAction extends Action2 {69constructor() {70super({71id: 'multiDiffEditor.collapseAll',72title: localize2('collapseAllDiffs', 'Collapse All Diffs'),73icon: Codicon.collapseAll,74precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.not('multiDiffEditorAllCollapsed')),75menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({76id,77when: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.not('multiDiffEditorAllCollapsed')),78group: 'navigation',79order: 10080})),81f1: true,82});83}8485async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {86const resolvedContext = resolveCommandsContext(args, accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IListService));8788const groupContext = resolvedContext.groupedEditors[0];89if (!groupContext) {90return;91}9293const editor = groupContext.editors[0];94if (editor instanceof MultiDiffEditorInput) {95const viewModel = await editor.getViewModel();96viewModel.collapseAll();97}98}99}100101export class ExpandAllAction extends Action2 {102constructor() {103super({104id: 'multiDiffEditor.expandAll',105title: localize2('ExpandAllDiffs', 'Expand All Diffs'),106icon: Codicon.expandAll,107precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.has('multiDiffEditorAllCollapsed')),108menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({109id,110when: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.has('multiDiffEditorAllCollapsed')),111group: 'navigation',112order: 100113})),114f1: true,115});116}117118async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {119const resolvedContext = resolveCommandsContext(args, accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IListService));120121const groupContext = resolvedContext.groupedEditors[0];122if (!groupContext) {123return;124}125126const editor = groupContext.editors[0];127if (editor instanceof MultiDiffEditorInput) {128const viewModel = await editor.getViewModel();129viewModel.expandAll();130}131}132}133134135