diff --git a/extensions/notebook-test/src/notebookProvider.ts b/extensions/notebook-test/src/notebookProvider.ts index cc15e9ccf7c..2b02316dcbc 100644 --- a/extensions/notebook-test/src/notebookProvider.ts +++ b/extensions/notebook-test/src/notebookProvider.ts @@ -59,9 +59,19 @@ export class Cell { export class JupyterNotebook { public mapping: Map = new Map(); private preloadScript = false; + private _displayOrders = [ + 'application/json', + 'application/javascript', + 'text/html', + 'image/svg+xml', + 'text/markdown', + 'image/svg+xml', + 'image/png', + 'image/jpeg', + 'text/plain' + ]; constructor( private _extensionPath: string, - public document: vscode.NotebookDocument, editor: vscode.NotebookEditor, public notebookJSON: any, private fillOutputs: boolean @@ -228,7 +238,7 @@ export class NotebookProvider implements vscode.NotebookProvider { }] }; } - let jupyterNotebook = new JupyterNotebook(this._extensionPath, editor.document, editor, json, this.fillOutputs); + let jupyterNotebook = new JupyterNotebook(this._extensionPath, editor, json, this.fillOutputs); this._notebooks.set(editor.document.uri.toString(), jupyterNotebook); } catch { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index bfd066c1d3a..f0990aaccf9 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1399,6 +1399,7 @@ declare module 'vscode' { readonly isDirty: boolean; languages: string[]; cells: NotebookCell[]; + displayOrder?: GlobPattern[]; } export interface NotebookEditor { @@ -1411,7 +1412,6 @@ declare module 'vscode' { } export interface NotebookProvider { - displayOrder?: GlobPattern[]; resolveNotebook(editor: NotebookEditor): Promise; executeCell(document: NotebookDocument, cell: NotebookCell | undefined): Promise; save(document: NotebookDocument): Promise; diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 171e4a2d217..171535340ea 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -9,7 +9,6 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { INotebookService, IMainNotebookController } from 'vs/workbench/contrib/notebook/browser/notebookService'; import { Emitter, Event } from 'vs/base/common/event'; -import { IMarkdownString } from 'vs/base/common/htmlContent'; import { ICell, IOutput, INotebook, INotebookMimeTypeSelector } from 'vs/workbench/contrib/notebook/common/notebookCommon'; export class MainThreadCell implements ICell { @@ -139,7 +138,7 @@ export class MainThreadNotebookDocument extends Disposable implements INotebook } async createRawCell(viewType: string, uri: URI, index: number, language: string, type: 'markdown' | 'code'): Promise { - let cell = await this._proxy.$createRawCell(viewType, uri, index, language, type); + let cell = await this._proxy.$createEmptyCell(viewType, uri, index, language, type); if (cell) { let mainCell = new MainThreadCell(cell.handle, cell.source, cell.language, cell.cell_type, cell.outputs); this._mapping.set(cell.handle, mainCell); @@ -231,8 +230,6 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo controller.createNotebookDocument(handle, viewType, resource); } - // let document = new MainThreadNotebookDocument(this._proxy, handle, viewType, URI.revive(resource)); - // this._documents.set(handle, document); return; } @@ -244,15 +241,6 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo } } - async $updateNotebookCell(viewType: string, resource: UriComponents, cell: ICell, renderers: number[]): Promise { - let controller = this._notebookProviders.get(viewType); - - if (controller) { - controller.updateNotebookCell(resource, cell, renderers); - } - - } - async $updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise { let controller = this._notebookProviders.get(viewType); @@ -261,21 +249,13 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo } } - // async $updateNotebook(viewType: string, resource: UriComponents, notebook: INotebookDto): Promise { - // let controller = this._notebookProviders.get(viewType); - - // if (controller) { - // controller.updateNotebook(resource, notebook); - // } - // } - async resolveNotebook(viewType: string, uri: URI): Promise { let handle = await this._proxy.$resolveNotebook(viewType, uri); return handle; } - executeNotebook(viewType: string, uri: URI): Promise { - return this._proxy.$executeNotebook(viewType, uri); + async executeNotebook(viewType: string, uri: URI): Promise { + return this._proxy.$executeNotebook(viewType, uri, undefined); } } @@ -317,63 +297,40 @@ export class MainThreadNotebookController implements IMainNotebookController { } updateNotebook(resource: UriComponents, notebook: INotebook): void { - let mainthreadNotebook = this._mapping.get(URI.from(resource).toString()); - - if (mainthreadNotebook) { - mainthreadNotebook.updateCells(notebook.cells); - } + let document = this._mapping.get(URI.from(resource).toString()); + document?.updateCells(notebook.cells); } updateLanguages(resource: UriComponents, languages: string[]) { let document = this._mapping.get(URI.from(resource).toString()); - - if (document) { - document.updateLanguages(languages); - } + document?.updateLanguages(languages); } updateNotebookCells(resource: UriComponents, cells: ICell[], renderers: number[]): void { let document = this._mapping.get(URI.from(resource).toString()); - - if (document) { - document.updateRenderers(renderers); - document.updateCells(cells); - } + document?.updateRenderers(renderers); + document?.updateCells(cells); } updateNotebookCell(resource: UriComponents, cell: ICell, renderers: number[]): void { let document = this._mapping.get(URI.from(resource).toString()); - - if (document) { - document.updateRenderers(renderers); - document.updateCell(cell); - } + document?.updateRenderers(renderers); + document?.updateCell(cell); } updateNotebookRenderers(resource: UriComponents, renderers: number[]): void { let document = this._mapping.get(URI.from(resource).toString()); - - if (document) { - document.updateRenderers(renderers); - } + document?.updateRenderers(renderers); } updateNotebookActiveCell(uri: URI, cellHandle: number): void { let mainthreadNotebook = this._mapping.get(URI.from(uri).toString()); - - if (mainthreadNotebook) { - mainthreadNotebook.updateActiveCell(cellHandle); - } + mainthreadNotebook?.updateActiveCell(cellHandle); } async createRawCell(uri: URI, index: number, language: string, type: 'markdown' | 'code'): Promise { let mainthreadNotebook = this._mapping.get(URI.from(uri).toString()); - - if (mainthreadNotebook) { - return mainthreadNotebook.createRawCell(this._viewType, uri, index, language, type); - } - - return; + return mainthreadNotebook?.createRawCell(this._viewType, uri, index, language, type); } async deleteCell(uri: URI, index: number): Promise { @@ -390,23 +347,25 @@ export class MainThreadNotebookController implements IMainNotebookController { let mainthreadNotebook = this._mapping.get(URI.from(uri).toString()); if (mainthreadNotebook && mainthreadNotebook.activeCell) { - this._proxy.$executeNotebookCell(this._viewType, uri, mainthreadNotebook.activeCell.handle); + this._proxy.$executeNotebook(this._viewType, uri, mainthreadNotebook.activeCell.handle); } } - async latexRenderer(value: string): Promise { - return this._proxy.$latexRenderer(this._viewType, value); - } + // async latexRenderer(value: string): Promise { + // return this._proxy.$latexRenderer(this._viewType, value); + // } async destoryNotebookDocument(notebook: INotebook): Promise { - let mainthreadNotebook = this._mapping.get(URI.from(notebook.uri).toString()); + let document = this._mapping.get(URI.from(notebook.uri).toString()); - if (mainthreadNotebook) { - let removeFromExtHost = await this._proxy.$destoryNotebookDocument(this._viewType, notebook.uri); - if (removeFromExtHost) { - mainthreadNotebook.dispose(); - this._mapping.delete(URI.from(notebook.uri).toString()); - } + if (!document) { + return; + } + + let removeFromExtHost = await this._proxy.$destoryNotebookDocument(this._viewType, notebook.uri); + if (removeFromExtHost) { + document.dispose(); + this._mapping.delete(URI.from(notebook.uri).toString()); } } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f17e62c19ce..614832fac8f 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -649,9 +649,7 @@ export interface MainThreadNotebookShape extends IDisposable { $registerNotebookRenderer(extension: NotebookExtensionDescription, selectors: INotebookMimeTypeSelector, handle: number, preloads: UriComponents[]): Promise; $unregisterNotebookRenderer(handle: number): Promise; $createNotebookDocument(handle: number, viewType: string, resource: UriComponents): Promise; - // $updateNotebook(viewType: string, resource: UriComponents, notebook: INotebookDto): Promise; $updateNotebookCells(viewType: string, resource: UriComponents, cells: ICellDto[], renderers: number[]): Promise; - $updateNotebookCell(viewType: string, resource: UriComponents, cell: ICellDto, renderers: number[]): Promise; $updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise; } @@ -1475,10 +1473,9 @@ export interface ExtHostCommentsShape { export interface ExtHostNotebookShape { $resolveNotebook(viewType: string, uri: UriComponents): Promise; - $executeNotebook(viewType: string, uri: UriComponents): Promise; - $executeNotebookCell(viewType: string, uri: UriComponents, cellHandle: number): Promise; - $latexRenderer(viewType: string, value: string): Promise; - $createRawCell(viewType: string, uri: UriComponents, index: number, language: string, type: 'markdown' | 'code'): Promise; + $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined): Promise; + // $latexRenderer(viewType: string, value: string): Promise; + $createEmptyCell(viewType: string, uri: UriComponents, index: number, language: string, type: 'markdown' | 'code'): Promise; $deleteCell(viewType: string, uri: UriComponents, index: number): Promise; $saveNotebook(viewType: string, uri: UriComponents): Promise; $updateActiveEditor(viewType: string, uri: UriComponents): Promise; diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 6e02eda25e7..90313c99d4a 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -117,14 +117,14 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument { }); } - this._proxy.$updateNotebookCell(this.viewType, this.uri, { + this._proxy.$updateNotebookCells(this.viewType, this.uri, [{ handle: cell.handle, source: cell.source, language: cell.language, cell_type: cell.cell_type, outputs: outputs, isDirty: false - }, Array.from(renderers)); + }], Array.from(renderers)); })); }); } @@ -140,6 +140,16 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument { this._proxy.$updateNotebookLanguages(this.viewType, this.uri, this._languages); } + private _displayOrder: vscode.GlobPattern[] = []; + + get displayOrder() { + return this._displayOrder; + } + + set displayOrder(newOrder: vscode.GlobPattern[]) { + this._displayOrder = newOrder; + } + constructor( private readonly _proxy: MainThreadNotebookShape, public viewType: string, @@ -184,7 +194,7 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument { return await this._proxy.$updateNotebookCells(this.viewType, this.uri, cells, Array.from(renderers)); } - insertRawCell(index: number, cell: ExtHostCell) { + insertCell(index: number, cell: ExtHostCell) { this.cells.splice(index, 0, cell); if (!this._cellDisposableMapping.has(cell.handle)) { @@ -209,14 +219,14 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument { }); } - this._proxy.$updateNotebookCell(this.viewType, this.uri, { + this._proxy.$updateNotebookCells(this.viewType, this.uri, [{ handle: cell.handle, source: cell.source, language: cell.language, cell_type: cell.cell_type, outputs: outputs, isDirty: false - }, Array.from(renderers)); + }], Array.from(renderers)); })); } @@ -233,7 +243,7 @@ export class ExtHostNotebookDocument implements vscode.NotebookDocument { return true; } - getActiveCell(cellHandle: number) { + getCell(cellHandle: number) { return this.cells.find(cell => cell.handle === cellHandle); } @@ -448,11 +458,9 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN let editor = new ExtHostNotebookEditor( viewType, - // this._proxy, `${ExtHostNotebookController._handlePool++}`, URI.revive(uri), this._documents.get(URI.revive(uri).toString())!, - // this._documentsProxy, this._documentsAndEditors ); @@ -465,41 +473,35 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN return Promise.resolve(undefined); } - async $executeNotebook(viewType: string, uri: UriComponents): Promise { + async $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined): Promise { let provider = this._notebookProviders.get(viewType); - if (provider) { - let document = this._documents.get(URI.revive(uri).toString()); - - return provider.provider.executeCell(document!, undefined); - } - } - - async $executeNotebookCell(viewType: string, uri: UriComponents, cellHandle: number): Promise { - let provider = this._notebookProviders.get(viewType); - - if (provider) { - let document = this._documents.get(URI.revive(uri).toString()); - let cell = document?.getActiveCell(cellHandle); - - if (cell) { - return provider.provider.executeCell(document!, cell!); - } - } - } - - async $latexRenderer(viewType: string, value: string): Promise { - let provider = this._notebookProviders.get(viewType); - - if (provider && provider.provider.latexRenderer) { - let res = await provider.provider.latexRenderer(value); - return extHostTypeConverter.MarkdownString.from(res); + if (!provider) { + return; } - return; + let document = this._documents.get(URI.revive(uri).toString()); + + if (!document) { + return; + } + + let cell = cellHandle !== undefined ? document.getCell(cellHandle) : undefined; + return provider.provider.executeCell(document!, cell); } - async $createRawCell(viewType: string, uri: URI, index: number, language: string, type: 'markdown' | 'code'): Promise { + // async $latexRenderer(viewType: string, value: string): Promise { + // let provider = this._notebookProviders.get(viewType); + + // if (provider && provider.provider.latexRenderer) { + // let res = await provider.provider.latexRenderer(value); + // return extHostTypeConverter.MarkdownString.from(res); + // } + + // return; + // } + + async $createEmptyCell(viewType: string, uri: URI, index: number, language: string, type: 'markdown' | 'code'): Promise { let provider = this._notebookProviders.get(viewType); if (provider) { @@ -507,7 +509,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN let document = this._documents.get(URI.revive(uri).toString()); let rawCell = editor?.createCell('', language, type, []) as ExtHostCell; - document?.insertRawCell(index, rawCell!); + document?.insertCell(index, rawCell!); return { handle: rawCell.handle, source: rawCell.source, diff --git a/src/vs/workbench/contrib/notebook/browser/notebookService.ts b/src/vs/workbench/contrib/notebook/browser/notebookService.ts index f9b68cb87eb..2d346a66dc5 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookService.ts @@ -51,7 +51,7 @@ export interface IMainNotebookController { deleteCell(uri: URI, index: number): Promise executeNotebookActiveCell(uri: URI): void; destoryNotebookDocument(notebook: INotebook): Promise; - latexRenderer(value: string): Promise; + // latexRenderer(value: string): Promise; } export interface INotebookService { @@ -72,7 +72,7 @@ export interface INotebookService { deleteNotebookCell(viewType: string, resource: URI, index: number): Promise; destoryNotebookDocument(viewType: string, notebook: INotebook): void; updateActiveNotebookDocument(viewType: string, resource: URI): void; - latexRenderer(viewType: string, value: string): Promise; + // latexRenderer(viewType: string, value: string): Promise; } export class NotebookInfoStore { @@ -258,15 +258,15 @@ export class NotebookService extends Disposable implements INotebookService { this._onDidChangeActiveEditor.fire({ viewType, uri: resource }); } - async latexRenderer(viewType: string, value: string): Promise { - let provider = this._notebookProviders.get(viewType); + // async latexRenderer(viewType: string, value: string): Promise { + // let provider = this._notebookProviders.get(viewType); - if (provider) { - return provider.controller.latexRenderer(value); - } + // if (provider) { + // return provider.controller.latexRenderer(value); + // } - return; - } + // return; + // } private _onWillDispose(model: INotebook): void { let modelId = MODEL_ID(model.uri);