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

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

Issue 8890017: Fixed renaming in the file manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixing renaming from menu. Created 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // Setting the src of an img to an empty string can crash the browser, so we 5 // Setting the src of an img to an empty string can crash the browser, so we
6 // use an empty 1x1 gif instead. 6 // use an empty 1x1 gif instead.
7 const EMPTY_IMAGE_URI = 'data:image/gif;base64,' 7 const EMPTY_IMAGE_URI = 'data:image/gif;base64,'
8 + 'R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw%3D%3D'; 8 + 'R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw%3D%3D';
9 9
10 // If directory files changes too often, don't rescan directory more than once 10 // If directory files changes too often, don't rescan directory more than once
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 'image': 'images/filetype_large_image.png', 192 'image': 'images/filetype_large_image.png',
193 'video': 'images/filetype_large_video.png' 193 'video': 'images/filetype_large_video.png'
194 }; 194 };
195 195
196 /** 196 /**
197 * Regexp for archive files. Used to show mount-archive task. 197 * Regexp for archive files. Used to show mount-archive task.
198 */ 198 */
199 const ARCHIVES_REGEXP = /.zip$/; 199 const ARCHIVES_REGEXP = /.zip$/;
200 200
201 /** 201 /**
202 * Item for the Grid View.
203 * @constructor
204 */
205 function GridItem(fileManager, entry) {
206 var li = fileManager.document_.createElement('li');
207 GridItem.decorate(li, fileManager, entry);
208 return li;
209 }
210
211 GridItem.prototype = {
212 __proto__: cr.ui.ListItem.prototype,
213
214 get label() {
215 return this.querySelector('filename-label').textContent;
216 },
217 set label(value) {
218 // Grid sets it to entry. Ignore.
219 }
220 };
221
222 GridItem.decorate = function(li, fileManager, entry) {
223 li.__proto__ = GridItem.prototype;
224 fileManager.decorateThumbnail_(li, entry);
225 };
226
227
228 /**
202 * Return a translated string. 229 * Return a translated string.
203 * 230 *
204 * Wrapper function to make dealing with translated strings more concise. 231 * Wrapper function to make dealing with translated strings more concise.
205 * Equivilant to localStrings.getString(id). 232 * Equivilant to localStrings.getString(id).
206 * 233 *
207 * @param {string} id The id of the string to return. 234 * @param {string} id The id of the string to return.
208 * @return {string} The translated string. 235 * @return {string} The translated string.
209 */ 236 */
210 function str(id) { 237 function str(id) {
211 return localStrings.getString(id); 238 return localStrings.getString(id);
(...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 FileManager.prototype.setListType = function(type) { 1127 FileManager.prototype.setListType = function(type) {
1101 if (type && type == this.listType_) 1128 if (type && type == this.listType_)
1102 return; 1129 return;
1103 1130
1104 if (type == FileManager.ListType.DETAIL) { 1131 if (type == FileManager.ListType.DETAIL) {
1105 var selectedIndexes = this.grid_.selectionModel.selectedIndexes; 1132 var selectedIndexes = this.grid_.selectionModel.selectedIndexes;
1106 this.table_.dataModel = this.dataModel_; 1133 this.table_.dataModel = this.dataModel_;
1107 this.table_.style.display = ''; 1134 this.table_.style.display = '';
1108 this.grid_.style.display = 'none'; 1135 this.grid_.style.display = 'none';
1109 this.grid_.dataModel = this.emptyDataModel_; 1136 this.grid_.dataModel = this.emptyDataModel_;
1110 this.currentList_ = this.table_; 1137 /** @type {cr.ui.List} */
1138 this.currentList_ = this.table_.list;
1111 this.dialogDom_.querySelector('button.detail-view').disabled = true; 1139 this.dialogDom_.querySelector('button.detail-view').disabled = true;
1112 this.dialogDom_.querySelector('button.thumbnail-view').disabled = false; 1140 this.dialogDom_.querySelector('button.thumbnail-view').disabled = false;
1113 this.table_.selectionModel.selectedIndexes = selectedIndexes; 1141 this.table_.selectionModel.selectedIndexes = selectedIndexes;
1114 } else if (type == FileManager.ListType.THUMBNAIL) { 1142 } else if (type == FileManager.ListType.THUMBNAIL) {
1115 var selectedIndexes = this.table_.selectionModel.selectedIndexes; 1143 var selectedIndexes = this.table_.selectionModel.selectedIndexes;
1116 this.grid_.dataModel = this.dataModel_; 1144 this.grid_.dataModel = this.dataModel_;
1117 this.grid_.style.display = ''; 1145 this.grid_.style.display = '';
1118 this.table_.style.display = 'none'; 1146 this.table_.style.display = 'none';
1119 this.table_.dataModel = this.emptyDataModel_; 1147 this.table_.dataModel = this.emptyDataModel_;
1148 /** @type {cr.ui.List} */
1120 this.currentList_ = this.grid_; 1149 this.currentList_ = this.grid_;
1121 this.dialogDom_.querySelector('button.thumbnail-view').disabled = true; 1150 this.dialogDom_.querySelector('button.thumbnail-view').disabled = true;
1122 this.dialogDom_.querySelector('button.detail-view').disabled = false; 1151 this.dialogDom_.querySelector('button.detail-view').disabled = false;
1123 this.grid_.selectionModel.selectedIndexes = selectedIndexes; 1152 this.grid_.selectionModel.selectedIndexes = selectedIndexes;
1124 } else { 1153 } else {
1125 throw new Error('Unknown list type: ' + type); 1154 throw new Error('Unknown list type: ' + type);
1126 } 1155 }
1127 1156
1128 this.listType_ = type; 1157 this.listType_ = type;
1129 this.onResize_(); 1158 this.onResize_();
1130 }; 1159 };
1131 1160
1132 /** 1161 /**
1133 * Initialize the file thumbnail grid. 1162 * Initialize the file thumbnail grid.
1134 */ 1163 */
1135 FileManager.prototype.initGrid_ = function() { 1164 FileManager.prototype.initGrid_ = function() {
1136 this.grid_ = this.dialogDom_.querySelector('.thumbnail-grid'); 1165 this.grid_ = this.dialogDom_.querySelector('.thumbnail-grid');
1137 cr.ui.Grid.decorate(this.grid_); 1166 cr.ui.Grid.decorate(this.grid_);
1138 1167
1139 var self = this; 1168 var self = this;
1140 this.grid_.itemConstructor = function(entry) { 1169 this.grid_.itemConstructor = GridItem.bind(null, this);
1141 return self.renderThumbnail_(entry);
1142 };
1143 1170
1144 this.grid_.selectionModel = new this.selectionModelClass_(); 1171 this.grid_.selectionModel = new this.selectionModelClass_();
1145 1172
1146 this.grid_.addEventListener( 1173 this.grid_.addEventListener(
1147 'dblclick', this.onDetailDoubleClick_.bind(this)); 1174 'dblclick', this.onDetailDoubleClick_.bind(this));
1148 this.grid_.selectionModel.addEventListener( 1175 this.grid_.selectionModel.addEventListener(
1149 'change', this.onSelectionChanged_.bind(this)); 1176 'change', this.onSelectionChanged_.bind(this));
1150 cr.ui.contextMenuHandler.addContextMenuProperty(this.grid_); 1177 cr.ui.contextMenuHandler.addContextMenuProperty(this.grid_);
1151 this.grid_.contextMenu = this.fileContextMenu_; 1178 this.grid_.contextMenu = this.fileContextMenu_;
1152 this.grid_.addEventListener('mousedown', 1179 this.grid_.addEventListener('mousedown',
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 1299
1273 case 'copy': 1300 case 'copy':
1274 this.copySelectionToClipboard(); 1301 this.copySelectionToClipboard();
1275 return; 1302 return;
1276 1303
1277 case 'paste': 1304 case 'paste':
1278 this.pasteFromClipboard(); 1305 this.pasteFromClipboard();
1279 return; 1306 return;
1280 1307
1281 case 'rename': 1308 case 'rename':
1282 var leadIndex = this.currentList_.selectionModel.leadIndex; 1309 var index = this.currentList_.selectionModel.selectedIndex;
1283 var li = this.currentList_.getListItemByIndex(leadIndex); 1310 var item = this.currentList_.getListItemByIndex(index);
1284 var label = li.querySelector('.filename-label'); 1311 if (item)
1285 if (!label) { 1312 this.initiateRename_(item);
1286 console.warn('Unable to find label for rename of index: ' +
1287 leadIndex);
1288 return;
1289 }
1290
1291 this.initiateRename_(label);
1292 return; 1313 return;
1293 1314
1294 case 'delete': 1315 case 'delete':
1295 this.deleteEntries(this.selection.entries); 1316 this.deleteEntries(this.selection.entries);
1296 return; 1317 return;
1297 } 1318 }
1298 }; 1319 };
1299 1320
1300 /** 1321 /**
1301 * Respond to the back and forward buttons. 1322 * Respond to the back and forward buttons.
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1656 if (opt_imageLoadCallback) 1677 if (opt_imageLoadCallback)
1657 opt_imageLoadCallback(img, transform); 1678 opt_imageLoadCallback(img, transform);
1658 box.appendChild(img); 1679 box.appendChild(img);
1659 }; 1680 };
1660 img.src = url; 1681 img.src = url;
1661 self.applyImageTransformation_(box, transform); 1682 self.applyImageTransformation_(box, transform);
1662 }); 1683 });
1663 return box; 1684 return box;
1664 }; 1685 };
1665 1686
1666 FileManager.prototype.renderThumbnail_ = function(entry) { 1687 FileManager.prototype.decorateThumbnail_ = function(li, entry) {
1667 var li = this.document_.createElement('li');
1668 li.className = 'thumbnail-item'; 1688 li.className = 'thumbnail-item';
1669 1689
1670 if (this.showCheckboxes_) 1690 if (this.showCheckboxes_)
1671 li.appendChild(this.renderCheckbox_(entry)); 1691 li.appendChild(this.renderCheckbox_(entry));
1672 1692
1673 li.appendChild(this.renderThumbnailBox_(entry, false)); 1693 li.appendChild(this.renderThumbnailBox_(entry, false));
1674 1694 li.appendChild(this.renderFileNameLabel_(entry));
1675 var div = this.document_.createElement('div');
1676 div.className = 'filename-label';
1677 var labelText = entry.name;
1678 if (this.currentDirEntry_.name == '')
1679 labelText = this.getLabelForRootPath_(labelText);
1680
1681 div.textContent = labelText;
1682 div.entry = entry;
1683
1684 li.appendChild(div);
1685
1686 cr.defineProperty(li, 'lead', cr.PropertyKind.BOOL_ATTR);
1687 cr.defineProperty(li, 'selected', cr.PropertyKind.BOOL_ATTR);
1688 return li;
1689 }; 1695 };
1690 1696
1691 /** 1697 /**
1692 * Render the type column of the detail table. 1698 * Render the type column of the detail table.
1693 * 1699 *
1694 * Invoked by cr.ui.Table when a file needs to be rendered. 1700 * Invoked by cr.ui.Table when a file needs to be rendered.
1695 * 1701 *
1696 * @param {Entry} entry The Entry object to render. 1702 * @param {Entry} entry The Entry object to render.
1697 * @param {string} columnId The id of the column to be rendered. 1703 * @param {string} columnId The id of the column to be rendered.
1698 * @param {cr.ui.Table} table The table doing the rendering. 1704 * @param {cr.ui.Table} table The table doing the rendering.
(...skipping 29 matching lines...) Expand all
1728 * @param {string} columnId The id of the column to be rendered. 1734 * @param {string} columnId The id of the column to be rendered.
1729 * @param {cr.ui.Table} table The table doing the rendering. 1735 * @param {cr.ui.Table} table The table doing the rendering.
1730 */ 1736 */
1731 FileManager.prototype.renderName_ = function(entry, columnId, table) { 1737 FileManager.prototype.renderName_ = function(entry, columnId, table) {
1732 var label = this.document_.createElement('div'); 1738 var label = this.document_.createElement('div');
1733 if (this.showCheckboxes_) 1739 if (this.showCheckboxes_)
1734 label.appendChild(this.renderCheckbox_(entry)); 1740 label.appendChild(this.renderCheckbox_(entry));
1735 label.appendChild(this.renderIconType_(entry, columnId, table)); 1741 label.appendChild(this.renderIconType_(entry, columnId, table));
1736 label.entry = entry; 1742 label.entry = entry;
1737 label.className = 'detail-name'; 1743 label.className = 'detail-name';
1738 if (this.currentDirEntry_.name == '') { 1744 label.appendChild(this.renderFileNameLabel_(entry));
1739 label.appendChild(this.document_.createTextNode(
1740 this.getLabelForRootPath_(entry.name)));
1741 } else {
1742 label.appendChild(this.document_.createTextNode(entry.name));
1743 }
1744 1745
1745 return label; 1746 return label;
1746 }; 1747 };
1747 1748
1748 /** 1749 /**
1750 * Render filename label for grid and list view.
1751 * @param {Entry} entry The Entry object to render.
1752 * @return {HTMLDivElement} The label.
1753 */
1754 FileManager.prototype.renderFileNameLabel_ = function(entry) {
1755 // Filename need to be in a '.filename-label' container for correct
1756 // work of inplace renaming.
1757 var fileName = this.document_.createElement('div');
1758 fileName.className = 'filename-label';
1759 fileName.textContent = this.currentDirEntry_.name == '' ?
1760 this.getLabelForRootPath_(entry.name) : entry.name;
1761 return fileName;
1762 };
1763
1764 /**
1749 * Render the Size column of the detail table. 1765 * Render the Size column of the detail table.
1750 * 1766 *
1751 * @param {Entry} entry The Entry object to render. 1767 * @param {Entry} entry The Entry object to render.
1752 * @param {string} columnId The id of the column to be rendered. 1768 * @param {string} columnId The id of the column to be rendered.
1753 * @param {cr.ui.Table} table The table doing the rendering. 1769 * @param {cr.ui.Table} table The table doing the rendering.
1754 */ 1770 */
1755 FileManager.prototype.renderSize_ = function(entry, columnId, table) { 1771 FileManager.prototype.renderSize_ = function(entry, columnId, table) {
1756 var div = this.document_.createElement('div'); 1772 var div = this.document_.createElement('div');
1757 1773
1758 div.textContent = '...'; 1774 div.textContent = '...';
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after
2504 FileManager.prototype.selectEntry = function(name) { 2520 FileManager.prototype.selectEntry = function(name) {
2505 for (var i = 0; i < this.dataModel_.length; i++) { 2521 for (var i = 0; i < this.dataModel_.length; i++) {
2506 if (this.dataModel_.item(i).name == name) { 2522 if (this.dataModel_.item(i).name == name) {
2507 this.selectIndex(i); 2523 this.selectIndex(i);
2508 return; 2524 return;
2509 } 2525 }
2510 } 2526 }
2511 }; 2527 };
2512 2528
2513 FileManager.prototype.selectIndex = function(index) { 2529 FileManager.prototype.selectIndex = function(index) {
2514 this.currentList_.focus(); 2530 this.focusCurrentList_();
2515 if (index >= this.dataModel_.length) 2531 if (index >= this.dataModel_.length)
2516 return; 2532 return;
2517 this.currentList_.selectionModel.selectedIndex = index; 2533 this.currentList_.selectionModel.selectedIndex = index;
2518 this.currentList_.scrollIndexIntoView(index); 2534 this.currentList_.scrollIndexIntoView(index);
2519 }; 2535 };
2520 2536
2521 /** 2537 /**
2522 * Add the file/directory with given name to the current selection. 2538 * Add the file/directory with given name to the current selection.
2523 * 2539 *
2524 * @param {string} name The name of the entry to select. 2540 * @param {string} name The name of the entry to select.
2525 * @return {boolean} Whether entry exists. 2541 * @return {boolean} Whether entry exists.
2526 */ 2542 */
2527 FileManager.prototype.addItemToSelection = function(name) { 2543 FileManager.prototype.addItemToSelection = function(name) {
2528 var entryExists = false; 2544 var entryExists = false;
2529 for (var i = 0; i < this.dataModel_.length; i++) { 2545 for (var i = 0; i < this.dataModel_.length; i++) {
2530 if (this.dataModel_.item(i).name == name) { 2546 if (this.dataModel_.item(i).name == name) {
2531 this.currentList_.selectionModel.setIndexSelected(i, true); 2547 this.currentList_.selectionModel.setIndexSelected(i, true);
2532 this.currentList_.scrollIndexIntoView(i); 2548 this.currentList_.scrollIndexIntoView(i);
2533 this.currentList_.focus(); 2549 this.focusCurrentList_();
2534 entryExists = true; 2550 entryExists = true;
2535 break; 2551 break;
2536 } 2552 }
2537 } 2553 }
2538 return entryExists; 2554 return entryExists;
2539 } 2555 };
2556
2557 FileManager.prototype.focusCurrentList_ = function() {
2558 if (this.listType_ == FileManager.ListType.DETAIL)
2559 this.table_.focus();
2560 else // this.listType_ == FileManager.ListType.THUMBNAIL)
2561 this.grid_.focus();
2562 };
2540 2563
2541 /** 2564 /**
2542 * Return the name of the entries in the current directory 2565 * Return the name of the entries in the current directory
2543 * 2566 *
2544 * @return {object} Array of entry names. 2567 * @return {object} Array of entry names.
2545 */ 2568 */
2546 FileManager.prototype.listDirectory = function() { 2569 FileManager.prototype.listDirectory = function() {
2547 var list = [] 2570 var list = []
2548 for (var i = 0; i < this.dataModel_.length; i++) { 2571 for (var i = 0; i < this.dataModel_.length; i++) {
2549 list.push(this.dataModel_.item(i).name); 2572 list.push(this.dataModel_.item(i).name);
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
3243 FileManager.prototype.prefetchCacheForSorting_ = function(entries, callback) { 3266 FileManager.prototype.prefetchCacheForSorting_ = function(entries, callback) {
3244 var field = this.dataModel_.sortStatus.field; 3267 var field = this.dataModel_.sortStatus.field;
3245 if (field) { 3268 if (field) {
3246 this.prepareSortEntries_(entries, field, callback); 3269 this.prepareSortEntries_(entries, field, callback);
3247 } else { 3270 } else {
3248 callback(); 3271 callback();
3249 return; 3272 return;
3250 } 3273 }
3251 }; 3274 };
3252 3275
3253 FileManager.prototype.findListItem_ = function(event) { 3276 FileManager.prototype.findListItemForEvent_ = function(event) {
3254 var node = event.srcElement; 3277 var node = event.srcElement;
3278 var list = this.currentList_;
3279 // Assume list items are direct children of the list.
3280 if (node == list)
3281 return null;
3255 while (node) { 3282 while (node) {
3256 if (node.tagName == 'LI') 3283 var parent = node.parentNode;
3257 break; 3284 if (parent == list && node instanceof cr.ui.ListItem)
3258 node = node.parentNode; 3285 return node;
3286 node = parent;
3259 } 3287 }
3260 3288 return null;
3261 return node;
3262 }; 3289 };
3263 3290
3264 FileManager.prototype.onGridMouseDown_ = function(event) { 3291 FileManager.prototype.onGridMouseDown_ = function(event) {
3265 this.updateCommands_(); 3292 this.updateCommands_();
3266 3293
3267 if (this.allowRenameClick_(event, event.srcElement.parentNode)) { 3294 var item = this.findListItemForEvent_(event);
3295 if (!item)
3296 return;
3297 if (this.allowRenameClick_(event, item)) {
3268 event.preventDefault(); 3298 event.preventDefault();
3269 this.initiateRename_(event.srcElement); 3299 this.initiateRename_(item);
3270 } 3300 }
3271
3272 if (event.button != 1)
3273 return;
3274
3275 var li = this.findListItem_(event);
3276 if (!li)
3277 return;
3278 }; 3301 };
3279 3302
3280 FileManager.prototype.onTableMouseDown_ = function(event) { 3303 FileManager.prototype.onTableMouseDown_ = function(event) {
dgozman 2011/12/09 15:20:34 Same as onGridMouseDown_.
SeRya 2011/12/09 15:35:11 Fixed.
3281 this.updateCommands_(); 3304 this.updateCommands_();
3282 3305
3283 if (this.allowRenameClick_(event, 3306 var list = this.table_.list;
3284 event.srcElement.parentNode.parentNode)) { 3307 var item = this.findListItemForEvent_(event);
3308 if (!item)
3309 return;
3310 if (this.allowRenameClick_(event, item)) {
3285 event.preventDefault(); 3311 event.preventDefault();
3286 this.initiateRename_(event.srcElement); 3312 this.initiateRename_(item);
3287 }
3288
3289 if (event.button != 1)
3290 return;
3291
3292 var li = this.findListItem_(event);
3293 if (!li) {
3294 console.log('li not found', event);
3295 return;
3296 } 3313 }
3297 }; 3314 };
3298 3315
3299 /** 3316 /**
3300 * Unload handler for the page. May be called manually for the file picker 3317 * Unload handler for the page. May be called manually for the file picker
3301 * dialog, because it closes by calling extension API functions that do not 3318 * dialog, because it closes by calling extension API functions that do not
3302 * return. 3319 * return.
3303 */ 3320 */
3304 FileManager.prototype.onUnload_ = function() { 3321 FileManager.prototype.onUnload_ = function() {
3305 if (this.subscribedOnDirectoryChanges_) { 3322 if (this.subscribedOnDirectoryChanges_) {
(...skipping 11 matching lines...) Expand all
3317 // We receive a lot of events even in folders we are not interested in. 3334 // We receive a lot of events even in folders we are not interested in.
3318 if (event.fileUrl == this.currentDirEntry_.toURL()) 3335 if (event.fileUrl == this.currentDirEntry_.toURL())
3319 this.rescanDirectoryLater_(); 3336 this.rescanDirectoryLater_();
3320 }; 3337 };
3321 3338
3322 /** 3339 /**
3323 * Determine whether or not a click should initiate a rename. 3340 * Determine whether or not a click should initiate a rename.
3324 * 3341 *
3325 * Renames can happen on mouse click if the user clicks on a label twice, 3342 * Renames can happen on mouse click if the user clicks on a label twice,
3326 * at least a half second apart. 3343 * at least a half second apart.
3344 * @param {MouseEvent} event Click on the item.
3345 * @param {cr.ui.ListItem} item Clicked item.
3327 */ 3346 */
3328 FileManager.prototype.allowRenameClick_ = function(event, row) { 3347 FileManager.prototype.allowRenameClick_ = function(event, item) {
3329 if (this.dialogType_ != FileManager.DialogType.FULL_PAGE || 3348 if (this.dialogType_ != FileManager.DialogType.FULL_PAGE ||
3330 this.currentDirEntry_ == null || this.currentDirEntry_.name == '' || 3349 this.currentDirEntry_ == null || this.currentDirEntry_.name == '' ||
3331 isSystemDirEntry(this.currentDirEntry_)) { 3350 isSystemDirEntry(this.currentDirEntry_)) {
3332 // Renaming only enabled for full-page mode, outside of the root 3351 // Renaming only enabled for full-page mode, outside of the root
3333 // directory. 3352 // directory.
3334 return false; 3353 return false;
3335 } 3354 }
3336 3355
3337 // Didn't click on the label. 3356 // Didn't click on the label.
3338 if (!event.srcElement.classList.contains('filename-label')) 3357 if (!event.srcElement.classList.contains('filename-label'))
3339 return false; 3358 return false;
3340 3359
3341 // Wrong button or using a keyboard modifier. 3360 // Wrong button or using a keyboard modifier.
3342 if (event.button != 0 || event.shiftKey || event.metaKey || event.altKey) { 3361 if (event.button != 0 || event.shiftKey || event.metaKey || event.altKey) {
3343 this.lastLabelClick_ = null; 3362 this.lastLabelClick_ = null;
3344 return false; 3363 return false;
3345 } 3364 }
3346 3365
3347 var now = new Date(); 3366 var now = new Date();
3348 var path = event.srcElement.entry.fullPath;
3349 var lastLabelClick = this.lastLabelClick_; 3367 var lastLabelClick = this.lastLabelClick_;
3350 this.lastLabelClick_ = {path: path, date: now}; 3368 this.lastLabelClick_ = {index: item.listIndex, date: now};
3351 3369
3352 // Rename already in progress. 3370 // Rename already in progress.
3353 if (this.renameInput_.currentEntry) 3371 if (this.renameInput_.currentEntry)
3354 return false; 3372 return false;
3355 3373
3356 if (lastLabelClick && lastLabelClick.path == path) { 3374 if (lastLabelClick && lastLabelClick.index == item.listIndex) {
3357 var delay = now - lastLabelClick.date; 3375 var delay = now - lastLabelClick.date;
3358 if (delay > 500 && delay < 2000) { 3376 if (delay > 500 && delay < 2000) {
3359 this.lastLabelClick_ = null; 3377 this.lastLabelClick_ = null;
3360 return true; 3378 return true;
3361 } 3379 }
3362 } 3380 }
3363 3381
3364 return false; 3382 return false;
3365 }; 3383 };
3366 3384
3367 FileManager.prototype.initiateRename_= function(label) { 3385 FileManager.prototype.initiateRename_ = function(item) {
3386 var label = item.querySelector('.filename-label');
3368 var input = this.renameInput_; 3387 var input = this.renameInput_;
3369 3388
3370 input.value = label.textContent; 3389 input.value = label.textContent;
3371 input.style.top = label.offsetTop + 'px'; 3390 input.style.top = label.offsetTop + 'px';
3372 input.style.left = label.offsetLeft + 'px'; 3391 input.style.left = label.offsetLeft + 'px';
3373 input.style.width = label.clientWidth + 'px'; 3392 input.style.width = label.clientWidth + 'px';
3374 label.parentNode.appendChild(input); 3393 label.parentNode.appendChild(input);
3375 input.focus(); 3394 input.focus();
3376 var selectionEnd = input.value.lastIndexOf('.'); 3395 var selectionEnd = input.value.lastIndexOf('.');
3377 if (selectionEnd == -1) { 3396 if (selectionEnd == -1) {
3378 input.select(); 3397 input.select();
3379 } else { 3398 } else {
3380 input.selectionStart = 0; 3399 input.selectionStart = 0;
3381 input.selectionEnd = selectionEnd; 3400 input.selectionEnd = selectionEnd;
3382 } 3401 }
3383 3402
3384 // This has to be set late in the process so we don't handle spurious 3403 // This has to be set late in the process so we don't handle spurious
3385 // blur events. 3404 // blur events.
3386 input.currentEntry = label.entry; 3405 input.currentEntry = this.currentList_.dataModel.item(item.listIndex);
3387 }; 3406 };
3388 3407
3389 FileManager.prototype.onRenameInputKeyDown_ = function(event) { 3408 FileManager.prototype.onRenameInputKeyDown_ = function(event) {
3390 if (!this.renameInput_.currentEntry) 3409 if (!this.renameInput_.currentEntry)
3391 return; 3410 return;
3392 3411
3393 switch (event.keyCode) { 3412 switch (event.keyCode) {
3394 case 27: // Escape 3413 case 27: // Escape
3395 this.cancelRename_(); 3414 this.cancelRename_();
3396 event.preventDefault(); 3415 event.preventDefault();
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
3968 }); 3987 });
3969 }, onError); 3988 }, onError);
3970 3989
3971 function onError(err) { 3990 function onError(err) {
3972 console.log('Error while checking free space: ' + err); 3991 console.log('Error while checking free space: ' + err);
3973 setTimeout(doCheck, 1000 * 60); 3992 setTimeout(doCheck, 1000 * 60);
3974 } 3993 }
3975 } 3994 }
3976 } 3995 }
3977 })(); 3996 })();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698