Browse Source

Activate file in file browser when it is activated

Steven Silvester 8 years ago
parent
commit
f83e937c79
3 changed files with 53 additions and 5 deletions
  1. 18 2
      src/docmanager/manager.ts
  2. 17 2
      src/docmanager/widgetmanager.ts
  3. 18 1
      src/filebrowser/listing.ts

+ 18 - 2
src/docmanager/manager.ts

@@ -18,7 +18,7 @@ import {
 } from '@phosphor/properties';
 
 import {
-  Signal
+  ISignal, Signal
 } from '@phosphor/signaling';
 
 import {
@@ -76,8 +76,16 @@ class DocumentManager implements IDisposable {
     this._serviceManager = options.manager;
     this._opener = options.opener;
     this._widgetManager = new DocumentWidgetManager({
-      registry: this._registry
+      registry: this._registry,
     });
+    this._widgetManager.activateRequested.connect(this._onActivateRequested, this);
+  }
+
+  /**
+   * A signal emitted when one of the documents is activated.
+   */
+  get activateRequested(): ISignal<this, string> {
+    return this._activateRequested;
   }
 
   /**
@@ -376,11 +384,19 @@ class DocumentManager implements IDisposable {
     return widget;
   }
 
+  /**
+   * Handle an activateRequested signal from the widget manager.
+   */
+  private _onActivateRequested(sender: DocumentWidgetManager, args: string): void {
+    this._activateRequested.emit(args);
+  }
+
   private _serviceManager: ServiceManager.IManager = null;
   private _widgetManager: DocumentWidgetManager = null;
   private _registry: DocumentRegistry = null;
   private _contexts: Private.IContext[] = [];
   private _opener: DocumentManager.IWidgetOpener = null;
+  private _activateRequested = new Signal<this, string>(this);
 }
 
 

+ 17 - 2
src/docmanager/widgetmanager.ts

@@ -18,7 +18,7 @@ import {
 } from '@phosphor/properties';
 
 import {
-  Signal
+  ISignal, Signal
 } from '@phosphor/signaling';
 
 import {
@@ -56,6 +56,13 @@ class DocumentWidgetManager implements IDisposable {
     this._registry = options.registry;
   }
 
+  /**
+   * A signal emitted when one of the documents is activated.
+   */
+  get activateRequested(): ISignal<this, string> {
+    return this._activateRequested;
+  }
+
   /**
    * Test whether the document widget manager is disposed.
    */
@@ -207,12 +214,19 @@ class DocumentWidgetManager implements IDisposable {
    *   if the message should be dispatched to the handler as normal.
    */
   protected filterMessage(handler: IMessageHandler, msg: Message): boolean {
-    if (msg.type === 'close-request') {
+    switch (msg.type) {
+    case 'close-request':
       if (this._closeGuard) {
         return true;
       }
       this.onClose(handler as Widget);
       return false;
+    case 'activate-request':
+      let context = this.contextForWidget(handler as Widget);
+      this._activateRequested.emit(context.path);
+      break;
+    default:
+      break;
     }
     return true;
   }
@@ -334,6 +348,7 @@ class DocumentWidgetManager implements IDisposable {
 
   private _closeGuard = false;
   private _registry: DocumentRegistry = null;
+  private _activateRequested = new Signal<this, string>(this);
 }
 
 

+ 18 - 1
src/filebrowser/listing.ts

@@ -2,7 +2,7 @@
 // Distributed under the terms of the Modified BSD License.
 
 import {
-  Contents
+  Contents, ContentsManager
 } from '@jupyterlab/services';
 
 import {
@@ -216,6 +216,7 @@ class DirListing extends Widget {
     this._renderer = options.renderer || DirListing.defaultRenderer;
     let headerNode = utils.findElement(this.node, HEADER_CLASS);
     this._renderer.populateHeaderNode(headerNode);
+    this._manager.activateRequested.connect(this._onActivateRequested, this);
   }
 
   /**
@@ -1244,6 +1245,7 @@ class DirListing extends Widget {
     let name = items[index].name;
     this._selection[name] = true;
     this._isCut = false;
+    this.update();
   }
 
   /**
@@ -1286,6 +1288,21 @@ class DirListing extends Widget {
     }
   }
 
+  /**
+   * Handle an `activateRequested` signal from the manager.
+   */
+  private _onActivateRequested(sender: DocumentManager, args: string): void {
+    let dirname = ContentsManager.dirname(args);
+    if (dirname == '.') {
+      dirname = '';
+    }
+    if (dirname !== this._model.path) {
+      return;
+    }
+    let basename = ContentsManager.basename(args);
+    this._selectItemByName(basename);
+  }
+
   private _model: FileBrowserModel = null;
   private _editNode: HTMLInputElement = null;
   private _items: HTMLElement[] = [];