@@ -5,11 +5,11 @@ import { inject, injectable } from 'inversify';
55import {
66 Disposable ,
77 Event ,
8+ EventEmitter ,
89 GlobPattern ,
910 notebook ,
1011 NotebookContentProvider ,
1112 NotebookDocument ,
12- NotebookDocumentChangeEvent ,
1313 NotebookEditor ,
1414 NotebookKernel ,
1515 NotebookOutputRenderer ,
@@ -18,40 +18,45 @@ import {
1818 window
1919} from 'vscode' ;
2020import { UseProposedApi } from '../constants' ;
21- import { IVSCodeNotebook } from './types' ;
21+ import { IDisposableRegistry } from '../types' ;
22+ import {
23+ IVSCodeNotebook ,
24+ NotebookCellLanguageChangeEvent ,
25+ NotebookCellMoveEvent ,
26+ NotebookCellOutputsChangeEvent ,
27+ NotebookCellsChangeEvent
28+ } from './types' ;
2229
2330@injectable ( )
2431export class VSCodeNotebook implements IVSCodeNotebook {
25- constructor ( @inject ( UseProposedApi ) private readonly useProposedApi : boolean ) { }
26- public registerNotebookContentProvider ( notebookType : string , provider : NotebookContentProvider ) : Disposable {
27- return notebook . registerNotebookContentProvider ( notebookType , provider ) ;
28- }
29- public registerNotebookKernel ( id : string , selectors : GlobPattern [ ] , kernel : NotebookKernel ) : Disposable {
30- return notebook . registerNotebookKernel ( id , selectors , kernel ) ;
31- }
32- public registerNotebookOutputRenderer (
33- id : string ,
34- outputSelector : NotebookOutputSelector ,
35- renderer : NotebookOutputRenderer
36- ) : Disposable {
37- return notebook . registerNotebookOutputRenderer ( id , outputSelector , renderer ) ;
38- }
32+ private readonly _onDidChangeNotebookDocument = new EventEmitter <
33+ | NotebookCellsChangeEvent
34+ | NotebookCellMoveEvent
35+ | NotebookCellOutputsChangeEvent
36+ | NotebookCellLanguageChangeEvent
37+ > ( ) ;
3938 public get onDidOpenNotebookDocument ( ) : Event < NotebookDocument > {
4039 return notebook . onDidOpenNotebookDocument ;
4140 }
4241 public get onDidCloseNotebookDocument ( ) : Event < NotebookDocument > {
4342 return notebook . onDidCloseNotebookDocument ;
4443 }
45-
46- public get onDidChangeNotebookDocument ( ) : Event < NotebookDocumentChangeEvent > {
47- return notebook . onDidChangeNotebookDocument ;
44+ public get notebookEditors ( ) {
45+ return notebook . visibleNotebookEditors ;
4846 }
49- public isCell ( textDocument : TextDocument ) {
50- return (
51- textDocument . fileName . toLowerCase ( ) . includes ( '.ipynb' ) &&
52- textDocument . uri . query . includes ( 'notebook' ) &&
53- textDocument . uri . query . includes ( 'cell' )
54- ) ;
47+ public get onDidChangeNotebookDocument ( ) : Event <
48+ | NotebookCellsChangeEvent
49+ | NotebookCellMoveEvent
50+ | NotebookCellOutputsChangeEvent
51+ | NotebookCellLanguageChangeEvent
52+ > {
53+ // Temporarily disabled as API is not yet
54+ // Bogus if, to satisyf compiler and ensure addEventHandlers method is used.
55+ if ( process . env . SOME_BOGUS_ENV_VAR ) {
56+ this . addEventHandlers ( ) ;
57+ }
58+
59+ return this . _onDidChangeNotebookDocument . event ;
5560 }
5661 public get activeNotebookEditor ( ) : NotebookEditor | undefined {
5762 if ( ! this . useProposedApi ) {
@@ -66,6 +71,57 @@ export class VSCodeNotebook implements IVSCodeNotebook {
6671 if ( window . activeTextEditor && ! this . isCell ( window . activeTextEditor . document ) ) {
6772 return ;
6873 }
74+ // Temporary until VSC API stabilizes.
75+ if ( Array . isArray ( notebook . visibleNotebookEditors ) ) {
76+ return notebook . visibleNotebookEditors . find ( ( item ) => item . active && item . visible ) ;
77+ }
6978 return notebook . activeNotebookEditor ;
7079 }
80+ private addedEventHandlers ?: boolean ;
81+ constructor (
82+ @inject ( UseProposedApi ) private readonly useProposedApi : boolean ,
83+ @inject ( IDisposableRegistry ) private readonly disposables : IDisposableRegistry
84+ ) { }
85+ public registerNotebookContentProvider ( notebookType : string , provider : NotebookContentProvider ) : Disposable {
86+ return notebook . registerNotebookContentProvider ( notebookType , provider ) ;
87+ }
88+ public registerNotebookKernel ( id : string , selectors : GlobPattern [ ] , kernel : NotebookKernel ) : Disposable {
89+ return notebook . registerNotebookKernel ( id , selectors , kernel ) ;
90+ }
91+ public registerNotebookOutputRenderer (
92+ id : string ,
93+ outputSelector : NotebookOutputSelector ,
94+ renderer : NotebookOutputRenderer
95+ ) : Disposable {
96+ return notebook . registerNotebookOutputRenderer ( id , outputSelector , renderer ) ;
97+ }
98+ public isCell ( textDocument : TextDocument ) {
99+ return (
100+ ( textDocument . uri . fsPath . toLowerCase ( ) . includes ( '.ipynb' ) &&
101+ textDocument . uri . query . includes ( 'notebook' ) &&
102+ textDocument . uri . query . includes ( 'cell' ) ) ||
103+ textDocument . uri . scheme . includes ( 'vscode-notebook-cell' )
104+ ) ;
105+ }
106+ private addEventHandlers ( ) {
107+ if ( this . addedEventHandlers ) {
108+ return ;
109+ }
110+ this . disposables . push (
111+ ...[
112+ notebook . onDidChangeCellLanguage ( ( e ) =>
113+ this . _onDidChangeNotebookDocument . fire ( { ...e , type : 'changeCellLanguage' } )
114+ ) ,
115+ notebook . onDidChangeCellOutputs ( ( e ) =>
116+ this . _onDidChangeNotebookDocument . fire ( { ...e , type : 'changeCellOutputs' } )
117+ ) ,
118+ notebook . onDidChangeNotebookCells ( ( e ) =>
119+ this . _onDidChangeNotebookDocument . fire ( { ...e , type : 'changeCells' } )
120+ ) ,
121+ notebook . onDidMoveNotebookCell ( ( e ) =>
122+ this . _onDidChangeNotebookDocument . fire ( { ...e , type : 'moveCell' } )
123+ )
124+ ]
125+ ) ;
126+ }
71127}
0 commit comments