Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/multiDiffEditor/browser/actions.ts
5238 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 { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
8
import { URI } from '../../../../base/common/uri.js';
9
import { Selection } from '../../../../editor/common/core/selection.js';
10
import { localize2 } from '../../../../nls.js';
11
import { Action2, MenuId } from '../../../../platform/actions/common/actions.js';
12
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
13
import { ITextEditorOptions, TextEditorSelectionRevealType } from '../../../../platform/editor/common/editor.js';
14
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
15
import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';
16
import { IListService } from '../../../../platform/list/browser/listService.js';
17
import { resolveCommandsContext } from '../../../browser/parts/editor/editorCommandsContext.js';
18
import { MultiDiffEditor } from './multiDiffEditor.js';
19
import { MultiDiffEditorInput } from './multiDiffEditorInput.js';
20
import { IEditorGroupsService } from '../../../services/editor/common/editorGroupsService.js';
21
import { IEditorService } from '../../../services/editor/common/editorService.js';
22
import { ActiveEditorContext } from '../../../common/contextkeys.js';
23
24
export class GoToFileAction extends Action2 {
25
constructor() {
26
super({
27
id: 'multiDiffEditor.goToFile',
28
title: localize2('goToFile', 'Open File'),
29
icon: Codicon.goToFile,
30
precondition: ActiveEditorContext.isEqualTo(MultiDiffEditor.ID),
31
menu: {
32
when: ActiveEditorContext.isEqualTo(MultiDiffEditor.ID),
33
id: MenuId.MultiDiffEditorFileToolbar,
34
order: 22,
35
group: 'navigation',
36
},
37
});
38
}
39
40
async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {
41
const uri = args[0] as URI;
42
const editorService = accessor.get(IEditorService);
43
const activeEditorPane = editorService.activeEditorPane;
44
let selections: Selection[] | undefined = undefined;
45
if (!(activeEditorPane instanceof MultiDiffEditor)) {
46
return;
47
}
48
49
const editor = activeEditorPane.tryGetCodeEditor(uri);
50
if (editor) {
51
selections = editor.editor.getSelections() ?? undefined;
52
}
53
54
let targetUri = uri;
55
const item = activeEditorPane.findDocumentDiffItem(uri);
56
if (item && item.goToFileUri) {
57
targetUri = item.goToFileUri;
58
}
59
60
await editorService.openEditor({
61
label: item?.goToFileEditorTitle,
62
resource: targetUri,
63
options: {
64
selection: selections?.[0],
65
selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport,
66
} satisfies ITextEditorOptions,
67
});
68
}
69
}
70
71
export class GoToNextChangeAction extends Action2 {
72
constructor() {
73
super({
74
id: 'multiDiffEditor.goToNextChange',
75
title: localize2('goToNextChange', 'Go to Next Change'),
76
icon: Codicon.arrowDown,
77
precondition: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),
78
menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({
79
id,
80
when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),
81
group: 'navigation',
82
order: 2
83
})),
84
keybinding: {
85
primary: KeyMod.Alt | KeyCode.F5,
86
weight: KeybindingWeight.EditorContrib,
87
when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),
88
},
89
f1: true,
90
});
91
}
92
93
async run(accessor: ServicesAccessor): Promise<void> {
94
const editorService = accessor.get(IEditorService);
95
const activeEditorPane = editorService.activeEditorPane;
96
97
if (!(activeEditorPane instanceof MultiDiffEditor)) {
98
return;
99
}
100
101
activeEditorPane.goToNextChange();
102
}
103
}
104
105
export class GoToPreviousChangeAction extends Action2 {
106
constructor() {
107
super({
108
id: 'multiDiffEditor.goToPreviousChange',
109
title: localize2('goToPreviousChange', 'Go to Previous Change'),
110
icon: Codicon.arrowUp,
111
precondition: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),
112
menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({
113
id,
114
when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),
115
group: 'navigation',
116
order: 1
117
})),
118
keybinding: {
119
primary: KeyMod.Alt | KeyMod.Shift | KeyCode.F5,
120
weight: KeybindingWeight.EditorContrib,
121
when: ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID),
122
},
123
f1: true,
124
});
125
}
126
127
async run(accessor: ServicesAccessor): Promise<void> {
128
const editorService = accessor.get(IEditorService);
129
const activeEditorPane = editorService.activeEditorPane;
130
131
if (!(activeEditorPane instanceof MultiDiffEditor)) {
132
return;
133
}
134
135
activeEditorPane.goToPreviousChange();
136
}
137
}
138
139
export class CollapseAllAction extends Action2 {
140
constructor() {
141
super({
142
id: 'multiDiffEditor.collapseAll',
143
title: localize2('collapseAllDiffs', 'Collapse All Diffs'),
144
icon: Codicon.collapseAll,
145
precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.not('multiDiffEditorAllCollapsed')),
146
menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({
147
id,
148
when: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.not('multiDiffEditorAllCollapsed')),
149
group: 'navigation',
150
order: 100
151
})),
152
f1: true,
153
});
154
}
155
156
async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {
157
const resolvedContext = resolveCommandsContext(args, accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IListService));
158
159
const groupContext = resolvedContext.groupedEditors[0];
160
if (!groupContext) {
161
return;
162
}
163
164
const editor = groupContext.editors[0];
165
if (editor instanceof MultiDiffEditorInput) {
166
const viewModel = await editor.getViewModel();
167
viewModel.collapseAll();
168
}
169
}
170
}
171
172
export class ExpandAllAction extends Action2 {
173
constructor() {
174
super({
175
id: 'multiDiffEditor.expandAll',
176
title: localize2('ExpandAllDiffs', 'Expand All Diffs'),
177
icon: Codicon.expandAll,
178
precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.has('multiDiffEditorAllCollapsed')),
179
menu: [MenuId.EditorTitle, MenuId.CompactWindowEditorTitle].map(id => ({
180
id,
181
when: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID), ContextKeyExpr.has('multiDiffEditorAllCollapsed')),
182
group: 'navigation',
183
order: 100
184
})),
185
f1: true,
186
});
187
}
188
189
async run(accessor: ServicesAccessor, ...args: unknown[]): Promise<void> {
190
const resolvedContext = resolveCommandsContext(args, accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IListService));
191
192
const groupContext = resolvedContext.groupedEditors[0];
193
if (!groupContext) {
194
return;
195
}
196
197
const editor = groupContext.editors[0];
198
if (editor instanceof MultiDiffEditorInput) {
199
const viewModel = await editor.getViewModel();
200
viewModel.expandAll();
201
}
202
}
203
}
204
205