use resourceEditorInput so that virtual documents can be shown in the editor

This commit is contained in:
Johannes Rieken 2016-01-06 17:53:37 +01:00
parent a4874a3997
commit ac5267eb61
2 changed files with 56 additions and 46 deletions

View file

@ -174,7 +174,29 @@ suite('workspace-namespace', () => {
}, err => {
// expected
})
})
});
test('registerTextDocumentContentProvider, show virtual document', function() {
// duplicate registration
let registration = workspace.registerTextDocumentContentProvider('foo', {
open(uri) {
return 'I am virtual';
},
close() {
// nothing
}
});
return workspace.openTextDocument(Uri.parse('foo://something/path')).then(doc => {
return window.showTextDocument(doc).then(editor => {
assert.ok(editor.document === doc);
assert.equal(editor.document.getText(), 'I am virtual');
registration.dispose();
})
});
});
test('findFiles', () => {
return workspace.findFiles('*.js', null).then((res) => {

View file

@ -27,8 +27,10 @@ import {asWinJsPromise} from 'vs/base/common/async';
import {EditorModel, EditorInput} from 'vs/workbench/common/editor';
import {IEditorInput, IResourceInput} from 'vs/platform/editor/common/editor';
import {BaseTextEditorModel} from 'vs/workbench/browser/parts/editor/textEditorModel';
import {ResourceEditorInput} from 'vs/workbench/browser/parts/editor/resourceEditorInput';
import {IMode} from 'vs/editor/common/modes';
import {IModeService} from 'vs/editor/common/services/modeService';
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
export interface IModelAddedData {
url: URI;
@ -558,8 +560,7 @@ export class ExtHostDocument extends BaseTextDocument {
@Remotable.MainContext('MainThreadDocuments')
export class MainThreadDocuments {
private _modelService: IModelService;
private _modeService: IModeService;
private _instantiationService: IInstantiationService;
private _textFileService: ITextFileService;
private _editorService: IWorkbenchEditorService;
private _fileService: IFileService;
@ -570,6 +571,7 @@ export class MainThreadDocuments {
private _modelIsSynced: {[modelId:string]:boolean;};
constructor(
@IInstantiationService instantiationService: IInstantiationService,
@IThreadService threadService: IThreadService,
@IModelService modelService: IModelService,
@IModeService modeService: IModeService,
@ -579,8 +581,7 @@ export class MainThreadDocuments {
@IFileService fileService: IFileService,
@IUntitledEditorService untitledEditorService: IUntitledEditorService
) {
this._modelService = modelService;
this._modeService = modeService;
this._instantiationService = instantiationService;
this._textFileService = textFileService;
this._editorService = editorService;
this._fileService = fileService;
@ -695,8 +696,7 @@ export class MainThreadDocuments {
default:
// create an input that talks back to the extension host
return TPromise.as(new MainThreadExtensionEditorInput(uri, this._proxy, this._modelService,
this._modeService));
return TPromise.as(this._instantiationService.createInstance(MainThreadExtensionEditorInput, uri, this._proxy));
}
}
@ -722,14 +722,19 @@ export class MainThreadDocuments {
}
}
export class MainThreadExtensionEditorInput extends EditorInput {
export class MainThreadExtensionEditorInput extends ResourceEditorInput {
private _model: MainThreadEditorModel;
private _documents: ExtHostModelService;
private _modeService: IModeService;
private _modelService: IModelService;
private _model: TPromise<EditorCommon.IModel>;
constructor(resource: URI, documents: ExtHostModelService, modelService:IModelService, modeService:IModeService) {
super();
this._model = new MainThreadEditorModel(resource, documents, modelService, modeService)
// todo@joh name, description
constructor(resource: URI, documents: ExtHostModelService, @IModelService modelService: IModelService,
@IModeService modeService: IModeService, @IInstantiationService instantiationService: IInstantiationService) {
super(resource.fsPath, undefined, resource, modelService, instantiationService);
this._documents = documents;
this._modeService = modeService;
this._modelService = modelService;
}
getId(): string {
@ -737,8 +742,22 @@ export class MainThreadExtensionEditorInput extends EditorInput {
}
resolve(refresh?: boolean): TPromise<EditorModel> {
// todo@joh proper refresh
return this._model.load(refresh);
if (!this._model) {
const model = this._modelService.getModel(this.resource);
if (model) {
this._model = TPromise.as(model);
} else {
this._model = this._documents.$openTextDocumentContent(this.resource).then(value => {
const firstLine = value.substr(0, value.search(/\r?\n/) + 1);
return this._modelService.createModel(value,
this._modeService.getOrCreateModeByFilenameOrFirstLine(this.resource.fsPath, firstLine),
this.resource);
});
}
}
return this._model.then(() => super.resolve(refresh));
}
dispose() {
@ -746,34 +765,3 @@ export class MainThreadExtensionEditorInput extends EditorInput {
super.dispose();
}
}
export class MainThreadEditorModel extends BaseTextEditorModel {
private _resource: URI;
private _documents: ExtHostModelService;
constructor(resource: URI, documents: ExtHostModelService, @IModelService modelService: IModelService,
@IModeService modeService: IModeService) {
super(modelService, modeService);
this._documents = documents;
this._resource = resource;
}
load(refresh?: boolean): TPromise<EditorModel> {
return this._documents.$openTextDocumentContent(this._resource).then(value => {
return this.createTextEditorModel(value, this._resource)
}).then(() => {
return this;
});
}
protected getOrCreateMode(modeService: IModeService, mime: string, firstLineText?: string): TPromise<IMode> {
return modeService.getOrCreateModeByFilenameOrFirstLine(this._resource.fsPath, firstLineText);
}
dispose() {
console.log('MainThreadEditorModel DISPOSE');
super.dispose();
}
}