OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 var MAX_DRAG_THUMBAIL_COUNT = 4; | 5 var MAX_DRAG_THUMBAIL_COUNT = 4; |
6 | 6 |
7 /** | 7 /** |
8 * TODO(olege): Fix style warnings. | 8 * TODO(olege): Fix style warnings. |
9 */ | 9 */ |
10 function FileTransferController(fileList, | 10 function FileTransferController(fileList, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 * @param {HTMLDocument} doc Command dispatcher. | 68 * @param {HTMLDocument} doc Command dispatcher. |
69 */ | 69 */ |
70 attachCopyPasteHandlers: function(doc) { | 70 attachCopyPasteHandlers: function(doc) { |
71 this.document_ = doc; | 71 this.document_ = doc; |
72 doc.addEventListener('beforecopy', this.onBeforeCopy_.bind(this)); | 72 doc.addEventListener('beforecopy', this.onBeforeCopy_.bind(this)); |
73 doc.addEventListener('copy', this.onCopy_.bind(this)); | 73 doc.addEventListener('copy', this.onCopy_.bind(this)); |
74 doc.addEventListener('beforecut', this.onBeforeCut_.bind(this)); | 74 doc.addEventListener('beforecut', this.onBeforeCut_.bind(this)); |
75 doc.addEventListener('cut', this.onCut_.bind(this)); | 75 doc.addEventListener('cut', this.onCut_.bind(this)); |
76 doc.addEventListener('beforepaste', this.onBeforePaste_.bind(this)); | 76 doc.addEventListener('beforepaste', this.onBeforePaste_.bind(this)); |
77 doc.addEventListener('paste', this.onPaste_.bind(this)); | 77 doc.addEventListener('paste', this.onPaste_.bind(this)); |
| 78 this.copyCommand_ = doc.querySelector('command#copy'); |
78 }, | 79 }, |
79 | 80 |
80 /** | 81 /** |
81 * Write the current selection to system clipboard. | 82 * Write the current selection to system clipboard. |
82 * | 83 * |
83 * @param {Clipboard} clipboard Clipboard from the event. | 84 * @param {Clipboard} clipboard Clipboard from the event. |
84 * @param {string} effectAllowed Value must be valid for the | 85 * @param {string} effectAllowed Value must be valid for the |
85 * |dataTransfer.effectAllowed| property ('move', 'copy', 'copyMove'). | 86 * |dataTransfer.effectAllowed| property ('move', 'copy', 'copyMove'). |
86 */ | 87 */ |
87 cutOrCopy: function(dataTransfer, effectAllowed) { | 88 cutOrCopy: function(dataTransfer, effectAllowed) { |
88 var directories = []; | 89 var directories = []; |
89 var files = []; | 90 var files = []; |
90 var entries = this.selectedEntries_; | 91 var entries = this.selectedEntries_; |
91 for (var i = 0; i < entries.length; i++) { | 92 for (var i = 0; i < entries.length; i++) { |
92 (entries[i].isDirectory ? directories : files).push(entries[i].fullPath); | 93 (entries[i].isDirectory ? directories : files).push(entries[i].fullPath); |
93 } | 94 } |
94 | 95 |
95 // Tag to check it's filemanager data. | 96 // Tag to check it's filemanager data. |
96 dataTransfer.setData('fs/tag', 'filemanager-data'); | 97 dataTransfer.setData('fs/tag', 'filemanager-data'); |
97 | 98 |
98 dataTransfer.setData('fs/isOnGData', this.isOnGData); | 99 dataTransfer.setData('fs/isOnGData', this.isOnGData); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 | 258 |
258 onBeforeCopy_: function(event) { | 259 onBeforeCopy_: function(event) { |
259 if (!this.isDocumentWideEvent_(event)) | 260 if (!this.isDocumentWideEvent_(event)) |
260 return; | 261 return; |
261 | 262 |
262 // queryCommandEnabled returns true if event.returnValue is false. | 263 // queryCommandEnabled returns true if event.returnValue is false. |
263 event.returnValue = !this.canCopyOrDrag_(); | 264 event.returnValue = !this.canCopyOrDrag_(); |
264 }, | 265 }, |
265 | 266 |
266 canCopyOrDrag_: function() { | 267 canCopyOrDrag_: function() { |
| 268 if (this.isOnGData && util.isOffline() && !this.allGDataFilesAvailable) |
| 269 return false; |
267 return this.selectedEntries_.length > 0; | 270 return this.selectedEntries_.length > 0; |
268 }, | 271 }, |
269 | 272 |
270 onCut_: function(event) { | 273 onCut_: function(event) { |
271 if (!this.isDocumentWideEvent_(event) || | 274 if (!this.isDocumentWideEvent_(event) || |
272 !this.canCutOrDrag_()) { | 275 !this.canCutOrDrag_()) { |
273 return; | 276 return; |
274 } | 277 } |
275 event.preventDefault(); | 278 event.preventDefault(); |
276 this.cutOrCopy(event.clipboardData, 'move'); | 279 this.cutOrCopy(event.clipboardData, 'move'); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 // asynchronous operations. | 379 // asynchronous operations. |
377 if (!this.isOnGData && entries[i].isFile) | 380 if (!this.isOnGData && entries[i].isFile) |
378 entries[i].file(function(file) { files.push(file); }); | 381 entries[i].file(function(file) { files.push(file); }); |
379 | 382 |
380 // Items to drag are created in advance. Images must be loaded | 383 // Items to drag are created in advance. Images must be loaded |
381 // at the time the 'dragstart' event comes. Otherwise draggable | 384 // at the time the 'dragstart' event comes. Otherwise draggable |
382 // image will be rendered without IMG tags. | 385 // image will be rendered without IMG tags. |
383 if (dragNodes.length < MAX_DRAG_THUMBAIL_COUNT) | 386 if (dragNodes.length < MAX_DRAG_THUMBAIL_COUNT) |
384 dragNodes.push(new this.dragNodeConstructor_(entries[i])); | 387 dragNodes.push(new this.dragNodeConstructor_(entries[i])); |
385 } | 388 } |
| 389 |
| 390 if (this.isOnGData) { |
| 391 this.allGDataFilesAvailable = false; |
| 392 var urls = entries.map(function(e) { return e.toURL() }); |
| 393 this.directoryModel_.getMetadataCache().get( |
| 394 urls, 'gdata', function(props) { |
| 395 // We consider directories not available offline for the purposes of |
| 396 // file transfer since we cannot afford to recursive traversal. |
| 397 this.allGDataFilesAvailable = |
| 398 entries.filter(function(e) {return e.isDirectory}).length == 0 && |
| 399 props.filter(function(p) {return !p.availableOffline}).length == 0; |
| 400 // |Copy| is the only menu item affected by allGDataFilesAvailable. |
| 401 // It could be open right now, update its UI. |
| 402 this.copyCommand_.disabled = !this.canCopyOrDrag_(); |
| 403 }.bind(this)); |
| 404 } |
386 }, | 405 }, |
387 | 406 |
388 get currentDirectory() { | 407 get currentDirectory() { |
389 return this.directoryModel_.getCurrentDirEntry(); | 408 return this.directoryModel_.getCurrentDirEntry(); |
390 }, | 409 }, |
391 | 410 |
392 get readonly() { | 411 get readonly() { |
393 return this.directoryModel_.isReadOnly(); | 412 return this.directoryModel_.isReadOnly(); |
394 }, | 413 }, |
395 | 414 |
(...skipping 13 matching lines...) Expand all Loading... |
409 * @type {Array.<Entry>} | 428 * @type {Array.<Entry>} |
410 */ | 429 */ |
411 get selectedEntries_() { | 430 get selectedEntries_() { |
412 var list = this.fileList_; | 431 var list = this.fileList_; |
413 return this.fileListSelection_.selectedIndexes.map(function(index) { | 432 return this.fileListSelection_.selectedIndexes.map(function(index) { |
414 return list.item(index); | 433 return list.item(index); |
415 }); | 434 }); |
416 } | 435 } |
417 }; | 436 }; |
418 | 437 |
OLD | NEW |