Pārlūkot izejas kodu

Fixes jupyterlab/jupyterlab#1410

akosyakov 8 gadi atpakaļ
vecāks
revīzija
4e62955024
4 mainītis faili ar 54 papildinājumiem un 41 dzēšanām
  1. 0 12
      src/console/content.ts
  2. 45 19
      src/console/panel.ts
  3. 7 9
      src/console/plugin.ts
  4. 2 1
      test/src/console/panel.spec.ts

+ 0 - 12
src/console/content.ts

@@ -17,10 +17,6 @@ import {
   clearSignalData, defineSignal, ISignal
 } from 'phosphor/lib/core/signaling';
 
-import {
-  Token
-} from 'phosphor/lib/core/token';
-
 import {
   Panel, PanelLayout
 } from 'phosphor/lib/ui/panel';
@@ -800,14 +796,6 @@ namespace ConsoleContent {
       readonly editorServices: IEditorServices;
     }
   }
-
-  /* tslint:disable */
-  /**
-   * The console renderer token.
-   */
-  export
-  const IRenderer = new Token<IRenderer>('jupyter.services.console.renderer');
-  /* tslint:enable */
 }
 
 

+ 45 - 19
src/console/panel.ts

@@ -1,6 +1,10 @@
 // Copyright (c) Jupyter Development Team.
 // Distributed under the terms of the Modified BSD License.
 
+import {
+  Token
+} from 'phosphor/lib/core/token';
+
 import {
   Session
 } from '@jupyterlab/services';
@@ -39,13 +43,8 @@ class ConsolePanel extends Panel {
   constructor(options: ConsolePanel.IOptions) {
     super();
     this.addClass(PANEL_CLASS);
+    this._content = options.content;
 
-    // Create console content widget.
-    this._content = options.content || new ConsoleContent({
-      session: options.session,
-      rendermime: options.rendermime,
-      renderer: options.renderer
-    });
     this.addWidget(this._content);
   }
 
@@ -104,28 +103,55 @@ namespace ConsolePanel {
   export
   interface IOptions {
     /**
-     * The optional console content instance to display in the console panel.
-     *
-     * #### Notes
-     * If a console content widget is passed in, its MIME renderer and session
-     * must match the values in the console panel options argument or it will
-     * result in undefined behavior.
+     * The console content instance to display in the console panel.
      */
-    content?: ConsoleContent;
+    content: ConsoleContent;
+  }
+  /**
+   * The console panel renderer.
+   */
+  export
+  interface IRenderer {
+    /**
+     * Create a new console panel.
+     */
+    createConsole(rendermime: IRenderMime, session: Session.ISession): ConsolePanel;
+  }
+  /**
+   * Default implementation of `IRenderer`.
+   */
+  export
+  class Renderer implements IRenderer {
 
     /**
-     * The mime renderer for the console panel.
+     * The console content renderer.
      */
-    rendermime: IRenderMime;
+    readonly contentRenderer: ConsoleContent.IRenderer;
 
     /**
-     * The renderer for a console widget.
+     * Create a new renderer.
      */
-    renderer: ConsoleContent.IRenderer;
+    constructor(options: ConsoleContent.Renderer.IOptions) {
+      this.contentRenderer = new ConsoleContent.Renderer(options);
+    }
 
     /**
-     * The session for the console panel.
+     * Create a new console panel.
      */
-    session: Session.ISession;
+    createConsole(rendermime: IRenderMime, session: Session.ISession): ConsolePanel {
+      const content = new ConsoleContent({
+        rendermime, session,
+        renderer: this.contentRenderer
+      });
+      return new ConsolePanel({content});
+    }
+
   }
+  /* tslint:disable */
+  /**
+   * The console renderer token.
+   */
+  export
+  const IRenderer = new Token<IRenderer>('jupyter.services.console.renderer');
+  /* tslint:enable */
 }

+ 7 - 9
src/console/plugin.ts

@@ -62,7 +62,7 @@ import {
 } from '../services';
 
 import {
-  IConsoleTracker, ConsolePanel, ConsoleContent
+  IConsoleTracker, ConsolePanel
 } from './index';
 
 
@@ -80,7 +80,7 @@ const trackerPlugin: JupyterLabPlugin<IConsoleTracker> = {
     IInspector,
     ICommandPalette,
     IPathTracker,
-    ConsoleContent.IRenderer,
+    ConsolePanel.IRenderer,
     ILayoutRestorer
   ],
   activate: activateConsole,
@@ -92,13 +92,13 @@ const trackerPlugin: JupyterLabPlugin<IConsoleTracker> = {
  * The console widget renderer.
  */
 export
-const rendererPlugin: JupyterLabPlugin<ConsoleContent.IRenderer> = {
+const rendererPlugin: JupyterLabPlugin<ConsolePanel.IRenderer> = {
   id: 'jupyter.services.console-renderer',
-  provides: ConsoleContent.IRenderer,
+  provides: ConsolePanel.IRenderer,
   requires: [IEditorServices],
   autoStart: true,
   activate: (app: JupyterLab, editorServices: IEditorServices) => {
-    return new ConsoleContent.Renderer({ editorServices });
+    return new ConsolePanel.Renderer({ editorServices });
   }
 };
 
@@ -133,7 +133,7 @@ interface ICreateConsoleArgs extends JSONObject {
 /**
  * Activate the console extension.
  */
-function activateConsole(app: JupyterLab, services: IServiceManager, rendermime: IRenderMime, mainMenu: IMainMenu, inspector: IInspector, palette: ICommandPalette, pathTracker: IPathTracker, renderer: ConsoleContent.IRenderer, layout: ILayoutRestorer): IConsoleTracker {
+function activateConsole(app: JupyterLab, services: IServiceManager, rendermime: IRenderMime, mainMenu: IMainMenu, inspector: IInspector, palette: ICommandPalette, pathTracker: IPathTracker, renderer: ConsolePanel.IRenderer, layout: ILayoutRestorer): IConsoleTracker {
   let manager = services.sessions;
   let { commands, keymap } = app;
   let category = 'Console';
@@ -343,9 +343,7 @@ function activateConsole(app: JupyterLab, services: IServiceManager, rendermime:
    * The manager must be ready before calling this function.
    */
   function createConsole(session: Session.ISession, name: string): void {
-    let panel = new ConsolePanel({
-      session, rendermime: rendermime.clone(), renderer
-    });
+    let panel = renderer.createConsole(rendermime.clone(), session);
     let specs = manager.specs;
     let displayName = specs.kernelspecs[session.kernel.name].display_name;
     let captionOptions: Private.ICaptionOptions = {

+ 2 - 1
test/src/console/panel.spec.ts

@@ -60,7 +60,8 @@ describe('console/panel', () => {
   beforeEach(done => {
     Session.startNew({ path: utils.uuid() }).then(newSession => {
       session = newSession;
-      panel = new TestPanel({ renderer, rendermime, session });
+      const content = new ConsoleContent({ renderer, rendermime, session });
+      panel = new TestPanel({ content });
       done();
     });
   });