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

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

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

Powered by Google App Engine
This is Rietveld 408576698