plugin.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import {
  4. JupyterLab, JupyterLabPlugin
  5. } from '../application';
  6. import {
  7. ICommandPalette
  8. } from '../commandpalette';
  9. import {
  10. InstanceTracker
  11. } from '../common/instancetracker';
  12. import {
  13. IInstanceRestorer
  14. } from '../instancerestorer';
  15. import {
  16. IInspector, Inspector
  17. } from './';
  18. /**
  19. * A service providing an inspector panel.
  20. */
  21. const plugin: JupyterLabPlugin<IInspector> = {
  22. activate,
  23. id: 'jupyter.services.inspector',
  24. requires: [ICommandPalette, IInstanceRestorer],
  25. provides: IInspector
  26. };
  27. /**
  28. * Export the plugin as default.
  29. */
  30. export default plugin;
  31. /**
  32. * A class that manages inspector widget instances and offers persistent
  33. * `IInspector` instance that other plugins can communicate with.
  34. */
  35. class InspectorManager implements IInspector {
  36. /**
  37. * The current inspector widget.
  38. */
  39. get inspector(): Inspector {
  40. return this._inspector;
  41. }
  42. set inspector(inspector: Inspector) {
  43. if (this._inspector === inspector) {
  44. return;
  45. }
  46. this._inspector = inspector;
  47. // If an inspector was added and it has no source
  48. if (inspector && !inspector.source) {
  49. inspector.source = this._source;
  50. }
  51. }
  52. /**
  53. * The source of events the inspector panel listens for.
  54. */
  55. get source(): Inspector.IInspectable {
  56. return this._source;
  57. }
  58. set source(source: Inspector.IInspectable) {
  59. if (this._source !== source) {
  60. if (this._source) {
  61. this._source.disposed.disconnect(this._onSourceDisposed, this);
  62. }
  63. this._source = source;
  64. this._source.disposed.connect(this._onSourceDisposed, this);
  65. }
  66. if (this._inspector && !this._inspector.isDisposed) {
  67. this._inspector.source = this._source;
  68. }
  69. }
  70. /**
  71. * Handle the source disposed signal.
  72. */
  73. private _onSourceDisposed() {
  74. this._source = null;
  75. }
  76. private _inspector: Inspector = null;
  77. private _source: Inspector.IInspectable = null;
  78. }
  79. /**
  80. * Activate the console extension.
  81. */
  82. function activate(app: JupyterLab, palette: ICommandPalette, restorer: IInstanceRestorer): IInspector {
  83. const category = 'Inspector';
  84. const command = 'inspector:open';
  85. const label = 'Open Inspector';
  86. const manager = new InspectorManager();
  87. const tracker = new InstanceTracker<Inspector>({ namespace: 'inspector' });
  88. // Handle state restoration.
  89. restorer.restore(tracker, {
  90. command,
  91. args: () => null,
  92. name: () => 'inspector'
  93. });
  94. function newInspector(): Inspector {
  95. let inspector = new Inspector({ items: Private.defaultInspectorItems });
  96. inspector.id = 'jp-inspector';
  97. inspector.title.label = 'Inspector';
  98. inspector.title.closable = true;
  99. inspector.disposed.connect(() => {
  100. if (manager.inspector === inspector) {
  101. manager.inspector = null;
  102. }
  103. });
  104. tracker.add(inspector);
  105. return inspector;
  106. }
  107. function openInspector(): void {
  108. if (!manager.inspector || manager.inspector.isDisposed) {
  109. manager.inspector = newInspector();
  110. app.shell.addToMainArea(manager.inspector);
  111. }
  112. if (manager.inspector.isAttached) {
  113. app.shell.activateMain(manager.inspector.id);
  114. }
  115. }
  116. app.commands.addCommand(command, { execute: openInspector, label });
  117. palette.addItem({ command, category });
  118. return manager;
  119. }
  120. /**
  121. * A namespace for private data.
  122. */
  123. namespace Private {
  124. /**
  125. * The default set of inspector items added to the inspector panel.
  126. */
  127. export
  128. const defaultInspectorItems: Inspector.IInspectorItem[] = [
  129. {
  130. className: 'jp-HintsInspectorItem',
  131. name: 'Hints',
  132. rank: 20,
  133. type: 'hints'
  134. }
  135. ];
  136. }