Browse Source

Work on using ES6 Maps for extenders rather than reinventing the wheel.

Ian Rose 7 years ago
parent
commit
84604b16d9

+ 5 - 5
packages/console-extension/src/index.ts

@@ -30,7 +30,7 @@ import {
 } from '@jupyterlab/launcher';
 } from '@jupyterlab/launcher';
 
 
 import {
 import {
-  IMainMenu
+  IMainMenu, IKernelMenu, IRunMenu
 } from '@jupyterlab/mainmenu';
 } from '@jupyterlab/mainmenu';
 
 
 import {
 import {
@@ -414,7 +414,7 @@ function activateConsole(app: JupyterLab, mainMenu: IMainMenu, palette: ICommand
   mainMenu.fileMenu.newMenu.addItem({ command: CommandIDs.create });
   mainMenu.fileMenu.newMenu.addItem({ command: CommandIDs.create });
 
 
   // Add a kernel user to the Kernel menu
   // Add a kernel user to the Kernel menu
-  mainMenu.kernelMenu.addUser<ConsolePanel>({
+  mainMenu.kernelMenu.kernelUsers.set('Console', {
     tracker,
     tracker,
     interruptKernel: current => {
     interruptKernel: current => {
       let kernel = current.console.session.kernel;
       let kernel = current.console.session.kernel;
@@ -425,13 +425,13 @@ function activateConsole(app: JupyterLab, mainMenu: IMainMenu, palette: ICommand
     },
     },
     restartKernel: current => current.console.session.restart(),
     restartKernel: current => current.console.session.restart(),
     changeKernel: current => current.console.session.selectKernel()
     changeKernel: current => current.console.session.selectKernel()
-  });
+  } as IKernelMenu.IKernelUser<ConsolePanel>);
 
 
   // Add a code runner to the Run menu.
   // Add a code runner to the Run menu.
-  mainMenu.runMenu.addRunner<ConsolePanel>({
+  mainMenu.runMenu.codeRunners.set('Console', {
     tracker,
     tracker,
     run: current => current.console.execute(true)
     run: current => current.console.execute(true)
-  });
+  } as IRunMenu.ICodeRunner<ConsolePanel>);
 
 
   // Add the console menu.
   // Add the console menu.
   menu.addItem({ command: CommandIDs.runUnforced });
   menu.addItem({ command: CommandIDs.runUnforced });

+ 3 - 3
packages/fileeditor-extension/src/index.ts

@@ -30,7 +30,7 @@ import {
 } from '@jupyterlab/launcher';
 } from '@jupyterlab/launcher';
 
 
 import {
 import {
-  IMainMenu
+  IMainMenu, IViewMenu
 } from '@jupyterlab/mainmenu';
 } from '@jupyterlab/mainmenu';
 
 
 
 
@@ -398,7 +398,7 @@ function activate(app: JupyterLab, editorServices: IEditorServices, browserFacto
     menu.fileMenu.newMenu.addItem({ command: CommandIDs.createNew });
     menu.fileMenu.newMenu.addItem({ command: CommandIDs.createNew });
 
 
     // Add editor view options.
     // Add editor view options.
-    menu.viewMenu.addEditorViewer<FileEditor>({
+    menu.viewMenu.editorViewers.set('Editor', {
       tracker,
       tracker,
       toggleLineNumbers: widget => {
       toggleLineNumbers: widget => {
         const lineNumbers = !widget.editor.getOption('lineNumbers');
         const lineNumbers = !widget.editor.getOption('lineNumbers');
@@ -415,7 +415,7 @@ function activate(app: JupyterLab, editorServices: IEditorServices, browserFacto
       lineNumbersToggled: widget => widget.editor.getOption('lineNumbers'),
       lineNumbersToggled: widget => widget.editor.getOption('lineNumbers'),
       wordWrapToggled: widget => widget.editor.getOption('lineWrap'),
       wordWrapToggled: widget => widget.editor.getOption('lineWrap'),
       matchBracketsToggled: widget => widget.editor.getOption('matchBrackets')
       matchBracketsToggled: widget => widget.editor.getOption('matchBrackets')
-    });
+    } as IViewMenu.IEditorViewer<FileEditor>);
   }
   }
 
 
   app.contextMenu.addItem({
   app.contextMenu.addItem({

+ 44 - 38
packages/mainmenu-extension/src/index.ts

@@ -103,25 +103,22 @@ function createFileMenu(app: JupyterLab, menu: FileMenu): void {
 function createKernelMenu(app: JupyterLab, menu: KernelMenu): void {
 function createKernelMenu(app: JupyterLab, menu: KernelMenu): void {
   const commands = menu.commands;
   const commands = menu.commands;
 
 
-  let findUser = (widget: Widget) => {
-    return menu.findUser(widget);
-  };
   commands.addCommand(CommandIDs.interruptKernel, {
   commands.addCommand(CommandIDs.interruptKernel, {
     label: 'Interrupt Kernel',
     label: 'Interrupt Kernel',
-    isEnabled: Private.delegateEnabled(app, findUser, 'interruptKernel'),
-    execute: Private.delegateExecute(app, findUser, 'interruptKernel')
+    isEnabled: Private.delegateEnabled(app, menu.kernelUsers, 'interruptKernel'),
+    execute: Private.delegateExecute(app, menu.kernelUsers, 'interruptKernel')
   });
   });
 
 
   commands.addCommand(CommandIDs.restartKernel, {
   commands.addCommand(CommandIDs.restartKernel, {
     label: 'Restart Kernel',
     label: 'Restart Kernel',
-    isEnabled: Private.delegateEnabled(app, findUser, 'restartKernel'),
-    execute: Private.delegateExecute(app, findUser, 'restartKernel')
+    isEnabled: Private.delegateEnabled(app, menu.kernelUsers, 'restartKernel'),
+    execute: Private.delegateExecute(app, menu.kernelUsers, 'restartKernel')
   });
   });
 
 
   commands.addCommand(CommandIDs.changeKernel, {
   commands.addCommand(CommandIDs.changeKernel, {
     label: 'Change Kernel',
     label: 'Change Kernel',
-    isEnabled: Private.delegateEnabled(app, findUser, 'changeKernel'),
-    execute: Private.delegateExecute(app, findUser, 'changeKernel')
+    isEnabled: Private.delegateEnabled(app, menu.kernelUsers, 'changeKernel'),
+    execute: Private.delegateExecute(app, menu.kernelUsers, 'changeKernel')
   });
   });
 
 
   let items = [
   let items = [
@@ -141,37 +138,34 @@ function createKernelMenu(app: JupyterLab, menu: KernelMenu): void {
 function createViewMenu(app: JupyterLab, menu: ViewMenu): void {
 function createViewMenu(app: JupyterLab, menu: ViewMenu): void {
   const commands = menu.commands;
   const commands = menu.commands;
 
 
-  let findEditorViewer = (widget: Widget) => {
-    return menu.findEditorViewer(widget);
-  };
   commands.addCommand(CommandIDs.lineNumbering, {
   commands.addCommand(CommandIDs.lineNumbering, {
     label: 'Line Numbers',
     label: 'Line Numbers',
     isEnabled: Private.delegateEnabled
     isEnabled: Private.delegateEnabled
-             (app, findEditorViewer, 'toggleLineNumbers'),
+             (app, menu.editorViewers, 'toggleLineNumbers'),
     isToggled: Private.delegateToggled
     isToggled: Private.delegateToggled
-             (app, findEditorViewer, 'lineNumbersToggled'),
+             (app, menu.editorViewers, 'lineNumbersToggled'),
     execute: Private.delegateExecute
     execute: Private.delegateExecute
-             (app, findEditorViewer, 'toggleLineNumbers')
+             (app, menu.editorViewers, 'toggleLineNumbers')
   });
   });
 
 
   commands.addCommand(CommandIDs.matchBrackets, {
   commands.addCommand(CommandIDs.matchBrackets, {
     label: 'Match Brackets',
     label: 'Match Brackets',
     isEnabled: Private.delegateEnabled
     isEnabled: Private.delegateEnabled
-             (app, findEditorViewer, 'toggleMatchBrackets'),
+             (app, menu.editorViewers, 'toggleMatchBrackets'),
     isToggled: Private.delegateToggled
     isToggled: Private.delegateToggled
-             (app, findEditorViewer, 'matchBracketsToggled'),
+             (app, menu.editorViewers, 'matchBracketsToggled'),
     execute: Private.delegateExecute
     execute: Private.delegateExecute
-             (app, findEditorViewer, 'toggleMatchBrackets')
+             (app, menu.editorViewers, 'toggleMatchBrackets')
   });
   });
 
 
   commands.addCommand(CommandIDs.wordWrap, {
   commands.addCommand(CommandIDs.wordWrap, {
     label: 'Word Wrap',
     label: 'Word Wrap',
     isEnabled: Private.delegateEnabled
     isEnabled: Private.delegateEnabled
-               (app, findEditorViewer, 'toggleWordWrap'),
+               (app, menu.editorViewers, 'toggleWordWrap'),
     isToggled: Private.delegateToggled
     isToggled: Private.delegateToggled
-               (app, findEditorViewer, 'wordWrapToggled'),
+               (app, menu.editorViewers, 'wordWrapToggled'),
     execute: Private.delegateExecute
     execute: Private.delegateExecute
-               (app, findEditorViewer, 'toggleWordWrap')
+               (app, menu.editorViewers, 'toggleWordWrap')
   });
   });
 
 
   let items = [
   let items = [
@@ -190,31 +184,28 @@ function createViewMenu(app: JupyterLab, menu: ViewMenu): void {
 function createRunMenu(app: JupyterLab, menu: RunMenu): void {
 function createRunMenu(app: JupyterLab, menu: RunMenu): void {
   const commands = menu.commands;
   const commands = menu.commands;
 
 
-  let findRunner = (widget: Widget) => {
-    return menu.findRunner(widget);
-  };
   commands.addCommand(CommandIDs.run, {
   commands.addCommand(CommandIDs.run, {
     label: 'Run',
     label: 'Run',
-    isEnabled: Private.delegateEnabled(app, findRunner, 'run'),
-    execute: Private.delegateExecute(app, findRunner, 'run')
+    isEnabled: Private.delegateEnabled(app, menu.codeRunners, 'run'),
+    execute: Private.delegateExecute(app, menu.codeRunners, 'run')
   });
   });
 
 
   commands.addCommand(CommandIDs.runAll, {
   commands.addCommand(CommandIDs.runAll, {
     label: 'Run All',
     label: 'Run All',
-    isEnabled: Private.delegateEnabled(app, findRunner, 'runAll'),
-    execute: Private.delegateExecute(app, findRunner, 'runAll')
+    isEnabled: Private.delegateEnabled(app, menu.codeRunners, 'runAll'),
+    execute: Private.delegateExecute(app, menu.codeRunners, 'runAll')
   });
   });
 
 
   commands.addCommand(CommandIDs.runAbove, {
   commands.addCommand(CommandIDs.runAbove, {
     label: 'Run Above',
     label: 'Run Above',
-    isEnabled: Private.delegateEnabled(app, findRunner, 'runAbove'),
-    execute: Private.delegateExecute(app, findRunner, 'runAbove')
+    isEnabled: Private.delegateEnabled(app, menu.codeRunners, 'runAbove'),
+    execute: Private.delegateExecute(app, menu.codeRunners, 'runAbove')
   });
   });
 
 
   commands.addCommand(CommandIDs.runBelow, {
   commands.addCommand(CommandIDs.runBelow, {
     label: 'Run Below',
     label: 'Run Below',
-    isEnabled: Private.delegateEnabled(app, findRunner, 'runBelow'),
-    execute: Private.delegateExecute(app, findRunner, 'runBelow')
+    isEnabled: Private.delegateEnabled(app, menu.codeRunners, 'runBelow'),
+    execute: Private.delegateExecute(app, menu.codeRunners, 'runBelow')
   });
   });
 
 
   let items = [
   let items = [
@@ -234,15 +225,30 @@ export default menuPlugin;
  * A namespace for Private data.
  * A namespace for Private data.
  */
  */
 namespace Private {
 namespace Private {
+  /**
+   * Given a widget and a map containing IMenuExtenders,
+   * check the tracker and return the extender, if any,
+   * that holds the widget.
+   */
+  function findExtender<E extends IMenuExtender<Widget>>(widget: Widget, map: Map<string, E>): E {
+    let extender: E;
+    map.forEach((value, key) => {
+      if (value.tracker.has(widget)) {
+        extender = value;
+      }
+    });
+    return extender;
+  }
+
   /**
   /**
    * A utility function that delegates command execution
    * A utility function that delegates command execution
    * to an IMenuExtender.
    * to an IMenuExtender.
    */
    */
   export
   export
-  function delegateExecute<E extends IMenuExtender<Widget>>(app: JupyterLab, finder: (w: Widget) => E, executor: keyof E): () => Promise<any> {
+  function delegateExecute<E extends IMenuExtender<Widget>>(app: JupyterLab, map: Map<string, E>, executor: keyof E): () => Promise<any> {
     return () => {
     return () => {
       let widget = app.shell.currentWidget;
       let widget = app.shell.currentWidget;
-      const extender = finder(widget);
+      const extender = findExtender(widget, map);
       if (!extender) {
       if (!extender) {
         return Promise.resolve(void 0);
         return Promise.resolve(void 0);
       }
       }
@@ -255,10 +261,10 @@ namespace Private {
    * to an IMenuExtender.
    * to an IMenuExtender.
    */
    */
   export
   export
-  function delegateEnabled<E extends IMenuExtender<Widget>>(app: JupyterLab, finder: (w: Widget) => E, executor: keyof E): () => boolean {
+  function delegateEnabled<E extends IMenuExtender<Widget>>(app: JupyterLab, map: Map<string, E>, executor: keyof E): () => boolean {
     return () => {
     return () => {
       let widget = app.shell.currentWidget;
       let widget = app.shell.currentWidget;
-      const extender = finder(widget);
+      const extender = findExtender(widget, map);
       return !!extender && !!extender[executor];
       return !!extender && !!extender[executor];
     };
     };
   }
   }
@@ -268,10 +274,10 @@ namespace Private {
    * for an IMenuExtender.
    * for an IMenuExtender.
    */
    */
   export
   export
-  function delegateToggled<E extends IMenuExtender<Widget>>(app: JupyterLab, finder: (w: Widget) => E, toggled: keyof E): () => boolean {
+  function delegateToggled<E extends IMenuExtender<Widget>>(app: JupyterLab, map: Map<string, E>, toggled: keyof E): () => boolean {
     return () => {
     return () => {
       let widget = app.shell.currentWidget;
       let widget = app.shell.currentWidget;
-      const extender = finder(widget);
+      const extender = findExtender(widget, map);
       return !!extender && !!extender[toggled] && !!extender[toggled](widget);
       return !!extender && !!extender[toggled] && !!extender[toggled](widget);
     };
     };
   }
   }

+ 35 - 29
packages/mainmenu/src/kernel.ts

@@ -10,7 +10,7 @@ import {
 } from '@phosphor/widgets';
 } from '@phosphor/widgets';
 
 
 import {
 import {
-  IJupyterLabMenu, JupyterLabMenu, IMenuExtender, findExtender
+  IJupyterLabMenu, JupyterLabMenu, IMenuExtender
 } from './labmenu';
 } from './labmenu';
 
 
 /**
 /**
@@ -19,23 +19,20 @@ import {
 export
 export
 interface IKernelMenu extends IJupyterLabMenu {
 interface IKernelMenu extends IJupyterLabMenu {
   /**
   /**
-   * Add an IKernelUser to the Kernel menu.
+   * A map storing IKernelUsers for the Kernel menu.
    *
    *
-   * @param user - An IKernelUser.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  addUser<T extends Widget>(user: IKernelMenu.IKernelUser<T>): void;
-
+  readonly kernelUsers: Map<string, IKernelMenu.IKernelUser<Widget>>;
+  
   /**
   /**
-   * Given a widget, see if it belongs to
-   * any of the IKernelUsers registered with
-   * the kernel menu.
-   *
-   * @param widget: a widget.
+   * A map storing IConsoleCreators for the Kernel menu.
    *
    *
-   * @returns an IKernelUser, if any of the registered users own
-   *   the widget, otherwise undefined.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  findUser(widget: Widget | null): IKernelMenu.IKernelUser<Widget> | undefined;
+  readonly consoleCreators: Map<string, IKernelMenu.IConsoleCreator<Widget>>;
 }
 }
 
 
 /**
 /**
@@ -49,30 +46,28 @@ class KernelMenu extends JupyterLabMenu implements IKernelMenu {
   constructor(options: Menu.IOptions) {
   constructor(options: Menu.IOptions) {
     super(options);
     super(options);
     this.title.label = 'Kernel';
     this.title.label = 'Kernel';
+
+    this.kernelUsers =
+      new Map<string, IKernelMenu.IKernelUser<Widget>>();
+    this.consoleCreators =
+      new Map<string, IKernelMenu.IConsoleCreator<Widget>>();
   }
   }
 
 
   /**
   /**
-   * Add a new KernelUser to the menu.
+   * A map storing IKernelUsers for the Kernel menu.
    *
    *
-   * @param user - the user to add.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  addUser<T extends Widget>(user: IKernelMenu.IKernelUser<T>): void {
-    this._users.push(user);
-  }
-
+  readonly kernelUsers: Map<string, IKernelMenu.IKernelUser<Widget>>;
+  
   /**
   /**
-   * Find a kernel user for a given widget.
-   *
-   * @param widget - A widget to check.
+   * A map storing IConsoleCreators for the Kernel menu.
    *
    *
-   * @returns an IKernelUser if any of the registered users own the widget.
-   *   Otherwise it returns undefined.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  findUser(widget: Widget | null): IKernelMenu.IKernelUser<Widget> | undefined {
-    return findExtender<Widget>(widget, this._users);
-  }
-
-  private _users: IKernelMenu.IKernelUser<Widget>[] = [];
+  readonly consoleCreators: Map<string, IKernelMenu.IConsoleCreator<Widget>>;
 }
 }
 
 
 /**
 /**
@@ -101,5 +96,16 @@ namespace IKernelMenu {
      */
      */
     changeKernel?: (widget: T) => Promise<void>;
     changeKernel?: (widget: T) => Promise<void>;
   }
   }
+
+  /**
+   * Interface for a command to create a console for an activity.
+   */
+  export
+  interface IConsoleCreator<T extends Widget> extends IMenuExtender<T> {
+    /**
+     * The function to create the console.
+     */
+    createConsole: (widget: T) => Promise<void>;
+  }
 }
 }
 
 

+ 0 - 11
packages/mainmenu/src/labmenu.ts

@@ -114,17 +114,6 @@ class JupyterLabMenu extends Menu implements IJupyterLabMenu {
   private _startIndex = 0;
   private _startIndex = 0;
 }
 }
 
 
-/**
- * Given a widget and a list of menu extenders, check to see if
- * any of the menu extenders own that widget.
- */
-export
-function findExtender<T extends Widget>(widget: T | null, extenders: IMenuExtender<T>[]): IMenuExtender<T> | undefined {
-  if (!widget) {
-    return undefined;
-  }
-  return ArrayExt.findFirstValue(extenders, el => el.tracker.has(widget))
-}
 
 
 /**
 /**
  * A namespace for private data.
  * A namespace for private data.

+ 11 - 36
packages/mainmenu/src/run.ts

@@ -6,7 +6,7 @@ import {
 } from '@phosphor/widgets';
 } from '@phosphor/widgets';
 
 
 import {
 import {
-  IJupyterLabMenu, IMenuExtender, JupyterLabMenu, findExtender
+  IJupyterLabMenu, IMenuExtender, JupyterLabMenu
 } from './labmenu';
 } from './labmenu';
 
 
 /**
 /**
@@ -15,23 +15,12 @@ import {
 export
 export
 interface IRunMenu extends IJupyterLabMenu {
 interface IRunMenu extends IJupyterLabMenu {
   /**
   /**
-   * Add an ICodeRunner to the Run menu.
+   * A map storing ICodeRunner for the Run menu.
    *
    *
-   * @param user - An ICodeRunner.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  addRunner<T extends Widget>(user: IRunMenu.ICodeRunner<T>): void;
-
-  /**
-   * Given a widget, see if it belongs to
-   * any of the ICodeRunners registered with
-   * the run menu.
-   *
-   * @param widget: a widget.
-   *
-   * @returns an ICodeRunner, if any of the registered users own
-   *   the widget, otherwise undefined.
-   */
-  findRunner(widget: Widget | null): IRunMenu.ICodeRunner<Widget> | undefined;
+  readonly codeRunners: Map<string, IRunMenu.ICodeRunner<Widget>>;
 }
 }
 
 
 /**
 /**
@@ -45,32 +34,18 @@ class RunMenu extends JupyterLabMenu implements IRunMenu {
   constructor(options: Menu.IOptions) {
   constructor(options: Menu.IOptions) {
     super(options);
     super(options);
     this.title.label = 'Run';
     this.title.label = 'Run';
-  }
 
 
-  /**
-   * Add an ICodeRunner to the Run menu.
-   *
-   * @param user - An ICodeRunner.
-   */
-  addRunner<T extends Widget>(runner: IRunMenu.ICodeRunner<T>): void {
-    this._runners.push(runner);
+    this.codeRunners =
+      new Map<string, IRunMenu.ICodeRunner<Widget>>();
   }
   }
 
 
   /**
   /**
-   * Given a widget, see if it belongs to
-   * any of the ICodeRunner registered with
-   * the run menu.
+   * A map storing ICodeRunner for the Run menu.
    *
    *
-   * @param widget: a widget.
-   *
-   * @returns an ICodeRunner, if any of the registered users own
-   *   the widget, otherwise undefined.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  findRunner(widget: Widget | null): IRunMenu.ICodeRunner<Widget> | undefined {
-    return findExtender<Widget>(widget, this._runners);
-  }
-
-  private _runners: IRunMenu.ICodeRunner<Widget>[] = [];
+  readonly codeRunners: Map<string, IRunMenu.ICodeRunner<Widget>>;
 }
 }
 
 
 /**
 /**

+ 11 - 22
packages/mainmenu/src/view.ts

@@ -6,7 +6,7 @@ import {
 } from '@phosphor/widgets';
 } from '@phosphor/widgets';
 
 
 import {
 import {
-  IJupyterLabMenu, IMenuExtender, JupyterLabMenu, findExtender
+  IJupyterLabMenu, IMenuExtender, JupyterLabMenu
 } from './labmenu';
 } from './labmenu';
 
 
 /**
 /**
@@ -15,11 +15,12 @@ import {
 export
 export
 interface IViewMenu extends IJupyterLabMenu {
 interface IViewMenu extends IJupyterLabMenu {
   /**
   /**
-   * Add an IKernelUser to the Kernel menu.
+   * A map storing IKernelUsers for the Kernel menu.
    *
    *
-   * @param user - An IKernelUser.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  addEditorViewer<T extends Widget>(user: IViewMenu.IEditorViewer<T>): void;
+  readonly editorViewers: Map<string, IViewMenu.IEditorViewer<Widget>>;
 }
 }
 
 
 /**
 /**
@@ -33,30 +34,18 @@ class ViewMenu extends JupyterLabMenu implements IViewMenu {
   constructor(options: Menu.IOptions) {
   constructor(options: Menu.IOptions) {
     super(options);
     super(options);
     this.title.label = 'View';
     this.title.label = 'View';
-  }
 
 
-  /**
-   * Add a new KernelUser to the menu.
-   *
-   * @param user - the user to add.
-   */
-  addEditorViewer<T extends Widget>(editorViewer: IViewMenu.IEditorViewer<T>): void {
-    this._editorViewers.push(editorViewer);
+    this.editorViewers =
+      new Map<string, IViewMenu.IEditorViewer<Widget>>();
   }
   }
 
 
   /**
   /**
-   * Find a kernel user for a given widget.
+   * A map storing IKernelUsers for the Kernel menu.
    *
    *
-   * @param widget - A widget to check.
-   *
-   * @returns an IKernelUser if any of the registered users own the widget.
-   *   Otherwise it returns undefined.
+   * ### Notes
+   * The key for the map may be used in menu labels.
    */
    */
-  findEditorViewer(widget: Widget | null): IViewMenu.IEditorViewer<Widget> | undefined {
-    return findExtender<Widget>(widget, this._editorViewers);
-  }
-
-  private _editorViewers: IViewMenu.IEditorViewer<Widget>[] = [];
+  readonly editorViewers: Map<string, IViewMenu.IEditorViewer<Widget>>;
 }
 }
 
 
 /**
 /**

+ 7 - 7
packages/notebook-extension/src/index.ts

@@ -26,7 +26,7 @@ import {
 } from '@jupyterlab/launcher';
 } from '@jupyterlab/launcher';
 
 
 import {
 import {
-  IMainMenu
+  IMainMenu, IKernelMenu, IRunMenu, IViewMenu
 } from '@jupyterlab/mainmenu';
 } from '@jupyterlab/mainmenu';
 
 
 import {
 import {
@@ -449,7 +449,7 @@ function activateNotebookHandler(app: JupyterLab, mainMenu: IMainMenu, palette:
   mainMenu.fileMenu.newMenu.addItem({ command: CommandIDs.createNew });
   mainMenu.fileMenu.newMenu.addItem({ command: CommandIDs.createNew });
 
 
   // Add a kernel user to the Kernel menu
   // Add a kernel user to the Kernel menu
-  mainMenu.kernelMenu.addUser<NotebookPanel>({
+  mainMenu.kernelMenu.kernelUsers.set('Notebook', {
     tracker,
     tracker,
     interruptKernel: current => {
     interruptKernel: current => {
       let kernel = current.session.kernel;
       let kernel = current.session.kernel;
@@ -460,7 +460,7 @@ function activateNotebookHandler(app: JupyterLab, mainMenu: IMainMenu, palette:
     },
     },
     restartKernel: current => current.session.restart(),
     restartKernel: current => current.session.restart(),
     changeKernel: current => current.session.selectKernel()
     changeKernel: current => current.session.selectKernel()
-  });
+  } as IKernelMenu.IKernelUser<NotebookPanel>);
 
 
   // Add some commands to the application view menu.
   // Add some commands to the application view menu.
   const viewGroup = [
   const viewGroup = [
@@ -472,7 +472,7 @@ function activateNotebookHandler(app: JupyterLab, mainMenu: IMainMenu, palette:
   mainMenu.viewMenu.addGroup(viewGroup);
   mainMenu.viewMenu.addGroup(viewGroup);
 
 
   // Add an IEditorViewer to the application view menu
   // Add an IEditorViewer to the application view menu
-  mainMenu.viewMenu.addEditorViewer<NotebookPanel>({
+  mainMenu.viewMenu.editorViewers.set('Editor', {
     tracker,
     tracker,
     toggleLineNumbers: widget => {
     toggleLineNumbers: widget => {
       NotebookActions.toggleAllLineNumbers(widget.notebook);
       NotebookActions.toggleAllLineNumbers(widget.notebook);
@@ -484,10 +484,10 @@ function activateNotebookHandler(app: JupyterLab, mainMenu: IMainMenu, palette:
       widget.notebook.activeCell.editor.getOption('lineNumbers'),
       widget.notebook.activeCell.editor.getOption('lineNumbers'),
     matchBracketsToggled: widget =>
     matchBracketsToggled: widget =>
       widget.notebook.activeCell.editor.getOption('matchBrackets'),
       widget.notebook.activeCell.editor.getOption('matchBrackets'),
-  });
+  } as IViewMenu.IEditorViewer<NotebookPanel>);
 
 
   // Add an ICodeRunner to the application run menu
   // Add an ICodeRunner to the application run menu
-  mainMenu.runMenu.addRunner<NotebookPanel>({
+  mainMenu.runMenu.codeRunners.set('Notebook', {
     tracker,
     tracker,
     run: current => {
     run: current => {
       const { context, notebook } = current;
       const { context, notebook } = current;
@@ -499,7 +499,7 @@ function activateNotebookHandler(app: JupyterLab, mainMenu: IMainMenu, palette:
       return NotebookActions.runAll(notebook, context.session)
       return NotebookActions.runAll(notebook, context.session)
       .then(() => void 0);
       .then(() => void 0);
     }
     }
-  });
+  } as IRunMenu.ICodeRunner<NotebookPanel>);
 
 
   // Add commands to the application edit menu.
   // Add commands to the application edit menu.
   const editGroup = [
   const editGroup = [