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

Side by Side Diff: chrome/browser/resources/file_manager/foreground/js/photo/gallery.js

Issue 109973002: Migrate from URLs to Entries in the Files App's gallery. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments + rebased. Created 7 years 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 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * Called from the main frame when unloading. 8 * Called from the main frame when unloading.
9 * @return {string?} User-visible message on null if it is OK to close. 9 * @return {string?} User-visible message on null if it is OK to close.
10 */ 10 */
(...skipping 25 matching lines...) Expand all
36 * the system. 36 * the system.
37 * @class 37 * @class
38 * @constructor 38 * @constructor
39 */ 39 */
40 function Gallery(context, volumeManager) { 40 function Gallery(context, volumeManager) {
41 this.container_ = document.querySelector('.gallery'); 41 this.container_ = document.querySelector('.gallery');
42 this.document_ = document; 42 this.document_ = document;
43 this.context_ = context; 43 this.context_ = context;
44 this.metadataCache_ = context.metadataCache; 44 this.metadataCache_ = context.metadataCache;
45 this.volumeManager_ = volumeManager; 45 this.volumeManager_ = volumeManager;
46 this.selectedEntry_ = null;
46 47
47 this.dataModel_ = new cr.ui.ArrayDataModel([]); 48 this.dataModel_ = new cr.ui.ArrayDataModel([]);
48 this.selectionModel_ = new cr.ui.ListSelectionModel(); 49 this.selectionModel_ = new cr.ui.ListSelectionModel();
49 this.displayStringFunction_ = context.displayStringFunction; 50 this.displayStringFunction_ = context.displayStringFunction;
50 51
51 this.initDom_(); 52 this.initDom_();
52 this.initListeners_(); 53 this.initListeners_();
53 } 54 }
54 55
55 /** 56 /**
56 * Gallery extends cr.EventTarget. 57 * Gallery extends cr.EventTarget.
57 */ 58 */
58 Gallery.prototype.__proto__ = cr.EventTarget.prototype; 59 Gallery.prototype.__proto__ = cr.EventTarget.prototype;
59 60
60 /** 61 /**
61 * Create and initialize a Gallery object based on a context. 62 * Create and initialize a Gallery object based on a context.
62 * 63 *
63 * @param {Object} context Gallery context. 64 * @param {Object} context Gallery context.
64 * @param {VolumeManagerWrapper} volumeManager VolumeManager of the system. 65 * @param {VolumeManagerWrapper} volumeManager VolumeManager of the system.
65 * @param {Array.<string>} urls Array of urls. 66 * @param {Array.<Entry>} entries Array of entries.
66 * @param {Array.<string>} selectedUrls Array of selected urls. 67 * @param {Array.<Entry>} selectedEntries Array of selected entries.
67 */ 68 */
68 Gallery.open = function(context, volumeManager, urls, selectedUrls) { 69 Gallery.open = function(context, volumeManager, entries, selectedEntries) {
69 Gallery.instance = new Gallery(context, volumeManager); 70 Gallery.instance = new Gallery(context, volumeManager);
70 Gallery.instance.load(urls, selectedUrls); 71 Gallery.instance.load(entries, selectedEntries);
71 }; 72 };
72 73
73 /** 74 /**
74 * Tools fade-out timeout im milliseconds. 75 * Tools fade-out timeout im milliseconds.
75 * @const 76 * @const
76 * @type {number} 77 * @type {number}
77 */ 78 */
78 Gallery.FADE_TIMEOUT = 3000; 79 Gallery.FADE_TIMEOUT = 3000;
79 80
80 /** 81 /**
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 this.volumeManager_.addEventListener('externally-unmounted', 125 this.volumeManager_.addEventListener('externally-unmounted',
125 this.onExternallyUnmounted_.bind(this)); 126 this.onExternallyUnmounted_.bind(this));
126 }; 127 };
127 128
128 /** 129 /**
129 * Closes gallery when a volume containing the selected item is unmounted. 130 * Closes gallery when a volume containing the selected item is unmounted.
130 * @param {Event} event The unmount event. 131 * @param {Event} event The unmount event.
131 * @private 132 * @private
132 */ 133 */
133 Gallery.prototype.onExternallyUnmounted_ = function(event) { 134 Gallery.prototype.onExternallyUnmounted_ = function(event) {
134 if (!this.selectedItemFilesystemPath_) 135 if (!this.selectedEntry_)
135 return; 136 return;
136 if (this.selectedItemFilesystemPath_.indexOf(event.mountPath) == 0) 137
138 if (this.volumeManager_.getVolumeInfo(this.selectedEntry_) ===
139 event.volumeInfo) {
137 this.onBack_(); 140 this.onBack_();
141 }
138 }; 142 };
139 143
140 /** 144 /**
141 * Beforeunload handler. 145 * Beforeunload handler.
142 * @return {string?} User-visible message on null if it is OK to close. 146 * @return {string?} User-visible message on null if it is OK to close.
143 */ 147 */
144 Gallery.prototype.onBeforeUnload = function() { 148 Gallery.prototype.onBeforeUnload = function() {
145 return this.slideMode_.onBeforeUnload(); 149 return this.slideMode_.onBeforeUnload();
146 }; 150 };
147 151
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 * @return {HTMLElement} Newly created button. 264 * @return {HTMLElement} Newly created button.
261 * @private 265 * @private
262 */ 266 */
263 Gallery.prototype.createToolbarButton_ = function(className, title) { 267 Gallery.prototype.createToolbarButton_ = function(className, title) {
264 var button = util.createChild(this.toolbar_, className, 'button'); 268 var button = util.createChild(this.toolbar_, className, 'button');
265 button.title = this.displayStringFunction_(title); 269 button.title = this.displayStringFunction_(title);
266 return button; 270 return button;
267 }; 271 };
268 272
269 /** 273 /**
270 * Load the content. 274 * Load the content.
hirono 2013/12/10 03:36:53 Loads
mtomasz 2013/12/10 05:07:01 Done.
271 * 275 *
272 * @param {Array.<string>} urls Array of urls. 276 * @param {Array.<Entry>} entries Array of entries.
273 * @param {Array.<string>} selectedUrls Array of selected urls. 277 * @param {Array.<Entry>} selectedEntries Array of selected entries.
274 */ 278 */
275 Gallery.prototype.load = function(urls, selectedUrls) { 279 Gallery.prototype.load = function(entries, selectedEntries) {
276 var items = []; 280 var items = [];
277 for (var index = 0; index < urls.length; ++index) { 281 for (var index = 0; index < entries.length; ++index) {
278 items.push(new Gallery.Item(urls[index])); 282 items.push(new Gallery.Item(entries[index]));
279 } 283 }
280 this.dataModel_.push.apply(this.dataModel_, items); 284 this.dataModel_.push.apply(this.dataModel_, items);
281 285
282 this.selectionModel_.adjustLength(this.dataModel_.length); 286 this.selectionModel_.adjustLength(this.dataModel_.length);
283 287
284 for (var i = 0; i != selectedUrls.length; i++) { 288 for (var i = 0; i !== selectedEntries.length; i++) {
285 var selectedIndex = urls.indexOf(selectedUrls[i]); 289 var selectedIndex = entries.indexOf(selectedEntries[i]);
hirono 2013/12/10 03:36:53 Can we use indexOf to compare Entries? If it is pr
mtomasz 2013/12/10 05:07:01 Added a comment. Done.
286 if (selectedIndex >= 0) 290 if (selectedIndex >= 0)
287 this.selectionModel_.setIndexSelected(selectedIndex, true); 291 this.selectionModel_.setIndexSelected(selectedIndex, true);
288 else 292 else
289 console.error('Cannot select ' + selectedUrls[i]); 293 console.error('Cannot select ' + selectedEntries[i]);
290 } 294 }
291 295
292 if (this.selectionModel_.selectedIndexes.length == 0) 296 if (this.selectionModel_.selectedIndexes.length === 0)
293 this.onSelection_(); 297 this.onSelection_();
294 298
295 var mosaic = this.mosaicMode_ && this.mosaicMode_.getMosaic(); 299 var mosaic = this.mosaicMode_ && this.mosaicMode_.getMosaic();
296 300
297 // Mosaic view should show up if most of the selected files are images. 301 // Mosaic view should show up if most of the selected files are images.
298 var imagesCount = 0; 302 var imagesCount = 0;
299 for (var i = 0; i != selectedUrls.length; i++) { 303 for (var i = 0; i !== selectedEntries.length; i++) {
300 if (FileType.getMediaType(selectedUrls[i]) == 'image') 304 if (FileType.getMediaType(selectedEntries[i]) === 'image')
301 imagesCount++; 305 imagesCount++;
302 } 306 }
303 var mostlyImages = imagesCount > (selectedUrls.length / 2.0); 307 var mostlyImages = imagesCount > (selectedEntries.length / 2.0);
304 308
305 var forcedMosaic = (this.context_.pageState && 309 var forcedMosaic = (this.context_.pageState &&
306 this.context_.pageState.gallery == 'mosaic'); 310 this.context_.pageState.gallery === 'mosaic');
307 311
308 var showMosaic = (mostlyImages && selectedUrls.length > 1) || forcedMosaic; 312 var showMosaic = (mostlyImages && selectedEntries.length > 1) || forcedMosaic;
309 if (mosaic && showMosaic) { 313 if (mosaic && showMosaic) {
310 this.setCurrentMode_(this.mosaicMode_); 314 this.setCurrentMode_(this.mosaicMode_);
311 mosaic.init(); 315 mosaic.init();
312 mosaic.show(); 316 mosaic.show();
313 this.inactivityWatcher_.check(); // Show the toolbar. 317 this.inactivityWatcher_.check(); // Show the toolbar.
314 cr.dispatchSimpleEvent(this, 'loaded'); 318 cr.dispatchSimpleEvent(this, 'loaded');
315 } else { 319 } else {
316 this.setCurrentMode_(this.slideMode_); 320 this.setCurrentMode_(this.slideMode_);
317 var maybeLoadMosaic = function() { 321 var maybeLoadMosaic = function() {
318 if (mosaic) 322 if (mosaic)
(...skipping 11 matching lines...) Expand all
330 334
331 /** 335 /**
332 * Close the Gallery and go to Files.app. 336 * Close the Gallery and go to Files.app.
333 * @private 337 * @private
334 */ 338 */
335 Gallery.prototype.back_ = function() { 339 Gallery.prototype.back_ = function() {
336 if (util.isFullScreen(this.context_.appWindow)) { 340 if (util.isFullScreen(this.context_.appWindow)) {
337 util.toggleFullScreen(this.context_.appWindow, 341 util.toggleFullScreen(this.context_.appWindow,
338 false); // Leave the full screen mode. 342 false); // Leave the full screen mode.
339 } 343 }
340 this.context_.onBack(this.getSelectedUrls()); 344 this.context_.onBack(this.getSelectedEntries());
341 }; 345 };
342 346
343 /** 347 /**
344 * Handle user's 'Back' action (Escape or a click on the X icon). 348 * Handle user's 'Back' action (Escape or a click on the X icon).
345 * @private 349 * @private
346 */ 350 */
347 Gallery.prototype.onBack_ = function() { 351 Gallery.prototype.onBack_ = function() {
348 this.executeWhenReady(this.back_.bind(this)); 352 this.executeWhenReady(this.back_.bind(this));
349 }; 353 };
350 354
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 // Show the toolbar and hide it after the default timeout. 400 // Show the toolbar and hide it after the default timeout.
397 this.inactivityWatcher_.kick(); 401 this.inactivityWatcher_.kick();
398 }; 402 };
399 403
400 /** 404 /**
401 * Set the current mode, update the UI. 405 * Set the current mode, update the UI.
402 * @param {Object} mode Current mode. 406 * @param {Object} mode Current mode.
403 * @private 407 * @private
404 */ 408 */
405 Gallery.prototype.setCurrentMode_ = function(mode) { 409 Gallery.prototype.setCurrentMode_ = function(mode) {
406 if (mode != this.slideMode_ && mode != this.mosaicMode_) 410 if (mode !== this.slideMode_ && mode !== this.mosaicMode_)
407 console.error('Invalid Gallery mode'); 411 console.error('Invalid Gallery mode');
408 412
409 this.currentMode_ = mode; 413 this.currentMode_ = mode;
410 this.container_.setAttribute('mode', this.currentMode_.getName()); 414 this.container_.setAttribute('mode', this.currentMode_.getName());
411 this.updateSelectionAndState_(); 415 this.updateSelectionAndState_();
412 this.updateButtons_(); 416 this.updateButtons_();
413 }; 417 };
414 418
415 /** 419 /**
416 * Mode toggle event handler. 420 * Mode toggle event handler.
(...skipping 16 matching lines...) Expand all
433 var onModeChanged = function() { 437 var onModeChanged = function() {
434 this.changingMode_ = false; 438 this.changingMode_ = false;
435 if (opt_callback) opt_callback(); 439 if (opt_callback) opt_callback();
436 }.bind(this); 440 }.bind(this);
437 441
438 var tileIndex = Math.max(0, this.selectionModel_.selectedIndex); 442 var tileIndex = Math.max(0, this.selectionModel_.selectedIndex);
439 443
440 var mosaic = this.mosaicMode_.getMosaic(); 444 var mosaic = this.mosaicMode_.getMosaic();
441 var tileRect = mosaic.getTileRect(tileIndex); 445 var tileRect = mosaic.getTileRect(tileIndex);
442 446
443 if (this.currentMode_ == this.slideMode_) { 447 if (this.currentMode_ === this.slideMode_) {
444 this.setCurrentMode_(this.mosaicMode_); 448 this.setCurrentMode_(this.mosaicMode_);
445 mosaic.transform( 449 mosaic.transform(
446 tileRect, this.slideMode_.getSelectedImageRect(), true /* instant */); 450 tileRect, this.slideMode_.getSelectedImageRect(), true /* instant */);
447 this.slideMode_.leave(tileRect, 451 this.slideMode_.leave(tileRect,
448 function() { 452 function() {
449 // Animate back to normal position. 453 // Animate back to normal position.
450 mosaic.transform(); 454 mosaic.transform();
451 mosaic.show(); 455 mosaic.show();
452 onModeChanged(); 456 onModeChanged();
453 }.bind(this)); 457 }.bind(this));
(...skipping 24 matching lines...) Expand all
478 /* TODO(dgozman): Implement Undo delete, Remove the confirmation dialog. */ 482 /* TODO(dgozman): Implement Undo delete, Remove the confirmation dialog. */
479 483
480 var itemsToRemove = this.getSelectedItems(); 484 var itemsToRemove = this.getSelectedItems();
481 var plural = itemsToRemove.length > 1; 485 var plural = itemsToRemove.length > 1;
482 var param = plural ? itemsToRemove.length : itemsToRemove[0].getFileName(); 486 var param = plural ? itemsToRemove.length : itemsToRemove[0].getFileName();
483 487
484 function deleteNext() { 488 function deleteNext() {
485 if (!itemsToRemove.length) 489 if (!itemsToRemove.length)
486 return; // All deleted. 490 return; // All deleted.
487 491
488 var url = itemsToRemove.pop().getUrl(); 492 // TODO(hirono): Use fileOperationManager.
489 webkitResolveLocalFileSystemURL(url, 493 var entry = itemsToRemove.pop().getEntry();
490 function(entry) { 494 entry.remove(deleteNext, function() {
491 entry.remove(deleteNext, 495 util.flog('Error deleting: ' + entry.fullPath, deleteNext);
492 util.flog('Error deleting ' + url, deleteNext)); 496 });
493 },
494 util.flog('Error resolving ' + url, deleteNext));
495 } 497 }
496 498
497 // Prevent the Gallery from handling Esc and Enter. 499 // Prevent the Gallery from handling Esc and Enter.
498 this.document_.body.removeEventListener('keydown', this.keyDownBound_); 500 this.document_.body.removeEventListener('keydown', this.keyDownBound_);
499 var restoreListener = function() { 501 var restoreListener = function() {
500 this.document_.body.addEventListener('keydown', this.keyDownBound_); 502 this.document_.body.addEventListener('keydown', this.keyDownBound_);
501 }.bind(this); 503 }.bind(this);
502 504
503 cr.ui.dialogs.BaseDialog.OK_LABEL = this.displayStringFunction_( 505 cr.ui.dialogs.BaseDialog.OK_LABEL = this.displayStringFunction_(
504 'GALLERY_OK_LABEL'); 506 'GALLERY_OK_LABEL');
(...skipping 21 matching lines...) Expand all
526 528
527 /** 529 /**
528 * @return {Array.<Gallery.Item>} Current selection. 530 * @return {Array.<Gallery.Item>} Current selection.
529 */ 531 */
530 Gallery.prototype.getSelectedItems = function() { 532 Gallery.prototype.getSelectedItems = function() {
531 return this.selectionModel_.selectedIndexes.map( 533 return this.selectionModel_.selectedIndexes.map(
532 this.dataModel_.item.bind(this.dataModel_)); 534 this.dataModel_.item.bind(this.dataModel_));
533 }; 535 };
534 536
535 /** 537 /**
536 * @return {Array.<string>} Array of currently selected urls. 538 * @return {Array.<Entry>} Array of currently selected entries.
537 */ 539 */
538 Gallery.prototype.getSelectedUrls = function() { 540 Gallery.prototype.getSelectedEntries = function() {
539 return this.selectionModel_.selectedIndexes.map(function(index) { 541 return this.selectionModel_.selectedIndexes.map(function(index) {
540 return this.dataModel_.item(index).getUrl(); 542 return this.dataModel_.item(index).getEntry();
541 }.bind(this)); 543 }.bind(this));
542 }; 544 };
543 545
544 /** 546 /**
545 * @return {Gallery.Item} Current single selection. 547 * @return {Gallery.Item} Current single selection.
546 */ 548 */
547 Gallery.prototype.getSingleSelectedItem = function() { 549 Gallery.prototype.getSingleSelectedItem = function() {
548 var items = this.getSelectedItems(); 550 var items = this.getSelectedItems();
549 if (items.length > 1) 551 if (items.length > 1)
550 throw new Error('Unexpected multiple selection'); 552 throw new Error('Unexpected multiple selection');
(...skipping 17 matching lines...) Expand all
568 this.selectionModel_.adjustLength(this.dataModel_.length); 570 this.selectionModel_.adjustLength(this.dataModel_.length);
569 }; 571 };
570 572
571 /** 573 /**
572 * Content change event handler. 574 * Content change event handler.
573 * @param {Event} event Event. 575 * @param {Event} event Event.
574 * @private 576 * @private
575 */ 577 */
576 Gallery.prototype.onContentChange_ = function(event) { 578 Gallery.prototype.onContentChange_ = function(event) {
577 var index = this.dataModel_.indexOf(event.item); 579 var index = this.dataModel_.indexOf(event.item);
578 if (index != this.selectionModel_.selectedIndex) 580 if (index !== this.selectionModel_.selectedIndex)
579 console.error('Content changed for unselected item'); 581 console.error('Content changed for unselected item');
580 this.updateSelectionAndState_(); 582 this.updateSelectionAndState_();
581 }; 583 };
582 584
583 /** 585 /**
584 * Keydown handler. 586 * Keydown handler.
585 * 587 *
586 * @param {Event} event Event. 588 * @param {Event} event Event.
587 * @private 589 * @private
588 */ 590 */
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 /** 627 /**
626 * Update the UI related to the selected item and the persistent state. 628 * Update the UI related to the selected item and the persistent state.
627 * 629 *
628 * @private 630 * @private
629 */ 631 */
630 Gallery.prototype.updateSelectionAndState_ = function() { 632 Gallery.prototype.updateSelectionAndState_ = function() {
631 var path; 633 var path;
632 var displayName = ''; 634 var displayName = '';
633 635
634 var selectedItems = this.getSelectedItems(); 636 var selectedItems = this.getSelectedItems();
635 if (selectedItems.length == 1) { 637 if (selectedItems.length === 1) {
636 var item = selectedItems[0]; 638 var item = selectedItems[0];
637 path = util.extractFilePath(item.getUrl()); 639 var entry = item.getEntry();
638 var fullName = item.getFileName(); 640 window.top.document.title = entry.name;
639 window.top.document.title = fullName; 641 displayName = ImageUtil.getDisplayNameFromName(entry.name);
640 displayName = ImageUtil.getFileNameFromFullName(fullName);
641 } else if (selectedItems.length > 1 && this.context_.curDirEntry) { 642 } else if (selectedItems.length > 1 && this.context_.curDirEntry) {
642 // If the Gallery was opened on search results the search query will not be 643 // If the Gallery was opened on search results the search query will not be
643 // recorded in the app state and the relaunch will just open the gallery 644 // recorded in the app state and the relaunch will just open the gallery
644 // in the curDirEntry directory. 645 // in the curDirEntry directory.
645 path = this.context_.curDirEntry.fullPath; 646 path = this.context_.curDirEntry.fullPath;
646 window.top.document.title = this.context_.curDirEntry.name; 647 window.top.document.title = this.context_.curDirEntry.name;
647 displayName = 648 displayName =
648 this.displayStringFunction_('GALLERY_ITEMS_SELECTED', 649 this.displayStringFunction_('GALLERY_ITEMS_SELECTED',
649 selectedItems.length); 650 selectedItems.length);
650 } 651 }
651 652
652 window.top.util.updateAppState(path, 653 window.top.util.updateAppState(path,
653 {gallery: (this.currentMode_ == this.mosaicMode_ ? 'mosaic' : 'slide')}); 654 {gallery: (this.currentMode_ === this.mosaicMode_ ? 'mosaic' : 'slide')});
654 655
655 // We can't rename files in readonly directory. 656 // We can't rename files in readonly directory.
656 // We can only rename a single file. 657 // We can only rename a single file.
657 this.filenameEdit_.disabled = selectedItems.length != 1 || 658 this.filenameEdit_.disabled = selectedItems.length !== 1 ||
658 this.context_.readonlyDirName; 659 this.context_.readonlyDirName;
659 660
660 this.filenameEdit_.value = displayName; 661 this.filenameEdit_.value = displayName;
661 662
662 // Resolve real filesystem path of the current file. 663 // Resolve real filesystem path of the current file.
663 if (this.selectionModel_.selectedIndexes.length) { 664 if (this.selectionModel_.selectedIndexes.length) {
664 var selectedIndex = this.selectionModel_.selectedIndex; 665 var selectedIndex = this.selectionModel_.selectedIndex;
665 var selectedItem = 666 var selectedItem =
666 this.dataModel_.item(this.selectionModel_.selectedIndex); 667 this.dataModel_.item(this.selectionModel_.selectedIndex);
667 668 this.selectedEntry_ = selectedItem.getEntry();
668 this.selectedItemFilesystemPath_ = null;
669 webkitResolveLocalFileSystemURL(selectedItem.getUrl(),
670 function(entry) {
671 if (this.selectionModel_.selectedIndex != selectedIndex)
672 return;
673 this.selectedItemFilesystemPath_ = entry.fullPath;
674 }.bind(this));
675 } 669 }
676 }; 670 };
677 671
678 /** 672 /**
679 * Click event handler on filename edit box 673 * Click event handler on filename edit box
680 * @private 674 * @private
681 */ 675 */
682 Gallery.prototype.onFilenameFocus_ = function() { 676 Gallery.prototype.onFilenameFocus_ = function() {
683 ImageUtil.setAttribute(this.filenameSpacer_, 'renaming', true); 677 ImageUtil.setAttribute(this.filenameSpacer_, 'renaming', true);
684 this.filenameEdit_.originalValue = this.filenameEdit_.value; 678 this.filenameEdit_.originalValue = this.filenameEdit_.value;
685 setTimeout(this.filenameEdit_.select.bind(this.filenameEdit_), 0); 679 setTimeout(this.filenameEdit_.select.bind(this.filenameEdit_), 0);
686 this.onUserAction_(); 680 this.onUserAction_();
687 }; 681 };
688 682
689 /** 683 /**
690 * Blur event handler on filename edit box. 684 * Blur event handler on filename edit box.
691 * 685 *
692 * @param {Event} event Blur event. 686 * @param {Event} event Blur event.
693 * @return {boolean} if default action should be prevented. 687 * @return {boolean} if default action should be prevented.
694 * @private 688 * @private
695 */ 689 */
696 Gallery.prototype.onFilenameEditBlur_ = function(event) { 690 Gallery.prototype.onFilenameEditBlur_ = function(event) {
697 if (this.filenameEdit_.value && this.filenameEdit_.value[0] == '.') { 691 if (this.filenameEdit_.value && this.filenameEdit_.value[0] === '.') {
698 this.prompt_.show('GALLERY_FILE_HIDDEN_NAME', 5000); 692 this.prompt_.show('GALLERY_FILE_HIDDEN_NAME', 5000);
699 this.filenameEdit_.focus(); 693 this.filenameEdit_.focus();
700 event.stopPropagation(); 694 event.stopPropagation();
701 event.preventDefault(); 695 event.preventDefault();
702 return false; 696 return false;
703 } 697 }
704 698
705 var item = this.getSingleSelectedItem(); 699 var item = this.getSingleSelectedItem();
706 var oldUrl = item.getUrl(); 700 var oldEntry = item.getEntry();
707 701
708 var onFileExists = function() { 702 var onFileExists = function() {
709 this.prompt_.show('GALLERY_FILE_EXISTS', 3000); 703 this.prompt_.show('GALLERY_FILE_EXISTS', 3000);
710 this.filenameEdit_.value = name; 704 this.filenameEdit_.value = name;
711 this.filenameEdit_.focus(); 705 this.filenameEdit_.focus();
712 }.bind(this); 706 }.bind(this);
713 707
714 var onSuccess = function() { 708 var onSuccess = function() {
715 var e = new Event('content'); 709 var event = new Event('content');
716 e.item = item; 710 event.item = item;
717 e.oldUrl = oldUrl; 711 event.oldEntry = oldEntry;
718 e.metadata = null; // Metadata unchanged. 712 event.metadata = null; // Metadata unchanged.
719 this.dataModel_.dispatchEvent(e); 713 this.dataModel_.dispatchEvent(event);
720 }.bind(this); 714 }.bind(this);
721 715
722 if (this.filenameEdit_.value) { 716 if (this.filenameEdit_.value) {
723 this.getSingleSelectedItem().rename( 717 this.getSingleSelectedItem().rename(
724 this.filenameEdit_.value, onSuccess, onFileExists); 718 this.filenameEdit_.value, onSuccess, onFileExists);
725 } 719 }
726 720
727 ImageUtil.setAttribute(this.filenameSpacer_, 'renaming', false); 721 ImageUtil.setAttribute(this.filenameSpacer_, 'renaming', false);
728 this.onUserAction_(); 722 this.onUserAction_();
729 }; 723 };
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 if (!this.shareButton_.hasAttribute('disabled')) 784 if (!this.shareButton_.hasAttribute('disabled'))
791 this.shareMenu_.hidden = !this.shareMenu_.hidden; 785 this.shareMenu_.hidden = !this.shareMenu_.hidden;
792 this.inactivityWatcher_.check(); 786 this.inactivityWatcher_.check();
793 }; 787 };
794 788
795 /** 789 /**
796 * Updates available actions list based on the currently selected urls. 790 * Updates available actions list based on the currently selected urls.
797 * @private. 791 * @private.
798 */ 792 */
799 Gallery.prototype.updateShareMenu_ = function() { 793 Gallery.prototype.updateShareMenu_ = function() {
800 var urls = this.getSelectedUrls(); 794 var entries = this.getSelectedEntries();
801 795
802 function isShareAction(task) { 796 function isShareAction(task) {
803 var taskParts = task.taskId.split('|'); 797 var taskParts = task.taskId.split('|');
804 return taskParts[0] != chrome.runtime.id; 798 return taskParts[0] !== chrome.runtime.id;
805 } 799 }
806 800
807 var api = Gallery.getFileBrowserPrivate(); 801 var api = Gallery.getFileBrowserPrivate();
808 var mimeTypes = []; // TODO(kaznacheev) Collect mime types properly. 802 var mimeTypes = []; // TODO(kaznacheev) Collect mime types properly.
809 803
810 var createShareMenu = function(tasks) { 804 var createShareMenu = function(tasks) {
811 var wasHidden = this.shareMenu_.hidden; 805 var wasHidden = this.shareMenu_.hidden;
812 this.shareMenu_.hidden = true; 806 this.shareMenu_.hidden = true;
813 var items = this.shareMenu_.querySelectorAll('.item'); 807 var items = this.shareMenu_.querySelectorAll('.item');
814 for (var i = 0; i != items.length; i++) { 808 for (var i = 0; i !== items.length; i++) {
815 items[i].parentNode.removeChild(items[i]); 809 items[i].parentNode.removeChild(items[i]);
816 } 810 }
817 811
818 for (var t = 0; t != tasks.length; t++) { 812 for (var t = 0; t !== tasks.length; t++) {
819 var task = tasks[t]; 813 var task = tasks[t];
820 if (!isShareAction(task)) continue; 814 if (!isShareAction(task)) continue;
821 815
822 var item = util.createChild(this.shareMenu_, 'item'); 816 var item = util.createChild(this.shareMenu_, 'item');
823 item.textContent = task.title; 817 item.textContent = task.title;
824 item.style.backgroundImage = 'url(' + task.iconUrl + ')'; 818 item.style.backgroundImage = 'url(' + task.iconUrl + ')';
825 item.addEventListener('click', function(taskId) { 819 item.addEventListener('click', function(taskId) {
826 this.toggleShare_(); // Hide the menu. 820 this.toggleShare_(); // Hide the menu.
827 this.executeWhenReady(api.executeTask.bind(api, taskId, urls)); 821 this.executeWhenReady(api.executeTask.bind(api, taskId, entries));
828 }.bind(this, task.taskId)); 822 }.bind(this, task.taskId));
829 } 823 }
830 824
831 var empty = this.shareMenu_.querySelector('.item') == null; 825 var empty = this.shareMenu_.querySelector('.item') === null;
832 ImageUtil.setAttribute(this.shareButton_, 'disabled', empty); 826 ImageUtil.setAttribute(this.shareButton_, 'disabled', empty);
833 this.shareMenu_.hidden = wasHidden || empty; 827 this.shareMenu_.hidden = wasHidden || empty;
834 }.bind(this); 828 }.bind(this);
835 829
836 // Create or update the share menu with a list of sharing tasks and show 830 // Create or update the share menu with a list of sharing tasks and show
837 // or hide the share button. 831 // or hide the share button.
838 if (!urls.length) 832 // TODO(mtomasz): Pass Entries directly, instead of URLs.
833 if (!entries.length)
839 createShareMenu([]); // Empty list of tasks, since there is no selection. 834 createShareMenu([]); // Empty list of tasks, since there is no selection.
840 else 835 else
841 api.getFileTasks(urls, mimeTypes, createShareMenu); 836 api.getFileTasks(util.entriesToURLs(entries), mimeTypes, createShareMenu);
842 }; 837 };
843 838
844 /** 839 /**
845 * Updates thumbnails. 840 * Updates thumbnails.
846 * @private 841 * @private
847 */ 842 */
848 Gallery.prototype.updateThumbnails_ = function() { 843 Gallery.prototype.updateThumbnails_ = function() {
849 if (this.currentMode_ == this.slideMode_) 844 if (this.currentMode_ === this.slideMode_)
850 this.slideMode_.updateThumbnails(); 845 this.slideMode_.updateThumbnails();
851 846
852 if (this.mosaicMode_) { 847 if (this.mosaicMode_) {
853 var mosaic = this.mosaicMode_.getMosaic(); 848 var mosaic = this.mosaicMode_.getMosaic();
854 if (mosaic.isInitialized()) 849 if (mosaic.isInitialized())
855 mosaic.reload(); 850 mosaic.reload();
856 } 851 }
857 }; 852 };
858 853
859 /** 854 /**
860 * Updates buttons. 855 * Updates buttons.
861 * @private 856 * @private
862 */ 857 */
863 Gallery.prototype.updateButtons_ = function() { 858 Gallery.prototype.updateButtons_ = function() {
864 if (this.modeButton_) { 859 if (this.modeButton_) {
865 var oppositeMode = 860 var oppositeMode =
866 this.currentMode_ == this.slideMode_ ? this.mosaicMode_ : 861 this.currentMode_ === this.slideMode_ ? this.mosaicMode_ :
867 this.slideMode_; 862 this.slideMode_;
868 this.modeButton_.title = 863 this.modeButton_.title =
869 this.displayStringFunction_(oppositeMode.getTitle()); 864 this.displayStringFunction_(oppositeMode.getTitle());
870 } 865 }
871 }; 866 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698