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