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

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: . 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 981 matching lines...) Expand 10 before | Expand all | Expand 10 after
992 this.commands_[key].disabled = !this.canExecute_(key); 992 this.commands_[key].disabled = !this.canExecute_(key);
993 }; 993 };
994 994
995 /** 995 /**
996 * @param {string} commandId Command identifier. 996 * @param {string} commandId Command identifier.
997 * @return {boolean} True if the command can be executed for current 997 * @return {boolean} True if the command can be executed for current
998 * selection. 998 * selection.
999 */ 999 */
1000 FileManager.prototype.canExecute_ = function(commandId) { 1000 FileManager.prototype.canExecute_ = function(commandId) {
1001 var readonly = this.isOnReadonlyDirectory(); 1001 var readonly = this.isOnReadonlyDirectory();
1002 var shouldCreate = !util.isSpecialReadonlyDirectory(
1003 this.directoryModel_.getCurrentDirEntry().fullPath);
SeRya 2012/05/10 08:44:16 I think here should not be difference between loca
tbarzic 2012/05/10 23:28:02 Done.
1002 switch (commandId) { 1004 switch (commandId) {
1003 case 'copy': 1005 case 'copy':
1004 case 'cut': 1006 case 'cut':
1005 return this.document_.queryCommandEnabled(commandId); 1007 return this.document_.queryCommandEnabled(commandId);
1006 1008
1007 case 'paste': 1009 case 'paste':
1008 return !!this.fileTransferController_ && 1010 return !!this.fileTransferController_ &&
1009 this.fileTransferController_.queryPasteCommandEnabled(); 1011 this.fileTransferController_.queryPasteCommandEnabled() &&
1012 shouldCreate;
1010 1013
1011 case 'rename': 1014 case 'rename':
1012 return (// Initialized to the point where we have a current directory 1015 return (// Initialized to the point where we have a current directory
1013 !readonly && 1016 !readonly &&
1014 // Rename not in progress. 1017 // Rename not in progress.
1015 !this.isRenamingInProgress() && 1018 !this.isRenamingInProgress() &&
1016 // Only one file selected. 1019 // Only one file selected.
1017 this.selection && 1020 this.selection &&
1018 this.selection.totalCount == 1); 1021 this.selection.totalCount == 1);
1019 1022
1020 case 'delete': 1023 case 'delete':
1021 return (// Initialized to the point where we have a current directory 1024 return (// Initialized to the point where we have a current directory
1022 !readonly && 1025 !readonly &&
1023 // Rename not in progress. 1026 // Rename not in progress.
1024 !this.isRenamingInProgress() && 1027 !this.isRenamingInProgress() &&
1025 this.selection && 1028 this.selection &&
1026 this.selection.totalCount > 0); 1029 this.selection.totalCount > 0);
1027 1030
1028 case 'newfolder': 1031 case 'newfolder':
1029 return !readonly && 1032 return !readonly &&
1033 shouldCreate &&
1030 (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE || 1034 (this.dialogType_ == FileManager.DialogType.SELECT_SAVEAS_FILE ||
1031 this.dialogType_ == FileManager.DialogType.FULL_PAGE); 1035 this.dialogType_ == FileManager.DialogType.FULL_PAGE);
1032 1036
1033 case 'unmount': 1037 case 'unmount':
1034 return true; 1038 return true;
1035 1039
1036 case 'format': 1040 case 'format':
1037 var entry = this.directoryModel_.getCurrentRootDirEntry(); 1041 var entry = this.directoryModel_.getCurrentRootDirEntry();
1038 1042
1039 return entry && DirectoryModel.getRootType(entry.fullPath) == 1043 return entry && DirectoryModel.getRootType(entry.fullPath) ==
(...skipping 816 matching lines...) Expand 10 before | Expand all | Expand 10 after
1856 * Render filename label for grid and list view. 1860 * Render filename label for grid and list view.
1857 * @param {Entry} entry The Entry object to render. 1861 * @param {Entry} entry The Entry object to render.
1858 * @return {HTMLDivElement} The label. 1862 * @return {HTMLDivElement} The label.
1859 */ 1863 */
1860 FileManager.prototype.renderFileNameLabel_ = function(entry) { 1864 FileManager.prototype.renderFileNameLabel_ = function(entry) {
1861 // Filename need to be in a '.filename-label' container for correct 1865 // Filename need to be in a '.filename-label' container for correct
1862 // work of inplace renaming. 1866 // work of inplace renaming.
1863 var fileName = this.document_.createElement('div'); 1867 var fileName = this.document_.createElement('div');
1864 fileName.className = 'filename-label'; 1868 fileName.className = 'filename-label';
1865 1869
1870 var displayName =
1871 this.directoryModel_.getDisplayName(entry.fullPath, entry.name);
1872
1866 fileName.textContent = 1873 fileName.textContent =
1867 this.directoryModel_.getCurrentDirEntry().name == '' ? 1874 this.directoryModel_.getCurrentDirEntry().name == '' ?
1868 this.getRootLabel_(entry.name) : entry.name; 1875 this.getRootLabel_(displayName) : displayName;
1869 return fileName; 1876 return fileName;
1870 }; 1877 };
1871 1878
1872 /** 1879 /**
1873 * Render the Size column of the detail table. 1880 * Render the Size column of the detail table.
1874 * 1881 *
1875 * @param {Entry} entry The Entry object to render. 1882 * @param {Entry} entry The Entry object to render.
1876 * @param {string} columnId The id of the column to be rendered. 1883 * @param {string} columnId The id of the column to be rendered.
1877 * @param {cr.ui.Table} table The table doing the rendering. 1884 * @param {cr.ui.Table} table The table doing the rendering.
1878 */ 1885 */
(...skipping 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after
2887 var path = rootPathNames.join('/') + '/'; 2894 var path = rootPathNames.join('/') + '/';
2888 var doc = this.document_; 2895 var doc = this.document_;
2889 2896
2890 for (var i = 0; i < pathNames.length; i++) { 2897 for (var i = 0; i < pathNames.length; i++) {
2891 var pathName = pathNames[i]; 2898 var pathName = pathNames[i];
2892 path += pathName; 2899 path += pathName;
2893 2900
2894 var div = doc.createElement('div'); 2901 var div = doc.createElement('div');
2895 2902
2896 div.className = 'breadcrumb-path'; 2903 div.className = 'breadcrumb-path';
2897 div.textContent = i == 0 ? this.getRootLabel_(path) : pathName; 2904 // We normally shouldn't be updating breadcrumbs for gdata search paths
2905 // (we have to use getDisplayName for these paths), but we have to handle
2906 // the case when user explicitly navigates to
2907 // chrome://files/#/gdata/.search/foo.
2908 div.textContent = i == 0 ? this.getRootLabel_(path) :
2909 this.directoryModel_.getDisplayName(path,
2910 pathName);
2898 2911
2899 path = path + '/'; 2912 path = path + '/';
2900 div.path = path; 2913 div.path = path;
2901 2914
2902 bc.appendChild(div); 2915 bc.appendChild(div);
2903 2916
2904 if (i == pathNames.length - 1) { 2917 if (i == pathNames.length - 1 ||
2905 div.classList.add('breadcrumb-last'); 2918 path == util.GDATA_SEARCH_ROOT_PATH + '/') {
2919 div.classList.add('breadcrumb-non-clickable');
2906 } else { 2920 } else {
2907 div.addEventListener('click', this.onBreadcrumbClick_.bind(this)); 2921 div.addEventListener('click', this.onBreadcrumbClick_.bind(this));
2922 }
2908 2923
2924 if (i != pathNames.length - 1) {
2909 var spacer = doc.createElement('div'); 2925 var spacer = doc.createElement('div');
2910 spacer.className = 'separator'; 2926 spacer.className = 'separator';
2911 bc.appendChild(spacer); 2927 bc.appendChild(spacer);
2912 } 2928 }
2913 } 2929 }
2914 this.truncateBreadcrumbs_(); 2930 this.truncateBreadcrumbs_();
2915 }; 2931 };
2916 2932
2917 FileManager.prototype.isRenamingInProgress = function() { 2933 FileManager.prototype.isRenamingInProgress = function() {
2918 return !!this.renameInput_.currentEntry; 2934 return !!this.renameInput_.currentEntry;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
3055 FileManager.prototype.getCurrentDirectoryURL = function() { 3071 FileManager.prototype.getCurrentDirectoryURL = function() {
3056 return this.directoryModel_ && 3072 return this.directoryModel_ &&
3057 this.directoryModel_.getCurrentDirEntry().toURL(); 3073 this.directoryModel_.getCurrentDirEntry().toURL();
3058 }; 3074 };
3059 3075
3060 FileManager.prototype.deleteEntries = function(entries, force, opt_callback) { 3076 FileManager.prototype.deleteEntries = function(entries, force, opt_callback) {
3061 if (!force) { 3077 if (!force) {
3062 var self = this; 3078 var self = this;
3063 var msg; 3079 var msg;
3064 if (entries.length == 1) { 3080 if (entries.length == 1) {
3065 msg = strf('CONFIRM_DELETE_ONE', entries[0].name); 3081 var entryName = this.directoryModel_.getDisplayName(entries[0].fullPath,
3082 entries[0].name);
3083 msg = strf('CONFIRM_DELETE_ONE', entryName);
3066 } else { 3084 } else {
3067 msg = strf('CONFIRM_DELETE_SOME', entries.length); 3085 msg = strf('CONFIRM_DELETE_SOME', entries.length);
3068 } 3086 }
3069 3087
3070 this.confirm.show(msg, this.deleteEntries.bind( 3088 this.confirm.show(msg, this.deleteEntries.bind(
3071 this, entries, true, opt_callback)); 3089 this, entries, true, opt_callback));
3072 return; 3090 return;
3073 } 3091 }
3074 3092
3075 this.directoryModel_.deleteEntries(entries, opt_callback); 3093 this.directoryModel_.deleteEntries(entries, opt_callback);
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
3334 } 3352 }
3335 if (!this.okButton_.disabled) { 3353 if (!this.okButton_.disabled) {
3336 this.onOk_(); 3354 this.onOk_();
3337 return true; 3355 return true;
3338 } 3356 }
3339 return false; 3357 return false;
3340 }; 3358 };
3341 3359
3342 FileManager.prototype.onDirectoryAction = function(entry) { 3360 FileManager.prototype.onDirectoryAction = function(entry) {
3343 var deviceNumber = this.getDeviceNumber(entry); 3361 var deviceNumber = this.getDeviceNumber(entry);
3362 // TODO(tbarzic): Is this still used?
SeRya 2012/05/10 08:44:16 It's obsolete code. Please remove it.
tbarzic 2012/05/10 23:28:02 Yeah, I though so, but wanted to check before I re
3344 if (deviceNumber != undefined && 3363 if (deviceNumber != undefined &&
3345 this.mountPoints_[deviceNumber].mountCondition == 3364 this.mountPoints_[deviceNumber].mountCondition ==
3346 'unknown_filesystem') { 3365 'unknown_filesystem') {
3347 return this.showButter(str('UNKNOWN_FILESYSTEM_WARNING')); 3366 return this.showButter(str('UNKNOWN_FILESYSTEM_WARNING'));
3348 } else if (deviceNumber != undefined && 3367 } else if (deviceNumber != undefined &&
3349 this.mountPoints_[deviceNumber].mountCondition == 3368 this.mountPoints_[deviceNumber].mountCondition ==
3350 'unsupported_filesystem') { 3369 'unsupported_filesystem') {
3351 return this.showButter(str('UNSUPPORTED_FILESYSTEM_WARNING')); 3370 return this.showButter(str('UNSUPPORTED_FILESYSTEM_WARNING'));
3352 } else { 3371 } else {
3353 return this.directoryModel_.changeDirectory(entry.fullPath); 3372 if (!util.isGDataSearchPath(entry.fullPath))
3373 return this.directoryModel_.changeDirectory(entry.fullPath);
3374
3375 // If we are under gdata search path, the real entries file path may be
3376 // different from |entry.fullPath|.
3377 var self = this;
3378 chrome.fileBrowserPrivate.getPathForDriveSearchResult(entry.toURL(),
3379 function(path) {
3380 // |path| may be undefined if there was an error.
3381 var changeToPath = path || entry.fullPath;
3382 self.directoryModel_.changeDirectory(changeToPath);
3383 });
3354 } 3384 }
3355 }; 3385 };
3356 3386
3357 /** 3387 /**
3358 * Show or hide the "Low disk space" warning. 3388 * Show or hide the "Low disk space" warning.
3359 * @param {boolean} show True if the box need to be shown. 3389 * @param {boolean} show True if the box need to be shown.
3360 */ 3390 */
3361 FileManager.prototype.showLowDiskSpaceWarning_ = function(show) { 3391 FileManager.prototype.showLowDiskSpaceWarning_ = function(show) {
3362 var box = this.dialogDom_.querySelector('.downloads-warning'); 3392 var box = this.dialogDom_.querySelector('.downloads-warning');
3363 if (show) { 3393 if (show) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3395 /** 3425 /**
3396 * Update the tab title. 3426 * Update the tab title.
3397 */ 3427 */
3398 FileManager.prototype.updateTitle_ = function() { 3428 FileManager.prototype.updateTitle_ = function() {
3399 this.document_.title = this.getCurrentDirectory().substr(1).replace( 3429 this.document_.title = this.getCurrentDirectory().substr(1).replace(
3400 new RegExp('^' + DirectoryModel.GDATA_DIRECTORY), 3430 new RegExp('^' + DirectoryModel.GDATA_DIRECTORY),
3401 str('GDATA_PRODUCT_NAME')); 3431 str('GDATA_PRODUCT_NAME'));
3402 }, 3432 },
3403 3433
3404 /** 3434 /**
3435 * Updates search box value if needed when directory gets changed.
3436 * @param {Entry} oldDirEntry Dir entry from which directory was changed.
3437 * @param {Entry} newDirEntry Dir entry to which directory was changed.
3438 */
3439 FileManager.prototype.updateSearchBoxOnDirChange_ =
3440 function(oldDirEntry, newDirEntry) {
3441 if (this.directoryModel_.shouldClearSearch(oldDirEntry, newDirEntry))
SeRya 2012/05/10 08:44:16 I think the search box should be cleared unconditi
tbarzic 2012/05/10 23:28:02 Yeah, I found that a bit strange too, but had deci
3442 this.dialogDom_.querySelector('#search-box').value = '';
3443 },
3444
3445 /**
3405 * Update the UI when the current directory changes. 3446 * Update the UI when the current directory changes.
3406 * 3447 *
3407 * @param {cr.Event} event The directory-changed event. 3448 * @param {cr.Event} event The directory-changed event.
3408 */ 3449 */
3409 FileManager.prototype.onDirectoryChanged_ = function(event) { 3450 FileManager.prototype.onDirectoryChanged_ = function(event) {
3410 this.updateCommonActionButtons_(); 3451 this.updateCommonActionButtons_();
3411 this.updateOkButton_(); 3452 this.updateOkButton_();
3412 this.updateBreadcrumbs_(); 3453 this.updateBreadcrumbs_();
3413 this.updateColumnModel_(); 3454 this.updateColumnModel_();
3455 this.updateSearchBoxOnDirChange_(event.previousDirEntry, event.newDirEntry);
3414 3456
3415 // Sometimes we rescan the same directory (when mounting GData lazily first, 3457 // Sometimes we rescan the same directory (when mounting GData lazily first,
3416 // then for real). Do not update the location then. 3458 // then for real). Do not update the location then.
3417 if (event.newDirEntry.fullPath != event.previousDirEntry.fullPath) { 3459 if (event.newDirEntry.fullPath != event.previousDirEntry.fullPath) {
3418 this.updateLocation_(event.initial, event.newDirEntry.fullPath); 3460 this.updateLocation_(event.initial, event.newDirEntry.fullPath);
3419 } 3461 }
3420 3462
3421 this.checkFreeSpace_(this.getCurrentDirectory()); 3463 this.checkFreeSpace_(this.getCurrentDirectory());
3422 3464
3423 this.updateTitle_(); 3465 this.updateTitle_();
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
3589 input.validation_ = false; 3631 input.validation_ = false;
3590 // Alert dialog restores focus unless the item removed from DOM. 3632 // Alert dialog restores focus unless the item removed from DOM.
3591 if (this.document_.activeElement != input) 3633 if (this.document_.activeElement != input)
3592 this.cancelRename_(); 3634 this.cancelRename_();
3593 } 3635 }
3594 3636
3595 if (!this.validateFileName_(newName, validationDone.bind(this))) 3637 if (!this.validateFileName_(newName, validationDone.bind(this)))
3596 return; 3638 return;
3597 3639
3598 function onError(err) { 3640 function onError(err) {
3599 nameNode.textContent = entry.name; 3641 var entryName =
3600 this.alert.show(strf('ERROR_RENAMING', entry.name, 3642 this.directoryModel_.getDisplayName(entry.fullPath, entry.name);
3643 nameNode.textContent = entryName;
3644 this.alert.show(strf('ERROR_RENAMING', entryName,
3601 getFileErrorString(err.code))); 3645 getFileErrorString(err.code)));
3602 } 3646 }
3603 3647
3604 this.cancelRename_(); 3648 this.cancelRename_();
3605 // Optimistically apply new name immediately to avoid flickering in 3649 // Optimistically apply new name immediately to avoid flickering in
3606 // case of success. 3650 // case of success.
3607 nameNode.textContent = newName; 3651 nameNode.textContent = newName;
3608 3652
3609 this.directoryModel_.doesExist(newName, function(exists, isFile) { 3653 this.directoryModel_.doesExist(entry, newName, function(exists, isFile) {
3610 if (!exists) { 3654 if (!exists) {
3611 this.directoryModel_.renameEntry(entry, newName, onError.bind(this)); 3655 this.directoryModel_.renameEntry(entry, newName, onError.bind(this));
3612 } else { 3656 } else {
3613 nameNode.textContent = entry.name; 3657 nameNode.textContent =
3658 this.directoryModel_.getDisplayName(entry.fullPath, entry.name);
3614 var message = isFile ? 'FILE_ALREADY_EXISTS' : 3659 var message = isFile ? 'FILE_ALREADY_EXISTS' :
3615 'DIRECTORY_ALREADY_EXISTS'; 3660 'DIRECTORY_ALREADY_EXISTS';
3616 this.alert.show(strf(message, newName)); 3661 this.alert.show(strf(message, newName));
3617 } 3662 }
3618 }.bind(this)); 3663 }.bind(this));
3619 }; 3664 };
3620 3665
3621 FileManager.prototype.cancelRename_ = function() { 3666 FileManager.prototype.cancelRename_ = function() {
3622 this.renameInput_.currentEntry = null; 3667 this.renameInput_.currentEntry = null;
3623 3668
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after
4289 4334
4290 if (oldValue) { 4335 if (oldValue) {
4291 event.target.removeAttribute('checked'); 4336 event.target.removeAttribute('checked');
4292 } else { 4337 } else {
4293 event.target.setAttribute('checked', 'checked'); 4338 event.target.setAttribute('checked', 'checked');
4294 } 4339 }
4295 }; 4340 };
4296 4341
4297 FileManager.prototype.onSearchBoxUpdate_ = function(event) { 4342 FileManager.prototype.onSearchBoxUpdate_ = function(event) {
4298 var searchString = this.dialogDom_.querySelector('#search-box').value; 4343 var searchString = this.dialogDom_.querySelector('#search-box').value;
4299 if (searchString) { 4344 this.directoryModel_.search(searchString);
4300 this.directoryModel_.addFilter(
4301 'searchbox',
4302 function(e) {
4303 return e.name.substr(0, searchString.length) == searchString;
4304 });
4305 } else {
4306 this.directoryModel_.removeFilter('searchbox');
4307 }
4308 }; 4345 };
4309 4346
4310 FileManager.prototype.decorateSplitter = function(splitterElement) { 4347 FileManager.prototype.decorateSplitter = function(splitterElement) {
4311 var self = this; 4348 var self = this;
4312 4349
4313 var Splitter = cr.ui.Splitter; 4350 var Splitter = cr.ui.Splitter;
4314 4351
4315 var customSplitter = cr.ui.define('div'); 4352 var customSplitter = cr.ui.define('div');
4316 4353
4317 customSplitter.prototype = { 4354 customSplitter.prototype = {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
4431 4468
4432 this.directoryModel_.addEventListener('scan-completed', maybeShowBanner); 4469 this.directoryModel_.addEventListener('scan-completed', maybeShowBanner);
4433 this.directoryModel_.addEventListener('rescan-completed', maybeShowBanner); 4470 this.directoryModel_.addEventListener('rescan-completed', maybeShowBanner);
4434 4471
4435 var style = this.document_.createElement('link'); 4472 var style = this.document_.createElement('link');
4436 style.rel = 'stylesheet'; 4473 style.rel = 'stylesheet';
4437 style.href = 'css/gdrive_welcome.css'; 4474 style.href = 'css/gdrive_welcome.css';
4438 this.document_.head.appendChild(style); 4475 this.document_.head.appendChild(style);
4439 }; 4476 };
4440 })(); 4477 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698