Index: ui/file_manager/file_manager/foreground/js/import_controller.js |
diff --git a/ui/file_manager/file_manager/foreground/js/import_controller.js b/ui/file_manager/file_manager/foreground/js/import_controller.js |
index 4f7170b85b51fa4771d874bc438a2e9f9db877c2..9531312df32df4a644a7f9beda32ca22227e1cf9 100644 |
--- a/ui/file_manager/file_manager/foreground/js/import_controller.js |
+++ b/ui/file_manager/file_manager/foreground/js/import_controller.js |
@@ -36,10 +36,10 @@ importer.CommandUpdate; |
* volume lookup and so-on. |
* @param {!importer.MediaScanner} scanner |
* @param {!importer.ImportRunner} importRunner |
- * @param {function()} commandUpdateHandler |
+ * @param {!importer.CommandWidget} commandWidget |
*/ |
importer.ImportController = |
- function(environment, scanner, importRunner, commandUpdateHandler) { |
+ function(environment, scanner, importRunner, commandWidget) { |
/** @private {!importer.ControllerEnvironment} */ |
this.environment_ = environment; |
@@ -50,8 +50,8 @@ importer.ImportController = |
/** @private {!importer.MediaScanner} */ |
this.scanner_ = scanner; |
- /** @private {function()} */ |
- this.updateCommands_ = commandUpdateHandler; |
+ /** @private {!importer.CommandWidget} */ |
+ this.commandWidget_ = commandWidget; |
/** |
* A cache of scans by volumeId, directory URL. |
@@ -63,13 +63,20 @@ importer.ImportController = |
var listener = this.onScanEvent_.bind(this); |
this.scanner_.addObserver(listener); |
// Remove the observer when the foreground window is closed. |
- window.addEventListener('pagehide', function() { |
- this.scanner_.removeObserver(listener); |
- }.bind(this)); |
+ window.addEventListener( |
+ 'pagehide', |
+ function() { |
+ this.scanner_.removeObserver(listener); |
+ }.bind(this)); |
+ |
this.environment_.addVolumeUnmountListener( |
this.onVolumeUnmounted_.bind(this)); |
+ |
this.environment_.addDirectoryChangedListener( |
this.onDirectoryChanged_.bind(this)); |
+ |
+ this.commandWidget_.addExecuteListener( |
+ this.execute.bind(this)); |
}; |
/** |
@@ -90,7 +97,7 @@ importer.ImportController.prototype.onScanEvent_ = function(event, result) { |
} |
if (event === importer.ScanEvent.FINALIZED || |
event === importer.ScanEvent.INVALIDATED) { |
- this.updateCommands_(); |
+ this.pushUpdate_(); |
} |
}; |
@@ -106,8 +113,15 @@ importer.ImportController.prototype.execute = function() { |
}; |
/** |
- * Called by the 'cloud-import' command when it wants an update |
- * on the command state. |
+ * Push an update to the command widget. |
+ * @private |
+ */ |
+importer.ImportController.prototype.pushUpdate_ = function() { |
+ this.commandWidget_.update(this.getCommandUpdate()); |
+}; |
+ |
+/** |
+ * Returns an update describing the state of the CommandWidget. |
* |
* @return {!importer.CommandUpdate} response |
*/ |
@@ -264,14 +278,12 @@ importer.ImportController.prototype.onVolumeUnmounted_ = function(volumeId) { |
if (this.cachedScans_.hasOwnProperty(volumeId)) { |
delete this.cachedScans_[volumeId]; |
} |
+ this.pushUpdate_(); |
}; |
-/** |
- * @param {string} volumeId |
- * @private |
- */ |
+/** @private */ |
importer.ImportController.prototype.onDirectoryChanged_ = function() { |
- this.updateCommands_(); |
+ this.pushUpdate_(); |
}; |
/** |
@@ -398,49 +410,60 @@ importer.RuntimeControllerEnvironment.prototype.addDirectoryChangedListener = |
* Class that adapts from the new non-command button to the old |
* command style interface. |
* |
- * <p>NOTE: This adapter is a stop gap bridge between the old-style |
- * Command button and our new do-it-yourself toolbar button. We used |
- * an adapter to minimize changes to RuntimeImportController while other |
- * people are working on that file. Once the dust settles we can make |
- * more transformative changes. |
- * |
- * @constructor |
- * @struct |
+ * @interface |
+ */ |
+importer.CommandWidget = function() {}; |
+ |
+/** |
+ * Install a listener that get's called when the user wants to initiate |
+ * import. |
* |
- * @param {!FileManager} fileManager |
+ * @param {function()} listener |
*/ |
-importer.ButtonCommandAdapter = function(fileManager) { |
+importer.CommandWidget.prototype.addExecuteListener; |
- /** @param {!FileManager} */ |
- this.fileManager_ = fileManager; |
+/** |
+ * @param {!importer.CommandUpdate} update |
+ */ |
+importer.CommandWidget.prototype.update; |
- /** @param {Element} */ |
+/** |
+ * Runtime implementation of CommandWidget. |
+ * |
+ * @constructor |
+ * @implements {importer.CommandWidget} |
+ * @struct |
+ */ |
+importer.RuntimeCommandWidget = function() { |
+ /** @private {Element} */ |
this.buttonElement_ = document.querySelector('#cloud-import-button'); |
- this.buttonElement_.onclick = this.execute_.bind(this); |
+ this.buttonElement_.onclick = this.notifyExecuteListener_.bind(this); |
- /** @param {Element} */ |
+ /** @private {Element} */ |
this.iconElement_ = document.querySelector('#cloud-import-button core-icon'); |
+ |
+ /** @private {function()} */ |
+ this.listener_; |
+}; |
+ |
+/** @override */ |
+importer.RuntimeCommandWidget.prototype.addExecuteListener = |
+ function(listener) { |
+ console.assert(!this.listener_); |
+ this.listener_ = listener; |
}; |
/** @private */ |
-importer.ButtonCommandAdapter.prototype.execute_ = function() { |
- this.fileManager_.importController.execute(); |
+importer.RuntimeCommandWidget.prototype.notifyExecuteListener_ = function() { |
+ console.assert(!!this.listener_); |
+ this.listener_(); |
}; |
-/** |
- * @param {!Event} event Command event. |
- * @param {!FileManager} fileManager |
- */ |
-importer.ButtonCommandAdapter.prototype.update = function() { |
- if (this.fileManager_.importController) { |
- var update = fileManager.importController.getCommandUpdate(); |
+/** @override */ |
+importer.RuntimeCommandWidget.prototype.update = function(update) { |
this.buttonElement_.setAttribute('title', update.label); |
this.buttonElement_.disabled = !update.executable; |
this.buttonElement_.style.display = update.visible ? 'block' : 'none'; |
this.iconElement_.setAttribute('icon', update.coreIcon); |
- } else { |
- this.buttonElement_.setAttribute('display', 'none'); |
- this.iconElement_.setAttribute('icon', 'cloud-off'); |
- } |
}; |