diff options
author | serya@chromium.org <serya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-10 02:31:50 +0000 |
---|---|---|
committer | serya@chromium.org <serya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-10 02:31:50 +0000 |
commit | fe71297a08588eddd63ac4e6e102841a7b969663 (patch) | |
tree | b50037e8295e7fdadfc2c0d7da0bc3df68344b5a | |
parent | a35e6197ab62433513094bd099333dc74ef4e4a1 (diff) | |
download | chromium_src-fe71297a08588eddd63ac4e6e102841a7b969663.zip chromium_src-fe71297a08588eddd63ac4e6e102841a7b969663.tar.gz chromium_src-fe71297a08588eddd63ac4e6e102841a7b969663.tar.bz2 |
Fixed renaming in the file manager.
BUG=chromium-os:23770
TEST=None
Review URL: http://codereview.chromium.org/8890017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113928 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/resources/file_manager/js/file_manager.js | 171 |
1 files changed, 88 insertions, 83 deletions
diff --git a/chrome/browser/resources/file_manager/js/file_manager.js b/chrome/browser/resources/file_manager/js/file_manager.js index 0425871..bf371e8 100644 --- a/chrome/browser/resources/file_manager/js/file_manager.js +++ b/chrome/browser/resources/file_manager/js/file_manager.js @@ -199,6 +199,33 @@ FileManager.prototype = { const ARCHIVES_REGEXP = /.zip$/; /** + * Item for the Grid View. + * @constructor + */ + function GridItem(fileManager, entry) { + var li = fileManager.document_.createElement('li'); + GridItem.decorate(li, fileManager, entry); + return li; + } + + GridItem.prototype = { + __proto__: cr.ui.ListItem.prototype, + + get label() { + return this.querySelector('filename-label').textContent; + }, + set label(value) { + // Grid sets it to entry. Ignore. + } + }; + + GridItem.decorate = function(li, fileManager, entry) { + li.__proto__ = GridItem.prototype; + fileManager.decorateThumbnail_(li, entry); + }; + + + /** * Return a translated string. * * Wrapper function to make dealing with translated strings more concise. @@ -1107,7 +1134,8 @@ FileManager.prototype = { this.table_.style.display = ''; this.grid_.style.display = 'none'; this.grid_.dataModel = this.emptyDataModel_; - this.currentList_ = this.table_; + /** @type {cr.ui.List} */ + this.currentList_ = this.table_.list; this.dialogDom_.querySelector('button.detail-view').disabled = true; this.dialogDom_.querySelector('button.thumbnail-view').disabled = false; this.table_.selectionModel.selectedIndexes = selectedIndexes; @@ -1117,6 +1145,7 @@ FileManager.prototype = { this.grid_.style.display = ''; this.table_.style.display = 'none'; this.table_.dataModel = this.emptyDataModel_; + /** @type {cr.ui.List} */ this.currentList_ = this.grid_; this.dialogDom_.querySelector('button.thumbnail-view').disabled = true; this.dialogDom_.querySelector('button.detail-view').disabled = false; @@ -1137,9 +1166,7 @@ FileManager.prototype = { cr.ui.Grid.decorate(this.grid_); var self = this; - this.grid_.itemConstructor = function(entry) { - return self.renderThumbnail_(entry); - }; + this.grid_.itemConstructor = GridItem.bind(null, this); this.grid_.selectionModel = new this.selectionModelClass_(); @@ -1150,7 +1177,7 @@ FileManager.prototype = { cr.ui.contextMenuHandler.addContextMenuProperty(this.grid_); this.grid_.contextMenu = this.fileContextMenu_; this.grid_.addEventListener('mousedown', - this.onGridMouseDown_.bind(this)); + this.onGridOrTableMouseDown_.bind(this)); }; /** @@ -1193,7 +1220,7 @@ FileManager.prototype = { this.table_.contextMenu = this.fileContextMenu_; this.table_.addEventListener('mousedown', - this.onTableMouseDown_.bind(this)); + this.onGridOrTableMouseDown_.bind(this)); }; FileManager.prototype.onCopyProgress_ = function(event) { @@ -1279,16 +1306,10 @@ FileManager.prototype = { return; case 'rename': - var leadIndex = this.currentList_.selectionModel.leadIndex; - var li = this.currentList_.getListItemByIndex(leadIndex); - var label = li.querySelector('.filename-label'); - if (!label) { - console.warn('Unable to find label for rename of index: ' + - leadIndex); - return; - } - - this.initiateRename_(label); + var index = this.currentList_.selectionModel.selectedIndex; + var item = this.currentList_.getListItemByIndex(index); + if (item) + this.initiateRename_(item); return; case 'delete': @@ -1663,29 +1684,14 @@ FileManager.prototype = { return box; }; - FileManager.prototype.renderThumbnail_ = function(entry) { - var li = this.document_.createElement('li'); + FileManager.prototype.decorateThumbnail_ = function(li, entry) { li.className = 'thumbnail-item'; if (this.showCheckboxes_) li.appendChild(this.renderCheckbox_(entry)); li.appendChild(this.renderThumbnailBox_(entry, false)); - - var div = this.document_.createElement('div'); - div.className = 'filename-label'; - var labelText = entry.name; - if (this.currentDirEntry_.name == '') - labelText = this.getLabelForRootPath_(labelText); - - div.textContent = labelText; - div.entry = entry; - - li.appendChild(div); - - cr.defineProperty(li, 'lead', cr.PropertyKind.BOOL_ATTR); - cr.defineProperty(li, 'selected', cr.PropertyKind.BOOL_ATTR); - return li; + li.appendChild(this.renderFileNameLabel_(entry)); }; /** @@ -1735,17 +1741,26 @@ FileManager.prototype = { label.appendChild(this.renderIconType_(entry, columnId, table)); label.entry = entry; label.className = 'detail-name'; - if (this.currentDirEntry_.name == '') { - label.appendChild(this.document_.createTextNode( - this.getLabelForRootPath_(entry.name))); - } else { - label.appendChild(this.document_.createTextNode(entry.name)); - } - + label.appendChild(this.renderFileNameLabel_(entry)); return label; }; /** + * Render filename label for grid and list view. + * @param {Entry} entry The Entry object to render. + * @return {HTMLDivElement} The label. + */ + FileManager.prototype.renderFileNameLabel_ = function(entry) { + // Filename need to be in a '.filename-label' container for correct + // work of inplace renaming. + var fileName = this.document_.createElement('div'); + fileName.className = 'filename-label'; + fileName.textContent = this.currentDirEntry_.name == '' ? + this.getLabelForRootPath_(entry.name) : entry.name; + return fileName; + }; + + /** * Render the Size column of the detail table. * * @param {Entry} entry The Entry object to render. @@ -2511,7 +2526,7 @@ FileManager.prototype = { }; FileManager.prototype.selectIndex = function(index) { - this.currentList_.focus(); + this.focusCurrentList_(); if (index >= this.dataModel_.length) return; this.currentList_.selectionModel.selectedIndex = index; @@ -2530,13 +2545,20 @@ FileManager.prototype = { if (this.dataModel_.item(i).name == name) { this.currentList_.selectionModel.setIndexSelected(i, true); this.currentList_.scrollIndexIntoView(i); - this.currentList_.focus(); + this.focusCurrentList_(); entryExists = true; break; } } return entryExists; - } + }; + + FileManager.prototype.focusCurrentList_ = function() { + if (this.listType_ == FileManager.ListType.DETAIL) + this.table_.focus(); + else // this.listType_ == FileManager.ListType.THUMBNAIL) + this.grid_.focus(); + }; /** * Return the name of the entries in the current directory @@ -3250,49 +3272,30 @@ FileManager.prototype = { } }; - FileManager.prototype.findListItem_ = function(event) { + FileManager.prototype.findListItemForEvent_ = function(event) { var node = event.srcElement; + var list = this.currentList_; + // Assume list items are direct children of the list. + if (node == list) + return null; while (node) { - if (node.tagName == 'LI') - break; - node = node.parentNode; + var parent = node.parentNode; + if (parent == list && node instanceof cr.ui.ListItem) + return node; + node = parent; } - - return node; + return null; }; - FileManager.prototype.onGridMouseDown_ = function(event) { + FileManager.prototype.onGridOrTableMouseDown_ = function(event) { this.updateCommands_(); - if (this.allowRenameClick_(event, event.srcElement.parentNode)) { - event.preventDefault(); - this.initiateRename_(event.srcElement); - } - - if (event.button != 1) - return; - - var li = this.findListItem_(event); - if (!li) + var item = this.findListItemForEvent_(event); + if (!item) return; - }; - - FileManager.prototype.onTableMouseDown_ = function(event) { - this.updateCommands_(); - - if (this.allowRenameClick_(event, - event.srcElement.parentNode.parentNode)) { + if (this.allowRenameClick_(event, item)) { event.preventDefault(); - this.initiateRename_(event.srcElement); - } - - if (event.button != 1) - return; - - var li = this.findListItem_(event); - if (!li) { - console.log('li not found', event); - return; + this.initiateRename_(item); } }; @@ -3324,8 +3327,10 @@ FileManager.prototype = { * * Renames can happen on mouse click if the user clicks on a label twice, * at least a half second apart. + * @param {MouseEvent} event Click on the item. + * @param {cr.ui.ListItem} item Clicked item. */ - FileManager.prototype.allowRenameClick_ = function(event, row) { + FileManager.prototype.allowRenameClick_ = function(event, item) { if (this.dialogType_ != FileManager.DialogType.FULL_PAGE || this.currentDirEntry_ == null || this.currentDirEntry_.name == '' || isSystemDirEntry(this.currentDirEntry_)) { @@ -3345,15 +3350,14 @@ FileManager.prototype = { } var now = new Date(); - var path = event.srcElement.entry.fullPath; var lastLabelClick = this.lastLabelClick_; - this.lastLabelClick_ = {path: path, date: now}; + this.lastLabelClick_ = {index: item.listIndex, date: now}; // Rename already in progress. if (this.renameInput_.currentEntry) return false; - if (lastLabelClick && lastLabelClick.path == path) { + if (lastLabelClick && lastLabelClick.index == item.listIndex) { var delay = now - lastLabelClick.date; if (delay > 500 && delay < 2000) { this.lastLabelClick_ = null; @@ -3364,7 +3368,8 @@ FileManager.prototype = { return false; }; - FileManager.prototype.initiateRename_= function(label) { + FileManager.prototype.initiateRename_ = function(item) { + var label = item.querySelector('.filename-label'); var input = this.renameInput_; input.value = label.textContent; @@ -3383,7 +3388,7 @@ FileManager.prototype = { // This has to be set late in the process so we don't handle spurious // blur events. - input.currentEntry = label.entry; + input.currentEntry = this.currentList_.dataModel.item(item.listIndex); }; FileManager.prototype.onRenameInputKeyDown_ = function(event) { |