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

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

Issue 10342010: Add gdata content search to file_manager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix indent Created 8 years, 7 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 /** 5 /**
6 * FileManager constructor. 6 * FileManager constructor.
7 * 7 *
8 * FileManager objects encapsulate the functionality of the file selector 8 * FileManager objects encapsulate the functionality of the file selector
9 * dialogs, as well as the full screen file manager application (though the 9 * dialogs, as well as the full screen file manager application (though the
10 * latter is not yet implemented). 10 * latter is not yet implemented).
(...skipping 1016 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 case 'delete': 1027 case 'delete':
1028 return (// Initialized to the point where we have a current directory 1028 return (// Initialized to the point where we have a current directory
1029 !readonly && 1029 !readonly &&
1030 // Rename not in progress. 1030 // Rename not in progress.
1031 !this.isRenamingInProgress() && 1031 !this.isRenamingInProgress() &&
1032 this.selection && 1032 this.selection &&
1033 this.selection.totalCount > 0); 1033 this.selection.totalCount > 0);
1034 1034
1035 case 'newfolder': 1035 case 'newfolder':
1036 return !readonly && 1036 return !readonly &&
1037 !this.directoryModel_.isSearching() &&
1037 (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE || 1038 (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE ||
1038 this.dialogType_ == FileManager.DialogType.FULL_PAGE); 1039 this.dialogType_ == FileManager.DialogType.FULL_PAGE);
1039 1040
1040 case 'unmount': 1041 case 'unmount':
1041 return true; 1042 return true;
1042 1043
1043 case 'format': 1044 case 'format':
1044 var entry = this.directoryModel_.getCurrentRootDirEntry(); 1045 var entry = this.directoryModel_.getCurrentRootDirEntry();
1045 1046
1046 return entry && DirectoryModel.getRootType(entry.fullPath) == 1047 return entry && DirectoryModel.getRootType(entry.fullPath) ==
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 } 1281 }
1281 } 1282 }
1282 }; 1283 };
1283 1284
1284 /** 1285 /**
1285 * Handler of file manager operations. Update directory model 1286 * Handler of file manager operations. Update directory model
1286 * to reflect operation result iimediatelly (not waiting directory 1287 * to reflect operation result iimediatelly (not waiting directory
1287 * update event). 1288 * update event).
1288 */ 1289 */
1289 FileManager.prototype.onCopyManagerOperationComplete_ = function(event) { 1290 FileManager.prototype.onCopyManagerOperationComplete_ = function(event) {
1290 var currentPath = this.directoryModel_.getCurrentDirEntry().fullPath; 1291 var currentPath =
1292 this.directoryModel_.getCurrentDirPath();
1293 if (this.isOnGData() && this.directoryModel_.isSearching())
1294 return;
1295
1291 function inCurrentDirectory(entry) { 1296 function inCurrentDirectory(entry) {
1292 var fullPath = entry.fullPath; 1297 var fullPath = entry.fullPath;
1293 var dirPath = fullPath.substr(0, fullPath.length - 1298 var dirPath = fullPath.substr(0, fullPath.length -
1294 entry.name.length - 1); 1299 entry.name.length - 1);
1295 return dirPath == currentPath; 1300 return dirPath == currentPath;
1296 } 1301 }
1297 for (var i = 0; i < event.affectedEntries.length; i++) { 1302 for (var i = 0; i < event.affectedEntries.length; i++) {
1298 entry = event.affectedEntries[i]; 1303 entry = event.affectedEntries[i];
1299 if (inCurrentDirectory(entry)) 1304 if (inCurrentDirectory(entry))
1300 this.directoryModel_.onEntryChanged(entry.name); 1305 this.directoryModel_.onEntryChanged(entry.name);
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1518 defaultTitle = str('SELECT_OPEN_FILE_TITLE'); 1523 defaultTitle = str('SELECT_OPEN_FILE_TITLE');
1519 break; 1524 break;
1520 1525
1521 case FileManager.DialogType.SELECT_OPEN_MULTI_FILE: 1526 case FileManager.DialogType.SELECT_OPEN_MULTI_FILE:
1522 defaultTitle = str('SELECT_OPEN_MULTI_FILE_TITLE'); 1527 defaultTitle = str('SELECT_OPEN_MULTI_FILE_TITLE');
1523 break; 1528 break;
1524 1529
1525 case FileManager.DialogType.SELECT_SAVEAS_FILE: 1530 case FileManager.DialogType.SELECT_SAVEAS_FILE:
1526 defaultTitle = str('SELECT_SAVEAS_FILE_TITLE'); 1531 defaultTitle = str('SELECT_SAVEAS_FILE_TITLE');
1527 okLabel = str('SAVE_LABEL'); 1532 okLabel = str('SAVE_LABEL');
1533 // We don't want search enabled in save as dialog.
1534 this.dialogDom_.querySelector('#search-box').style.display = 'none';
1528 break; 1535 break;
1529 1536
1530 case FileManager.DialogType.FULL_PAGE: 1537 case FileManager.DialogType.FULL_PAGE:
1531 break; 1538 break;
1532 1539
1533 default: 1540 default:
1534 throw new Error('Unknown dialog type: ' + this.dialogType_); 1541 throw new Error('Unknown dialog type: ' + this.dialogType_);
1535 } 1542 }
1536 1543
1537 this.okButton_.textContent = okLabel; 1544 this.okButton_.textContent = okLabel;
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
1863 * @param {Entry} entry The Entry object to render. 1870 * @param {Entry} entry The Entry object to render.
1864 * @return {HTMLDivElement} The label. 1871 * @return {HTMLDivElement} The label.
1865 */ 1872 */
1866 FileManager.prototype.renderFileNameLabel_ = function(entry) { 1873 FileManager.prototype.renderFileNameLabel_ = function(entry) {
1867 // Filename need to be in a '.filename-label' container for correct 1874 // Filename need to be in a '.filename-label' container for correct
1868 // work of inplace renaming. 1875 // work of inplace renaming.
1869 var fileName = this.document_.createElement('div'); 1876 var fileName = this.document_.createElement('div');
1870 fileName.className = 'filename-label'; 1877 fileName.className = 'filename-label';
1871 1878
1872 fileName.textContent = 1879 fileName.textContent =
1873 this.directoryModel_.getCurrentDirEntry().name == '' ? 1880 this.directoryModel_.getDisplayName(entry.fullPath, entry.name);
1874 this.getRootLabel_(entry.name) : entry.name; 1881
1875 return fileName; 1882 return fileName;
1876 }; 1883 };
1877 1884
1878 /** 1885 /**
1879 * Render the Size column of the detail table. 1886 * Render the Size column of the detail table.
1880 * 1887 *
1881 * @param {Entry} entry The Entry object to render. 1888 * @param {Entry} entry The Entry object to render.
1882 * @param {string} columnId The id of the column to be rendered. 1889 * @param {string} columnId The id of the column to be rendered.
1883 * @param {cr.ui.Table} table The table doing the rendering. 1890 * @param {cr.ui.Table} table The table doing the rendering.
1884 */ 1891 */
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
2697 this.setupCurrentDirectoryPostponed_(true /* cancel */); 2704 this.setupCurrentDirectoryPostponed_(true /* cancel */);
2698 // Change to unmounted GData root. 2705 // Change to unmounted GData root.
2699 changeDirectoryTo = '/' + DirectoryModel.GDATA_DIRECTORY; 2706 changeDirectoryTo = '/' + DirectoryModel.GDATA_DIRECTORY;
2700 } 2707 }
2701 } 2708 }
2702 } 2709 }
2703 2710
2704 chrome.fileBrowserPrivate.getMountPoints(function(mountPoints) { 2711 chrome.fileBrowserPrivate.getMountPoints(function(mountPoints) {
2705 this.setMountPoints_(mountPoints); 2712 this.setMountPoints_(mountPoints);
2706 2713
2707 if (event.eventType == 'mount') { 2714 if (event.eventType == 'mount' && event.mountType != 'gdata') {
2708 // Mount request finished - remove it. 2715 // Mount request finished - remove it.
2709 // Currently we only request mounts for archive files. 2716 // Currently we only request mounts for archive files.
2710 var index = this.mountRequests_.indexOf(event.sourcePath); 2717 var index = this.mountRequests_.indexOf(event.sourcePath);
2711 if (index != -1) { 2718 if (index != -1) {
2712 this.mountRequests_.splice(index, 1); 2719 this.mountRequests_.splice(index, 1);
2713 if (event.status == 'success') { 2720 if (event.status == 'success') {
2714 // Successful mount requested from this tab, go to the drive root. 2721 // Successful mount requested from this tab, go to the drive root.
2715 changeDirectoryTo = event.mountPath; 2722 changeDirectoryTo = event.mountPath;
2716 } else { 2723 } else {
2717 // Request initiated from this tab failed, report the error. 2724 // Request initiated from this tab failed, report the error.
2718 var fileName = event.sourcePath.split('/').pop(); 2725 var fileName = event.sourcePath.split('/').pop();
2719 this.alert.show( 2726 this.alert.show(
2720 strf('ARCHIVE_MOUNT_FAILED', fileName, event.status)); 2727 strf('ARCHIVE_MOUNT_FAILED', fileName, event.status));
2721 } 2728 }
2722 } 2729 }
2723 } 2730 }
2724 2731
2725 if (event.eventType == 'unmount') { 2732 if (event.eventType == 'unmount' && event.mountType != 'gdata') {
2726 // Unmount request finished - remove it. 2733 // Unmount request finished - remove it.
2727 var index = this.unmountRequests_.indexOf(event.mountPath); 2734 var index = this.unmountRequests_.indexOf(event.mountPath);
2728 if (index != -1) { 2735 if (index != -1) {
2729 this.unmountRequests_.splice(index, 1); 2736 this.unmountRequests_.splice(index, 1);
2730 if (event.status != 'success') 2737 if (event.status != 'success')
2731 this.alert.show(strf('UNMOUNT_FAILED', event.status)); 2738 this.alert.show(strf('UNMOUNT_FAILED', event.status));
2732 } 2739 }
2733 2740
2734 if (event.status == 'success' && 2741 if (event.status == 'success' &&
2735 event.mountPath == this.directoryModel_.getCurrentRootPath()) { 2742 event.mountPath == this.directoryModel_.getCurrentRootPath()) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2855 if (task.taskId != this.getExtensionId_() + '|gallery') { 2862 if (task.taskId != this.getExtensionId_() + '|gallery') {
2856 // Add callback, so gallery can execute the task. 2863 // Add callback, so gallery can execute the task.
2857 task.execute = this.dispatchFileTask_.bind(this, task.taskId); 2864 task.execute = this.dispatchFileTask_.bind(this, task.taskId);
2858 shareActions.push(task); 2865 shareActions.push(task);
2859 } 2866 }
2860 } 2867 }
2861 callback(shareActions); 2868 callback(shareActions);
2862 }.bind(this)); 2869 }.bind(this));
2863 }; 2870 };
2864 2871
2872 /**
2873 * Does preprocessing of url list to open before calling |doOpenGallery_|.
2874 *
2875 * @param {Array.<string>} urls List of urls to open in the gallery.
2876 */
2865 FileManager.prototype.openGallery_ = function(urls) { 2877 FileManager.prototype.openGallery_ = function(urls) {
2866 var self = this;
2867
2868 var galleryFrame = this.document_.createElement('iframe');
2869 galleryFrame.className = 'overlay-pane';
2870 galleryFrame.scrolling = 'no';
2871 galleryFrame.setAttribute('webkitallowfullscreen', true);
2872
2873 var singleSelection = urls.length == 1; 2878 var singleSelection = urls.length == 1;
2874 var selectedUrl; 2879 var selectedUrl;
2875 if (singleSelection && FileType.isImage(urls[0])) { 2880 if (singleSelection && FileType.isImage(urls[0])) {
2876 // Single image item selected. Pass to the Gallery as a selected. 2881 // Single image item selected. Pass to the Gallery as a selected.
2877 selectedUrl = urls[0]; 2882 selectedUrl = urls[0];
2878 // Pass along every image and video in the directory so that it shows up 2883 // Pass along every image and video in the directory so that it shows up
2879 // in the ribbon. 2884 // in the ribbon.
2880 // We do not do that if a single video is selected because the UI is 2885 // We do not do that if a single video is selected because the UI is
2881 // cleaner without the ribbon. 2886 // cleaner without the ribbon.
2882 urls = this.getAllUrlsInCurrentDirectory_().filter( 2887 urls = this.getAllUrlsInCurrentDirectory_().filter(
2883 FileType.isImageOrVideo); 2888 FileType.isImageOrVideo);
2884 } else { 2889 } else {
2885 // Pass just the selected items, select the first entry. 2890 // Pass just the selected items, select the first entry.
2886 selectedUrl = urls[0]; 2891 selectedUrl = urls[0];
2887 } 2892 }
2888 2893
2894 // TODO(tbarzic): There's probably a better way to do this.
2895 if (this.directoryModel_.isOnGDataSearchDir()) {
2896 var self = this;
2897 var gdataRootUrl = this.directoryModel_.getCurrentRootDirEntry().toURL();
2898 util.resolveGDataSearchUrls([selectedUrl], gdataRootUrl,
2899 function(resolved) {
2900 util.resolveGDataSearchUrls(urls, gdataRootUrl,
2901 self.doOpenGallery_.bind(self, singleSelection, resolved[0]));
2902 });
2903 return;
2904 }
2905 this.doOpenGallery_(singleSelection, selectedUrl, urls);
2906 };
2907
2908 /**
2909 * Opens provided urls in the gallery.
2910 *
2911 * @param {string} selectedUrl Url of the item that should initially be
2912 * selected.
2913 * @param {Array.<string>} urls List of all the urls that will be shown in
2914 * the gallery.
2915 */
2916 FileManager.prototype.doOpenGallery_ = function(singleSelection,
2917 selectedUrl,
2918 urls) {
2919 var self = this;
2920
2921 var galleryFrame = this.document_.createElement('iframe');
2922 galleryFrame.className = 'overlay-pane';
2923 galleryFrame.scrolling = 'no';
2924 galleryFrame.setAttribute('webkitallowfullscreen', true);
2925
2889 var dirPath = this.directoryModel_.getCurrentDirEntry().fullPath; 2926 var dirPath = this.directoryModel_.getCurrentDirEntry().fullPath;
2890
2891 // Push a temporary state which will be replaced every time an individual 2927 // Push a temporary state which will be replaced every time an individual
2892 // item is selected in the Gallery. 2928 // item is selected in the Gallery.
2893 this.updateLocation_(false /*push*/, dirPath); 2929 this.updateLocation_(false /*push*/, dirPath);
2894 2930
2895 galleryFrame.onload = function() { 2931 galleryFrame.onload = function() {
2896 galleryFrame.contentWindow.ImageUtil.metrics = metrics; 2932 galleryFrame.contentWindow.ImageUtil.metrics = metrics;
2897 galleryFrame.contentWindow.FileType = FileType; 2933 galleryFrame.contentWindow.FileType = FileType;
2898 galleryFrame.contentWindow.util = util; 2934 galleryFrame.contentWindow.util = util;
2899 2935
2900 // Gallery shoud treat GData folder as readonly even when online 2936 // Gallery shoud treat GData folder as readonly even when online
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2968 3004
2969 path = path + '/'; 3005 path = path + '/';
2970 div.path = path; 3006 div.path = path;
2971 3007
2972 bc.appendChild(div); 3008 bc.appendChild(div);
2973 3009
2974 if (i == pathNames.length - 1) { 3010 if (i == pathNames.length - 1) {
2975 div.classList.add('breadcrumb-last'); 3011 div.classList.add('breadcrumb-last');
2976 } else { 3012 } else {
2977 div.addEventListener('click', this.onBreadcrumbClick_.bind(this)); 3013 div.addEventListener('click', this.onBreadcrumbClick_.bind(this));
2978
2979 var spacer = doc.createElement('div'); 3014 var spacer = doc.createElement('div');
2980 spacer.className = 'separator'; 3015 spacer.className = 'separator';
2981 bc.appendChild(spacer); 3016 bc.appendChild(spacer);
2982 } 3017 }
2983 } 3018 }
2984 this.truncateBreadcrumbs_(); 3019 this.truncateBreadcrumbs_();
2985 }; 3020 };
2986 3021
2987 FileManager.prototype.isRenamingInProgress = function() { 3022 FileManager.prototype.isRenamingInProgress = function() {
2988 return !!this.renameInput_.currentEntry; 3023 return !!this.renameInput_.currentEntry;
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
3119 }; 3154 };
3120 3155
3121 /** 3156 /**
3122 * Return URL of the current directory or null. 3157 * Return URL of the current directory or null.
3123 */ 3158 */
3124 FileManager.prototype.getCurrentDirectoryURL = function() { 3159 FileManager.prototype.getCurrentDirectoryURL = function() {
3125 return this.directoryModel_ && 3160 return this.directoryModel_ &&
3126 this.directoryModel_.getCurrentDirEntry().toURL(); 3161 this.directoryModel_.getCurrentDirEntry().toURL();
3127 }; 3162 };
3128 3163
3164 /**
3165 * Return URL of the search directory, current directory or null.
3166 */
3167 FileManager.prototype.getSearchOrCurrentDirectoryURL = function() {
3168 return this.directoryModel_ &&
3169 this.directoryModel_.getSearchOrCurrentDirEntry().toURL();
3170 };
3171
3129 FileManager.prototype.deleteEntries = function(entries, force, opt_callback) { 3172 FileManager.prototype.deleteEntries = function(entries, force, opt_callback) {
3130 if (!force) { 3173 if (!force) {
3131 var self = this; 3174 var self = this;
3132 var msg; 3175 var msg;
3133 if (entries.length == 1) { 3176 if (entries.length == 1) {
3134 msg = strf('CONFIRM_DELETE_ONE', entries[0].name); 3177 var entryName = this.directoryModel_.getDisplayName(entries[0].fullPath,
3178 entries[0].name);
3179 msg = strf('CONFIRM_DELETE_ONE', entryName);
3135 } else { 3180 } else {
3136 msg = strf('CONFIRM_DELETE_SOME', entries.length); 3181 msg = strf('CONFIRM_DELETE_SOME', entries.length);
3137 } 3182 }
3138 3183
3139 this.confirm.show(msg, this.deleteEntries.bind( 3184 this.confirm.show(msg, this.deleteEntries.bind(
3140 this, entries, true, opt_callback)); 3185 this, entries, true, opt_callback));
3141 return; 3186 return;
3142 } 3187 }
3143 3188
3144 this.directoryModel_.deleteEntries(entries, opt_callback); 3189 this.directoryModel_.deleteEntries(entries, opt_callback);
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
3401 this.dispatchDefaultTask_(); 3446 this.dispatchDefaultTask_();
3402 return true; 3447 return true;
3403 } 3448 }
3404 if (!this.okButton_.disabled) { 3449 if (!this.okButton_.disabled) {
3405 this.onOk_(); 3450 this.onOk_();
3406 return true; 3451 return true;
3407 } 3452 }
3408 return false; 3453 return false;
3409 }; 3454 };
3410 3455
3456 /**
3457 * Executes directory action (i.e. changes directory). If new directory is a
3458 * search result directory, we'll have to calculate its real path before we
3459 * actually do the operation.
3460 *
3461 * @param {DirectoryEntry} entry Directory entry to which directory should be
3462 * changed.
3463 */
3411 FileManager.prototype.onDirectoryAction = function(entry) { 3464 FileManager.prototype.onDirectoryAction = function(entry) {
3412 var deviceNumber = this.getDeviceNumber(entry); 3465 if (!DirectoryModel.isGDataSearchPath(entry.fullPath))
3413 if (deviceNumber != undefined &&
3414 this.mountPoints_[deviceNumber].mountCondition ==
3415 'unknown_filesystem') {
3416 return this.showButter(str('UNKNOWN_FILESYSTEM_WARNING'));
3417 } else if (deviceNumber != undefined &&
3418 this.mountPoints_[deviceNumber].mountCondition ==
3419 'unsupported_filesystem') {
3420 return this.showButter(str('UNSUPPORTED_FILESYSTEM_WARNING'));
3421 } else {
3422 return this.directoryModel_.changeDirectory(entry.fullPath); 3466 return this.directoryModel_.changeDirectory(entry.fullPath);
3423 } 3467
3468 // If we are under gdata search path, the real entries file path may be
3469 // different from |entry.fullPath|.
3470 var self = this;
3471 chrome.fileBrowserPrivate.getPathForDriveSearchResult(entry.toURL(),
3472 function(path) {
3473 // |path| may be undefined if there was an error. If that is the case,
3474 // change to the original file path.
3475 var changeToPath = path;
3476 self.directoryModel_.changeDirectory(changeToPath);
3477 });
3424 }; 3478 };
3425 3479
3426 /** 3480 /**
3427 * Show or hide the "Low disk space" warning. 3481 * Show or hide the "Low disk space" warning.
3428 * @param {boolean} show True if the box need to be shown. 3482 * @param {boolean} show True if the box need to be shown.
3429 */ 3483 */
3430 FileManager.prototype.showLowDiskSpaceWarning_ = function(show) { 3484 FileManager.prototype.showLowDiskSpaceWarning_ = function(show) {
3431 var box = this.dialogDom_.querySelector('.downloads-warning'); 3485 var box = this.dialogDom_.querySelector('.downloads-warning');
3432 if (show) { 3486 if (show) {
3433 var html = util.htmlUnescape(str('DOWNLOADS_DIRECTORY_WARNING')); 3487 var html = util.htmlUnescape(str('DOWNLOADS_DIRECTORY_WARNING'));
(...skipping 30 matching lines...) Expand all
3464 /** 3518 /**
3465 * Update the tab title. 3519 * Update the tab title.
3466 */ 3520 */
3467 FileManager.prototype.updateTitle_ = function() { 3521 FileManager.prototype.updateTitle_ = function() {
3468 this.document_.title = this.getCurrentDirectory().substr(1).replace( 3522 this.document_.title = this.getCurrentDirectory().substr(1).replace(
3469 new RegExp('^' + DirectoryModel.GDATA_DIRECTORY), 3523 new RegExp('^' + DirectoryModel.GDATA_DIRECTORY),
3470 str('GDATA_PRODUCT_NAME')); 3524 str('GDATA_PRODUCT_NAME'));
3471 }, 3525 },
3472 3526
3473 /** 3527 /**
3528 * Updates search box value when directory gets changed.
3529 */
3530 FileManager.prototype.updateSearchBoxOnDirChange_ = function() {
3531 var searchBox = this.dialogDom_.querySelector('#search-box');
3532 if (!searchBox.disabled)
3533 searchBox.value = '';
3534 },
3535
3536 /**
3474 * Update the UI when the current directory changes. 3537 * Update the UI when the current directory changes.
3475 * 3538 *
3476 * @param {cr.Event} event The directory-changed event. 3539 * @param {cr.Event} event The directory-changed event.
3477 */ 3540 */
3478 FileManager.prototype.onDirectoryChanged_ = function(event) { 3541 FileManager.prototype.onDirectoryChanged_ = function(event) {
3479 this.updateCommonActionButtons_(); 3542 this.updateCommonActionButtons_();
3480 this.updateOkButton_(); 3543 this.updateOkButton_();
3481 this.updateBreadcrumbs_(); 3544 this.updateBreadcrumbs_();
3482 this.updateColumnModel_(); 3545 this.updateColumnModel_();
3546 this.updateSearchBoxOnDirChange_();
3483 3547
3484 // Sometimes we rescan the same directory (when mounting GData lazily first, 3548 // Sometimes we rescan the same directory (when mounting GData lazily first,
3485 // then for real). Do not update the location then. 3549 // then for real). Do not update the location then.
3486 if (event.newDirEntry.fullPath != event.previousDirEntry.fullPath) { 3550 if (event.newDirEntry.fullPath != event.previousDirEntry.fullPath) {
3487 this.updateLocation_(event.initial, event.newDirEntry.fullPath); 3551 this.updateLocation_(event.initial, event.newDirEntry.fullPath);
3488 } 3552 }
3489 3553
3490 this.checkFreeSpace_(this.getCurrentDirectory()); 3554 this.checkFreeSpace_(this.getCurrentDirectory());
3491 3555
3492 this.updateTitle_(); 3556 this.updateTitle_();
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
3581 if (!result) { 3645 if (!result) {
3582 console.log('Failed to remove file watch'); 3646 console.log('Failed to remove file watch');
3583 } 3647 }
3584 }); 3648 });
3585 this.watchedDirectoryUrl_ = null; 3649 this.watchedDirectoryUrl_ = null;
3586 } 3650 }
3587 }; 3651 };
3588 3652
3589 FileManager.prototype.onFileChanged_ = function(event) { 3653 FileManager.prototype.onFileChanged_ = function(event) {
3590 // We receive a lot of events even in folders we are not interested in. 3654 // We receive a lot of events even in folders we are not interested in.
3591 if (encodeURI(event.fileUrl) == this.getCurrentDirectoryURL()) 3655 if (encodeURI(event.fileUrl) == this.getSearchOrCurrentDirectoryURL())
3592 this.directoryModel_.rescanLater(); 3656 this.directoryModel_.rescanLater();
3593 }; 3657 };
3594 3658
3595 FileManager.prototype.initiateRename_ = function() { 3659 FileManager.prototype.initiateRename_ = function() {
3596 var item = this.currentList_.ensureLeadItemExists(); 3660 var item = this.currentList_.ensureLeadItemExists();
3597 if (!item) 3661 if (!item)
3598 return; 3662 return;
3599 var label = item.querySelector('.filename-label'); 3663 var label = item.querySelector('.filename-label');
3600 var input = this.renameInput_; 3664 var input = this.renameInput_;
3601 3665
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3661 input.validation_ = false; 3725 input.validation_ = false;
3662 // Alert dialog restores focus unless the item removed from DOM. 3726 // Alert dialog restores focus unless the item removed from DOM.
3663 if (this.document_.activeElement != input) 3727 if (this.document_.activeElement != input)
3664 this.cancelRename_(); 3728 this.cancelRename_();
3665 } 3729 }
3666 3730
3667 if (!this.validateFileName_(newName, validationDone.bind(this))) 3731 if (!this.validateFileName_(newName, validationDone.bind(this)))
3668 return; 3732 return;
3669 3733
3670 function onError(err) { 3734 function onError(err) {
3671 nameNode.textContent = entry.name; 3735 var entryName =
3672 this.alert.show(strf('ERROR_RENAMING', entry.name, 3736 this.directoryModel_.getDisplayName(entry.fullPath, entry.name);
3737 nameNode.textContent = entryName;
3738 this.alert.show(strf('ERROR_RENAMING', entryName,
3673 getFileErrorString(err.code))); 3739 getFileErrorString(err.code)));
3674 } 3740 }
3675 3741
3676 this.cancelRename_(); 3742 this.cancelRename_();
3677 // Optimistically apply new name immediately to avoid flickering in 3743 // Optimistically apply new name immediately to avoid flickering in
3678 // case of success. 3744 // case of success.
3679 nameNode.textContent = newName; 3745 nameNode.textContent = newName;
3680 3746
3681 this.directoryModel_.doesExist(newName, function(exists, isFile) { 3747 this.directoryModel_.doesExist(entry, newName, function(exists, isFile) {
3682 if (!exists) { 3748 if (!exists) {
3683 this.directoryModel_.renameEntry(entry, newName, onError.bind(this)); 3749 this.directoryModel_.renameEntry(entry, newName, onError.bind(this));
3684 } else { 3750 } else {
3685 nameNode.textContent = entry.name; 3751 nameNode.textContent =
3752 this.directoryModel_.getDisplayName(entry.fullPath, entry.name);
3686 var message = isFile ? 'FILE_ALREADY_EXISTS' : 3753 var message = isFile ? 'FILE_ALREADY_EXISTS' :
3687 'DIRECTORY_ALREADY_EXISTS'; 3754 'DIRECTORY_ALREADY_EXISTS';
3688 this.alert.show(strf(message, newName)); 3755 this.alert.show(strf(message, newName));
3689 } 3756 }
3690 }.bind(this)); 3757 }.bind(this));
3691 }; 3758 };
3692 3759
3693 FileManager.prototype.cancelRename_ = function() { 3760 FileManager.prototype.cancelRename_ = function() {
3694 this.renameInput_.currentEntry = null; 3761 this.renameInput_.currentEntry = null;
3695 3762
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
4043 } 4110 }
4044 this.onUnload_(); 4111 this.onUnload_();
4045 window.close(); 4112 window.close();
4046 }; 4113 };
4047 4114
4048 /** 4115 /**
4049 * Tries to close this modal dialog with some files selected. 4116 * Tries to close this modal dialog with some files selected.
4050 * Performs preprocessing if needed (e.g. for GData). 4117 * Performs preprocessing if needed (e.g. for GData).
4051 * @param {Object} selection Contains urls, filterIndex and multiple fields. 4118 * @param {Object} selection Contains urls, filterIndex and multiple fields.
4052 */ 4119 */
4053 FileManager.prototype.selectFilesAndClose_ = function(selection) { 4120 FileManager.prototype.doSelectFilesAndClose_ = function(selection) {
4054 if (!this.isOnGData()) { 4121 if (!this.isOnGData()) {
4055 setTimeout(this.callSelectFilesApiAndClose_.bind(this, selection), 0); 4122 setTimeout(this.callSelectFilesApiAndClose_.bind(this, selection), 0);
4056 return; 4123 return;
4057 } 4124 }
4058 4125
4059 var shade = this.document_.createElement('div'); 4126 var shade = this.document_.createElement('div');
4060 shade.className = 'shade'; 4127 shade.className = 'shade';
4061 var footer = this.document_.querySelector('.dialog-footer'); 4128 var footer = this.document_.querySelector('.dialog-footer');
4062 var progress = footer.querySelector('.progress-track'); 4129 var progress = footer.querySelector('.progress-track');
4063 progress.style.width = '0%'; 4130 progress.style.width = '0%';
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
4145 } 4212 }
4146 } 4213 }
4147 this.resolveSelectResults_(selection.urls, onResolved); 4214 this.resolveSelectResults_(selection.urls, onResolved);
4148 }.bind(this); 4215 }.bind(this);
4149 4216
4150 setup(); 4217 setup();
4151 this.metadataCache_.get(selection.urls, 'gdata', onProperties); 4218 this.metadataCache_.get(selection.urls, 'gdata', onProperties);
4152 }; 4219 };
4153 4220
4154 /** 4221 /**
4222 * Does selection urls list preprocessing and calls |doSelectFilesAndClose_|.
4223 *
4224 * @param {Object} selection Contains urls, filterIndex and multiple fields.
4225 */
4226 FileManager.prototype.selectFilesAndClose_ = function(selection) {
4227 if (this.directoryModel_.isOnGDataSearchDir()) {
4228 var self = this;
4229 var gdataRootUrl = this.directoryModel_.getCurrentRootDirEntry().toURL();
4230 util.resolveGDataSearchUrls(selection.urls, gdataRootUrl,
4231 function(resolved) {
4232 selection.urls = resolved;
4233 self.doSelectFilesAndClose_(selection);
4234 });
4235 return;
4236 }
4237 this.doSelectFilesAndClose_(selection);
4238 };
4239
4240 /**
4155 * Handle a click of the ok button. 4241 * Handle a click of the ok button.
4156 * 4242 *
4157 * The ok button has different UI labels depending on the type of dialog, but 4243 * The ok button has different UI labels depending on the type of dialog, but
4158 * in code it's always referred to as 'ok'. 4244 * in code it's always referred to as 'ok'.
4159 * 4245 *
4160 * @param {Event} event The click event. 4246 * @param {Event} event The click event.
4161 */ 4247 */
4162 FileManager.prototype.onOk_ = function(event) { 4248 FileManager.prototype.onOk_ = function(event) {
4163 var currentDirUrl = this.getCurrentDirectoryURL(); 4249 var currentDirUrl = this.getSearchOrCurrentDirectoryURL();
4164 4250
4165 if (currentDirUrl.charAt(currentDirUrl.length - 1) != '/') 4251 if (currentDirUrl.charAt(currentDirUrl.length - 1) != '/')
4166 currentDirUrl += '/'; 4252 currentDirUrl += '/';
4167 4253
4168 var self = this; 4254 var self = this;
4169 if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) { 4255 if (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE) {
4170 // Save-as doesn't require a valid selection from the list, since 4256 // Save-as doesn't require a valid selection from the list, since
4171 // we're going to take the filename from the text input. 4257 // we're going to take the filename from the text input.
4172 var filename = this.filenameInput_.value; 4258 var filename = this.filenameInput_.value;
4173 if (!filename) 4259 if (!filename)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4215 throw new Error('Nothing selected!'); 4301 throw new Error('Nothing selected!');
4216 4302
4217 var dm = this.directoryModel_.getFileList(); 4303 var dm = this.directoryModel_.getFileList();
4218 for (var i = 0; i < selectedIndexes.length; i++) { 4304 for (var i = 0; i < selectedIndexes.length; i++) {
4219 var entry = dm.item(selectedIndexes[i]); 4305 var entry = dm.item(selectedIndexes[i]);
4220 if (!entry) { 4306 if (!entry) {
4221 console.log('Error locating selected file at index: ' + i); 4307 console.log('Error locating selected file at index: ' + i);
4222 continue; 4308 continue;
4223 } 4309 }
4224 4310
4225 files.push(currentDirUrl + encodeURIComponent(entry.name)); 4311 files.push(entry.toURL());
4226 } 4312 }
4227 4313
4228 // Multi-file selection has no other restrictions. 4314 // Multi-file selection has no other restrictions.
4229 if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE) { 4315 if (this.dialogType_ == FileManager.DialogType.SELECT_OPEN_MULTI_FILE) {
4230 var multipleSelection = { 4316 var multipleSelection = {
4231 urls: files, 4317 urls: files,
4232 multiple: true 4318 multiple: true
4233 }; 4319 };
4234 this.selectFilesAndClose_(multipleSelection); 4320 this.selectFilesAndClose_(multipleSelection);
4235 return; 4321 return;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
4360 else 4446 else
4361 event.target.removeAttribute('checked'); 4447 event.target.removeAttribute('checked');
4362 4448
4363 var changeInfo = {}; 4449 var changeInfo = {};
4364 changeInfo[pref] = inverted ? !newValue : newValue; 4450 changeInfo[pref] = inverted ? !newValue : newValue;
4365 chrome.fileBrowserPrivate.setGDataPreferences(changeInfo); 4451 chrome.fileBrowserPrivate.setGDataPreferences(changeInfo);
4366 }; 4452 };
4367 4453
4368 FileManager.prototype.onSearchBoxUpdate_ = function(event) { 4454 FileManager.prototype.onSearchBoxUpdate_ = function(event) {
4369 var searchString = this.document_.getElementById('search-box').value; 4455 var searchString = this.document_.getElementById('search-box').value;
4370 var searchStringLC = searchString.toLowerCase();
4371 var noResultsDiv = this.document_.getElementById('no-search-results'); 4456 var noResultsDiv = this.document_.getElementById('no-search-results');
4372 if (searchString) {
4373 this.directoryModel_.addFilter(
4374 'searchbox',
4375 function(e) {
4376 return e.name.toLowerCase().indexOf(searchStringLC) > -1;
4377 });
4378 4457
4379 this.reportEmptySearchResults_ = function() { 4458 function reportEmptySearchResults() {
4380 if (this.directoryModel_.getFileList().length === 0) { 4459 if (this.directoryModel_.getFileList().length === 0) {
4381 var text = strf('SEARCH_NO_MATCHING_FILES', searchString); 4460 var text = strf('SEARCH_NO_MATCHING_FILES', searchString);
4382 noResultsDiv.innerHTML = text; 4461 noResultsDiv.innerHTML = text;
4383 noResultsDiv.hidden = false; 4462 noResultsDiv.hidden = false;
4384 } 4463 } else {
4385 }.bind(this); 4464 noResultsDiv.hidden = true;
4465 }
4466 }
4386 4467
4387 this.directoryModel_.addEventListener( 4468 function hideNoResultsDiv() {
4388 'rescan-completed', this.reportEmptySearchResults_);
4389 } else {
4390 this.directoryModel_.removeFilter('searchbox');
4391 noResultsDiv.hidden = true; 4469 noResultsDiv.hidden = true;
4392 this.directoryModel_.removeEventListener(
4393 'rescan-completed', this.reportEmptySearchResults_);
4394 } 4470 }
4471
4472 this.directoryModel_.search(searchString,
4473 reportEmptySearchResults.bind(this),
4474 hideNoResultsDiv.bind(this));
4395 }; 4475 };
4396 4476
4397 FileManager.prototype.decorateSplitter = function(splitterElement) { 4477 FileManager.prototype.decorateSplitter = function(splitterElement) {
4398 var self = this; 4478 var self = this;
4399 4479
4400 var Splitter = cr.ui.Splitter; 4480 var Splitter = cr.ui.Splitter;
4401 4481
4402 var customSplitter = cr.ui.define('div'); 4482 var customSplitter = cr.ui.define('div');
4403 4483
4404 customSplitter.prototype = { 4484 customSplitter.prototype = {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
4546 4626
4547 function closeBanner() { 4627 function closeBanner() {
4548 self.cleanupGDataWelcome_(); 4628 self.cleanupGDataWelcome_();
4549 // Stop showing the welcome banner. 4629 // Stop showing the welcome banner.
4550 localStorage[WELCOME_HEADER_COUNTER_KEY] = WELCOME_HEADER_COUNTER_LIMIT; 4630 localStorage[WELCOME_HEADER_COUNTER_KEY] = WELCOME_HEADER_COUNTER_LIMIT;
4551 } 4631 }
4552 4632
4553 return maybeShowBanner; 4633 return maybeShowBanner;
4554 }; 4634 };
4555 })(); 4635 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698