Path: blob/main/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts
5238 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 { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';7import { URI } from '../../../../base/common/uri.js';8import { Selection } from '../../../../editor/common/core/selection.js';9import { localize2 } from '../../../../nls.js';10import { Action2, MenuId } from '../../../../platform/actions/common/actions.js';11import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';12import { ITextEditorOptions, TextEditorSelectionRevealType } from '../../../../platform/editor/common/editor.js';13import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';14import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';15import { IListService } from '../../../../platform/list/browser/listService.js';16import { resolveCommandsContext } from '../../../browser/parts/editor/editorCommandsContext.js';17import { MultiDiffEditor } from './multiDiffEditor.js';18import { MultiDiffEditorInput } from './multiDiffEditorInput.js';19import { IEditorGroupsService } from '../../../services/editor/common/editorGroupsService.js';20import { IEditorService } from '../../../services/editor/common/editorService.js';21import { ActiveEditorContext } from '../../../common/contextkeys.js';2223export class GoToFileAction extends Action2 {24constructor() {25super({26id: 'multiDiffEditor.goToFile',27title: localize2('goToFile', 'Open File'),28icon: Codicon.goToFile,29precondition: ActiveEditorContext.isEqualTo(MultiDiffEditor.ID),30menu: {31when: ActiveEditorContext.isEqualTo(MultiDiffEditor.ID),32id: MenuId.MultiDiffEditorFileToolbar,33order: 22,34group: 'navigation',35},36});37}3839async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {40const uri = args[0] as URI;41const editorService = accessor.get(IEditorService);42const activeEditorPane = editorService.activeEditorPane;43let selections: Selection[] | undefined = undefined;44if (!(activeEditorPane instanceof MultiDiffEditor)) {45return;46}4748const editor = activeEditorPane.tryGetCodeEditor(uri);49if (editor) {50selections = editor.editor.getSelections() ?? undefined;51}5253let targetUri = uri;54const item = activeEditorPane.findDocumentDiffItem(uri);55if (item && item.goToFileUri) {56targetUri = item.goToFileUri;57}5859await editorService.openEditor({60label: item?.goToFileEditorTitle,61resource: targetUri,62options: {63selection: selections?.[0],64selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport,65} satisfies ITextEditorOptions,66});67}68}6970export class GoToNextChangeAction extends Action2 {71constructor() {72super({73id: 'multiDiffEditor.goToNextChange',74title: localize2('goToNextChange', 'Go to Next Change'),75icon: Codicon.arrowDown,76precondition: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),77menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({78id,79when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),80group: 'navigation',81order: 282})),83keybinding: {84primary: KeyMod.Alt | KeyCode.F5,85weight: KeybindingWeight.EditorContrib,86when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),87},88f1: true,89});90}9192async run(accessor: ServicesAccessor): Promise<void> {93const editorService = accessor.get(IEditorService);94const activeEditorPane = editorService.activeEditorPane;9596if (!(activeEditorPane instanceof MultiDiffEditor)) {97return;98}99100activeEditorPane.goToNextChange();101}102}103104export class GoToPreviousChangeAction extends Action2 {105constructor() {106super({107id: 'multiDiffEditor.goToPreviousChange',108title: localize2('goToPreviousChange', 'Go to Previous Change'),109icon: Codicon.arrowUp,110precondition: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),111menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({112id,113when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),114group: 'navigation',115order: 1116})),117keybinding: {118primary: KeyMod.Alt | KeyMod.Shift | KeyCode.F5,119weight: KeybindingWeight.EditorContrib,120when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),121},122f1: true,123});124}125126async run(accessor: ServicesAccessor): Promise<void> {127const editorService = accessor.get(IEditorService);128const activeEditorPane = editorService.activeEditorPane;129130if (!(activeEditorPane instanceof MultiDiffEditor)) {131return;132}133134activeEditorPane.goToPreviousChange();135}136}137138export class CollapseAllAction extends Action2 {139constructor() {140super({141id: 'multiDiffEditor.collapseAll',142title: localize2('collapseAllDiffs', 'Collapse All Diffs'),143icon: Codicon.collapseAll,144precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.not('multiDiffEditorAllCollapsed')),145menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({146id,147when: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.not('multiDiffEditorAllCollapsed')),148group: 'navigation',149order: 100150})),151f1: true,152});153}154155async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {156const resolvedContext = resolveCommandsContext(args, accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IListService));157158const groupContext = resolvedContext.groupedEditors[0];159if (!groupContext) {160return;161}162163const editor = groupContext.editors[0];164if (editor instanceof MultiDiffEditorInput) {165const viewModel = await editor.getViewModel();166viewModel.collapseAll();167}168}169}170171export class ExpandAllAction extends Action2 {172constructor() {173super({174id: 'multiDiffEditor.expandAll',175title: localize2('ExpandAllDiffs', 'Expand All Diffs'),176icon: Codicon.expandAll,177precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.has('multiDiffEditorAllCollapsed')),178menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({179id,180when: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.has('multiDiffEditorAllCollapsed')),181group: 'navigation',182order: 100183})),184f1: true,185});186}187188async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {189const resolvedContext = resolveCommandsContext(args, accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IListService));190191const groupContext = resolvedContext.groupedEditors[0];192if (!groupContext) {193return;194}195196const editor = groupContext.editors[0];197if (editor instanceof MultiDiffEditorInput) {198const viewModel = await editor.getViewModel();199viewModel.expandAll();200}201}202}203204205