notebook.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import {
  4. INotebookTracker,
  5. NotebookPanel,
  6. NotebookTracker
  7. } from '@jupyterlab/notebook';
  8. import { DebugSession } from './../session';
  9. import { IClientSession } from '@jupyterlab/apputils';
  10. import { CodeCell } from '@jupyterlab/cells';
  11. import { CellManager } from './cell';
  12. import { Debugger } from '../debugger';
  13. import { Breakpoints } from '../breakpoints';
  14. export class DebuggerNotebookHandler {
  15. constructor(options: DebuggerNotebookHandler.IOptions) {
  16. this.debuggerModel = options.debuggerModel;
  17. this.notebookTracker = options.notebookTracker;
  18. this.breakpoints = this.debuggerModel.sidebar.breakpoints.model;
  19. this.notebookTracker.currentChanged.connect(
  20. (sender, notebookPanel: NotebookPanel) => {
  21. const session = notebookPanel ? notebookPanel.session : null;
  22. this.newDebuggerSession(session, sender);
  23. }
  24. );
  25. this.debuggerModel.sessionChanged.connect(() => {
  26. const notebookPanel: NotebookPanel = this.notebookTracker.currentWidget;
  27. if (
  28. notebookPanel &&
  29. notebookPanel.session.name === this.debuggerModel.session.id
  30. ) {
  31. this.notebookTracker.activeCellChanged.connect(this.onNewCell, this);
  32. if (!this.cellManager) {
  33. this.cellManager = new CellManager({
  34. breakpointsModel: this.breakpoints,
  35. activeCell: this.notebookTracker.activeCell as CodeCell,
  36. debuggerModel: this.debuggerModel,
  37. type: 'notebook'
  38. });
  39. }
  40. }
  41. });
  42. }
  43. private notebookTracker: INotebookTracker;
  44. private debuggerModel: Debugger.Model;
  45. private breakpoints: Breakpoints.Model;
  46. private cellManager: CellManager;
  47. protected onNewCell(noteTracker: NotebookTracker, codeCell: CodeCell) {
  48. setTimeout(() => {
  49. if (this.cellManager) {
  50. this.cellManager.activeCell = codeCell;
  51. this.cellManager.onActiveCellChanged();
  52. } else {
  53. this.cellManager = new CellManager({
  54. breakpointsModel: this.breakpoints,
  55. activeCell: codeCell,
  56. debuggerModel: this.debuggerModel,
  57. type: 'notebook'
  58. });
  59. }
  60. });
  61. }
  62. protected newDebuggerSession(
  63. client: IClientSession | null,
  64. note: INotebookTracker
  65. ) {
  66. if (this.debuggerModel.session) {
  67. note.activeCellChanged.disconnect(this.onNewCell, this);
  68. }
  69. if (client) {
  70. const newSession = new DebugSession({
  71. client: client as IClientSession
  72. });
  73. this.debuggerModel.session = newSession;
  74. }
  75. }
  76. }
  77. export namespace DebuggerNotebookHandler {
  78. export interface IOptions {
  79. debuggerModel: Debugger.Model;
  80. notebookTracker: INotebookTracker;
  81. }
  82. }