@codingame/monaco-vscode-views-service-override 1.85.0 → 1.85.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/assets/index-no-csp.html +4 -0
  2. package/assets/index.html +5 -1
  3. package/index.d.ts +2 -2
  4. package/index.js +2 -2
  5. package/package.json +11 -9
  6. package/tools/editor.js +1 -1
  7. package/views.d.ts +9 -4
  8. package/views.js +32 -10
  9. package/vscode/src/vs/workbench/api/browser/viewsExtensionPoint.js +2 -2
  10. package/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.js +1 -1
  11. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/commands/commands.js +692 -0
  12. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/commands/devCommands.js +240 -0
  13. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution.js +77 -0
  14. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorSerializer.js +42 -0
  15. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/colors.js +71 -0
  16. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/conflictActions.js +346 -0
  17. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/editorGutter.js +96 -0
  18. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView.js +145 -0
  19. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/editors/codeEditorView.js +103 -0
  20. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView.js +399 -0
  21. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/editors/resultCodeEditorView.js +196 -0
  22. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/fixedZoneWidget.js +41 -0
  23. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/lineAlignment.js +128 -0
  24. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/media/mergeEditor.css.js +6 -0
  25. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/mergeEditor.js +611 -0
  26. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/scrollSynchronizer.js +158 -0
  27. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/viewModel.js +262 -0
  28. package/vscode/src/vs/workbench/contrib/mergeEditor/browser/view/viewZones.js +173 -0
  29. package/vscode/src/vs/workbench/contrib/webview/browser/webview.contribution.js +79 -0
  30. package/vscode/src/vs/workbench/contrib/webview/browser/webviewFindWidget.js +1 -1
  31. package/vscode/src/vs/workbench/services/history/browser/historyService.js +3 -0
  32. package/override/vs/workbench/contrib/notebook/common/notebookEditorInput.js +0 -3
  33. package/vscode/src/vs/base/browser/ui/tree/treeDefaults.js +0 -16
  34. package/vscode/src/vs/workbench/browser/parts/views/checkbox.js +0 -107
  35. package/vscode/src/vs/workbench/browser/parts/views/media/views.css.js +0 -6
  36. package/vscode/src/vs/workbench/browser/parts/views/treeView.js +0 -1604
  37. package/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.css.js +0 -6
  38. package/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.js +0 -390
  39. package/vscode/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.js +0 -157
  40. package/vscode/src/vs/workbench/contrib/notebook/common/notebookContextKeys.js +0 -5
  41. package/vscode/src/vs/workbench/contrib/remote/browser/media/tunnelView.css.js +0 -6
  42. package/vscode/src/vs/workbench/contrib/remote/browser/remoteExplorer.js +0 -217
  43. package/vscode/src/vs/workbench/contrib/remote/browser/remoteIcons.js +0 -91
  44. package/vscode/src/vs/workbench/contrib/remote/browser/tunnelView.js +0 -1837
@@ -0,0 +1,103 @@
1
+ import { __decorate, __param } from '../../../../../../../../../external/tslib/tslib.es6.js';
2
+ import { h } from 'monaco-editor/esm/vs/base/browser/dom.js';
3
+ import { Emitter, Event } from 'monaco-editor/esm/vs/base/common/event.js';
4
+ import { Disposable } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
5
+ import { observableFromEvent, derived, autorun } from 'monaco-editor/esm/vs/base/common/observable.js';
6
+ import { EditorExtensionsRegistry } from 'monaco-editor/esm/vs/editor/browser/editorExtensions.js';
7
+ import { CodeEditorWidget } from 'monaco-editor/esm/vs/editor/browser/widget/codeEditorWidget.js';
8
+ import { Selection } from 'monaco-editor/esm/vs/editor/common/core/selection.js';
9
+ import { CodeLensContribution } from 'monaco-editor/esm/vs/editor/contrib/codelens/browser/codelensController.js';
10
+ import { FoldingController } from 'monaco-editor/esm/vs/editor/contrib/folding/browser/folding.js';
11
+ import { MenuWorkbenchToolBar } from 'monaco-editor/esm/vs/platform/actions/browser/toolbar.js';
12
+ import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiation/common/instantiation.js';
13
+ import { DEFAULT_EDITOR_MIN_DIMENSIONS, DEFAULT_EDITOR_MAX_DIMENSIONS } from 'vscode/vscode/vs/workbench/browser/parts/editor/editor';
14
+ import { setStyle, observableConfigValue } from 'vscode/vscode/vs/workbench/contrib/mergeEditor/browser/utils';
15
+
16
+ class CodeEditorView extends Disposable {
17
+ updateOptions(newOptions) {
18
+ this.editor.updateOptions(newOptions);
19
+ }
20
+ constructor(instantiationService, viewModel, configurationService) {
21
+ super();
22
+ this.instantiationService = instantiationService;
23
+ this.viewModel = viewModel;
24
+ this.configurationService = configurationService;
25
+ this.model = ( this.viewModel.map(m => m?.model));
26
+ this.htmlElements = h('div.code-view', [
27
+ h('div.header@header', [
28
+ h('span.title@title'),
29
+ h('span.description@description'),
30
+ h('span.detail@detail'),
31
+ h('span.toolbar@toolbar'),
32
+ ]),
33
+ h('div.container', [
34
+ h('div.gutter@gutterDiv'),
35
+ h('div@editor'),
36
+ ]),
37
+ ]);
38
+ this._onDidViewChange = ( new Emitter());
39
+ this.view = {
40
+ element: this.htmlElements.root,
41
+ minimumWidth: DEFAULT_EDITOR_MIN_DIMENSIONS.width,
42
+ maximumWidth: DEFAULT_EDITOR_MAX_DIMENSIONS.width,
43
+ minimumHeight: DEFAULT_EDITOR_MIN_DIMENSIONS.height,
44
+ maximumHeight: DEFAULT_EDITOR_MAX_DIMENSIONS.height,
45
+ onDidChange: this._onDidViewChange.event,
46
+ layout: (width, height, top, left) => {
47
+ setStyle(this.htmlElements.root, { width, height, top, left });
48
+ this.editor.layout({
49
+ width: width - this.htmlElements.gutterDiv.clientWidth,
50
+ height: height - this.htmlElements.header.clientHeight,
51
+ });
52
+ }
53
+ };
54
+ this.checkboxesVisible = observableConfigValue('mergeEditor.showCheckboxes', false, this.configurationService);
55
+ this.showDeletionMarkers = observableConfigValue('mergeEditor.showDeletionMarkers', true, this.configurationService);
56
+ this.useSimplifiedDecorations = observableConfigValue('mergeEditor.useSimplifiedDecorations', false, this.configurationService);
57
+ this.editor = this.instantiationService.createInstance(CodeEditorWidget, this.htmlElements.editor, {}, {
58
+ contributions: this.getEditorContributions(),
59
+ });
60
+ this.isFocused = observableFromEvent(Event.any(this.editor.onDidBlurEditorWidget, this.editor.onDidFocusEditorWidget), () => this.editor.hasWidgetFocus());
61
+ this.cursorPosition = observableFromEvent(this.editor.onDidChangeCursorPosition, () => this.editor.getPosition());
62
+ this.selection = observableFromEvent(this.editor.onDidChangeCursorSelection, () => this.editor.getSelections());
63
+ this.cursorLineNumber = ( this.cursorPosition.map(p => p?.lineNumber));
64
+ }
65
+ getEditorContributions() {
66
+ return EditorExtensionsRegistry.getEditorContributions().filter(c => c.id !== FoldingController.ID && c.id !== CodeLensContribution.ID);
67
+ }
68
+ }
69
+ function createSelectionsAutorun(codeEditorView, translateRange) {
70
+ const selections = derived(reader => {
71
+ const viewModel = codeEditorView.viewModel.read(reader);
72
+ if (!viewModel) {
73
+ return [];
74
+ }
75
+ const baseRange = viewModel.selectionInBase.read(reader);
76
+ if (!baseRange || baseRange.sourceEditor === codeEditorView) {
77
+ return [];
78
+ }
79
+ return ( baseRange.rangesInBase.map(r => translateRange(r, viewModel)));
80
+ });
81
+ return autorun(reader => {
82
+ const ranges = selections.read(reader);
83
+ if (ranges.length === 0) {
84
+ return;
85
+ }
86
+ codeEditorView.editor.setSelections(( ranges.map(r => ( new Selection(r.startLineNumber, r.startColumn, r.endLineNumber, r.endColumn)))));
87
+ });
88
+ }
89
+ let TitleMenu = class TitleMenu extends Disposable {
90
+ constructor(menuId, targetHtmlElement, instantiationService) {
91
+ super();
92
+ const toolbar = instantiationService.createInstance(MenuWorkbenchToolBar, targetHtmlElement, menuId, {
93
+ menuOptions: { renderShortTitle: true },
94
+ toolbarOptions: { primaryGroup: () => false }
95
+ });
96
+ this._store.add(toolbar);
97
+ }
98
+ };
99
+ TitleMenu = ( __decorate([
100
+ ( __param(2, IInstantiationService))
101
+ ], TitleMenu));
102
+
103
+ export { CodeEditorView, TitleMenu, createSelectionsAutorun };
@@ -0,0 +1,399 @@
1
+ import { __decorate, __param } from '../../../../../../../../../external/tslib/tslib.es6.js';
2
+ import { reset, addDisposableListener, EventType, h } from 'monaco-editor/esm/vs/base/browser/dom.js';
3
+ import { renderLabelWithIcons } from 'monaco-editor/esm/vs/base/browser/ui/iconLabel/iconLabels.js';
4
+ import { Toggle } from 'monaco-editor/esm/vs/base/browser/ui/toggle/toggle.js';
5
+ import { Separator, Action } from 'monaco-editor/esm/vs/base/common/actions.js';
6
+ import { Codicon } from 'monaco-editor/esm/vs/base/common/codicons.js';
7
+ import { Disposable } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
8
+ import { clamp } from 'monaco-editor/esm/vs/base/common/numbers.js';
9
+ import { derivedOpts, autorunOpts, derived, transaction, observableValue, autorun } from 'monaco-editor/esm/vs/base/common/observable.js';
10
+ import { noBreakWhitespace } from 'monaco-editor/esm/vs/base/common/strings.js';
11
+ import { isDefined } from 'monaco-editor/esm/vs/base/common/types.js';
12
+ import { MinimapPosition, OverviewRulerLane } from 'monaco-editor/esm/vs/editor/common/model.js';
13
+ import { localizeWithPath } from 'monaco-editor/esm/vs/nls.js';
14
+ import { MenuId } from 'monaco-editor/esm/vs/platform/actions/common/actions.js';
15
+ import { IConfigurationService } from 'monaco-editor/esm/vs/platform/configuration/common/configuration.js';
16
+ import { IContextMenuService } from 'monaco-editor/esm/vs/platform/contextview/browser/contextView.js';
17
+ import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiation/common/instantiation.js';
18
+ import { defaultToggleStyles } from 'monaco-editor/esm/vs/platform/theme/browser/defaultStyles.js';
19
+ import { applyObservableDecorations, setFields } from 'vscode/vscode/vs/workbench/contrib/mergeEditor/browser/utils';
20
+ import { handledConflictMinimapOverViewRulerColor, unhandledConflictMinimapOverViewRulerColor } from '../colors.js';
21
+ import { EditorGutter } from '../editorGutter.js';
22
+ import { CodeEditorView, createSelectionsAutorun, TitleMenu } from './codeEditorView.js';
23
+
24
+ let InputCodeEditorView = class InputCodeEditorView extends CodeEditorView {
25
+ constructor(inputNumber, viewModel, instantiationService, contextMenuService, configurationService) {
26
+ super(instantiationService, viewModel, configurationService);
27
+ this.inputNumber = inputNumber;
28
+ this.otherInputNumber = this.inputNumber === 1 ? 2 : 1;
29
+ this.modifiedBaseRangeGutterItemInfos = derivedOpts({ debugName: `input${this.inputNumber}.modifiedBaseRangeGutterItemInfos` }, reader => {
30
+ const viewModel = this.viewModel.read(reader);
31
+ if (!viewModel) {
32
+ return [];
33
+ }
34
+ const model = viewModel.model;
35
+ const inputNumber = this.inputNumber;
36
+ const showNonConflictingChanges = viewModel.showNonConflictingChanges.read(reader);
37
+ return ( model.modifiedBaseRanges.read(reader)
38
+ .filter((r) => r.getInputDiffs(this.inputNumber).length > 0 && (showNonConflictingChanges || r.isConflicting || !model.isHandled(r).read(reader)))
39
+ .map((baseRange, idx) => ( new ModifiedBaseRangeGutterItemModel(( idx.toString()), baseRange, inputNumber, viewModel))));
40
+ });
41
+ this.decorations = derivedOpts({ debugName: `input${this.inputNumber}.decorations` }, reader => {
42
+ const viewModel = this.viewModel.read(reader);
43
+ if (!viewModel) {
44
+ return [];
45
+ }
46
+ const model = viewModel.model;
47
+ const textModel = (this.inputNumber === 1 ? model.input1 : model.input2).textModel;
48
+ const activeModifiedBaseRange = viewModel.activeModifiedBaseRange.read(reader);
49
+ const result = ( new Array());
50
+ const showNonConflictingChanges = viewModel.showNonConflictingChanges.read(reader);
51
+ const showDeletionMarkers = this.showDeletionMarkers.read(reader);
52
+ const diffWithThis = viewModel.baseCodeEditorView.read(reader) !== undefined && viewModel.baseShowDiffAgainst.read(reader) === this.inputNumber;
53
+ const useSimplifiedDecorations = !diffWithThis && this.useSimplifiedDecorations.read(reader);
54
+ for (const modifiedBaseRange of model.modifiedBaseRanges.read(reader)) {
55
+ const range = modifiedBaseRange.getInputRange(this.inputNumber);
56
+ if (!range) {
57
+ continue;
58
+ }
59
+ const blockClassNames = ['merge-editor-block'];
60
+ let blockPadding = [0, 0, 0, 0];
61
+ const isHandled = model.isInputHandled(modifiedBaseRange, this.inputNumber).read(reader);
62
+ if (isHandled) {
63
+ blockClassNames.push('handled');
64
+ }
65
+ if (modifiedBaseRange === activeModifiedBaseRange) {
66
+ blockClassNames.push('focused');
67
+ blockPadding = [0, 2, 0, 2];
68
+ }
69
+ if (modifiedBaseRange.isConflicting) {
70
+ blockClassNames.push('conflicting');
71
+ }
72
+ const inputClassName = this.inputNumber === 1 ? 'input i1' : 'input i2';
73
+ blockClassNames.push(inputClassName);
74
+ if (!modifiedBaseRange.isConflicting && !showNonConflictingChanges && isHandled) {
75
+ continue;
76
+ }
77
+ if (useSimplifiedDecorations && !isHandled) {
78
+ blockClassNames.push('use-simplified-decorations');
79
+ }
80
+ result.push({
81
+ range: range.toInclusiveRangeOrEmpty(),
82
+ options: {
83
+ showIfCollapsed: true,
84
+ blockClassName: blockClassNames.join(' '),
85
+ blockPadding,
86
+ blockIsAfterEnd: range.startLineNumber > textModel.getLineCount(),
87
+ description: 'Merge Editor',
88
+ minimap: {
89
+ position: MinimapPosition.Gutter,
90
+ color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor },
91
+ },
92
+ overviewRuler: modifiedBaseRange.isConflicting ? {
93
+ position: OverviewRulerLane.Center,
94
+ color: { id: isHandled ? handledConflictMinimapOverViewRulerColor : unhandledConflictMinimapOverViewRulerColor },
95
+ } : undefined
96
+ }
97
+ });
98
+ if (!useSimplifiedDecorations && (modifiedBaseRange.isConflicting || !model.isHandled(modifiedBaseRange).read(reader))) {
99
+ const inputDiffs = modifiedBaseRange.getInputDiffs(this.inputNumber);
100
+ for (const diff of inputDiffs) {
101
+ const range = diff.outputRange.toInclusiveRange();
102
+ if (range) {
103
+ result.push({
104
+ range,
105
+ options: {
106
+ className: `merge-editor-diff ${inputClassName}`,
107
+ description: 'Merge Editor',
108
+ isWholeLine: true,
109
+ }
110
+ });
111
+ }
112
+ if (diff.rangeMappings) {
113
+ for (const d of diff.rangeMappings) {
114
+ if (showDeletionMarkers || !d.outputRange.isEmpty()) {
115
+ result.push({
116
+ range: d.outputRange,
117
+ options: {
118
+ className: d.outputRange.isEmpty() ? `merge-editor-diff-empty-word ${inputClassName}` : `merge-editor-diff-word ${inputClassName}`,
119
+ description: 'Merge Editor',
120
+ showIfCollapsed: true,
121
+ }
122
+ });
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return result;
130
+ });
131
+ this.htmlElements.root.classList.add(`input`);
132
+ this._register(( new EditorGutter(this.editor, this.htmlElements.gutterDiv, {
133
+ getIntersectingGutterItems: (range, reader) => {
134
+ if (this.checkboxesVisible.read(reader)) {
135
+ return this.modifiedBaseRangeGutterItemInfos.read(reader);
136
+ }
137
+ else {
138
+ return [];
139
+ }
140
+ },
141
+ createView: (item, target) => ( new MergeConflictGutterItemView(item, target, contextMenuService)),
142
+ })));
143
+ this._register(createSelectionsAutorun(this, (baseRange, viewModel) => viewModel.model.translateBaseRangeToInput(this.inputNumber, baseRange)));
144
+ this._register(instantiationService.createInstance(TitleMenu, inputNumber === 1 ? MenuId.MergeInput1Toolbar : MenuId.MergeInput2Toolbar, this.htmlElements.toolbar));
145
+ this._register(autorunOpts({ debugName: `input${this.inputNumber}: update labels & text model` }, reader => {
146
+ const vm = this.viewModel.read(reader);
147
+ if (!vm) {
148
+ return;
149
+ }
150
+ this.editor.setModel(this.inputNumber === 1 ? vm.model.input1.textModel : vm.model.input2.textModel);
151
+ const title = this.inputNumber === 1
152
+ ? vm.model.input1.title || ( localizeWithPath(
153
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
154
+ 'input1',
155
+ 'Input 1'
156
+ ))
157
+ : vm.model.input2.title || ( localizeWithPath(
158
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
159
+ 'input2',
160
+ 'Input 2'
161
+ ));
162
+ const description = this.inputNumber === 1
163
+ ? vm.model.input1.description
164
+ : vm.model.input2.description;
165
+ const detail = this.inputNumber === 1
166
+ ? vm.model.input1.detail
167
+ : vm.model.input2.detail;
168
+ reset(this.htmlElements.title, ...renderLabelWithIcons(title));
169
+ reset(this.htmlElements.description, ...(description ? renderLabelWithIcons(description) : []));
170
+ reset(this.htmlElements.detail, ...(detail ? renderLabelWithIcons(detail) : []));
171
+ }));
172
+ this._register(applyObservableDecorations(this.editor, this.decorations));
173
+ }
174
+ };
175
+ InputCodeEditorView = ( __decorate([
176
+ ( __param(2, IInstantiationService)),
177
+ ( __param(3, IContextMenuService)),
178
+ ( __param(4, IConfigurationService))
179
+ ], InputCodeEditorView));
180
+ class ModifiedBaseRangeGutterItemModel {
181
+ constructor(id, baseRange, inputNumber, viewModel) {
182
+ this.id = id;
183
+ this.baseRange = baseRange;
184
+ this.inputNumber = inputNumber;
185
+ this.viewModel = viewModel;
186
+ this.model = this.viewModel.model;
187
+ this.range = this.baseRange.getInputRange(this.inputNumber);
188
+ this.enabled = this.model.isUpToDate;
189
+ this.toggleState = derived(this, reader => {
190
+ const input = this.model
191
+ .getState(this.baseRange)
192
+ .read(reader)
193
+ .getInput(this.inputNumber);
194
+ return input === 2 && !this.baseRange.isOrderRelevant
195
+ ? 1
196
+ : input;
197
+ });
198
+ this.state = derived(this, reader => {
199
+ const active = this.viewModel.activeModifiedBaseRange.read(reader);
200
+ if (!this.model.hasBaseRange(this.baseRange)) {
201
+ return { handled: false, focused: false };
202
+ }
203
+ return {
204
+ handled: this.model.isHandled(this.baseRange).read(reader),
205
+ focused: this.baseRange === active,
206
+ };
207
+ });
208
+ }
209
+ setState(value, tx) {
210
+ this.viewModel.setState(this.baseRange, this.model
211
+ .getState(this.baseRange)
212
+ .get()
213
+ .withInputValue(this.inputNumber, value), tx, this.inputNumber);
214
+ }
215
+ toggleBothSides() {
216
+ transaction(tx => {
217
+ const state = this.model
218
+ .getState(this.baseRange)
219
+ .get();
220
+ this.model.setState(this.baseRange, state
221
+ .toggle(this.inputNumber)
222
+ .toggle(this.inputNumber === 1 ? 2 : 1), true, tx);
223
+ });
224
+ }
225
+ getContextMenuActions() {
226
+ const state = this.model.getState(this.baseRange).get();
227
+ const handled = this.model.isHandled(this.baseRange).get();
228
+ const update = (newState) => {
229
+ transaction(tx => {
230
+ return this.viewModel.setState(this.baseRange, newState, tx, this.inputNumber);
231
+ });
232
+ };
233
+ function action(id, label, targetState, checked) {
234
+ const action = ( new Action(id, label, undefined, true, () => {
235
+ update(targetState);
236
+ }));
237
+ action.checked = checked;
238
+ return action;
239
+ }
240
+ const both = state.includesInput1 && state.includesInput2;
241
+ return [
242
+ this.baseRange.input1Diffs.length > 0
243
+ ? action('mergeEditor.acceptInput1', ( localizeWithPath(
244
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
245
+ 'mergeEditor.accept',
246
+ 'Accept {0}',
247
+ this.model.input1.title
248
+ )), state.toggle(1), state.includesInput1)
249
+ : undefined,
250
+ this.baseRange.input2Diffs.length > 0
251
+ ? action('mergeEditor.acceptInput2', ( localizeWithPath(
252
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
253
+ 'mergeEditor.accept',
254
+ 'Accept {0}',
255
+ this.model.input2.title
256
+ )), state.toggle(2), state.includesInput2)
257
+ : undefined,
258
+ this.baseRange.isConflicting
259
+ ? setFields(action('mergeEditor.acceptBoth', ( localizeWithPath(
260
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
261
+ 'mergeEditor.acceptBoth',
262
+ 'Accept Both'
263
+ )), state.withInputValue(1, !both).withInputValue(2, !both), both), { enabled: this.baseRange.canBeCombined })
264
+ : undefined,
265
+ ( new Separator()),
266
+ this.baseRange.isConflicting
267
+ ? setFields(action('mergeEditor.swap', ( localizeWithPath(
268
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
269
+ 'mergeEditor.swap',
270
+ 'Swap'
271
+ )), state.swap(), false), { enabled: !state.kind && (!both || this.baseRange.isOrderRelevant) })
272
+ : undefined,
273
+ setFields(( new Action('mergeEditor.markAsHandled', ( localizeWithPath(
274
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
275
+ 'mergeEditor.markAsHandled',
276
+ 'Mark as Handled'
277
+ )), undefined, true, () => {
278
+ transaction((tx) => {
279
+ this.model.setHandled(this.baseRange, !handled, tx);
280
+ });
281
+ })), { checked: handled }),
282
+ ].filter(isDefined);
283
+ }
284
+ }
285
+ class MergeConflictGutterItemView extends Disposable {
286
+ constructor(item, target, contextMenuService) {
287
+ super();
288
+ this.isMultiLine = observableValue(this, false);
289
+ this.item = observableValue(this, item);
290
+ const checkBox = ( new Toggle({
291
+ isChecked: false,
292
+ title: '',
293
+ icon: Codicon.check,
294
+ ...defaultToggleStyles
295
+ }));
296
+ checkBox.domNode.classList.add('accept-conflict-group');
297
+ this._register(addDisposableListener(checkBox.domNode, EventType.MOUSE_DOWN, (e) => {
298
+ const item = this.item.get();
299
+ if (!item) {
300
+ return;
301
+ }
302
+ if (e.button === 2) {
303
+ e.stopPropagation();
304
+ e.preventDefault();
305
+ contextMenuService.showContextMenu({
306
+ getAnchor: () => checkBox.domNode,
307
+ getActions: () => item.getContextMenuActions(),
308
+ });
309
+ }
310
+ else if (e.button === 1) {
311
+ e.stopPropagation();
312
+ e.preventDefault();
313
+ item.toggleBothSides();
314
+ }
315
+ }));
316
+ this._register(autorun(reader => {
317
+ const item = this.item.read(reader);
318
+ const value = item.toggleState.read(reader);
319
+ const iconMap = {
320
+ [0 ]: { icon: undefined, checked: false, title: ( localizeWithPath(
321
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
322
+ 'accept.excluded',
323
+ "Accept"
324
+ )) },
325
+ [3 ]: { icon: Codicon.circleFilled, checked: false, title: ( localizeWithPath(
326
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
327
+ 'accept.conflicting',
328
+ "Accept (result is dirty)"
329
+ )) },
330
+ [1 ]: { icon: Codicon.check, checked: true, title: ( localizeWithPath(
331
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
332
+ 'accept.first',
333
+ "Undo accept"
334
+ )) },
335
+ [2 ]: { icon: Codicon.checkAll, checked: true, title: ( localizeWithPath(
336
+ 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView',
337
+ 'accept.second',
338
+ "Undo accept (currently second)"
339
+ )) },
340
+ };
341
+ const state = iconMap[value];
342
+ checkBox.setIcon(state.icon);
343
+ checkBox.checked = state.checked;
344
+ checkBox.setTitle(state.title);
345
+ if (!item.enabled.read(reader)) {
346
+ checkBox.disable();
347
+ }
348
+ else {
349
+ checkBox.enable();
350
+ }
351
+ }));
352
+ this._register(autorun(reader => {
353
+ const state = this.item.read(reader).state.read(reader);
354
+ const classNames = [
355
+ 'merge-accept-gutter-marker',
356
+ state.handled && 'handled',
357
+ state.focused && 'focused',
358
+ this.isMultiLine.read(reader) ? 'multi-line' : 'single-line',
359
+ ];
360
+ target.className = classNames.filter(c => typeof c === 'string').join(' ');
361
+ }));
362
+ this._register(checkBox.onChange(() => {
363
+ transaction(tx => {
364
+ this.item.get().setState(checkBox.checked, tx);
365
+ });
366
+ }));
367
+ target.appendChild(h('div.background', [noBreakWhitespace]).root);
368
+ target.appendChild(this.checkboxDiv = h('div.checkbox', [h('div.checkbox-background', [checkBox.domNode])]).root);
369
+ }
370
+ layout(top, height, viewTop, viewHeight) {
371
+ const checkboxHeight = this.checkboxDiv.clientHeight;
372
+ const middleHeight = height / 2 - checkboxHeight / 2;
373
+ const margin = checkboxHeight;
374
+ let effectiveCheckboxTop = top + middleHeight;
375
+ const preferredViewPortRange = [
376
+ margin,
377
+ viewTop + viewHeight - margin - checkboxHeight
378
+ ];
379
+ const preferredParentRange = [
380
+ top + margin,
381
+ top + height - checkboxHeight - margin
382
+ ];
383
+ if (preferredParentRange[0] < preferredParentRange[1]) {
384
+ effectiveCheckboxTop = clamp(effectiveCheckboxTop, preferredViewPortRange[0], preferredViewPortRange[1]);
385
+ effectiveCheckboxTop = clamp(effectiveCheckboxTop, preferredParentRange[0], preferredParentRange[1]);
386
+ }
387
+ this.checkboxDiv.style.top = `${effectiveCheckboxTop - top}px`;
388
+ transaction((tx) => {
389
+ this.isMultiLine.set(height > 30, tx);
390
+ });
391
+ }
392
+ update(baseRange) {
393
+ transaction(tx => {
394
+ this.item.set(baseRange, tx);
395
+ });
396
+ }
397
+ }
398
+
399
+ export { InputCodeEditorView, MergeConflictGutterItemView, ModifiedBaseRangeGutterItemModel };