Browse Source

Simplify widget factories

Steven Silvester 8 years ago
parent
commit
e5e0635ef8

+ 2 - 4
src/csvwidget/widget.ts

@@ -240,9 +240,7 @@ class CSVWidgetFactory extends ABCWidgetFactory<CSVWidget, DocumentRegistry.IMod
   /**
    * Create a new widget given a context.
    */
-  createNew(context: DocumentRegistry.IContext<DocumentRegistry.IModel>, kernel?: Kernel.IModel): CSVWidget {
-    let widget = new CSVWidget(context);
-    this.widgetCreated.emit(widget);
-    return widget;
+  protected createNewWidget(context: DocumentRegistry.IContext<DocumentRegistry.IModel>): CSVWidget {
+    return new CSVWidget(context);
   }
 }

+ 8 - 2
src/docmanager/manager.ts

@@ -127,7 +127,10 @@ class DocumentManager implements IDisposable {
       // Load the contents from disk.
       context.revert();
     }
-    let widget = this._widgetManager.createWidget(widgetFactory.name, context, kernel);
+    if (kernel) {
+      context.changeKernel(kernel);
+    }
+    let widget = this._widgetManager.createWidget(widgetFactory.name, context);
     this._opener.open(widget);
     return widget;
   }
@@ -153,7 +156,10 @@ class DocumentManager implements IDisposable {
     let context = this._createContext(path, factory);
     // Immediately save the contents to disk.
     context.save();
-    let widget = this._widgetManager.createWidget(widgetFactory.name, context, kernel);
+    if (kernel) {
+      context.changeKernel(kernel);
+    }
+    let widget = this._widgetManager.createWidget(widgetFactory.name, context);
     this._opener.open(widget);
     return widget;
   }

+ 10 - 10
src/docmanager/widgetmanager.ts

@@ -1,10 +1,6 @@
 // Copyright (c) Jupyter Development Team.
 // Distributed under the terms of the Modified BSD License.
 
-import {
-  Kernel
-} from '@jupyterlab/services';
-
 import {
   each
 } from 'phosphor/lib/algorithm/iteration';
@@ -71,7 +67,7 @@ class DocumentWidgetManager implements IDisposable {
   /**
    * Test whether the document widget manager is disposed.
    */
-  get IDisposed(): boolean {
+  get isDisposed(): boolean {
     return this._registry === null;
   }
 
@@ -79,7 +75,7 @@ class DocumentWidgetManager implements IDisposable {
    * Dispose of the resources used by the widget.
    */
   dispose(): void {
-    if (this.IDisposed) {
+    if (this.isDisposed) {
       return;
     }
     disconnectReceiver(this);
@@ -89,9 +85,12 @@ class DocumentWidgetManager implements IDisposable {
   /**
    * Create a widget for a document and handle its lifecycle.
    */
-  createWidget(name: string, context: DocumentRegistry.IContext<DocumentRegistry.IModel>, kernel?: Kernel.IModel): Widget {
+  createWidget(name: string, context: DocumentRegistry.IContext<DocumentRegistry.IModel>): Widget {
     let factory = this._registry.getWidgetFactory(name);
-    let widget = factory.createNew(context, kernel);
+    if (!factory) {
+      throw new Error(`Factory is not registered: ${name}`);
+    }
+    let widget = factory.createNew(context);
     Private.nameProperty.set(widget, name);
 
     // Handle widget extensions.
@@ -231,9 +230,9 @@ class DocumentWidgetManager implements IDisposable {
   /**
    * Handle `'close-request'` messages.
    */
-  protected onClose(widget: Widget): void {
+  protected onClose(widget: Widget): Promise<boolean> {
     // Handle dirty state.
-    this._maybeClose(widget).then(result => {
+    return this._maybeClose(widget).then(result => {
       if (result) {
         this._closeGuard = true;
         widget.close();
@@ -241,6 +240,7 @@ class DocumentWidgetManager implements IDisposable {
         // Dispose of document widgets when they are closed.
         widget.dispose();
       }
+      return result;
     }).catch(() => {
       widget.dispose();
     });

+ 10 - 1
src/docregistry/default.ts

@@ -357,7 +357,16 @@ abstract class ABCWidgetFactory<T extends Widget, U extends DocumentRegistry.IMo
    * #### Notes
    * It should emit the [widgetCreated] signal with the new widget.
    */
-  abstract createNew(context: DocumentRegistry.IContext<U>, kernel?: Kernel.IModel): T;
+  createNew(context: DocumentRegistry.IContext<U>): T {
+    let widget = this.createNewWidget(context);
+    this.widgetCreated.emit(widget);
+    return widget;
+  }
+
+  /**
+   * Create a widget for a context.
+   */
+  protected abstract createNewWidget(context: DocumentRegistry.IContext<U>): T;
 
   private _isDisposed = false;
   private _name: string;

+ 2 - 2
src/docregistry/registry.ts

@@ -780,12 +780,12 @@ namespace DocumentRegistry {
     widgetCreated: ISignal<IWidgetFactory<T, U>, T>;
 
     /**
-     * Create a new widget.
+     * Create a new widget given a context.
      *
      * #### Notes
      * It should emit the [widgetCreated] signal with the new widget.
      */
-    createNew(context: IContext<U>, kernel?: Kernel.IModel): T;
+    createNew(context: IContext<U>): T;
   }
 
   /**

+ 2 - 7
src/editorwidget/widget.ts

@@ -131,12 +131,7 @@ class EditorWidgetFactory extends ABCWidgetFactory<EditorWidget, DocumentRegistr
   /**
    * Create a new widget given a context.
    */
-  createNew(context: DocumentRegistry.IContext<DocumentRegistry.IModel>, kernel?: Kernel.IModel): EditorWidget {
-    if (kernel) {
-      context.changeKernel(kernel);
-    }
-    let widget = new EditorWidget(context);
-    this.widgetCreated.emit(widget);
-    return widget;
+  protected createNewWidget(context: DocumentRegistry.IContext<DocumentRegistry.IModel>): EditorWidget {
+    return new EditorWidget(context);
   }
 }

+ 2 - 4
src/imagewidget/widget.ts

@@ -108,10 +108,8 @@ class ImageWidgetFactory extends ABCWidgetFactory<ImageWidget, DocumentRegistry.
   /**
    * Create a new widget given a context.
    */
-  createNew(context: DocumentRegistry.IContext<DocumentRegistry.IModel>, kernel?: Kernel.IModel): ImageWidget {
-    let widget = new ImageWidget(context);
-    this.widgetCreated.emit(widget);
-    return widget;
+  protected createNewWidget(context: DocumentRegistry.IContext<DocumentRegistry.IModel>): ImageWidget {
+    return new ImageWidget(context);
   }
 }
 

+ 2 - 4
src/markdownwidget/widget.ts

@@ -122,10 +122,8 @@ class MarkdownWidgetFactory extends ABCWidgetFactory<MarkdownWidget, DocumentReg
   /**
    * Create a new widget given a context.
    */
-  createNew(context: DocumentRegistry.IContext<DocumentRegistry.IModel>, kernel?: Kernel.IModel): MarkdownWidget {
-    let widget = new MarkdownWidget(context, this._rendermime.clone());
-    this.widgetCreated.emit(widget);
-    return widget;
+  protected createNewWidget(context: DocumentRegistry.IContext<DocumentRegistry.IModel>): MarkdownWidget {
+    return new MarkdownWidget(context, this._rendermime.clone());
   }
 
   private _rendermime: RenderMime = null;

+ 1 - 5
src/notebook/notebook/widgetfactory.ts

@@ -66,11 +66,8 @@ class NotebookWidgetFactory extends ABCWidgetFactory<NotebookPanel, INotebookMod
    * The factory will start the appropriate kernel and populate
    * the default toolbar items using `ToolbarItems.populateDefaults`.
    */
-  createNew(context: DocumentRegistry.IContext<INotebookModel>, kernel?: Kernel.IModel): NotebookPanel {
+  protected createNewWidget(context: DocumentRegistry.IContext<INotebookModel>): NotebookPanel {
     let rendermime = this._rendermime.clone();
-    if (kernel) {
-      context.changeKernel(kernel);
-    }
     let panel = new NotebookPanel({
       rendermime,
       clipboard: this._clipboard,
@@ -78,7 +75,6 @@ class NotebookWidgetFactory extends ABCWidgetFactory<NotebookPanel, INotebookMod
     });
     panel.context = context;
     ToolbarItems.populateDefaults(panel);
-    this.widgetCreated.emit(panel);
     return panel;
   }