textfiles.ts 8.1 KB
Newer Older
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

J
Johannes Rieken 已提交
7
import { TPromise } from 'vs/base/common/winjs.base';
8 9
import URI from 'vs/base/common/uri';
import Event from 'vs/base/common/event';
J
Johannes Rieken 已提交
10 11
import { IDisposable } from 'vs/base/common/lifecycle';
import { IEncodingSupport, ConfirmResult } from 'vs/workbench/common/editor';
12
import { IBaseStat, IResolveContentOptions } from 'vs/platform/files/common/files';
J
Johannes Rieken 已提交
13
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
J
Joao Moreno 已提交
14
import { ITextEditorModel } from 'vs/editor/common/services/resolverService';
A
Alex Dima 已提交
15
import { IRawTextSource } from 'vs/editor/common/model/textSource';
16
import { IRevertOptions } from 'vs/platform/editor/common/editor';
17 18 19 20 21 22 23 24 25

/**
 * The save error handler can be installed on the text text file editor model to install code that executes when save errors occur.
 */
export interface ISaveErrorHandler {

	/**
	 * Called whenever a save fails.
	 */
B
Benjamin Pasero 已提交
26
	onSaveError(error: Error, model: ITextFileEditorModel): void;
27 28 29 30 31 32 33
}

export interface ISaveParticipant {

	/**
	 * Participate in a save of a model. Allows to change the model before it is being saved to disk.
	 */
B
Benjamin Pasero 已提交
34
	participate(model: ITextFileEditorModel, env: { reason: SaveReason }): void;
35 36 37 38 39 40 41 42 43
}

/**
 * States the text text file editor model can be in.
 */
export enum ModelState {
	SAVED,
	DIRTY,
	PENDING_SAVE,
44 45 46 47 48

	/**
	 * A model is in conflict mode when changes cannot be saved because the
	 * underlying file has changed. Models in conflict mode are always dirty.
	 */
49
	CONFLICT,
50 51 52 53 54 55 56 57 58 59

	/**
	 * A model is in orphan state when the underlying file has been deleted.
	 */
	ORPHAN,

	/**
	 * Any error that happens during a save that is not causing the CONFLICT state.
	 * Models in error mode are always diry.
	 */
60 61 62 63 64 65 66 67 68
	ERROR
}

export enum StateChange {
	DIRTY,
	SAVING,
	SAVE_ERROR,
	SAVED,
	REVERTED,
69
	ENCODING,
70 71
	CONTENT_CHANGE,
	ORPHANED_CHANGE
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
}

export class TextFileModelChangeEvent {
	private _resource: URI;
	private _kind: StateChange;

	constructor(model: ITextFileEditorModel, kind: StateChange) {
		this._resource = model.getResource();
		this._kind = kind;
	}

	public get resource(): URI {
		return this._resource;
	}

	public get kind(): StateChange {
		return this._kind;
	}
}

export const TEXT_FILE_SERVICE_ID = 'textFileService';

export interface ITextFileOperationResult {
	results: IResult[];
}

export interface IResult {
	source: URI;
	target?: URI;
	success?: boolean;
}

export interface IAutoSaveConfiguration {
	autoSaveDelay: number;
	autoSaveFocusChange: boolean;
	autoSaveApplicationChange: boolean;
}

export enum AutoSaveMode {
	OFF,
	AFTER_SHORT_DELAY,
	AFTER_LONG_DELAY,
	ON_FOCUS_CHANGE,
	ON_WINDOW_CHANGE
}

export enum SaveReason {
	EXPLICIT = 1,
	AUTO = 2,
	FOCUS_CHANGE = 3,
	WINDOW_CHANGE = 4
}

export const ITextFileService = createDecorator<ITextFileService>(TEXT_FILE_SERVICE_ID);

export interface IRawTextContent extends IBaseStat {

	/**
	 * The line grouped content of a text file.
	 */
A
Alex Dima 已提交
132
	value: IRawTextSource;
133 134 135 136 137 138 139 140 141 142 143 144

	/**
	 * The line grouped logical hash of a text file.
	 */
	valueLogicalHash: string;

	/**
	 * The encoding of the content if known.
	 */
	encoding: string;
}

145 146 147 148 149
export interface IModelLoadOrCreateOptions {
	encoding?: string;
	reload?: boolean;
}

150 151
export interface ITextFileEditorModelManager {

152
	onModelDisposed: Event<URI>;
153
	onModelContentChanged: Event<TextFileModelChangeEvent>;
154 155
	onModelEncodingChanged: Event<TextFileModelChangeEvent>;

156 157 158 159
	onModelDirty: Event<TextFileModelChangeEvent>;
	onModelSaveError: Event<TextFileModelChangeEvent>;
	onModelSaved: Event<TextFileModelChangeEvent>;
	onModelReverted: Event<TextFileModelChangeEvent>;
160
	onModelOrphanedChanged: Event<TextFileModelChangeEvent>;
161 162 163 164 165

	onModelsDirty: Event<TextFileModelChangeEvent[]>;
	onModelsSaveError: Event<TextFileModelChangeEvent[]>;
	onModelsSaved: Event<TextFileModelChangeEvent[]>;
	onModelsReverted: Event<TextFileModelChangeEvent[]>;
166 167 168 169 170

	get(resource: URI): ITextFileEditorModel;

	getAll(resource?: URI): ITextFileEditorModel[];

B
Benjamin Pasero 已提交
171
	loadOrCreate(resource: URI, options?: IModelLoadOrCreateOptions): TPromise<ITextFileEditorModel>;
172 173

	disposeModel(model: ITextFileEditorModel): void;
174 175
}

176
export interface ISaveOptions {
177
	force?: boolean;
178 179 180
	reason?: SaveReason;
	overwriteReadonly?: boolean;
	overwriteEncoding?: boolean;
181
	skipSaveParticipants?: boolean;
182
	writeElevated?: boolean;
183 184 185 186
}

export interface ITextFileEditorModel extends ITextEditorModel, IEncodingSupport {

187
	onDidContentChange: Event<StateChange>;
188 189
	onDidStateChange: Event<StateChange>;

190 191
	getVersionId(): number;

192 193
	getResource(): URI;

194
	hasState(state: ModelState): boolean;
195

196 197
	getETag(): string;

198 199
	updatePreferredEncoding(encoding: string): void;

200
	save(options?: ISaveOptions): TPromise<void>;
201

B
Benjamin Pasero 已提交
202 203
	load(): TPromise<ITextFileEditorModel>;

204
	revert(soft?: boolean): TPromise<void>;
205 206 207 208 209

	getValue(): string;

	isDirty(): boolean;

210 211
	isResolved(): boolean;

212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
	isDisposed(): boolean;
}

export interface ITextFileService extends IDisposable {
	_serviceBrand: any;
	onAutoSaveConfigurationChange: Event<IAutoSaveConfiguration>;
	onFilesAssociationChange: Event<void>;

	/**
	 * Access to the manager of text file editor models providing further methods to work with them.
	 */
	models: ITextFileEditorModelManager;

	/**
	 * Resolve the contents of a file identified by the resource.
	 */
	resolveTextContent(resource: URI, options?: IResolveContentOptions): TPromise<IRawTextContent>;

	/**
	 * A resource is dirty if it has unsaved changes or is an untitled file not yet saved.
	 *
	 * @param resource the resource to check for being dirty. If it is not specified, will check for
	 * all dirty resources.
	 */
	isDirty(resource?: URI): boolean;

	/**
	 * Returns all resources that are currently dirty matching the provided resources or all dirty resources.
	 *
	 * @param resources the resources to check for being dirty. If it is not specified, will check for
	 * all dirty resources.
	 */
	getDirty(resources?: URI[]): URI[];

	/**
	 * Saves the resource.
	 *
	 * @param resource the resource to save
250
	 * @param options optional save options
251
	 * @return true if the resource was saved.
252 253 254 255
	 */
	save(resource: URI, options?: ISaveOptions): TPromise<boolean>;

	/**
256
	 * Saves the provided resource asking the user for a file name or using the provided one.
257 258
	 *
	 * @param resource the resource to save as.
259 260
	 * @param targetResource the optional target to save to.
	 * @param options optional save options
261
	 * @return true if the file was saved.
262
	 */
263
	saveAs(resource: URI, targetResource?: URI, options?: ISaveOptions): TPromise<URI>;
264 265 266 267 268 269 270

	/**
	 * Saves the set of resources and returns a promise with the operation result.
	 *
	 * @param resources can be null to save all.
	 * @param includeUntitled to save all resources and optionally exclude untitled ones.
	 */
271 272
	saveAll(includeUntitled?: boolean, options?: ISaveOptions): TPromise<ITextFileOperationResult>;
	saveAll(resources: URI[], options?: ISaveOptions): TPromise<ITextFileOperationResult>;
273 274 275 276 277 278 279

	/**
	 * Reverts the provided resource.
	 *
	 * @param resource the resource of the file to revert.
	 * @param force to force revert even when the file is not dirty
	 */
280
	revert(resource: URI, options?: IRevertOptions): TPromise<boolean>;
281 282 283 284

	/**
	 * Reverts all the provided resources and returns a promise with the operation result.
	 */
285
	revertAll(resources?: URI[], options?: IRevertOptions): TPromise<ITextFileOperationResult>;
286 287 288 289 290 291 292

	/**
	 * Brings up the confirm dialog to either save, don't save or cancel.
	 *
	 * @param resources the resources of the files to ask for confirmation or null if
	 * confirming for all dirty resources.
	 */
293
	confirmSave(resources?: URI[]): TPromise<ConfirmResult>;
294 295 296 297 298 299 300 301 302 303

	/**
	 * Convinient fast access to the current auto save mode.
	 */
	getAutoSaveMode(): AutoSaveMode;

	/**
	 * Convinient fast access to the raw configured auto save settings.
	 */
	getAutoSaveConfiguration(): IAutoSaveConfiguration;
304 305 306 307 308

	/**
	 * Convinient fast access to the hot exit file setting.
	 */
	isHotExitEnabled: boolean;
309
}