/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions } from 'vs/workbench/common/editor'; import * as DOM from 'vs/base/browser/dom'; import { bootstrapAngular } from 'sql/platform/bootstrap/node/bootstrapService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CancellationToken } from 'vs/base/common/cancellation'; import { NotebookInput } from 'sql/workbench/parts/notebook/notebookInput'; import { NotebookModule } from 'sql/workbench/parts/notebook/notebook.module'; import { NOTEBOOK_SELECTOR } from 'sql/workbench/parts/notebook/notebook.component'; import { INotebookParams } from 'sql/workbench/services/notebook/common/notebookService'; import { IStorageService } from 'vs/platform/storage/common/storage'; export class NotebookEditor extends BaseEditor { public static ID: string = 'workbench.editor.notebookEditor'; private _notebookContainer: HTMLElement; constructor( @ITelemetryService telemetryService: ITelemetryService, @IThemeService themeService: IThemeService, @IInstantiationService private instantiationService: IInstantiationService, @IStorageService storageService: IStorageService ) { super(NotebookEditor.ID, telemetryService, themeService, storageService); } public get notebookInput(): NotebookInput { return this.input as NotebookInput; } /** * Called to create the editor in the parent element. */ public createEditor(parent: HTMLElement): void { } /** * Sets focus on this editor. Specifically, it sets the focus on the hosted text editor. */ public focus(): void { } /** * Updates the internal variable keeping track of the editor's size, and re-calculates the sash position. * To be called when the container of this editor changes size. */ public layout(dimension: DOM.Dimension): void { if (this.notebookInput) { this.notebookInput.doChangeLayout(); } } public setInput(input: NotebookInput, options: EditorOptions): Promise { if (this.input && this.input.matches(input)) { return Promise.resolve(undefined); } const parentElement = this.getContainer(); super.setInput(input, options, CancellationToken.None); DOM.clearNode(parentElement); if (!input.hasBootstrapped) { let container = DOM.$('.notebookEditor'); container.style.height = '100%'; this._notebookContainer = DOM.append(parentElement, container); input.container = this._notebookContainer; return Promise.resolve(this.bootstrapAngular(input)); } else { this._notebookContainer = DOM.append(parentElement, input.container); input.doChangeLayout(); return Promise.resolve(null); } } /** * Load the angular components and record for this input that we have done so */ private bootstrapAngular(input: NotebookInput): void { // Get the bootstrap params and perform the bootstrap input.hasBootstrapped = true; let params: INotebookParams = { notebookUri: input.notebookUri, input: input, providerInfo: input.getProviderInfo(), profile: input.connectionProfile }; bootstrapAngular(this.instantiationService, NotebookModule, this._notebookContainer, NOTEBOOK_SELECTOR, params, input ); } }