| Index: ui/file_manager/file_manager/foreground/js/ui/file_table.js
|
| diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table.js b/ui/file_manager/file_manager/foreground/js/ui/file_table.js
|
| index 1dae4d49e1cc6722cade45ddca2a6e2e5fb0c751..54a677a2da36e19485e87c430666a40c4b40ba13 100644
|
| --- a/ui/file_manager/file_manager/foreground/js/ui/file_table.js
|
| +++ b/ui/file_manager/file_manager/foreground/js/ui/file_table.js
|
| @@ -3,11 +3,6 @@
|
| // found in the LICENSE file.
|
|
|
| /**
|
| - * Namespace for utility functions.
|
| - */
|
| -var filelist = {};
|
| -
|
| -/**
|
| * Custom column model for advanced auto-resizing.
|
| *
|
| * @param {!Array<cr.ui.table.TableColumn>} tableColumns Table columns.
|
| @@ -364,8 +359,9 @@ FileTable.prototype.__proto__ = cr.ui.Table.prototype;
|
| FileTable.decorate = function(
|
| self, metadataModel, volumeManager, historyLoader, fullPage) {
|
| cr.ui.Table.decorate(self);
|
| - FileTableList.decorate(self.list);
|
| self.__proto__ = FileTable.prototype;
|
| + FileTableList.decorate(self.list);
|
| + self.list.setOnMergeItems(self.updateHighPriorityRange_.bind(self));
|
| self.metadataModel_ = metadataModel;
|
| self.volumeManager_ = volumeManager;
|
| self.historyLoader_ = historyLoader;
|
| @@ -494,8 +490,9 @@ FileTable.decorate = function(
|
| *
|
| * @param {number} beginIndex Begin index.
|
| * @param {number} endIndex End index.
|
| + * @private
|
| */
|
| -FileTable.prototype.updateHighPriorityRange = function(beginIndex, endIndex) {
|
| +FileTable.prototype.updateHighPriorityRange_ = function(beginIndex, endIndex) {
|
| // Keep these values to set range when a new list thumbnail loader is set.
|
| this.beginIndex_ = beginIndex;
|
| this.endIndex_ = endIndex;
|
| @@ -1020,324 +1017,3 @@ FileTable.prototype.relayoutImmediately_ = function() {
|
| this.redraw();
|
| cr.dispatchSimpleEvent(this.list, 'relayout');
|
| };
|
| -
|
| -/**
|
| - * Common item decoration for table's and grid's items.
|
| - * @param {cr.ui.ListItem} li List item.
|
| - * @param {Entry} entry The entry.
|
| - * @param {!MetadataModel} metadataModel Cache to
|
| - * retrieve metadada.
|
| - */
|
| -filelist.decorateListItem = function(li, entry, metadataModel) {
|
| - li.classList.add(entry.isDirectory ? 'directory' : 'file');
|
| - // The metadata may not yet be ready. In that case, the list item will be
|
| - // updated when the metadata is ready via updateListItemsMetadata. For files
|
| - // not on an external backend, externalProps is not available.
|
| - var externalProps = metadataModel.getCache(
|
| - [entry], ['hosted', 'availableOffline', 'customIconUrl', 'shared'])[0];
|
| - filelist.updateListItemExternalProps(li, externalProps);
|
| -
|
| - // Overriding the default role 'list' to 'listbox' for better
|
| - // accessibility on ChromeOS.
|
| - li.setAttribute('role', 'option');
|
| -
|
| - Object.defineProperty(li, 'selected', {
|
| - /**
|
| - * @this {cr.ui.ListItem}
|
| - * @return {boolean} True if the list item is selected.
|
| - */
|
| - get: function() {
|
| - return this.hasAttribute('selected');
|
| - },
|
| -
|
| - /**
|
| - * @this {cr.ui.ListItem}
|
| - */
|
| - set: function(v) {
|
| - if (v)
|
| - this.setAttribute('selected', '');
|
| - else
|
| - this.removeAttribute('selected');
|
| - }
|
| - });
|
| -};
|
| -
|
| -/**
|
| - * Render the type column of the detail table.
|
| - * @param {!Document} doc Owner document.
|
| - * @param {!Entry} entry The Entry object to render.
|
| - * @param {string=} opt_mimeType Optional mime type for the file.
|
| - * @return {!HTMLDivElement} Created element.
|
| - */
|
| -filelist.renderFileTypeIcon = function(doc, entry, opt_mimeType) {
|
| - var icon = /** @type {!HTMLDivElement} */ (doc.createElement('div'));
|
| - icon.className = 'detail-icon';
|
| - icon.setAttribute('file-type-icon', FileType.getIcon(entry, opt_mimeType));
|
| - return icon;
|
| -};
|
| -
|
| -/**
|
| - * Render filename label for grid and list view.
|
| - * @param {!Document} doc Owner document.
|
| - * @param {!Entry} entry The Entry object to render.
|
| - * @return {!HTMLDivElement} The label.
|
| - */
|
| -filelist.renderFileNameLabel = function(doc, entry) {
|
| - // Filename need to be in a '.filename-label' container for correct
|
| - // work of inplace renaming.
|
| - var box = /** @type {!HTMLDivElement} */ (doc.createElement('div'));
|
| - box.className = 'filename-label';
|
| - var fileName = doc.createElement('span');
|
| - fileName.className = 'entry-name';
|
| - fileName.textContent = entry.name;
|
| - box.appendChild(fileName);
|
| -
|
| - return box;
|
| -};
|
| -
|
| -/**
|
| - * Updates grid item or table row for the externalProps.
|
| - * @param {cr.ui.ListItem} li List item.
|
| - * @param {Object} externalProps Metadata.
|
| - */
|
| -filelist.updateListItemExternalProps = function(li, externalProps) {
|
| - if (li.classList.contains('file')) {
|
| - if (externalProps.availableOffline)
|
| - li.classList.remove('dim-offline');
|
| - else
|
| - li.classList.add('dim-offline');
|
| - // TODO(mtomasz): Consider adding some vidual indication for files which
|
| - // are not cached on LTE. Currently we show them as normal files.
|
| - // crbug.com/246611.
|
| - }
|
| -
|
| - var iconDiv = li.querySelector('.detail-icon');
|
| - if (!iconDiv)
|
| - return;
|
| -
|
| - if (externalProps.customIconUrl)
|
| - iconDiv.style.backgroundImage = 'url(' + externalProps.customIconUrl + ')';
|
| - else
|
| - iconDiv.style.backgroundImage = ''; // Back to the default image.
|
| -
|
| - if (li.classList.contains('directory'))
|
| - iconDiv.classList.toggle('shared', !!externalProps.shared);
|
| -};
|
| -
|
| -/**
|
| - * Handles mouseup/mousedown events on file list to change the selection state.
|
| - *
|
| - * Basically the content of this function is identical to
|
| - * cr.ui.ListSelectionController's handlePointerDownUp(), but following
|
| - * handlings are inserted to control the check-select mode.
|
| - *
|
| - * 1) When checkmark area is clicked, toggle item selection and enable the
|
| - * check-select mode.
|
| - * 2) When non-checkmark area is clicked in check-select mode, disable the
|
| - * check-select mode.
|
| - *
|
| - * @param {!Event} e The browser mouse event.
|
| - * @param {number} index The index that was under the mouse pointer, -1 if
|
| - * none.
|
| - * @this {cr.ui.ListSelectionController}
|
| - */
|
| -filelist.handlePointerDownUp = function(e, index) {
|
| - var sm = /** @type {!FileListSelectionModel|!FileListSingleSelectionModel} */
|
| - (this.selectionModel);
|
| - var anchorIndex = sm.anchorIndex;
|
| - var isDown = (e.type == 'mousedown');
|
| -
|
| - var isTargetCheckmark = e.target.classList.contains('detail-checkmark') ||
|
| - e.target.classList.contains('checkmark');
|
| - // If multiple selection is allowed and the checkmark is clicked without
|
| - // modifiers(Ctrl/Shift), the click should toggle the item's selection.
|
| - // (i.e. same behavior as Ctrl+Click)
|
| - var isClickOnCheckmark = isTargetCheckmark && sm.multiple && index != -1 &&
|
| - !e.shiftKey && !e.ctrlKey && e.button == 0;
|
| -
|
| - sm.beginChange();
|
| -
|
| - if (index == -1) {
|
| - sm.leadIndex = sm.anchorIndex = -1;
|
| - sm.unselectAll();
|
| - } else {
|
| - if (sm.multiple && (e.ctrlKey || isClickOnCheckmark) && !e.shiftKey) {
|
| - // Selection is handled at mouseUp.
|
| - if (!isDown) {
|
| - // 1) When checkmark area is clicked, toggle item selection and enable
|
| - // the check-select mode.
|
| - if (isClickOnCheckmark) {
|
| - // If a selected item's checkmark is clicked when the selection mode
|
| - // is not check-select, we should avoid toggling(unselecting) the
|
| - // item. It is done here by toggling the selection twice.
|
| - if (!sm.getCheckSelectMode() && sm.getIndexSelected(index))
|
| - sm.setIndexSelected(index, !sm.getIndexSelected(index));
|
| - // Always enables check-select mode on clicks on checkmark.
|
| - sm.setCheckSelectMode(true);
|
| - }
|
| - // Toggle the current one and make it anchor index.
|
| - sm.setIndexSelected(index, !sm.getIndexSelected(index));
|
| - sm.leadIndex = index;
|
| - sm.anchorIndex = index;
|
| - }
|
| - } else if (e.shiftKey && anchorIndex != -1 && anchorIndex != index) {
|
| - // Shift is done in mousedown.
|
| - if (isDown) {
|
| - sm.unselectAll();
|
| - sm.leadIndex = index;
|
| - if (sm.multiple)
|
| - sm.selectRange(anchorIndex, index);
|
| - else
|
| - sm.setIndexSelected(index, true);
|
| - }
|
| - } else {
|
| - // Right click for a context menu needs to not clear the selection.
|
| - var isRightClick = e.button == 2;
|
| -
|
| - // If the index is selected this is handled in mouseup.
|
| - var indexSelected = sm.getIndexSelected(index);
|
| - if ((indexSelected && !isDown || !indexSelected && isDown) &&
|
| - !(indexSelected && isRightClick)) {
|
| - // 2) When non-checkmark area is clicked in check-select mode, disable
|
| - // the check-select mode.
|
| - if (sm.getCheckSelectMode()) {
|
| - // Unselect all items once to ensure that the check-select mode is
|
| - // terminated.
|
| - sm.endChange();
|
| - sm.unselectAll();
|
| - sm.beginChange();
|
| - }
|
| - sm.selectedIndex = index;
|
| - }
|
| - }
|
| - }
|
| - sm.endChange();
|
| -};
|
| -
|
| -/**
|
| - * Handles key events on file list to change the selection state.
|
| - *
|
| - * Basically the content of this function is identical to
|
| - * cr.ui.ListSelectionController's handleKeyDown(), but following handlings is
|
| - * inserted to control the check-select mode.
|
| - *
|
| - * 1) When pressing direction key results in a single selection, the
|
| - * check-select mode should be terminated.
|
| - *
|
| - * @param {Event} e The keydown event.
|
| - * @this {cr.ui.ListSelectionController}
|
| - */
|
| -filelist.handleKeyDown = function(e) {
|
| - var SPACE_KEY_CODE = 32;
|
| - var tagName = e.target.tagName;
|
| -
|
| - // If focus is in an input field of some kind, only handle navigation keys
|
| - // that aren't likely to conflict with input interaction (e.g., text
|
| - // editing, or changing the value of a checkbox or select).
|
| - if (tagName == 'INPUT') {
|
| - var inputType = e.target.type;
|
| - // Just protect space (for toggling) for checkbox and radio.
|
| - if (inputType == 'checkbox' || inputType == 'radio') {
|
| - if (e.keyCode == SPACE_KEY_CODE)
|
| - return;
|
| - // Protect all but the most basic navigation commands in anything else.
|
| - } else if (e.key != 'ArrowUp' && e.key != 'ArrowDown') {
|
| - return;
|
| - }
|
| - }
|
| - // Similarly, don't interfere with select element handling.
|
| - if (tagName == 'SELECT')
|
| - return;
|
| -
|
| - var sm = /** @type {!FileListSelectionModel|!FileListSingleSelectionModel} */
|
| - (this.selectionModel);
|
| - var newIndex = -1;
|
| - var leadIndex = sm.leadIndex;
|
| - var prevent = true;
|
| -
|
| - // Ctrl/Meta+A
|
| - if (sm.multiple && e.keyCode == 65 &&
|
| - (cr.isMac && e.metaKey || !cr.isMac && e.ctrlKey)) {
|
| - sm.selectAll();
|
| - e.preventDefault();
|
| - return;
|
| - }
|
| -
|
| - // Esc
|
| - if (e.keyCode === 27 && !e.ctrlKey && !e.shiftKey) {
|
| - sm.unselectAll();
|
| - e.preventDefault();
|
| - return;
|
| - }
|
| -
|
| - // Space
|
| - if (e.keyCode == SPACE_KEY_CODE) {
|
| - if (leadIndex != -1) {
|
| - var selected = sm.getIndexSelected(leadIndex);
|
| - if (e.ctrlKey || !selected) {
|
| - sm.setIndexSelected(leadIndex, !selected || !sm.multiple);
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - switch (e.key) {
|
| - case 'Home':
|
| - newIndex = this.getFirstIndex();
|
| - break;
|
| - case 'End':
|
| - newIndex = this.getLastIndex();
|
| - break;
|
| - case 'ArrowUp':
|
| - newIndex = leadIndex == -1 ?
|
| - this.getLastIndex() : this.getIndexAbove(leadIndex);
|
| - break;
|
| - case 'ArrowDown':
|
| - newIndex = leadIndex == -1 ?
|
| - this.getFirstIndex() : this.getIndexBelow(leadIndex);
|
| - break;
|
| - case 'ArrowLeft':
|
| - case 'MediaTrackPrevious':
|
| - newIndex = leadIndex == -1 ?
|
| - this.getLastIndex() : this.getIndexBefore(leadIndex);
|
| - break;
|
| - case 'ArrowRight':
|
| - case 'MediaTrackNext':
|
| - newIndex = leadIndex == -1 ?
|
| - this.getFirstIndex() : this.getIndexAfter(leadIndex);
|
| - break;
|
| - default:
|
| - prevent = false;
|
| - }
|
| -
|
| - if (newIndex >= 0 && newIndex < sm.length) {
|
| - sm.beginChange();
|
| -
|
| - sm.leadIndex = newIndex;
|
| - if (e.shiftKey) {
|
| - var anchorIndex = sm.anchorIndex;
|
| - if (sm.multiple)
|
| - sm.unselectAll();
|
| - if (anchorIndex == -1) {
|
| - sm.setIndexSelected(newIndex, true);
|
| - sm.anchorIndex = newIndex;
|
| - } else {
|
| - sm.selectRange(anchorIndex, newIndex);
|
| - }
|
| - } else {
|
| - // 1) When pressing direction key results in a single selection, the
|
| - // check-select mode should be terminated.
|
| - sm.setCheckSelectMode(false);
|
| -
|
| - if (sm.multiple)
|
| - sm.unselectAll();
|
| - sm.setIndexSelected(newIndex, true);
|
| - sm.anchorIndex = newIndex;
|
| - }
|
| -
|
| - sm.endChange();
|
| -
|
| - if (prevent)
|
| - e.preventDefault();
|
| - }
|
| -};
|
|
|