Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/common/services/modelUndoRedoParticipant.ts
3295 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 { IModelService } from './model.js';
7
import { ITextModelService } from './resolverService.js';
8
import { Disposable, IDisposable, dispose } from '../../../base/common/lifecycle.js';
9
import { IUndoRedoService } from '../../../platform/undoRedo/common/undoRedo.js';
10
import { IUndoRedoDelegate, MultiModelEditStackElement } from '../model/editStack.js';
11
12
export class ModelUndoRedoParticipant extends Disposable implements IUndoRedoDelegate {
13
constructor(
14
@IModelService private readonly _modelService: IModelService,
15
@ITextModelService private readonly _textModelService: ITextModelService,
16
@IUndoRedoService private readonly _undoRedoService: IUndoRedoService,
17
) {
18
super();
19
this._register(this._modelService.onModelRemoved((model) => {
20
// a model will get disposed, so let's check if the undo redo stack is maintained
21
const elements = this._undoRedoService.getElements(model.uri);
22
if (elements.past.length === 0 && elements.future.length === 0) {
23
return;
24
}
25
for (const element of elements.past) {
26
if (element instanceof MultiModelEditStackElement) {
27
element.setDelegate(this);
28
}
29
}
30
for (const element of elements.future) {
31
if (element instanceof MultiModelEditStackElement) {
32
element.setDelegate(this);
33
}
34
}
35
}));
36
}
37
38
public prepareUndoRedo(element: MultiModelEditStackElement): IDisposable | Promise<IDisposable> {
39
// Load all the needed text models
40
const missingModels = element.getMissingModels();
41
if (missingModels.length === 0) {
42
// All models are available!
43
return Disposable.None;
44
}
45
46
const disposablesPromises = missingModels.map(async (uri) => {
47
try {
48
const reference = await this._textModelService.createModelReference(uri);
49
return <IDisposable>reference;
50
} catch (err) {
51
// This model could not be loaded, maybe it was deleted in the meantime?
52
return Disposable.None;
53
}
54
});
55
56
return Promise.all(disposablesPromises).then(disposables => {
57
return {
58
dispose: () => dispose(disposables)
59
};
60
});
61
}
62
}
63
64