| OLD | NEW |
| 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 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Namespace for utility functions. | 8 * Namespace for utility functions. |
| 9 */ | 9 */ |
| 10 var filelist = {}; | 10 var filelist = {}; |
| 11 | 11 |
| 12 /** | 12 /** |
| 13 * Custom column model for advanced auto-resizing. |
| 14 * |
| 15 * @param {Array.<cr.ui.table.TableColumn>} tableColumns Table columns. |
| 16 * @extends {cr.ui.table.TableColumnModel} |
| 17 * @constructor |
| 18 */ |
| 19 function FileTableColumnModel(tableColumns) { |
| 20 cr.ui.table.TableColumnModel.call(this, tableColumns); |
| 21 } |
| 22 |
| 23 /** |
| 24 * Inherits from cr.ui.Table. |
| 25 */ |
| 26 FileTableColumnModel.prototype.__proto__ = |
| 27 cr.ui.table.TableColumnModel.prototype; |
| 28 |
| 29 /** |
| 30 * Normalizes widths to make their sum 100%. Uses the proportional approach |
| 31 * with some additional constraints. |
| 32 * |
| 33 * @param {number} contentWidth Target width. |
| 34 * @override |
| 35 */ |
| 36 FileTableColumnModel.prototype.normalizeWidths = function(contentWidth) { |
| 37 var fixedWidth = 0; |
| 38 var flexibleWidth = 0; |
| 39 |
| 40 // Some columns have fixed width. |
| 41 for (var index = 0; index < this.size; index++) { |
| 42 var column = this.columns_[index]; |
| 43 if (column.id == 'selection') |
| 44 fixedWidth += column.width; |
| 45 else |
| 46 flexibleWidth += column.width; |
| 47 } |
| 48 |
| 49 var factor = (contentWidth - fixedWidth) / flexibleWidth; |
| 50 for (var index = 0; index < this.size; index++) { |
| 51 var column = this.columns_[index]; |
| 52 if (column.id == 'selection') |
| 53 continue; |
| 54 column.width = column.width * factor; |
| 55 } |
| 56 }; |
| 57 |
| 58 /** |
| 13 * File list Table View. | 59 * File list Table View. |
| 14 * @constructor | 60 * @constructor |
| 15 */ | 61 */ |
| 16 function FileTable() { | 62 function FileTable() { |
| 17 throw new Error('Designed to decorate elements'); | 63 throw new Error('Designed to decorate elements'); |
| 18 } | 64 } |
| 19 | 65 |
| 20 /** | 66 /** |
| 21 * Inherits from cr.ui.Table. | 67 * Inherits from cr.ui.Table. |
| 22 */ | 68 */ |
| 23 FileTable.prototype.__proto__ = cr.ui.Table.prototype; | 69 FileTable.prototype.__proto__ = cr.ui.Table.prototype; |
| 24 | 70 |
| 25 /** | 71 /** |
| 26 * Decorates the element. | 72 * Decorates the element. |
| 27 * @param {HTMLElement} self Table to decorate. | 73 * @param {HTMLElement} self Table to decorate. |
| 28 * @param {MetadataCache} metadataCache To retrieve metadata. | 74 * @param {MetadataCache} metadataCache To retrieve metadata. |
| 29 * @param {boolean} fullPage True if it's full page File Manager, | 75 * @param {boolean} fullPage True if it's full page File Manager, |
| 30 * False if a file open/save dialog. | 76 * False if a file open/save dialog. |
| 31 */ | 77 */ |
| 32 FileTable.decorate = function(self, metadataCache, fullPage) { | 78 FileTable.decorate = function(self, metadataCache, fullPage) { |
| 33 cr.ui.Table.decorate(self); | 79 cr.ui.Table.decorate(self); |
| 34 self.__proto__ = FileTable.prototype; | 80 self.__proto__ = FileTable.prototype; |
| 35 self.metadataCache_ = metadataCache; | 81 self.metadataCache_ = metadataCache; |
| 36 self.collator_ = v8Intl.Collator([], {numeric: true, sensitivity: 'base'}); | 82 self.collator_ = v8Intl.Collator([], {numeric: true, sensitivity: 'base'}); |
| 37 | 83 |
| 38 var columns = [ | 84 var columns = [ |
| 39 new cr.ui.table.TableColumn('name', str('NAME_COLUMN_LABEL'), | 85 new cr.ui.table.TableColumn('name', str('NAME_COLUMN_LABEL'), |
| 40 fullPage ? 386 : 324), | 86 fullPage ? 386 : 324), |
| 41 new cr.ui.table.TableColumn('size', str('SIZE_COLUMN_LABEL'), | 87 new cr.ui.table.TableColumn('size', str('SIZE_COLUMN_LABEL'), |
| 42 fullPage ? 100 : 92, true), | 88 fullPage ? 100 : 92, true), |
| 43 new cr.ui.table.TableColumn('type', str('TYPE_COLUMN_LABEL'), | 89 new cr.ui.table.TableColumn('type', str('TYPE_COLUMN_LABEL'), |
| 44 fullPage ? 160 : 160), | 90 fullPage ? 160 : 160), |
| 45 new cr.ui.table.TableColumn('modificationTime', | 91 new cr.ui.table.TableColumn('modificationTime', |
| 46 str('DATE_COLUMN_LABEL'), | 92 str('DATE_COLUMN_LABEL'), |
| 47 fullPage ? 150 : 210), | 93 fullPage ? 150 : 210) |
| 48 new cr.ui.table.TableColumn('offline', | 94 ]; |
| 49 str('OFFLINE_COLUMN_LABEL'), | |
| 50 130) | |
| 51 ]; | |
| 52 | 95 |
| 53 columns[0].renderFunction = self.renderName_.bind(self); | 96 columns[0].renderFunction = self.renderName_.bind(self); |
| 54 columns[1].renderFunction = self.renderSize_.bind(self); | 97 columns[1].renderFunction = self.renderSize_.bind(self); |
| 55 columns[1].defaultOrder = 'desc'; | 98 columns[1].defaultOrder = 'desc'; |
| 56 columns[2].renderFunction = self.renderType_.bind(self); | 99 columns[2].renderFunction = self.renderType_.bind(self); |
| 57 columns[3].renderFunction = self.renderDate_.bind(self); | 100 columns[3].renderFunction = self.renderDate_.bind(self); |
| 58 columns[3].defaultOrder = 'desc'; | 101 columns[3].defaultOrder = 'desc'; |
| 59 columns[4].renderFunction = self.renderOffline_.bind(self); | |
| 60 | 102 |
| 61 columns[0].headerRenderFunction = | 103 var tableColumnModelClass; |
| 62 self.renderNameColumnHeader_.bind(self, columns[0].name); | 104 if (util.platform.newUI()) { |
| 105 tableColumnModelClass = FileTableColumnModel; |
| 106 columns.push(new cr.ui.table.TableColumn('selection', |
| 107 '', |
| 108 50, true)); |
| 109 columns[4].renderFunction = self.renderSelection_.bind(self); |
| 110 columns[4].headerRenderFunction = |
| 111 self.renderSelectionColumnHeader_.bind(self); |
| 112 } else { |
| 113 tableColumnModelClass = cr.ui.table.TableColumnModel; |
| 114 columns.push(new cr.ui.table.TableColumn('offline', |
| 115 str('OFFLINE_COLUMN_LABEL'), |
| 116 130)); |
| 117 columns[4].renderFunction = self.renderOffline_.bind(self); |
| 118 columns[0].headerRenderFunction = |
| 119 self.renderNameColumnHeader_.bind(self, columns[0].name); |
| 120 } |
| 63 | 121 |
| 64 var columnModel = Object.create(cr.ui.table.TableColumnModel.prototype, { | 122 var columnModel = Object.create(tableColumnModelClass.prototype, { |
| 65 size: { | 123 size: { |
| 66 get: function() { | 124 get: function() { |
| 125 if (util.platform.newUI()) |
| 126 return this.totalSize; |
| 67 return this.showOfflineColumn ? this.totalSize : this.totalSize - 1; | 127 return this.showOfflineColumn ? this.totalSize : this.totalSize - 1; |
| 68 } | 128 } |
| 69 }, | 129 }, |
| 70 | 130 |
| 71 totalSize: { | 131 totalSize: { |
| 72 get: function() { | 132 get: function() { |
| 73 return columns.length; | 133 return columns.length; |
| 74 } | 134 } |
| 75 }, | 135 }, |
| 76 | 136 |
| 77 showOfflineColumn: { | 137 showOfflineColumn: { |
| 78 writable: true, | 138 writable: true, |
| 79 value: false | 139 value: false |
| 80 } | 140 } |
| 81 }); | 141 }); |
| 82 cr.ui.table.TableColumnModel.call(columnModel, columns); | 142 |
| 143 tableColumnModelClass.call(columnModel, columns); |
| 83 self.columnModel = columnModel; | 144 self.columnModel = columnModel; |
| 84 self.setDateTimeFormat(true); | 145 self.setDateTimeFormat(true); |
| 85 self.setRenderFunction(self.renderTableRow_.bind(self, | 146 self.setRenderFunction(self.renderTableRow_.bind(self, |
| 86 self.getRenderFunction())); | 147 self.getRenderFunction())); |
| 87 | 148 |
| 149 if (util.platform.newUI()) |
| 150 ScrollBar.createVertical(self, self.list); |
| 151 |
| 88 var handleSelectionChange = function() { | 152 var handleSelectionChange = function() { |
| 89 var selectAll = self.querySelector('#select-all-checkbox'); | 153 var selectAll = self.querySelector('#select-all-checkbox'); |
| 90 if (selectAll) | 154 if (selectAll) |
| 91 self.updateSelectAllCheckboxState_(selectAll); | 155 self.updateSelectAllCheckboxState_(selectAll); |
| 92 }; | 156 }; |
| 93 | 157 |
| 94 Object.defineProperty(self.list_, 'selectionModel', { | 158 Object.defineProperty(self.list_, 'selectionModel', { |
| 95 get: function() { | 159 get: function() { |
| 96 return this.selectionModel_; | 160 return this.selectionModel_; |
| 97 }, | 161 }, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 * Invoked by cr.ui.Table when a file needs to be rendered. | 235 * Invoked by cr.ui.Table when a file needs to be rendered. |
| 172 * | 236 * |
| 173 * @param {Entry} entry The Entry object to render. | 237 * @param {Entry} entry The Entry object to render. |
| 174 * @param {string} columnId The id of the column to be rendered. | 238 * @param {string} columnId The id of the column to be rendered. |
| 175 * @param {cr.ui.Table} table The table doing the rendering. | 239 * @param {cr.ui.Table} table The table doing the rendering. |
| 176 * @return {HTMLDivElement} Created element. | 240 * @return {HTMLDivElement} Created element. |
| 177 * @private | 241 * @private |
| 178 */ | 242 */ |
| 179 FileTable.prototype.renderName_ = function(entry, columnId, table) { | 243 FileTable.prototype.renderName_ = function(entry, columnId, table) { |
| 180 var label = this.ownerDocument.createElement('div'); | 244 var label = this.ownerDocument.createElement('div'); |
| 181 if (this.selectionModel.multiple) { | 245 if (!util.platform.newUI()) { |
| 182 var checkBox = this.ownerDocument.createElement('INPUT'); | 246 if (this.selectionModel.multiple) { |
| 183 filelist.decorateSelectionCheckbox(checkBox, entry, this.list); | 247 var checkBox = this.ownerDocument.createElement('input'); |
| 184 label.appendChild(checkBox); | 248 filelist.decorateSelectionCheckbox(checkBox, entry, this.list); |
| 249 label.appendChild(checkBox); |
| 250 } |
| 185 } | 251 } |
| 186 label.appendChild(this.renderIconType_(entry, columnId, table)); | 252 label.appendChild(this.renderIconType_(entry, columnId, table)); |
| 187 label.entry = entry; | 253 label.entry = entry; |
| 188 label.className = 'detail-name'; | 254 label.className = 'detail-name'; |
| 189 label.appendChild(filelist.renderFileNameLabel(this.ownerDocument, entry)); | 255 label.appendChild(filelist.renderFileNameLabel(this.ownerDocument, entry)); |
| 190 return label; | 256 return label; |
| 191 }; | 257 }; |
| 192 | 258 |
| 193 /** | 259 /** |
| 260 * Render the Selection column of the detail table. |
| 261 * |
| 262 * Invoked by cr.ui.Table when a file needs to be rendered. |
| 263 * |
| 264 * @param {Entry} entry The Entry object to render. |
| 265 * @param {string} columnId The id of the column to be rendered. |
| 266 * @param {cr.ui.Table} table The table doing the rendering. |
| 267 * @return {HTMLDivElement} Created element. |
| 268 * @private |
| 269 */ |
| 270 FileTable.prototype.renderSelection_ = function(entry, columnId, table) { |
| 271 var label = this.ownerDocument.createElement('div'); |
| 272 label.className = 'selection-label'; |
| 273 if (this.selectionModel.multiple) { |
| 274 var checkBox = this.ownerDocument.createElement('input'); |
| 275 filelist.decorateSelectionCheckbox(checkBox, entry, this.list); |
| 276 label.appendChild(checkBox); |
| 277 } |
| 278 return label; |
| 279 }; |
| 280 |
| 281 /** |
| 194 * Render the Size column of the detail table. | 282 * Render the Size column of the detail table. |
| 195 * | 283 * |
| 196 * @param {Entry} entry The Entry object to render. | 284 * @param {Entry} entry The Entry object to render. |
| 197 * @param {string} columnId The id of the column to be rendered. | 285 * @param {string} columnId The id of the column to be rendered. |
| 198 * @param {cr.ui.Table} table The table doing the rendering. | 286 * @param {cr.ui.Table} table The table doing the rendering. |
| 199 * @return {HTMLDivElement} Created element. | 287 * @return {HTMLDivElement} Created element. |
| 200 * @private | 288 * @private |
| 201 */ | 289 */ |
| 202 FileTable.prototype.renderSize_ = function(entry, columnId, table) { | 290 FileTable.prototype.renderSize_ = function(entry, columnId, table) { |
| 203 var div = this.ownerDocument.createElement('div'); | 291 var div = this.ownerDocument.createElement('div'); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 * @return {HTMLDivElement} Created element. | 409 * @return {HTMLDivElement} Created element. |
| 322 * @private | 410 * @private |
| 323 */ | 411 */ |
| 324 FileTable.prototype.renderOffline_ = function(entry, columnId, table) { | 412 FileTable.prototype.renderOffline_ = function(entry, columnId, table) { |
| 325 var div = this.ownerDocument.createElement('div'); | 413 var div = this.ownerDocument.createElement('div'); |
| 326 div.className = 'offline'; | 414 div.className = 'offline'; |
| 327 | 415 |
| 328 if (entry.isDirectory) | 416 if (entry.isDirectory) |
| 329 return div; | 417 return div; |
| 330 | 418 |
| 331 var checkbox = this.ownerDocument.createElement('INPUT'); | 419 var checkbox = this.ownerDocument.createElement('input'); |
| 332 filelist.decorateCheckbox(checkbox); | 420 filelist.decorateCheckbox(checkbox); |
| 333 checkbox.classList.add('pin'); | 421 checkbox.classList.add('pin'); |
| 334 | 422 |
| 335 var command = this.ownerDocument.querySelector('command#toggle-pinned'); | 423 var command = this.ownerDocument.querySelector('command#toggle-pinned'); |
| 336 var onPinClick = function(event) { | 424 var onPinClick = function(event) { |
| 337 command.canExecuteChange(checkbox); | 425 command.canExecuteChange(checkbox); |
| 338 command.execute(checkbox); | 426 command.execute(checkbox); |
| 339 event.preventDefault(); | 427 event.preventDefault(); |
| 340 }; | 428 }; |
| 341 | 429 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 return item; | 576 return item; |
| 489 }; | 577 }; |
| 490 | 578 |
| 491 /** | 579 /** |
| 492 * Renders the name column header. | 580 * Renders the name column header. |
| 493 * @param {string} name Localized column name. | 581 * @param {string} name Localized column name. |
| 494 * @return {HTMLLiElement} Created element. | 582 * @return {HTMLLiElement} Created element. |
| 495 * @private | 583 * @private |
| 496 */ | 584 */ |
| 497 FileTable.prototype.renderNameColumnHeader_ = function(name) { | 585 FileTable.prototype.renderNameColumnHeader_ = function(name) { |
| 498 if (!this.selectionModel.multiple) { | 586 if (!this.selectionModel.multiple) |
| 499 return this.ownerDocument.createTextNode(name); | 587 return this.ownerDocument.createTextNode(name); |
| 500 } | 588 |
| 501 var input = this.ownerDocument.createElement('input'); | 589 var input = this.ownerDocument.createElement('input'); |
| 502 input.setAttribute('type', 'checkbox'); | 590 input.setAttribute('type', 'checkbox'); |
| 503 input.setAttribute('tabindex', -1); | 591 input.setAttribute('tabindex', -1); |
| 504 input.id = 'select-all-checkbox'; | 592 input.id = 'select-all-checkbox'; |
| 505 input.className = 'common'; | 593 input.className = 'common'; |
| 506 | 594 |
| 507 this.updateSelectAllCheckboxState_(input); | 595 this.updateSelectAllCheckboxState_(input); |
| 508 | 596 |
| 509 input.addEventListener('click', function(event) { | 597 input.addEventListener('click', function(event) { |
| 510 if (input.checked) | 598 if (input.checked) |
| 511 this.selectionModel.selectAll(); | 599 this.selectionModel.selectAll(); |
| 512 else | 600 else |
| 513 this.selectionModel.unselectAll(); | 601 this.selectionModel.unselectAll(); |
| 514 event.stopPropagation(); | 602 event.stopPropagation(); |
| 515 }.bind(this)); | 603 }.bind(this)); |
| 516 | 604 |
| 517 var fragment = this.ownerDocument.createDocumentFragment(); | 605 var fragment = this.ownerDocument.createDocumentFragment(); |
| 518 fragment.appendChild(input); | 606 fragment.appendChild(input); |
| 519 fragment.appendChild(this.ownerDocument.createTextNode(name)); | 607 fragment.appendChild(this.ownerDocument.createTextNode(name)); |
| 520 return fragment; | 608 return fragment; |
| 521 }; | 609 }; |
| 522 | 610 |
| 523 /** | 611 /** |
| 612 * Renders the selection column header. |
| 613 * @param {string} name Localized column name. |
| 614 * @return {HTMLLiElement} Created element. |
| 615 * @private |
| 616 */ |
| 617 FileTable.prototype.renderSelectionColumnHeader_ = function(name) { |
| 618 if (!this.selectionModel.multiple) |
| 619 return this.ownerDocument.createTextNode(''); |
| 620 |
| 621 var input = this.ownerDocument.createElement('input'); |
| 622 input.setAttribute('type', 'checkbox'); |
| 623 input.setAttribute('tabindex', -1); |
| 624 input.id = 'select-all-checkbox'; |
| 625 input.className = 'common'; |
| 626 |
| 627 this.updateSelectAllCheckboxState_(input); |
| 628 |
| 629 input.addEventListener('click', function(event) { |
| 630 if (input.checked) |
| 631 this.selectionModel.selectAll(); |
| 632 else |
| 633 this.selectionModel.unselectAll(); |
| 634 event.stopPropagation(); |
| 635 }.bind(this)); |
| 636 |
| 637 var fragment = this.ownerDocument.createDocumentFragment(); |
| 638 fragment.appendChild(input); |
| 639 return fragment; |
| 640 }; |
| 641 |
| 642 /** |
| 524 * Render the type column of the detail table. | 643 * Render the type column of the detail table. |
| 525 * | 644 * |
| 526 * Invoked by cr.ui.Table when a file needs to be rendered. | 645 * Invoked by cr.ui.Table when a file needs to be rendered. |
| 527 * | 646 * |
| 528 * @param {Entry} entry The Entry object to render. | 647 * @param {Entry} entry The Entry object to render. |
| 529 * @param {string} columnId The id of the column to be rendered. | 648 * @param {string} columnId The id of the column to be rendered. |
| 530 * @param {cr.ui.Table} table The table doing the rendering. | 649 * @param {cr.ui.Table} table The table doing the rendering. |
| 531 * @return {HTMLDivElement} Created element. | 650 * @return {HTMLDivElement} Created element. |
| 532 * @private | 651 * @private |
| 533 */ | 652 */ |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 687 break; | 806 break; |
| 688 } | 807 } |
| 689 } | 808 } |
| 690 if (url) { | 809 if (url) { |
| 691 iconDiv.style.backgroundImage = 'url(' + url + ')'; | 810 iconDiv.style.backgroundImage = 'url(' + url + ')'; |
| 692 } else { | 811 } else { |
| 693 iconDiv.style.backgroundImage = null; | 812 iconDiv.style.backgroundImage = null; |
| 694 } | 813 } |
| 695 } | 814 } |
| 696 }; | 815 }; |
| OLD | NEW |