diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 1a0d137e32b4b625331b8a5110356aab92c9d84c..5741ff5aa8557268b7b1a5be07472b6118f99f58 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1350,6 +1350,7 @@ declare module 'vscode' { } export interface WorkspaceEdit { + replaceNotebookMetadata(uri: Uri, value: NotebookDocumentMetadata): void; replaceCells(uri: Uri, start: number, end: number, cells: NotebookCellData[], metadata?: WorkspaceEditEntryMetadata): void; replaceCellOutput(uri: Uri, index: number, outputs: CellOutput[], metadata?: WorkspaceEditEntryMetadata): void; replaceCellMetadata(uri: Uri, index: number, cellMetadata: NotebookCellMetadata, metadata?: WorkspaceEditEntryMetadata): void; diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index d8e199ac0adae963f0b6eedfb5caa38953503b07..71d1e9400857bd02aa6c337401b7e1b960329449 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -44,7 +44,7 @@ function reviveWorkspaceEditDto2(data: IWorkspaceEditDto | undefined): ResourceE } else if (edit._type === WorkspaceEditType.Text) { result.push(new ResourceTextEdit(edit.resource, edit.edit, edit.modelVersionId, edit.metadata)); } else if (edit._type === WorkspaceEditType.Cell) { - result.push(new ResourceNotebookCellEdit(edit.resource, edit.edit, edit.modelVersionId, edit.metadata)); + result.push(new ResourceNotebookCellEdit(edit.resource, edit.edit, edit.notebookMetadata, edit.notebookVersionId, edit.metadata)); } } return result; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 94cbcab2a903cc30c837748001131b2345a80b51..172c3111ff7e2976eb14d21a81bbe3e133ae189a 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1274,8 +1274,9 @@ export interface IWorkspaceTextEditDto { export interface IWorkspaceCellEditDto { _type: WorkspaceEditType.Cell; resource: UriComponents; - edit: ICellEditOperation; - modelVersionId?: number; + edit?: ICellEditOperation; + notebookMetadata?: NotebookDocumentMetadata; + notebookVersionId?: number; metadata?: IWorkspaceEditEntryMetadataDto; } diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index e5df10e69f8ad83f5cd404120a6a984cf366375f..da9bd09b20acee745683389a4b0fdd871df72f0c 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -537,10 +537,11 @@ export namespace WorkspaceEdit { } else if (entry._type === types.FileEditType.Cell) { result.edits.push({ _type: extHostProtocol.WorkspaceEditType.Cell, + metadata: entry.metadata, resource: entry.uri, edit: entry.edit, - metadata: entry.metadata, - modelVersionId: notebooks?.lookupNotebookDocument(entry.uri)?.notebookDocument.version + notebookMetadata: entry.notebookMetadata, + notebookVersionId: notebooks?.lookupNotebookDocument(entry.uri)?.notebookDocument.version }); } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index d832779db22566de7fcaf0c0b8496346748a39a5..94638701e4f44982e633affc8d6e3260698817cf 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -601,7 +601,8 @@ export interface IFileTextEdit { export interface IFileCellEdit { _type: FileEditType.Cell; uri: URI; - edit: ICellEditOperation; + edit?: ICellEditOperation; + notebookMetadata?: vscode.NotebookDocumentMetadata; metadata?: vscode.WorkspaceEditEntryMetadata; } @@ -629,7 +630,11 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit { this._edits.push({ _type: FileEditType.File, from: uri, to: undefined, options, metadata }); } - // --- cell + // --- notebook + + replaceNotebookMetadata(uri: URI, value: vscode.NotebookDocumentMetadata, metadata?: vscode.WorkspaceEditEntryMetadata): void { + this._edits.push({ _type: FileEditType.Cell, metadata, uri, notebookMetadata: value }); + } replaceCells(uri: URI, start: number, end: number, cells: vscode.NotebookCellData[], metadata?: vscode.WorkspaceEditEntryMetadata): void { this._edits.push({ _type: FileEditType.Cell, metadata, uri, edit: { editType: CellEditType.Replace, index: start, count: end - start, cells: cells.map(cell => ({ ...cell, outputs: cell.outputs.map(output => addIdToOutput(output)) })) } }); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts index 5def1d910c2ab7d20e27f6a24e9c38242b3db2d0..41ab95fd25efbfdf99ee951d1d2fd8f8c8f8e125 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkCellEdits.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; import { WorkspaceEditMetadata } from 'vs/editor/common/modes'; import { IProgress } from 'vs/platform/progress/common/progress'; -import { ICellEditOperation } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ICellEditOperation, NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; @@ -17,7 +17,8 @@ export class ResourceNotebookCellEdit extends ResourceEdit { constructor( readonly resource: URI, - readonly cellEdit: ICellEditOperation, + readonly cellEdit?: ICellEditOperation, + readonly notebookMetadata?: NotebookDocumentMetadata, readonly versionId?: number, readonly metadata?: WorkspaceEditMetadata ) { @@ -48,10 +49,22 @@ export class BulkCellEdits { // throw new Error(`Notebook '${first.resource}' has changed in the meantime`); // } + const edits: ICellEditOperation[] = []; + let newMetadata: NotebookDocumentMetadata | undefined; + for (let edit of group) { + if (edit.cellEdit) { + edits.push(edit.cellEdit); + } + newMetadata = edit.notebookMetadata ?? newMetadata; + } + + // set metadata + if (newMetadata) { + ref.object.notebook.updateNotebookMetadata(newMetadata); + } // apply edits - const cellEdits = group.map(edit => edit.cellEdit); - this._notebookService.transformEditsOutputs(ref.object.notebook, cellEdits); - ref.object.notebook.applyEdit(ref.object.notebook.versionId, cellEdits, true); + this._notebookService.transformEditsOutputs(ref.object.notebook, edits); + ref.object.notebook.applyEdit(ref.object.notebook.versionId, edits, true); ref.dispose(); this._progress.report(undefined);