Chromium Code Reviews| Index: chrome/browser/resources/file_manager/js/file_table.js |
| diff --git a/chrome/browser/resources/file_manager/js/file_table.js b/chrome/browser/resources/file_manager/js/file_table.js |
| index 61dfda4fbb1275be7794daf4a6381e695de1b7fd..86c4e7d90c7f927918613b8b0d261a7bf5c9416a 100644 |
| --- a/chrome/browser/resources/file_manager/js/file_table.js |
| +++ b/chrome/browser/resources/file_manager/js/file_table.js |
| @@ -10,6 +10,50 @@ |
| var filelist = {}; |
| /** |
| + * Custom column model for advanced auto-resizing. |
| + * @param {Array.<cr.ui.table.TableColumn>} tableColumns Table columns. |
| + * @constructor |
| + */ |
|
yoshiki
2013/04/17 08:12:00
Add "@extends {cr.ui.table.TableColumnModel}".
mtomasz
2013/04/17 08:52:21
Done.
|
| +function FileTableColumnModel(tableColumns) { |
| + cr.ui.table.TableColumnModel.call(this, tableColumns); |
| +} |
| + |
| +/** |
| + * Inherits from cr.ui.Table. |
| + */ |
| +FileTableColumnModel.prototype.__proto__ = |
| + cr.ui.table.TableColumnModel.prototype; |
| + |
| +/** |
| + * Normalizes widths to make their sum 100%. Uses the proportional approach |
| + * with some additional constraints. |
| + * |
| + * @param {number} contentWidth Target width. |
| + * @override |
| + */ |
| +FileTableColumnModel.prototype.normalizeWidths = function(contentWidth) { |
| + var fixedWidth = 0; |
| + var flexibleWidth = 0; |
| + |
| + // Some columns have fixed width. |
| + for (var index = 0; index < this.size; index++) { |
| + var column = this.columns_[index]; |
| + if (column.id == 'selection') |
| + fixedWidth += column.width; |
| + else |
| + flexibleWidth += column.width; |
| + } |
| + |
| + var factor = (contentWidth - fixedWidth) / flexibleWidth; |
| + for (var index = 0; index < this.size; index++) { |
| + var column = this.columns_[index]; |
| + if (column.id == 'selection') |
| + continue; |
| + column.width = column.width * factor; |
| + } |
| +}; |
| + |
| +/** |
| * File list Table View. |
| * @constructor |
| */ |
| @@ -36,19 +80,16 @@ FileTable.decorate = function(self, metadataCache, fullPage) { |
| self.collator_ = v8Intl.Collator([], {numeric: true, sensitivity: 'base'}); |
| var columns = [ |
| - new cr.ui.table.TableColumn('name', str('NAME_COLUMN_LABEL'), |
| - fullPage ? 386 : 324), |
| - new cr.ui.table.TableColumn('size', str('SIZE_COLUMN_LABEL'), |
| - fullPage ? 100 : 92, true), |
| - new cr.ui.table.TableColumn('type', str('TYPE_COLUMN_LABEL'), |
| - fullPage ? 160 : 160), |
| - new cr.ui.table.TableColumn('modificationTime', |
| - str('DATE_COLUMN_LABEL'), |
| - fullPage ? 150 : 210), |
| - new cr.ui.table.TableColumn('offline', |
| - str('OFFLINE_COLUMN_LABEL'), |
| - 130) |
| - ]; |
| + new cr.ui.table.TableColumn('name', str('NAME_COLUMN_LABEL'), |
| + fullPage ? 386 : 324), |
| + new cr.ui.table.TableColumn('size', str('SIZE_COLUMN_LABEL'), |
| + fullPage ? 100 : 92, true), |
| + new cr.ui.table.TableColumn('type', str('TYPE_COLUMN_LABEL'), |
| + fullPage ? 160 : 160), |
| + new cr.ui.table.TableColumn('modificationTime', |
| + str('DATE_COLUMN_LABEL'), |
| + fullPage ? 150 : 210) |
| + ]; |
| columns[0].renderFunction = self.renderName_.bind(self); |
| columns[1].renderFunction = self.renderSize_.bind(self); |
| @@ -56,14 +97,31 @@ FileTable.decorate = function(self, metadataCache, fullPage) { |
| columns[2].renderFunction = self.renderType_.bind(self); |
| columns[3].renderFunction = self.renderDate_.bind(self); |
| columns[3].defaultOrder = 'desc'; |
| - columns[4].renderFunction = self.renderOffline_.bind(self); |
| - columns[0].headerRenderFunction = |
| - self.renderNameColumnHeader_.bind(self, columns[0].name); |
| + var tableColumnModelClass; |
| + if (util.platform.newUI()) { |
| + tableColumnModelClass = FileTableColumnModel; |
| + columns.push(new cr.ui.table.TableColumn('selection', |
| + '', |
| + 50, true)); |
| + columns[4].renderFunction = self.renderSelection_.bind(self); |
| + columns[4].headerRenderFunction = |
| + self.renderSelectionColumnHeader_.bind(self); |
| + } else { |
| + tableColumnModelClass = cr.ui.table.TableColumnModel; |
| + columns.push(new cr.ui.table.TableColumn('offline', |
| + str('OFFLINE_COLUMN_LABEL'), |
| + 130)); |
| + columns[4].renderFunction = self.renderOffline_.bind(self); |
| + columns[0].headerRenderFunction = |
| + self.renderNameColumnHeader_.bind(self, columns[0].name); |
| + } |
| - var columnModel = Object.create(cr.ui.table.TableColumnModel.prototype, { |
| + var columnModel = Object.create(tableColumnModelClass.prototype, { |
|
yoshiki
2013/04/17 08:12:00
nit: Remove a space at the head of the line.
mtomasz
2013/04/17 08:52:21
Done.
|
| size: { |
| get: function() { |
| + if (util.platform.newUI()) |
| + return this.totalSize; |
| return this.showOfflineColumn ? this.totalSize : this.totalSize - 1; |
| } |
| }, |
| @@ -79,12 +137,16 @@ FileTable.decorate = function(self, metadataCache, fullPage) { |
| value: false |
| } |
| }); |
| - cr.ui.table.TableColumnModel.call(columnModel, columns); |
| + |
| + tableColumnModelClass.call(columnModel, columns); |
| self.columnModel = columnModel; |
| self.setDateTimeFormat(true); |
| self.setRenderFunction(self.renderTableRow_.bind(self, |
| self.getRenderFunction())); |
| + if (util.platform.newUI()) |
| + ScrollBar.createVertical(self, self.list); |
| + |
| var handleSelectionChange = function() { |
| var selectAll = self.querySelector('#select-all-checkbox'); |
| if (selectAll) |
| @@ -178,10 +240,12 @@ FileTable.prototype.setupCompareFunctions = function(dataModel) { |
| */ |
| FileTable.prototype.renderName_ = function(entry, columnId, table) { |
| var label = this.ownerDocument.createElement('div'); |
| - if (this.selectionModel.multiple) { |
| - var checkBox = this.ownerDocument.createElement('INPUT'); |
| - filelist.decorateSelectionCheckbox(checkBox, entry, this.list); |
| - label.appendChild(checkBox); |
| + if (!util.platform.newUI()) { |
| + if (this.selectionModel.multiple) { |
| + var checkBox = this.ownerDocument.createElement('INPUT'); |
|
yoshiki
2013/04/17 08:12:00
nit: 'INPUT' should be in small letter for consist
mtomasz
2013/04/17 08:52:21
Done.
|
| + filelist.decorateSelectionCheckbox(checkBox, entry, this.list); |
| + label.appendChild(checkBox); |
| + } |
| } |
| label.appendChild(this.renderIconType_(entry, columnId, table)); |
| label.entry = entry; |
| @@ -191,6 +255,28 @@ FileTable.prototype.renderName_ = function(entry, columnId, table) { |
| }; |
| /** |
| + * Render the Selection column of the detail table. |
| + * |
| + * Invoked by cr.ui.Table when a file needs to be rendered. |
| + * |
| + * @param {Entry} entry The Entry object to render. |
| + * @param {string} columnId The id of the column to be rendered. |
| + * @param {cr.ui.Table} table The table doing the rendering. |
| + * @return {HTMLDivElement} Created element. |
| + * @private |
| + */ |
| +FileTable.prototype.renderSelection_ = function(entry, columnId, table) { |
| + var label = this.ownerDocument.createElement('div'); |
| + label.className = 'selection-label'; |
| + if (this.selectionModel.multiple) { |
| + var checkBox = this.ownerDocument.createElement('INPUT'); |
|
yoshiki
2013/04/17 08:12:00
ditto
mtomasz
2013/04/17 08:52:21
Done.
|
| + filelist.decorateSelectionCheckbox(checkBox, entry, this.list); |
| + label.appendChild(checkBox); |
| + } |
| + return label; |
| +}; |
| + |
| +/** |
| * Render the Size column of the detail table. |
| * |
| * @param {Entry} entry The Entry object to render. |
| @@ -495,9 +581,9 @@ FileTable.prototype.renderTableRow_ = function(baseRenderFunction, entry) { |
| * @private |
| */ |
| FileTable.prototype.renderNameColumnHeader_ = function(name) { |
| - if (!this.selectionModel.multiple) { |
| + if (!this.selectionModel.multiple) |
| return this.ownerDocument.createTextNode(name); |
| - } |
| + |
| var input = this.ownerDocument.createElement('input'); |
| input.setAttribute('type', 'checkbox'); |
| input.setAttribute('tabindex', -1); |
| @@ -521,6 +607,37 @@ FileTable.prototype.renderNameColumnHeader_ = function(name) { |
| }; |
| /** |
| + * Renders the selection column header. |
| + * @param {string} name Localized column name. |
| + * @return {HTMLLiElement} Created element. |
| + * @private |
| + */ |
| +FileTable.prototype.renderSelectionColumnHeader_ = function(name) { |
| + if (!this.selectionModel.multiple) |
| + return this.ownerDocument.createTextNode(''); |
| + |
| + var input = this.ownerDocument.createElement('input'); |
| + input.setAttribute('type', 'checkbox'); |
| + input.setAttribute('tabindex', -1); |
| + input.id = 'select-all-checkbox'; |
| + input.className = 'common'; |
| + |
| + this.updateSelectAllCheckboxState_(input); |
| + |
| + input.addEventListener('click', function(event) { |
| + if (input.checked) |
| + this.selectionModel.selectAll(); |
| + else |
| + this.selectionModel.unselectAll(); |
| + event.stopPropagation(); |
| + }.bind(this)); |
| + |
| + var fragment = this.ownerDocument.createDocumentFragment(); |
| + fragment.appendChild(input); |
| + return fragment; |
| +}; |
| + |
| +/** |
| * Render the type column of the detail table. |
| * |
| * Invoked by cr.ui.Table when a file needs to be rendered. |