提交 1d58387b 编写于 作者: B Benjamin Pasero

auto save: fix race condition with setting a model to auto save or not

上级 e43f0ce9
......@@ -8,6 +8,7 @@ import nls = require('vs/nls');
import {TPromise, Promise} from 'vs/base/common/winjs.base';
import {onUnexpectedError, toErrorMessage, getHttpStatus} from 'vs/base/common/errors';
import URI from 'vs/base/common/uri';
import {IDisposable} from 'vs/base/common/lifecycle';
import paths = require('vs/base/common/paths');
import diagnostics = require('vs/base/common/diagnostics');
import types = require('vs/base/common/types');
......@@ -90,6 +91,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements IEncodin
private contentEncoding: string; // encoding as reported from disk
private preferredEncoding: string; // encoding as chosen by the user
private textModelChangeListener: () => void;
private textFileServiceListener: IDisposable;
private dirty: boolean;
private versionId: number;
private bufferSavedVersionId: number;
......@@ -133,9 +135,14 @@ export class TextFileEditorModel extends BaseTextEditorModel implements IEncodin
this.mapPendingSaveToVersionId = {};
this.updateAutoSaveConfiguration(textFileService.getAutoSaveConfiguration());
this.registerListeners();
}
public updateAutoSaveConfiguration(config: IAutoSaveConfiguration): void {
private registerListeners(): void {
this.textFileServiceListener = this.textFileService.onAutoSaveConfigurationChange(config => this.updateAutoSaveConfiguration(config));
}
private updateAutoSaveConfiguration(config: IAutoSaveConfiguration): void {
if (typeof config.autoSaveDelay === 'number' && config.autoSaveDelay > 0) {
this.autoSaveAfterMillies = config.autoSaveDelay * 1000;
this.autoSaveAfterMilliesEnabled = true;
......@@ -732,6 +739,11 @@ export class TextFileEditorModel extends BaseTextEditorModel implements IEncodin
this.textModelChangeListener = null;
}
if (this.textFileServiceListener) {
this.textFileServiceListener.dispose();
this.textFileServiceListener = null;
}
this.cancelAutoSavePromises();
CACHE.remove(this.resource);
......
......@@ -8,6 +8,7 @@ import {TPromise, Promise} from 'vs/base/common/winjs.base';
import URI from 'vs/base/common/uri';
import errors = require('vs/base/common/errors');
import {ListenerUnbind} from 'vs/base/common/eventEmitter';
import Event, {Emitter} from 'vs/base/common/event';
import {FileEditorInput} from 'vs/workbench/parts/files/browser/editors/fileEditorInput';
import {CACHE, TextFileEditorModel} from 'vs/workbench/parts/files/browser/editors/textFileEditorModel';
import {IResult, ITextFileOperationResult, ConfirmResult, ITextFileService, IAutoSaveConfiguration} from 'vs/workbench/parts/files/common/files';
......@@ -33,6 +34,8 @@ export abstract class TextFileService implements ITextFileService {
private listenerToUnbind: ListenerUnbind[];
private _workingFilesModel: WorkingFilesModel;
private _onAutoSaveConfigurationChange: Emitter<IAutoSaveConfiguration>;
private configuredAutoSaveDelay: number;
private configuredAutoSaveOnFocusChange: boolean;
......@@ -45,11 +48,16 @@ export abstract class TextFileService implements ITextFileService {
@IEventService private eventService: IEventService
) {
this.listenerToUnbind = [];
this._onAutoSaveConfigurationChange = new Emitter<IAutoSaveConfiguration>();
this.registerListeners();
this.loadConfiguration();
}
public get onAutoSaveConfigurationChange(): Event<IAutoSaveConfiguration> {
return this._onAutoSaveConfigurationChange.event;
}
private get workingFilesModel(): WorkingFilesModel {
if (!this._workingFilesModel) {
this._workingFilesModel = this.instantiationService.createInstance(WorkingFilesModel);
......@@ -93,11 +101,12 @@ export abstract class TextFileService implements ITextFileService {
this.configuredAutoSaveDelay = configuration && configuration.files && configuration.files.autoSaveDelay;
this.configuredAutoSaveOnFocusChange = configuration && configuration.files && configuration.files.autoSaveFocusChange;
const autoSaveConfig = this.getAutoSaveConfiguration();
CACHE.getAll().forEach((model) => model.updateAutoSaveConfiguration(autoSaveConfig));
// Emit as event
this._onAutoSaveConfigurationChange.fire(this.getAutoSaveConfiguration());
// save all dirty when enabling auto save
if (!wasAutoSaveEnabled && this.isAutoSaveEnabled()) {
this.saveAll().done(null, errors.onUnexpectedError); // save all dirty when enabling auto save
this.saveAll().done(null, errors.onUnexpectedError);
}
}
......
......@@ -375,4 +375,9 @@ export interface ITextFileService extends IDisposable {
* Convinient fast access to the configured auto save settings.
*/
getAutoSaveConfiguration(): IAutoSaveConfiguration;
/**
* Event is fired with the auto save configuration whenever it changes.
*/
onAutoSaveConfigurationChange: Event<IAutoSaveConfiguration>;
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册