Bläddra i källkod

Merge branch 'master' into execution

Jason Grout 9 år sedan
förälder
incheckning
98370dfa28

+ 8 - 8
examples/lab/src/index.ts → examples/lab/index.js

@@ -11,14 +11,14 @@ function main() {
     require('phosphide/lib/appshell/plugin'),
     require('phosphide/lib/commandregistry/plugin'),
     require('phosphide/lib/commandpalette/plugin'),
-    require('../../lib/terminal/plugin'),
-    require('../../lib/fileopener/plugin'),
-    require('../../lib/filehandler/plugin'),
-    require('../../lib/filebrowser/plugin'),
-    require('../../lib/imagehandler/plugin'),
-    require('../../lib/notebook/plugin'),
-    require('../../lib/services/plugin'),
-    require('./plugin')
+    require('../lib/terminal/plugin'),
+    require('../lib/fileopener/plugin'),
+    require('../lib/filehandler/plugin'),
+    require('../lib/filebrowser/plugin'),
+    require('../lib/imagehandler/plugin'),
+    require('../lib/notebook/plugin'),
+    require('../lib/services/plugin'),
+    require('../lib/application/plugin')
   ]).then(function() {
     console.log('loading finished');
   });

+ 0 - 17
examples/lab/src/tsconfig.json

@@ -1,17 +0,0 @@
-{
-  "compilerOptions": {
-    "declaration": true,
-    "noImplicitAny": true,
-    "noEmitOnError": true,
-    "module": "commonjs",
-    "target": "ES5",
-    "outDir": "../build"
-  },
-  "files": [
-    "../../typings/es6-promise.d.ts",
-    "../../typings/codemirror/codemirror.d.ts",
-    "../../typings/requirejs/requirejs.d.ts",
-    "index.ts",
-    "plugin.ts"
-  ]
-}

+ 1 - 1
examples/lab/webpack.conf.js

@@ -1,6 +1,6 @@
 
 module.exports = {
-  entry: './example/build/index.js',
+  entry: './example/index.js',
   output: {
     path: './example/build',
     filename: 'bundle.js'

BIN
jupyter-plugins-demo.gif


+ 16 - 17
package.json

@@ -1,20 +1,19 @@
 {
   "name": "jupyter-js-plugins",
-  "version": "0.2.0",
+  "version": "0.2.3",
   "description": "Plugins for JupyterLab",
   "main": "lib/index.js",
   "typings": "lib/index.d.ts",
   "dependencies": {
     "codemirror": "^5.10.0",
     "jupyter-js-cells": "^0.2.5",
-    "jupyter-js-filebrowser": "^0.4.1",
-    "jupyter-js-notebook": "^0.3.0",
-    "jupyter-js-services": "^0.3.3",
+    "jupyter-js-filebrowser": "^0.4.7",
+    "jupyter-js-notebook": "^0.3.2",
+    "jupyter-js-services": "^0.4.1",
     "jupyter-js-terminal": "^0.1.12",
-    "jupyter-js-utils": "^0.2.6",
-    "phosphide": "^0.1.0",
+    "jupyter-js-utils": "^0.2.7",
+    "phosphide": "^0.2.0",
     "phosphor-codemirror": "^0.0.1",
-    "phosphor-command": "^0.5.0",
     "phosphor-di": "^0.9.0",
     "phosphor-properties": "^2.0.0",
     "phosphor-tabs": "^1.0.0-rc.2"
@@ -22,27 +21,27 @@
   "devDependencies": {
     "css-loader": "^0.23.1",
     "expect.js": "^0.3.1",
-    "fs-extra": "^0.26.3",
+    "fs-extra": "^0.26.4",
     "istanbul-instrumenter-loader": "^0.1.3",
     "json-loader": "^0.5.4",
-    "karma": "^0.13.9",
-    "karma-chrome-launcher": "^0.2.0",
+    "karma": "^0.13.19",
+    "karma-chrome-launcher": "^0.2.2",
     "karma-coverage": "^0.5.3",
-    "karma-firefox-launcher": "^0.1.6",
+    "karma-firefox-launcher": "^0.1.7",
     "karma-ie-launcher": "^0.2.0",
-    "karma-mocha": "^0.2.0",
-    "karma-mocha-reporter": "^1.1.1",
-    "mocha": "^2.2.5",
-    "rimraf": "^2.4.2",
+    "karma-mocha": "^0.2.1",
+    "karma-mocha-reporter": "^1.1.5",
+    "mocha": "^2.3.4",
+    "rimraf": "^2.5.0",
     "style-loader": "^0.13.0",
     "typedoc": "^0.3.12",
     "typescript": "^1.7.5",
-    "webpack": "^1.12.9"
+    "webpack": "^1.12.11"
   },
   "scripts": {
     "clean": "rimraf docs && rimraf lib && rimraf test/build",
     "clean:example": "rimraf example/build",
-    "build:example": "tsc --project example/src && webpack --config example/webpack.conf.js",
+    "build:example": "webpack --config example/webpack.conf.js",
     "build:src": "tsc --project src && node scripts/copycss.js",
     "build:test": "tsc --project test/src && webpack --config test/webpack.conf.js",
     "build": "npm run build:src && npm run build:test",

+ 0 - 0
examples/lab/index.css → src/application/plugin.css


+ 5 - 16
examples/lab/src/plugin.ts → src/application/plugin.ts

@@ -1,11 +1,3 @@
-// Copyright (c) Jupyter Development Team.
-// Distributed under the terms of the Modified BSD License.
-'use strict';
-
-import {
-  FileBrowserWidget
-} from 'jupyter-js-filebrowser';
-
 import {
   IAppShell, ICommandPalette, ICommandRegistry
 } from 'phosphide';
@@ -14,10 +6,6 @@ import {
   CodeMirrorWidget
 } from 'phosphor-codemirror';
 
-import {
-  ICommand, DelegateCommand
-} from 'phosphor-command';
-
 import {
   Container, Token
 } from 'phosphor-di';
@@ -28,8 +16,9 @@ import {
 
 import {
   IFileBrowserWidget
-} from '../../lib';
+} from '../index';
 
+import './plugin.css';
 
 /**
  * Register the plugin contributions.
@@ -40,10 +29,10 @@ import {
  * This is called automatically when the plugin is loaded.
  */
 export
-function resolve(container: Container): void {
-  container.resolve({
+function resolve(container: Container): Promise<void> {
+  return container.resolve({
     requires: [IAppShell, ICommandPalette, IFileBrowserWidget],
-    create: (shell, palette, browser) => {
+    create: (shell: IAppShell, palette: ICommandPalette, browser: IFileBrowserWidget) => {
       palette.title.text = 'Commands';
       shell.addToLeftArea(palette, { rank: 40 });
       shell.attach(document.body);

+ 1 - 1
src/filebrowser/plugin.ts

@@ -33,7 +33,7 @@ export
 function register(container: Container): void {
   container.register(IFileBrowserWidget, {
     requires: [IServicesProvider],
-    create: (provider) => {
+    create: (provider: IServicesProvider) => {
       let contents = provider.contentsManager;
       let sessions = provider.notebookSessionManager;
       let model = new FileBrowserModel(contents, sessions);

+ 4 - 3
src/filehandler/plugin.ts

@@ -28,12 +28,13 @@ import {
  * This is called automatically when the plugin is loaded.
  */
 export
-function resolve(container: Container): void {
-  container.resolve({
+function resolve(container: Container): Promise<IFileHandler> {
+  return container.resolve({
     requires: [IServicesProvider, IFileOpener],
-    create: (services, opener) => {
+    create: (services: IServicesProvider, opener: IFileOpener) => {
       let handler = new FileHandler(services.contentsManager);
       opener.registerDefault(handler);
+      return handler;
     }
   });
 }

+ 47 - 97
src/fileopener/plugin.ts

@@ -10,10 +10,6 @@ import {
   IAppShell, ICommandPalette, ICommandRegistry
 } from 'phosphide';
 
-import {
-  DelegateCommand
-} from 'phosphor-command';
-
 import {
   Container, Token
 } from 'phosphor-di';
@@ -44,83 +40,51 @@ import {
  */
 export
 function resolve(container: Container): Promise<void> {
-  return container.resolve(FileOpenerProvider).then(provider => provider.run());
-}
-
-export
-function register(container: Container): void {
-  container.register(IFileOpener, FileOpener);
-}
-
-
-class FileOpenerProvider {
-  /**
-   * The dependencies required by the file opener.
-   */
-  static requires: Token<any>[] = [IAppShell, IFileOpener, IFileBrowserWidget, ICommandPalette, ICommandRegistry];
-
-  static create(appShell: IAppShell, opener: IFileOpener, browserProvider: IFileBrowserWidget, palette: ICommandPalette, registry: ICommandRegistry): FileOpenerProvider {
-    return new FileOpenerProvider(appShell, opener, browserProvider, palette, registry);
-  }
-
-  /**
-   * Construct a new file opener.
-   */
-  constructor(appShell: IAppShell, opener: IFileOpener, browser: IFileBrowserWidget, palette: ICommandPalette, registry: ICommandRegistry) {
-    this._browser = browser;
-    this._registry = registry;
-    this._palette = palette;
-    this._appShell = appShell;
-    this._opener = opener;
-  }
-
-
-  run() {
-    let newFileCommandItem = {
-      id: 'jupyter-plugins:new-text-file',
-      command: new DelegateCommand(() => {
-        this._browser.newUntitled('file', '.txt').then(
-          contents => this._opener.open(contents.path)
+  return container.resolve({
+    requires: [IAppShell, IFileOpener, IFileBrowserWidget, ICommandPalette, ICommandRegistry],
+    create: (appShell: IAppShell, opener: IFileOpener, browser: IFileBrowserWidget, palette: ICommandPalette, registry: ICommandRegistry): void => {
+      registry.add('jupyter-plugins:new:text-file', () => {
+        browser.newUntitled('file', '.txt').then(
+          contents => opener.open(contents.path)
         );
-      })
-    }
-    let newNotebookCommandItem = {
-      id: 'jupyter-plugins:new-notebook',
-      command: new DelegateCommand(() => {
-        this._browser.newUntitled('notebook').then(
-          contents => this._opener.open(contents.path)
+      });
+
+      registry.add('jupyter-plugins:new:notebook', () => {
+        browser.newUntitled('notebook').then(
+          contents => opener.open(contents.path)
         );
-      })
-    }
-    this._registry.add([newFileCommandItem, newNotebookCommandItem]);
-    let paletteItems = [{
-      id: 'jupyter-plugins:new-text-file',
-      title: 'Text File',
-      caption: ''
-    }, {
-      id: 'jupyter-plugins:new-notebook',
-      title: 'Notebook',
-      caption: ''
-    }];
-    let section = {
-      text: 'New...',
-      items: paletteItems
-    }
-    this._palette.add([section]);
+      });
+      let paletteItems = [{
+        id: 'jupyter-plugins:new:text-file',
+        title: 'Text File',
+        caption: ''
+      }, {
+        id: 'jupyter-plugins:new:notebook',
+        title: 'Notebook',
+        caption: ''
+      }];
+      let section = {
+        text: 'New...',
+        items: paletteItems
+      }
+      palette.add([section]);
 
-    FileBrowserWidget.widgetFactory = () => {
-      let model = this._browser.model;
-      let item = model.items[model.selected[0]];
-      return this._opener.open(item.path);
+      browser.widgetFactory = path => {
+        return opener.open(path);
+      }
     }
-  }
+  });
+}
 
-  private _appShell: IAppShell = null;
-  private _defaultHandler: IFileHandler = null;
-  private _browser: FileBrowserWidget = null;
-  private _registry: ICommandRegistry = null;
-  private _palette: ICommandPalette = null;
-  private _opener: IFileOpener = null;
+
+export
+function register(container: Container): void {
+  container.register(IFileOpener, {
+    requires: [IAppShell, IFileBrowserWidget],
+    create: (appShell, browserProvider): IFileOpener => {
+      return new FileOpener(appShell, browserProvider);
+    }
+  });
 }
 
 
@@ -129,18 +93,6 @@ class FileOpenerProvider {
  */
 class FileOpener implements IFileOpener {
 
-  /**
-   * The dependencies required by the file opener.
-   */
-  static requires: Token<any>[] = [IAppShell, IFileBrowserWidget];
-
-  /**
-   * Create a new file opener instance.
-   */
-  static create(appShell: IAppShell, browserProvider: IFileBrowserWidget): IFileOpener {
-    return new FileOpener(appShell, browserProvider);
-  }
-
   /**
    * Construct a new file opener.
    */
@@ -216,15 +168,13 @@ class FileOpener implements IFileOpener {
     if (!widget.isAttached) {
       this._appShell.addToMainArea(widget);
     }
-    let parent = widget.parent;
-    while (parent) {
-      if (parent instanceof TabPanel) {
-        if ((parent as TabPanel).childIndex(widget) !== -1) {
-          (parent as TabPanel).currentWidget = widget;
-          return widget;
-        }
-      }
-      parent = parent.parent;
+    let stack = widget.parent;
+    if (!stack) {
+      return;
+    }
+    let tabs = stack.parent;
+    if (tabs instanceof TabPanel) {
+      tabs.currentWidget = widget;
     }
     return widget;
   }

+ 3 - 2
src/imagehandler/plugin.ts

@@ -32,12 +32,13 @@ import {
  * This is called automatically when the plugin is loaded.
  */
 export
-function resolve(container: Container): Promise<void> {
+function resolve(container: Container): Promise<IFileHandler> {
   return container.resolve({
     requires: [IServicesProvider, IFileOpener],
-    create: (services, opener) => {
+    create: (services: IServicesProvider, opener: IFileOpener) => {
       let handler = new ImageHandler(services.contentsManager);
       opener.register(handler);
+      return handler;
     }
   });
 }

+ 4 - 3
src/notebook/plugin.ts

@@ -21,7 +21,7 @@ import {
 } from 'phosphor-panel';
 
 import {
-  IServicesProvider, IFileOpener
+  IServicesProvider, IFileOpener, IFileHandler
 } from '../index';
 
 import {
@@ -48,12 +48,13 @@ import './plugin.css';
  * This is called automatically when the plugin is loaded.
  */
 export
-function resolve(container: Container): void {
-  container.resolve({
+function resolve(container: Container): Promise<IFileHandler> {
+  return container.resolve({
     requires: [IServicesProvider, IFileOpener],
     create: (services: IServicesProvider, opener: IFileOpener) => {
       let handler = new NotebookFileHandler(services.contentsManager, services.notebookSessionManager);
       opener.register(handler);
+      return handler;
     }
   });
 }

+ 4 - 13
src/services/plugin.ts

@@ -30,7 +30,10 @@ import {
  */
 export
 function register(container: Container): void {
-  container.register(IServicesProvider, ServicesProvider);
+  container.register(IServicesProvider, {
+    requires: [],
+    create: () => { return new ServicesProvider(); }
+  });
 }
 
 
@@ -39,18 +42,6 @@ function register(container: Container): void {
  */
 class ServicesProvider implements IServicesProvider {
 
-  /**
-   * The dependencies required by the services provider.
-   */
-  static requires: Token<any>[] = [];
-
-  /**
-   * Create a new services provider instance.
-   */
-  static create(): IServicesProvider {
-    return new ServicesProvider();
-  }
-
   /**
    * Construct a new services provider.
    */

+ 23 - 20
src/terminal/plugin.ts

@@ -7,39 +7,42 @@ import {
 } from 'jupyter-js-terminal';
 
 import {
-  DelegateCommand
-} from 'phosphor-command';
+  IAppShell, ICommandPalette, ICommandRegistry
+} from 'phosphide';
 
 import {
   Container, Token
 } from 'phosphor-di';
 
 import {
-  IAppShell, ICommandPalette, ICommandRegistry
-} from 'phosphide';
+  TabPanel
+} from 'phosphor-tabs';
 
 import './plugin.css';
 
 
 export
-function resolve(container: Container): void {
-  container.resolve({
+function resolve(container: Container): Promise<void> {
+  return container.resolve({
     requires: [IAppShell, ICommandPalette, ICommandRegistry],
-    create: (shell, palette, registry) => {
-      let termCommandItem = {
-        // Move this to the terminal.
-        id: 'jupyter-plugins:new-terminal',
-        command: new DelegateCommand(() => {
-          let term = new TerminalWidget();
-          term.color = 'black';
-          term.background = 'white';
-          term.title.closable = true;
-          shell.addToMainArea(term);
-        })
-      }
-      registry.add([termCommandItem]);
+    create: (shell: IAppShell, palette: ICommandPalette, registry: ICommandRegistry) => {
+      registry.add('jupyter-plugins:new:terminal', () => {
+        let term = new TerminalWidget();
+        term.color = 'black';
+        term.background = 'white';
+        term.title.closable = true;
+        shell.addToMainArea(term);
+        let stack = term.parent;
+        if (!stack) {
+          return;
+        }
+        let tabs = stack.parent;
+        if (tabs instanceof TabPanel) {
+          tabs.currentWidget = term;
+        }
+      });
       let paletteItem = {
-        id: 'jupyter-plugins:new-terminal',
+        id: 'jupyter-plugins:new:terminal',
         title: 'Terminal',
         caption: ''
       };

+ 1 - 0
src/tsconfig.json

@@ -13,6 +13,7 @@
     "../typings/requirejs/requirejs.d.ts",
     "../typings/codemirror/codemirror.d.ts",
     "index.ts",
+    "application/plugin.ts",
     "filebrowser/index.ts",
     "filebrowser/plugin.ts",
     "filehandler/plugin.ts",