diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 021f463060d2ccf541cd3fe735431623b2374fed..2cd084a4fc21120f6e3ccd8707489b4ca31835b4 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -5,6 +5,7 @@ 'use strict'; import {Registry} from 'vs/platform/platform'; +import URI from 'vs/base/common/uri'; import nls = require('vs/nls'); import {Promise} from 'vs/base/common/winjs.base'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; @@ -15,7 +16,8 @@ import {StringEditor} from 'vs/workbench/browser/parts/editor/stringEditor'; import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; import {UntitledEditorInput} from 'vs/workbench/common/editor/untitledEditorInput'; import {ResourceEditorInput} from 'vs/workbench/common/editor/resourceEditorInput'; -import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; +import {HtmlEditorInput} from 'vs/workbench/common/editor/htmlEditorInput'; +import {IInstantiationService, ServicesAccessor} from 'vs/platform/instantiation/common/instantiation'; import {TextDiffEditor} from 'vs/workbench/browser/parts/editor/textDiffEditor'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {BinaryResourceDiffEditor} from 'vs/workbench/browser/parts/editor/binaryDiffEditor'; @@ -27,6 +29,7 @@ import {Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarC import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; +import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; // Register String Editor (Registry.as(EditorExtensions.Editors)).registerEditor( @@ -148,4 +151,25 @@ class IFrameEditorActionContributor extends EditorInputActionContributor { } // Contribute to IFrame Editor Inputs -actionBarRegistry.registerActionBarContributor(Scope.EDITOR, IFrameEditorActionContributor); \ No newline at end of file +actionBarRegistry.registerActionBarContributor(Scope.EDITOR, IFrameEditorActionContributor); + +// Register Commands +KeybindingsRegistry.registerCommandDesc({ + id: 'workbench.html.preview', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), + description: { + description: 'Preview an html document.', + args: [{ name: 'uri', description: 'Uri of the document to preview.', constraint: URI }] + }, + handler(accessor: ServicesAccessor, args: [URI]) { + + let [resource] = args; + let name = resource.fsPath; + let input = accessor.get(IInstantiationService).createInstance(HtmlEditorInput, resource, name, undefined); + + return accessor.get(IWorkbenchEditorService).openEditor(input) + .then(editor => true); + }, + context: undefined, + primary: undefined +}); diff --git a/src/vs/workbench/common/editor/htmlEditorInput.ts b/src/vs/workbench/common/editor/htmlEditorInput.ts new file mode 100644 index 0000000000000000000000000000000000000000..96c456824851eb0954e5523c50c34ad82a97a1d7 --- /dev/null +++ b/src/vs/workbench/common/editor/htmlEditorInput.ts @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import {TPromise} from 'vs/base/common/winjs.base'; +import URI from 'vs/base/common/uri'; +import {IEditorService} from 'vs/platform/editor/common/editor'; +import {IModelService} from 'vs/editor/common/services/modelService'; +import {IFrameEditorInput} from 'vs/workbench/common/editor/iframeEditorInput'; +import {IFrameEditorModel} from 'vs/workbench/common/editor/iframeEditorModel'; + +export class HtmlEditorInput extends IFrameEditorInput { + + private _editorService: IEditorService; + private _modelService: IModelService; + + constructor(resource: URI, name: string, description: string, + @IEditorService editorService: IEditorService, + @IModelService modelService: IModelService + ) { + super(resource, name, description); + this._editorService = editorService; + this._modelService = modelService; + } + + public resolve(refresh?: boolean): TPromise { + return this._editorService.resolveEditorModel({ resource: this.getResource() }).then(model => { + if (!this._modelService.getModel(this.getResource())) { + throw new Error('Cannot load content for: ' + this.getResource()); + } + return super.resolve(refresh); + }); + } + + protected createModel(): IFrameEditorModel { + // todo@joh check mode? + // todo@joh listen to model changes! + const model = this._modelService.getModel(this.getResource()); + const result = new IFrameEditorModel(this.getResource()); + + result.setContents('', model.getValue(), ''); // change this + return result; + } + + public createNew(resource: URI): IFrameEditorInput { + return; + } +}