mirror of
https://github.com/Microsoft/vscode
synced 2024-10-02 09:18:59 +00:00
Notebook document events.
This commit is contained in:
parent
b5831f5be7
commit
0dea13a46a
|
@ -810,7 +810,9 @@
|
|||
"terminate",
|
||||
"trigger",
|
||||
"unregister",
|
||||
"write"
|
||||
"write",
|
||||
"move",
|
||||
"clear"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
80
src/vs/vscode.proposed.d.ts
vendored
80
src/vs/vscode.proposed.d.ts
vendored
|
@ -1800,56 +1800,57 @@ declare module 'vscode' {
|
|||
preloads?: Uri[];
|
||||
}
|
||||
|
||||
export enum NotebookCellsChangeType {
|
||||
ModelChange = 1,
|
||||
MoveCell = 2,
|
||||
ClearCellOutputs = 3,
|
||||
ClearAllCellsOutputs = 4,
|
||||
ChangeCellLanguage = 5
|
||||
}
|
||||
|
||||
export interface NotebookCellsModelChangedEvent {
|
||||
readonly kind: NotebookCellsChangeType.ModelChange;
|
||||
export interface NotebookCellsChange {
|
||||
readonly start: number;
|
||||
readonly deletedCount: number;
|
||||
readonly items: NotebookCell[];
|
||||
}
|
||||
|
||||
export interface NotebookCellsModelMoveEvent {
|
||||
readonly kind: NotebookCellsChangeType.MoveCell;
|
||||
readonly index: number;
|
||||
readonly newIndex: number;
|
||||
}
|
||||
|
||||
export interface NotebookCellClearOutputEvent {
|
||||
readonly kind: NotebookCellsChangeType.ClearCellOutputs;
|
||||
readonly index: number;
|
||||
}
|
||||
|
||||
export interface NotebookCellsClearOutputEvent {
|
||||
readonly kind: NotebookCellsChangeType.ClearAllCellsOutputs;
|
||||
}
|
||||
|
||||
export interface NotebookCellsChangeLanguageEvent {
|
||||
readonly kind: NotebookCellsChangeType.ChangeCellLanguage;
|
||||
readonly index: number;
|
||||
readonly language: string;
|
||||
}
|
||||
|
||||
export type NotebookContentChangeEvent = NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent;
|
||||
|
||||
|
||||
export interface NotebookDocumentChangeEvent {
|
||||
export interface NotebookCellsChangeEvent {
|
||||
|
||||
/**
|
||||
* The affected document.
|
||||
*/
|
||||
readonly document: NotebookDocument;
|
||||
readonly changes: ReadonlyArray<NotebookCellsChange>;
|
||||
}
|
||||
|
||||
export interface NotebookCellMoveEvent {
|
||||
|
||||
/**
|
||||
* An array of content changes.
|
||||
* The affected document.
|
||||
*/
|
||||
readonly contentChanges: ReadonlyArray<NotebookContentChangeEvent>;
|
||||
readonly document: NotebookDocument;
|
||||
readonly index: number;
|
||||
readonly newIndex: number;
|
||||
}
|
||||
|
||||
export interface NotebookCellOutputsClearEvent {
|
||||
|
||||
/**
|
||||
* The affected document.
|
||||
*/
|
||||
readonly document: NotebookDocument;
|
||||
readonly cell: NotebookCell;
|
||||
}
|
||||
|
||||
export interface NotebookAllCellsOutputsClearEvent {
|
||||
|
||||
/**
|
||||
* The affected document.
|
||||
*/
|
||||
readonly document: NotebookDocument;
|
||||
}
|
||||
|
||||
export interface NotebookCellLanguageChangeEvent {
|
||||
|
||||
/**
|
||||
* The affected document.
|
||||
*/
|
||||
readonly document: NotebookDocument;
|
||||
readonly cell: NotebookCell;
|
||||
readonly language: string;
|
||||
}
|
||||
|
||||
export interface NotebookCellData {
|
||||
|
@ -1926,8 +1927,11 @@ declare module 'vscode' {
|
|||
|
||||
export let activeNotebookEditor: NotebookEditor | undefined;
|
||||
|
||||
export const onDidChangeNotebookDocument: Event<NotebookDocumentChangeEvent>;
|
||||
|
||||
export const onDidChangeNotebookCells: Event<NotebookCellsChangeEvent>;
|
||||
export const onDidMoveNotebookCell: Event<NotebookCellMoveEvent>;
|
||||
export const onDidClearCellOutputs: Event<NotebookCellOutputsClearEvent>;
|
||||
export const onDidClearAllCellsOutputs: Event<NotebookAllCellsOutputsClearEvent>;
|
||||
export const onDidChangeCellLanguage: Event<NotebookCellLanguageChangeEvent>;
|
||||
/**
|
||||
* Create a document that is the concatenation of all notebook cells. By default all code-cells are included
|
||||
* but a selector can be provided to narrow to down the set of cells.
|
||||
|
|
|
@ -944,9 +944,25 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
|
|||
checkProposedApiEnabled(extension);
|
||||
return extHostNotebook.activeNotebookEditor;
|
||||
},
|
||||
onDidChangeNotebookDocument(listener, thisArgs?, disposables?) {
|
||||
onDidChangeNotebookCells(listener, thisArgs?, disposables?) {
|
||||
checkProposedApiEnabled(extension);
|
||||
return extHostNotebook.onDidChangeNotebookDocument(listener, thisArgs, disposables);
|
||||
return extHostNotebook.onDidChangeNotebookCells(listener, thisArgs, disposables);
|
||||
},
|
||||
onDidMoveNotebookCell(listener, thisArgs?, disposables?) {
|
||||
checkProposedApiEnabled(extension);
|
||||
return extHostNotebook.onDidMoveNotebookCell(listener, thisArgs, disposables);
|
||||
},
|
||||
onDidClearCellOutputs(listener, thisArgs?, disposables?) {
|
||||
checkProposedApiEnabled(extension);
|
||||
return extHostNotebook.onDidClearCellOutputs(listener, thisArgs, disposables);
|
||||
},
|
||||
onDidClearAllCellsOutputs(listener, thisArgs?, disposables?) {
|
||||
checkProposedApiEnabled(extension);
|
||||
return extHostNotebook.onDidClearAllCellsOutputs(listener, thisArgs, disposables);
|
||||
},
|
||||
onDidChangeCellLanguage(listener, thisArgs?, disposables?) {
|
||||
checkProposedApiEnabled(extension);
|
||||
return extHostNotebook.onDidChangeCellLanguage(listener, thisArgs, disposables);
|
||||
},
|
||||
createConcatTextDocument(notebook, selector) {
|
||||
checkProposedApiEnabled(extension);
|
||||
|
@ -1083,7 +1099,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
|
|||
CellKind: extHostTypes.CellKind,
|
||||
CellOutputKind: extHostTypes.CellOutputKind,
|
||||
NotebookCellRunState: extHostTypes.NotebookCellRunState,
|
||||
NotebookCellsChangeType: extHostTypes.NotebookCellsChangeType,
|
||||
AuthenticationSession2: extHostTypes.AuthenticationSession
|
||||
};
|
||||
};
|
||||
|
|
|
@ -42,6 +42,14 @@ function getObservable<T extends Object>(obj: T): IObservable<T> {
|
|||
};
|
||||
}
|
||||
|
||||
interface INotebookEventEmitter {
|
||||
emitModelChange(events: vscode.NotebookCellsChangeEvent): void;
|
||||
emitMoveChange(event: vscode.NotebookCellMoveEvent): void;
|
||||
emitCellOutputsClear(event: vscode.NotebookCellOutputsClearEvent): void;
|
||||
emitAllCellsOutputsClearEvent(event: vscode.NotebookAllCellsOutputsClearEvent): void;
|
||||
emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void;
|
||||
}
|
||||
|
||||
export class ExtHostCell extends Disposable implements vscode.NotebookCell {
|
||||
|
||||
// private originalSource: string[];
|
||||
|
@ -251,34 +259,31 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo
|
|||
|
||||
get isDirty() { return false; }
|
||||
|
||||
accpetModelChanged(event: NotebookCellsChangedEvent): vscode.NotebookContentChangeEvent[] {
|
||||
let modelEvents: vscode.NotebookContentChangeEvent[] = [];
|
||||
if (event.kind === NotebookCellsChangeType.ModelChange) {
|
||||
modelEvents = this.$spliceNotebookCells(event.changes);
|
||||
} else if (event.kind === NotebookCellsChangeType.Move) {
|
||||
modelEvents = this.$moveCell(event.index, event.newIdx);
|
||||
} else if (event.kind === NotebookCellsChangeType.CellClearOutput) {
|
||||
modelEvents = this.$clearCellOutputs(event.index);
|
||||
} else if (event.kind === NotebookCellsChangeType.CellsClearOutput) {
|
||||
modelEvents = this.$clearAllCellOutputs();
|
||||
} else if (event.kind === NotebookCellsChangeType.ChangeLanguage) {
|
||||
modelEvents = this.$changeCellLanguage(event.index, event.language);
|
||||
}
|
||||
|
||||
accpetModelChanged(event: NotebookCellsChangedEvent, emitter?: INotebookEventEmitter): void {
|
||||
this._versionId = event.versionId;
|
||||
return modelEvents;
|
||||
if (event.kind === NotebookCellsChangeType.ModelChange) {
|
||||
this.$spliceNotebookCells(event.changes, emitter);
|
||||
} else if (event.kind === NotebookCellsChangeType.Move) {
|
||||
this.$moveCell(event.index, event.newIdx, emitter);
|
||||
} else if (event.kind === NotebookCellsChangeType.CellClearOutput) {
|
||||
this.$clearCellOutputs(event.index, emitter);
|
||||
} else if (event.kind === NotebookCellsChangeType.CellsClearOutput) {
|
||||
this.$clearAllCellOutputs(emitter);
|
||||
} else if (event.kind === NotebookCellsChangeType.ChangeLanguage) {
|
||||
this.$changeCellLanguage(event.index, event.language, emitter);
|
||||
}
|
||||
}
|
||||
|
||||
private $spliceNotebookCells(splices: NotebookCellsSplice2[]): vscode.NotebookContentChangeEvent[] {
|
||||
private $spliceNotebookCells(splices: NotebookCellsSplice2[], emitter?: INotebookEventEmitter): void {
|
||||
if (this._disposed) {
|
||||
return [];
|
||||
return;
|
||||
}
|
||||
|
||||
if (!splices.length) {
|
||||
return [];
|
||||
return;
|
||||
}
|
||||
|
||||
let contentChangeEvents: vscode.NotebookCellsModelChangedEvent[] = [];
|
||||
let contentChangeEvents: vscode.NotebookCellsChange[] = [];
|
||||
|
||||
splices.reverse().forEach(splice => {
|
||||
let cellDtos = splice[2];
|
||||
|
@ -310,55 +315,47 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo
|
|||
}
|
||||
|
||||
this.cells.splice(splice[0], splice[1], ...newCells);
|
||||
contentChangeEvents.push({
|
||||
kind: extHostTypes.NotebookCellsChangeType.ModelChange,
|
||||
|
||||
const event: vscode.NotebookCellsChange = {
|
||||
start: splice[0],
|
||||
deletedCount: splice[1],
|
||||
items: newCells
|
||||
});
|
||||
};
|
||||
|
||||
contentChangeEvents.push(event);
|
||||
});
|
||||
|
||||
return contentChangeEvents;
|
||||
emitter?.emitModelChange({
|
||||
document: this,
|
||||
changes: contentChangeEvents
|
||||
});
|
||||
}
|
||||
|
||||
private $moveCell(index: number, newIdx: number): vscode.NotebookContentChangeEvent[] {
|
||||
private $moveCell(index: number, newIdx: number, emitter?: INotebookEventEmitter): void {
|
||||
const cells = this.cells.splice(index, 1);
|
||||
this.cells.splice(newIdx, 0, ...cells);
|
||||
|
||||
return [{
|
||||
kind: extHostTypes.NotebookCellsChangeType.MoveCell,
|
||||
index,
|
||||
newIndex: newIdx
|
||||
}];
|
||||
const event: vscode.NotebookCellMoveEvent = { document: this, index, newIndex: newIdx };
|
||||
emitter?.emitMoveChange(event);
|
||||
}
|
||||
|
||||
private $clearCellOutputs(index: number): vscode.NotebookContentChangeEvent[] {
|
||||
private $clearCellOutputs(index: number, emitter?: INotebookEventEmitter): void {
|
||||
const cell = this.cells[index];
|
||||
cell.outputs = [];
|
||||
|
||||
return [{
|
||||
kind: extHostTypes.NotebookCellsChangeType.ClearCellOutputs,
|
||||
index
|
||||
}];
|
||||
const event: vscode.NotebookCellOutputsClearEvent = { document: this, cell };
|
||||
emitter?.emitCellOutputsClear(event);
|
||||
}
|
||||
|
||||
private $clearAllCellOutputs(): vscode.NotebookContentChangeEvent[] {
|
||||
private $clearAllCellOutputs(emitter?: INotebookEventEmitter): void {
|
||||
this.cells.forEach(cell => cell.outputs = []);
|
||||
|
||||
return [{
|
||||
kind: extHostTypes.NotebookCellsChangeType.ClearAllCellsOutputs,
|
||||
}];
|
||||
const event: vscode.NotebookAllCellsOutputsClearEvent = { document: this };
|
||||
emitter?.emitAllCellsOutputsClearEvent(event);
|
||||
}
|
||||
|
||||
private $changeCellLanguage(index: number, language: string): vscode.NotebookContentChangeEvent[] {
|
||||
private $changeCellLanguage(index: number, language: string, emitter?: INotebookEventEmitter): void {
|
||||
const cell = this.cells[index];
|
||||
cell.language = language;
|
||||
|
||||
return [{
|
||||
kind: extHostTypes.NotebookCellsChangeType.ChangeCellLanguage,
|
||||
index,
|
||||
language
|
||||
}];
|
||||
const event: vscode.NotebookCellLanguageChangeEvent = { document: this, cell, language };
|
||||
emitter?.emitCellLanguageChange(event);
|
||||
}
|
||||
|
||||
eventuallyUpdateCellOutputs(cell: ExtHostCell, diffs: ISplice<vscode.CellOutput>[]) {
|
||||
|
@ -673,9 +670,16 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
|
|||
private readonly _unInitializedDocuments = new Map<string, ExtHostNotebookDocument>();
|
||||
private readonly _editors = new Map<string, { editor: ExtHostNotebookEditor, onDidReceiveMessage: Emitter<any>; }>();
|
||||
private readonly _notebookOutputRenderers = new Map<number, ExtHostNotebookOutputRenderer>();
|
||||
|
||||
private readonly _onDidChangeNotebookDocument = new Emitter<vscode.NotebookDocumentChangeEvent>();
|
||||
readonly onDidChangeNotebookDocument: Event<vscode.NotebookDocumentChangeEvent> = this._onDidChangeNotebookDocument.event;
|
||||
private readonly _onDidChangeNotebookCells = new Emitter<vscode.NotebookCellsChangeEvent>();
|
||||
readonly onDidChangeNotebookCells = this._onDidChangeNotebookCells.event;
|
||||
private readonly _onDidMoveNotebookCell = new Emitter<vscode.NotebookCellMoveEvent>();
|
||||
readonly onDidMoveNotebookCell = this._onDidMoveNotebookCell.event;
|
||||
private readonly _onDidClearCellOutputs = new Emitter<vscode.NotebookCellOutputsClearEvent>();
|
||||
readonly onDidClearCellOutputs = this._onDidClearCellOutputs.event;
|
||||
private readonly _onDidClearAllCellsOutputs = new Emitter<vscode.NotebookAllCellsOutputsClearEvent>();
|
||||
readonly onDidClearAllCellsOutputs = this._onDidClearAllCellsOutputs.event;
|
||||
private readonly _onDidChangeCellLanguage = new Emitter<vscode.NotebookCellLanguageChangeEvent>();
|
||||
readonly onDidChangeCellLanguage = this._onDidChangeCellLanguage.event;
|
||||
|
||||
private _outputDisplayOrder: INotebookDisplayOrder | undefined;
|
||||
|
||||
|
@ -999,10 +1003,23 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
|
|||
const document = this._documents.get(URI.revive(uriComponents).toString());
|
||||
|
||||
if (document) {
|
||||
const appliedEvents = document.accpetModelChanged(event);
|
||||
this._onDidChangeNotebookDocument.fire({
|
||||
document: document,
|
||||
contentChanges: appliedEvents
|
||||
const that = this;
|
||||
document.accpetModelChanged(event, {
|
||||
emitModelChange(event: vscode.NotebookCellsChangeEvent): void {
|
||||
that._onDidChangeNotebookCells.fire(event);
|
||||
},
|
||||
emitMoveChange(event: vscode.NotebookCellMoveEvent): void {
|
||||
that._onDidMoveNotebookCell.fire(event);
|
||||
},
|
||||
emitCellOutputsClear(event: vscode.NotebookCellOutputsClearEvent): void {
|
||||
that._onDidClearCellOutputs.fire(event);
|
||||
},
|
||||
emitAllCellsOutputsClearEvent(event: vscode.NotebookAllCellsOutputsClearEvent): void {
|
||||
that._onDidClearAllCellsOutputs.fire(event);
|
||||
},
|
||||
emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void {
|
||||
that._onDidChangeCellLanguage.fire(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,13 +44,19 @@ export class ExtHostNotebookConcatDocument implements vscode.NotebookConcatTextD
|
|||
this._onDidChange.fire(undefined);
|
||||
}
|
||||
}));
|
||||
this._disposables.add(extHostNotebooks.onDidChangeNotebookDocument(e => {
|
||||
if (e.document === this._notebook) {
|
||||
const documentChange = (document: vscode.NotebookDocument) => {
|
||||
if (document === this._notebook) {
|
||||
this._init();
|
||||
this._versionId += 1;
|
||||
this._onDidChange.fire(undefined);
|
||||
}
|
||||
}));
|
||||
};
|
||||
|
||||
this._disposables.add(extHostNotebooks.onDidMoveNotebookCell(e => documentChange(e.document)));
|
||||
this._disposables.add(extHostNotebooks.onDidChangeCellLanguage(e => documentChange(e.document)));
|
||||
this._disposables.add(extHostNotebooks.onDidClearAllCellsOutputs(e => documentChange(e.document)));
|
||||
this._disposables.add(extHostNotebooks.onDidClearCellOutputs(e => documentChange(e.document)));
|
||||
this._disposables.add(extHostNotebooks.onDidChangeNotebookCells(e => documentChange(e.document)));
|
||||
}
|
||||
|
||||
dispose(): void {
|
||||
|
|
|
@ -2732,14 +2732,6 @@ export enum NotebookCellRunState {
|
|||
Error = 4
|
||||
}
|
||||
|
||||
export enum NotebookCellsChangeType {
|
||||
ModelChange = 1,
|
||||
MoveCell = 2,
|
||||
ClearCellOutputs = 3,
|
||||
ClearAllCellsOutputs = 4,
|
||||
ChangeCellLanguage = 5
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region Timeline
|
||||
|
|
Loading…
Reference in a new issue