Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Side by Side Diff: chrome/browser/resources/file_manager/js/file_transfer_controller.js

Issue 10184005: [File Manager] Properly enable/disable Copy and Open for GData files in the offline mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 function FileTransferController(fileList, 7 function FileTransferController(fileList,
8 fileListSelection, 8 fileListSelection,
9 dragNodeConstructor, 9 dragNodeConstructor,
10 copyManager, 10 copyManager,
11 directoryModel) { 11 directoryModel,
12 commands) {
12 this.fileList_ = fileList; 13 this.fileList_ = fileList;
13 this.fileListSelection_ = fileListSelection; 14 this.fileListSelection_ = fileListSelection;
14 this.dragNodeConstructor_ = dragNodeConstructor; 15 this.dragNodeConstructor_ = dragNodeConstructor;
15 this.copyManager_ = copyManager; 16 this.copyManager_ = copyManager;
16 this.directoryModel_ = directoryModel; 17 this.directoryModel_ = directoryModel;
18 this.commands_ = commands;
17 19
18 this.fileListSelection_.addEventListener('change', 20 this.fileListSelection_.addEventListener('change',
19 this.onSelectionChanged_.bind(this)); 21 this.onSelectionChanged_.bind(this));
20 22
21 /** 23 /**
22 * DOM elements to represent selected files in drag operation. 24 * DOM elements to represent selected files in drag operation.
23 * @type {Array.<Element>} 25 * @type {Array.<Element>}
24 */ 26 */
25 this.dragNodes_ = []; 27 this.dragNodes_ = [];
26 28
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 * Attach handlers of copy, cut and paste operations to the document. 62 * Attach handlers of copy, cut and paste operations to the document.
61 * @param {HTMLDocument} doc Command dispatcher. 63 * @param {HTMLDocument} doc Command dispatcher.
62 */ 64 */
63 attachCopyPasteHandlers: function(doc) { 65 attachCopyPasteHandlers: function(doc) {
64 this.document_ = doc; 66 this.document_ = doc;
65 doc.addEventListener('beforecopy', this.onBeforeCopy_.bind(this)); 67 doc.addEventListener('beforecopy', this.onBeforeCopy_.bind(this));
66 doc.addEventListener('copy', this.onCopy_.bind(this)); 68 doc.addEventListener('copy', this.onCopy_.bind(this));
67 doc.addEventListener('beforecut', this.onBeforeCut_.bind(this)); 69 doc.addEventListener('beforecut', this.onBeforeCut_.bind(this));
68 doc.addEventListener('cut', this.onCut_.bind(this)); 70 doc.addEventListener('cut', this.onCut_.bind(this));
69 doc.addEventListener('beforepaste', this.onBeforePaste_.bind(this)); 71 doc.addEventListener('beforepaste', this.onBeforePaste_.bind(this));
70 doc.addEventListener('paste', this.onPaste_.bind(this)); 72 doc.addEventListener('paste', this.onPaste_.bind(this));
SeRya 2012/04/25 09:57:03 My suggestion is: this.copyCommand_ = doc.querySe
71 }, 73 },
72 74
73 /** 75 /**
74 * Write the current selection to system clipboard. 76 * Write the current selection to system clipboard.
75 * 77 *
76 * @param {Clipboard} clipboard Clipboard from the event. 78 * @param {Clipboard} clipboard Clipboard from the event.
77 * @param {string} effectAllowed Value must be valid for the 79 * @param {string} effectAllowed Value must be valid for the
78 * |dataTransfer.effectAllowed| property ('move', 'copy', 'copyMove'). 80 * |dataTransfer.effectAllowed| property ('move', 'copy', 'copyMove').
79 */ 81 */
80 cutOrCopy: function(dataTransfer, effectAllowed) { 82 cutOrCopy: function(dataTransfer, effectAllowed) {
81 var directories = []; 83 var directories = [];
82 var files = []; 84 var files = [];
83 var entries = this.selectedEntries_; 85 var entries = this.selectedEntries_;
84 for (var i = 0; i < entries.length; i++) { 86 for (var i = 0; i < entries.length; i++) {
85 (entries[i].isDirectory ? directories : files).push(entries[i].fullPath); 87 (entries[i].isDirectory ? directories : files).push(entries[i].fullPath);
86 } 88 }
87 89
88 // Tag to check it's filemanager data. 90 // Tag to check it's filemanager data.
89 dataTransfer.setData('fs/tag', 'filemanager-data'); 91 dataTransfer.setData('fs/tag', 'filemanager-data');
90 92
91 dataTransfer.setData('fs/isOnGData', this.isOnGData); 93 dataTransfer.setData('fs/isOnGData', this.isOnGData);
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 249
248 onBeforeCopy_: function(event) { 250 onBeforeCopy_: function(event) {
249 if (!this.isDocumentWideEvent_(event)) 251 if (!this.isDocumentWideEvent_(event))
250 return; 252 return;
251 253
252 // queryCommandEnabled returns true if event.returnValue is false. 254 // queryCommandEnabled returns true if event.returnValue is false.
253 event.returnValue = !this.canCopyOrDrag_(); 255 event.returnValue = !this.canCopyOrDrag_();
254 }, 256 },
255 257
256 canCopyOrDrag_: function() { 258 canCopyOrDrag_: function() {
259 if (this.isOnGData &&
260 this.directoryModel_.offline &&
261 !this.allGDataFilesAvailable)
262 return false;
257 return this.selectedEntries_.length > 0; 263 return this.selectedEntries_.length > 0;
258 }, 264 },
259 265
260 onCut_: function(event) { 266 onCut_: function(event) {
261 if (!this.isDocumentWideEvent_(event) || 267 if (!this.isDocumentWideEvent_(event) ||
262 !this.canCutOrDrag_()) { 268 !this.canCutOrDrag_()) {
263 return; 269 return;
264 } 270 }
265 event.preventDefault(); 271 event.preventDefault();
266 this.cutOrCopy(event.clipboardData, 'move'); 272 this.cutOrCopy(event.clipboardData, 'move');
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 // asynchronous operations. 370 // asynchronous operations.
365 if (!this.isOnGData && entries[i].isFile) 371 if (!this.isOnGData && entries[i].isFile)
366 entries[i].file(function(file) { files.push(file); }); 372 entries[i].file(function(file) { files.push(file); });
367 373
368 // Items to drag are created in advance. Images must be loaded 374 // Items to drag are created in advance. Images must be loaded
369 // at the time the 'dragstart' event comes. Otherwise draggable 375 // at the time the 'dragstart' event comes. Otherwise draggable
370 // image will be rendered without IMG tags. 376 // image will be rendered without IMG tags.
371 if (dragNodes.length < MAX_DRAG_THUMBAIL_COUNT) 377 if (dragNodes.length < MAX_DRAG_THUMBAIL_COUNT)
372 dragNodes.push(new this.dragNodeConstructor_(entries[i])); 378 dragNodes.push(new this.dragNodeConstructor_(entries[i]));
373 } 379 }
380
381 if (this.isOnGData) {
382 this.allGDataFilesAvailable = false;
383 var urls = entries.map(function(e) { return e.toURL() });
384 FileType.checkOfflineAvailability(entries, urls, function(result) {
385 this.allGDataFilesAvailable = result;
386 // |Copy| is the only menu item affected by allGDataFilesAvailable.
387 // It could be open right now, update its UI.
388 this.commands_['copy'].disabled = !this.canCopyOrDrag_();
389 }.bind(this));
390 }
374 }, 391 },
375 392
376 get currentDirectory() { 393 get currentDirectory() {
377 return this.directoryModel_.currentEntry; 394 return this.directoryModel_.currentEntry;
378 }, 395 },
379 396
380 get readonly() { 397 get readonly() {
381 return this.directoryModel_.readonly; 398 return this.directoryModel_.readonly;
382 }, 399 },
383 400
384 get isOnGData() { 401 get isOnGData() {
385 return this.directoryModel_.rootType == DirectoryModel.RootType.GDATA; 402 return this.directoryModel_.isOnGData;
386 }, 403 },
387 404
388 notify_: function(eventName) { 405 notify_: function(eventName) {
389 var self = this; 406 var self = this;
390 // Set timeout to avoid recursive events. 407 // Set timeout to avoid recursive events.
391 setTimeout(function() { 408 setTimeout(function() {
392 cr.dispatchSimpleEvent(self, eventName); 409 cr.dispatchSimpleEvent(self, eventName);
393 }, 0); 410 }, 0);
394 }, 411 },
395 412
396 /** 413 /**
397 * @type {Array.<Entry>} 414 * @type {Array.<Entry>}
398 */ 415 */
399 get selectedEntries_() { 416 get selectedEntries_() {
400 var list = this.fileList_; 417 var list = this.fileList_;
401 return this.fileListSelection_.selectedIndexes.map(function(index) { 418 return this.fileListSelection_.selectedIndexes.map(function(index) {
402 return list.item(index); 419 return list.item(index);
403 }); 420 });
404 } 421 }
405 }; 422 };
406 423
OLDNEW
« no previous file with comments | « chrome/browser/resources/file_manager/js/file_manager.js ('k') | chrome/browser/resources/file_manager/js/file_type.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698