diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index dfcd25a1213..9f627eb2cf4 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -305,6 +305,10 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo this._proxy.$acceptNotebookActiveKernelChange(e); })); + this._register(this._notebookService.onNotebookDocumentSaved(e => { + this._proxy.$acceptModelSaved(e); + })); + const updateOrder = () => { let userOrder = this.configurationService.getValue('notebook.displayOrder'); this._proxy.$acceptDisplayOrder({ diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 1d9e892d94c..eb5d8ea8455 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1633,6 +1633,7 @@ export interface ExtHostNotebookShape { $renderOutputs2(uriComponents: UriComponents, id: string, request: IOutputRenderRequest): Promise | undefined>; $onDidReceiveMessage(editorId: string, rendererId: string | undefined, message: unknown): void; $acceptModelChanged(uriComponents: UriComponents, event: NotebookCellsChangedEvent): void; + $acceptModelSaved(uriComponents: UriComponents): void; $acceptEditorPropertiesChanged(uriComponents: UriComponents, data: INotebookEditorPropertiesChangeData): void; $acceptDocumentAndEditorsDelta(delta: INotebookDocumentsAndEditorsDelta): Promise; $undoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise; diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 8dbb5eca0ee..9d9c567c468 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -3,28 +3,28 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as vscode from 'vscode'; +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { readonly } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; +import { hash } from 'vs/base/common/hash'; import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; +import { joinPath } from 'vs/base/common/resources'; import { ISplice } from 'vs/base/common/sequence'; +import { NotImplementedProxy } from 'vs/base/common/types'; import { URI, UriComponents } from 'vs/base/common/uri'; import * as UUID from 'vs/base/common/uuid'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { CellKind, ExtHostNotebookShape, IMainContext, MainContext, MainThreadNotebookShape, NotebookCellOutputsSplice, MainThreadDocumentsShape, INotebookEditorPropertiesChangeData, INotebookDocumentsAndEditorsDelta } from 'vs/workbench/api/common/extHost.protocol'; +import { CellKind, ExtHostNotebookShape, IMainContext, INotebookDocumentsAndEditorsDelta, INotebookEditorPropertiesChangeData, MainContext, MainThreadDocumentsShape, MainThreadNotebookShape, NotebookCellOutputsSplice } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; -import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { CellEditType, diff, ICellEditOperation, ICellInsertEdit, INotebookDisplayOrder, INotebookEditData, NotebookCellsChangedEvent, NotebookCellsSplice2, ICellDeleteEdit, notebookDocumentMetadataDefaults, NotebookCellsChangeType, NotebookDataDto, IOutputRenderRequest, IOutputRenderResponse, IOutputRenderResponseOutputInfo, IOutputRenderResponseCellInfo, IRawOutput, CellOutputKind, IProcessedOutput, INotebookKernelInfoDto2, IMainCellDto, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; -import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { ExtHostDocumentData } from 'vs/workbench/api/common/extHostDocumentData'; -import { NotImplementedProxy } from 'vs/base/common/types'; -import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; -import { asWebviewUri, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; +import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths'; -import { joinPath } from 'vs/base/common/resources'; -import { Schemas } from 'vs/base/common/network'; -import { hash } from 'vs/base/common/hash'; +import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; +import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; +import { asWebviewUri, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; +import { CellEditType, CellOutputKind, diff, ICellDeleteEdit, ICellEditOperation, ICellInsertEdit, IMainCellDto, INotebookDisplayOrder, INotebookEditData, INotebookKernelInfoDto2, IOutputRenderRequest, IOutputRenderResponse, IOutputRenderResponseCellInfo, IOutputRenderResponseOutputInfo, IProcessedOutput, IRawOutput, NotebookCellMetadata, NotebookCellsChangedEvent, NotebookCellsChangeType, NotebookCellsSplice2, NotebookDataDto, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import * as vscode from 'vscode'; import { Cache } from './cache'; interface IObservable { @@ -895,7 +895,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN private readonly _notebookKernelProviders = new Map(); private readonly _documents = new Map(); private readonly _unInitializedDocuments = new Map(); - private readonly _editors = new Map(); + private readonly _editors = new Map(); private readonly _webviewComm = new Map(); private readonly _notebookOutputRenderers = new Map(); private readonly _renderersUsedInNotebooks = new WeakMap>(); @@ -933,7 +933,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN private _onDidSaveNotebookDocument = new Emitter(); onDidSaveNotebookDocument: Event = this._onDidCloseNotebookDocument.event; visibleNotebookEditors: ExtHostNotebookEditor[] = []; - private _onDidChangeActiveNotebookKernel = new Emitter<{ document: ExtHostNotebookDocument, kernel: vscode.NotebookKernel | undefined }>(); + private _onDidChangeActiveNotebookKernel = new Emitter<{ document: ExtHostNotebookDocument, kernel: vscode.NotebookKernel | undefined; }>(); onDidChangeActiveNotebookKernel = this._onDidChangeActiveNotebookKernel.event; private _onDidChangeVisibleNotebookEditors = new Emitter(); onDidChangeVisibleNotebookEditors = this._onDidChangeVisibleNotebookEditors.event; @@ -1413,7 +1413,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN this._outputDisplayOrder = displayOrder; } - $acceptNotebookActiveKernelChange(event: { uri: UriComponents, providerHandle: number | undefined, kernelId: string | undefined }) { + $acceptNotebookActiveKernelChange(event: { uri: UriComponents, providerHandle: number | undefined, kernelId: string | undefined; }) { if (event.providerHandle !== undefined) { this._withAdapter(event.providerHandle, event.uri, async (adapter, document) => { const kernel = event.kernelId ? adapter.getKernel(event.kernelId) : undefined; @@ -1430,7 +1430,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN // TODO: remove document - editor one on one mapping private _getEditorFromURI(uriComponents: UriComponents) { const uriStr = URI.revive(uriComponents).toString(); - let editor: { editor: ExtHostNotebookEditor } | undefined; + let editor: { editor: ExtHostNotebookEditor; } | undefined; this._editors.forEach(e => { if (e.editor.uri.toString() === uriStr) { editor = e; @@ -1625,7 +1625,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN }); } - const removedEditors: { editor: ExtHostNotebookEditor }[] = []; + const removedEditors: { editor: ExtHostNotebookEditor; }[] = []; if (delta.removedEditors) { delta.removedEditors.forEach(editorid => { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index 727d88623d1..7d4f49372bf 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -253,6 +253,8 @@ export class NotebookService extends Disposable implements INotebookService, ICu public readonly onNotebookDocumentAdd: Event = this._onNotebookDocumentAdd.event; private readonly _onNotebookDocumentRemove: Emitter = this._register(new Emitter()); public readonly onNotebookDocumentRemove: Event = this._onNotebookDocumentRemove.event; + private readonly _onNotebookDocumentSaved: Emitter = this._register(new Emitter()); + public readonly onNotebookDocumentSaved: Event = this._onNotebookDocumentSaved.event; private readonly _notebookEditors = new Map(); private readonly _onDidChangeViewTypes = new Emitter(); @@ -1019,7 +1021,12 @@ export class NotebookService extends Disposable implements INotebookService, ICu const provider = this._notebookProviders.get(viewType); if (provider) { - return provider.controller.save(resource, token); + const ret = await provider.controller.save(resource, token); + if (ret) { + this._onNotebookDocumentSaved.fire(resource); + } + + return ret; } return false; @@ -1029,7 +1036,12 @@ export class NotebookService extends Disposable implements INotebookService, ICu const provider = this._notebookProviders.get(viewType); if (provider) { - return provider.controller.saveAs(resource, target, token); + const ret = await provider.controller.saveAs(resource, target, token); + if (ret) { + this._onNotebookDocumentSaved.fire(resource); + } + + return ret; } return false; diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 74870976e2c..9c6d199d7ed 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -46,6 +46,7 @@ export interface INotebookService { onNotebookEditorsRemove: Event; onNotebookDocumentRemove: Event; onNotebookDocumentAdd: Event; + onNotebookDocumentSaved: Event; onDidChangeKernels: Event; onDidChangeNotebookActiveKernel: Event<{ uri: URI, providerHandle: number | undefined, kernelId: string | undefined }>; registerNotebookController(viewType: string, extensionData: NotebookExtensionDescription, controller: IMainNotebookController): void;