Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ui / file_manager / file_manager / foreground / js / file_transfer_controller.js
index 1730bff..79a4868 100644 (file)
@@ -21,6 +21,7 @@ var DRAG_AND_DROP_GLOBAL_DATA = '__drag_and_drop_global_data';
  * @param {VolumeManagerWrapper} volumeManager Volume manager instance.
  * @param {MultiProfileShareDialog} multiProfileShareDialog Share dialog to be
  *     used to share files from another profile.
+ * @param {ProgressCenter} progressCenter To notify starting copy operation.
  * @constructor
  */
 function FileTransferController(doc,
@@ -28,25 +29,34 @@ function FileTransferController(doc,
                                 metadataCache,
                                 directoryModel,
                                 volumeManager,
-                                multiProfileShareDialog) {
+                                multiProfileShareDialog,
+                                progressCenter) {
   this.document_ = doc;
   this.fileOperationManager_ = fileOperationManager;
   this.metadataCache_ = metadataCache;
   this.directoryModel_ = directoryModel;
   this.volumeManager_ = volumeManager;
   this.multiProfileShareDialog_ = multiProfileShareDialog;
+  this.progressCenter_ = progressCenter;
 
   this.directoryModel_.getFileList().addEventListener(
-      'change', function(event) {
-    if (this.directoryModel_.getFileListSelection().
-        getIndexSelected(event.index)) {
-      this.onSelectionChanged_();
-    }
-  }.bind(this));
+      'change',
+      function(event) {
+        if (this.directoryModel_.getFileListSelection().
+            getIndexSelected(event.index)) {
+          this.onSelectionChanged_();
+        }
+      }.bind(this));
   this.directoryModel_.getFileListSelection().addEventListener('change',
       this.onSelectionChanged_.bind(this));
 
   /**
+   * The array of pending task ID.
+   * @type {Array.<string>}
+   */
+  this.pendingTaskIds = [];
+
+  /**
    * Promise to be fulfilled with the thumbnail image of selected file in drag
    * operation. Used if only one element is selected.
    * @type {Promise}
@@ -75,6 +85,13 @@ function FileTransferController(doc,
    * @private
    */
   this.touching_ = false;
+
+  /**
+   * Task ID counter.
+   * @type {number}
+   * @private
+   */
+  this.taskIdCounter_ = 0;
 }
 
 /**
@@ -134,20 +151,6 @@ FileTransferController.prototype = {
   },
 
   /**
-   * @this {FileTransferController}
-   * @param {NavigationList} tree Its sub items will could be drop target.
-   */
-  attachNavigationListDropTarget: function(list) {
-    list.addEventListener('dragover',
-        this.onDragOver_.bind(this, true /* onlyIntoDirectories */, list));
-    list.addEventListener('dragenter',
-        this.onDragEnterVolumesList_.bind(this, list));
-    list.addEventListener('dragleave', this.onDragLeave_.bind(this, list));
-    list.addEventListener('drop',
-        this.onDrop_.bind(this, true /* onlyIntoDirectories */));
-  },
-
-  /**
    * Attach handlers of copy, cut and paste operations to the document.
    *
    * @this {FileTransferController}
@@ -276,10 +279,11 @@ FileTransferController.prototype = {
     // Check all file entries and keeps only those need sharing operation.
     var processFileEntries = function(entries) {
       return new Promise(function(callback) {
+        // TODO(mtomasz): Move conversion from entry to url to custom bindings.
+        // crbug.com/345527.
         var urls = util.entriesToURLs(entries);
-        chrome.fileBrowserPrivate.getDriveEntryProperties(urls, callback);
-      }).
-      then(function(metadatas) {
+        chrome.fileManagerPrivate.getEntryProperties(urls, callback);
+      }).then(function(metadatas) {
         return entries.filter(function(entry, i) {
           var metadata = metadatas[i];
           return metadata && metadata.isHosted && !metadata.sharedWithMe;
@@ -345,15 +349,23 @@ FileTransferController.prototype = {
         opt_destinationEntry || this.currentDirectoryContentEntry;
     var entries;
     var failureUrls;
+    var taskId = this.fileOperationManager_.generateTaskId();
 
-    util.URLsToEntries(sourceURLs).
-    then(function(result) {
+    util.URLsToEntries(sourceURLs).then(function(result) {
+      this.pendingTaskIds.push(taskId);
       entries = result.entries;
       failureUrls = result.failureUrls;
+      var item = new ProgressCenterItem();
+      item.id = taskId;
+      item.type = ProgressItemType.COPY;
+      if (result.entries.length === 1)
+        item.message = strf('COPY_FILE_NAME', result.entries[0].name);
+      else
+        item.message = strf('COPY_ITEMS_REMAINING', result.entries.length);
+      this.progressCenter_.updateItem(item);
       // Check if cross share is needed or not.
       return this.getMultiProfileShareEntries_(entries);
-    }.bind(this)).
-    then(function(shareEntries) {
+    }.bind(this)).then(function(shareEntries) {
       if (shareEntries.length === 0)
         return;
       return this.multiProfileShareDialog_.show(shareEntries.length > 1).
@@ -366,7 +378,7 @@ FileTransferController.prototype = {
               if (index >= shareEntries.length)
                 return;
               return new Promise(function(fulfill) {
-                chrome.fileBrowserPrivate.requestDriveShare(
+                chrome.fileManagerPrivate.requestDriveShare(
                     shareEntries[index].toURL(),
                     dialogResult,
                     function() {
@@ -377,11 +389,11 @@ FileTransferController.prototype = {
             };
             return requestDriveShare(0);
           });
-    }.bind(this)).
-    then(function() {
+    }.bind(this)).then(function() {
       // Start the pasting operation.
       this.fileOperationManager_.paste(
-          entries, destinationEntry, toMove);
+          entries, destinationEntry, toMove, taskId);
+      this.pendingTaskIds.splice(this.pendingTaskIds.indexOf(taskId), 1);
 
       // Publish events for failureUrls.
       for (var i = 0; i < failureUrls.length; i++) {
@@ -393,8 +405,7 @@ FileTransferController.prototype = {
             toMove ? ProgressItemType.MOVE : ProgressItemType.COPY;
         this.dispatchEvent(event);
       }
-    }.bind(this)).
-    catch(function(error) {
+    }.bind(this)).catch(function(error) {
       if (error !== 'ABORT')
         console.error(error.stack ? error.stack : error);
     });
@@ -409,14 +420,15 @@ FileTransferController.prototype = {
    */
   preloadThumbnailImage_: function(entry) {
     var metadataPromise = new Promise(function(fulfill, reject) {
-      this.metadataCache_.getOne(entry,
-                                 'thumbnail|filesystem',
-                                 function(metadata) {
-        if (metadata)
-          fulfill(metadata);
-        else
-          reject('Failed to fetch metadata.');
-      });
+      this.metadataCache_.getOne(
+          entry,
+          'thumbnail|filesystem',
+          function(metadata) {
+            if (metadata)
+              fulfill(metadata);
+            else
+              reject('Failed to fetch metadata.');
+          });
     }.bind(this));
 
     var imagePromise = metadataPromise.then(function(metadata) {
@@ -550,7 +562,7 @@ FileTransferController.prototype = {
 
     window[DRAG_AND_DROP_GLOBAL_DATA] = {
       sourceRootURL: dt.getData('fs/sourceRootURL'),
-      missingFileContents: dt.getData('fs/missingFileContents'),
+      missingFileContents: dt.getData('fs/missingFileContents')
     };
   },
 
@@ -614,7 +626,7 @@ FileTransferController.prototype = {
     event.preventDefault();  // Required to prevent the cursor flicker.
     this.lastEnteredTarget_ = event.target;
     var item = event.target;
-    while (item && !(item instanceof DirectoryItem)) {
+    while (item && !(item instanceof cr.ui.TreeItem)) {
       item = item.parentNode;
     }
 
@@ -631,34 +643,6 @@ FileTransferController.prototype = {
 
   /**
    * @this {FileTransferController}
-   * @param {NavigationList} list Drop target list.
-   * @param {Event} event A dragenter event of DOM.
-   */
-  onDragEnterVolumesList_: function(list, event) {
-    event.preventDefault();  // Required to prevent the cursor flicker.
-
-    this.lastEnteredTarget_ = event.target;
-    var item = list.getListItemAncestor(event.target);
-    item = item && list.isItem(item) ? item : null;
-    if (item === this.dropTarget_)
-      return;
-
-    var modelItem = item && list.dataModel.item(item.listIndex);
-    if (modelItem && modelItem.isShortcut) {
-      this.setDropTarget_(item, event.dataTransfer, modelItem.entry);
-      return;
-    }
-    if (modelItem && modelItem.isVolume && modelItem.volumeInfo.displayRoot) {
-      this.setDropTarget_(
-          item, event.dataTransfer, modelItem.volumeInfo.displayRoot);
-      return;
-    }
-
-    this.clearDropTarget_();
-  },
-
-  /**
-   * @this {FileTransferController}
    * @param {cr.ui.List} list Drop target list.
    * @param {Event} event A dragleave event of DOM.
    */
@@ -996,7 +980,7 @@ FileTransferController.prototype = {
 
     if (this.isOnDrive) {
       this.allDriveFilesAvailable = false;
-      this.metadataCache_.get(entries, 'drive', function(props) {
+      this.metadataCache_.get(entries, 'external', function(props) {
         // We consider directories not available offline for the purposes of
         // file transfer since we cannot afford to recursive traversal.
         this.allDriveFilesAvailable =