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 // require: array_data_model.js | 5 // require: array_data_model.js |
6 // require: list_selection_model.js | 6 // require: list_selection_model.js |
7 // require: list_selection_controller.js | 7 // require: list_selection_controller.js |
8 // require: list_item.js | 8 // require: list_item.js |
9 | 9 |
10 /** | 10 /** |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
339 this.nextUniqueIdSuffix_ = 0; | 339 this.nextUniqueIdSuffix_ = 0; |
340 }, | 340 }, |
341 | 341 |
342 /** | 342 /** |
343 * @param {ListItem=} item The list item to measure. | 343 * @param {ListItem=} item The list item to measure. |
344 * @return {number} The height of the given item. If the fixed height on CSS | 344 * @return {number} The height of the given item. If the fixed height on CSS |
345 * is set by 'px', uses that value as height. Otherwise, measures the size. | 345 * is set by 'px', uses that value as height. Otherwise, measures the size. |
346 * @private | 346 * @private |
347 */ | 347 */ |
348 measureItemHeight_: function(item) { | 348 measureItemHeight_: function(item) { |
349 var height = item.style.height; | |
350 // Use the fixed height if set it on CSS, to save a time of layout | |
351 // calculation. | |
352 if (height && height.substr(-2) == 'px') | |
SeRya
2012/11/30 13:20:01
This code ignored item margins.
| |
353 return parseInt(height.substr(0, height.length - 2)); | |
354 | |
355 return this.measureItem(item).height; | 349 return this.measureItem(item).height; |
356 }, | 350 }, |
357 | 351 |
358 /** | 352 /** |
359 * @return {number} The height of default item, measuring it if necessary. | 353 * @return {number} The height of default item, measuring it if necessary. |
360 * @private | 354 * @private |
361 */ | 355 */ |
362 getDefaultItemHeight_: function() { | 356 getDefaultItemHeight_: function() { |
363 return this.getDefaultItemSize_().height; | 357 return this.getDefaultItemSize_().height; |
364 }, | 358 }, |
365 | 359 |
366 /** | 360 /** |
367 * @param {number} index The index of the item. | 361 * @param {number} index The index of the item. |
368 * @return {number} The height of the item, measuring it if necessary. | 362 * @return {number} The height of the item, measuring it if necessary. |
369 */ | 363 */ |
370 getItemHeightByIndex_: function(index) { | 364 getItemHeightByIndex_: function(index) { |
371 // If |this.fixedHeight_| is true, all the rows have same default height. | 365 // If |this.fixedHeight_| is true, all the rows have same default height. |
372 if (this.fixedHeight_) | 366 if (this.fixedHeight_) |
373 return this.getDefaultItemHeight_(); | 367 return this.getDefaultItemHeight_(); |
374 | 368 |
375 if (this.cachedItemHeights_[index]) | 369 if (this.cachedItemHeights_[index]) |
376 return this.cachedItemHeights_[index]; | 370 return this.cachedItemHeights_[index]; |
377 | 371 |
378 var item = this.getListItemByIndex(index); | 372 var item = this.getListItemByIndex(index); |
379 if (item) | 373 if (item) { |
380 return this.measureItemHeight_(item); | 374 var h = this.measureItemHeight_(item); |
381 | 375 this.cachedItemHeights_[index] = h; |
376 return h; | |
377 } | |
382 return this.getDefaultItemHeight_(); | 378 return this.getDefaultItemHeight_(); |
383 }, | 379 }, |
384 | 380 |
385 /** | 381 /** |
386 * @return {{height: number, width: number}} The height and width | 382 * @return {{height: number, width: number}} The height and width |
387 * of default item, measuring it if necessary. | 383 * of default item, measuring it if necessary. |
388 * @private | 384 * @private |
389 */ | 385 */ |
390 getDefaultItemSize_: function() { | 386 getDefaultItemSize_: function() { |
391 if (!this.measured_ || !this.measured_.height) { | 387 if (!this.measured_ || !this.measured_.height) { |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
681 | 677 |
682 /** | 678 /** |
683 * @param {number} index The index of the item. | 679 * @param {number} index The index of the item. |
684 * @return {number} The top position of the item inside the list. | 680 * @return {number} The top position of the item inside the list. |
685 */ | 681 */ |
686 getItemTop: function(index) { | 682 getItemTop: function(index) { |
687 if (this.fixedHeight_) { | 683 if (this.fixedHeight_) { |
688 var itemHeight = this.getDefaultItemHeight_(); | 684 var itemHeight = this.getDefaultItemHeight_(); |
689 return index * itemHeight; | 685 return index * itemHeight; |
690 } else { | 686 } else { |
687 this.ensureAllItemSizesInCache(); | |
691 var top = 0; | 688 var top = 0; |
692 for (var i = 0; i < index; i++) { | 689 for (var i = 0; i < index; i++) { |
693 top += this.getItemHeightByIndex_(i); | 690 top += this.getItemHeightByIndex_(i); |
694 } | 691 } |
695 return top; | 692 return top; |
696 } | 693 } |
697 }, | 694 }, |
698 | 695 |
699 /** | 696 /** |
700 * @param {number} index The index of the item. | 697 * @param {number} index The index of the item. |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1046 for (var y = 0; y < measuringIndexes.length; y++) { | 1043 for (var y = 0; y < measuringIndexes.length; y++) { |
1047 // If the list item has been appended above, removes it. | 1044 // If the list item has been appended above, removes it. |
1048 if (isElementAppended[y]) | 1045 if (isElementAppended[y]) |
1049 this.removeChild(measuringItems[y]); | 1046 this.removeChild(measuringItems[y]); |
1050 } | 1047 } |
1051 }, | 1048 }, |
1052 | 1049 |
1053 /** | 1050 /** |
1054 * Returns the height of after filler in the list. | 1051 * Returns the height of after filler in the list. |
1055 * @param {number} lastIndex The index of item past the last in viewport. | 1052 * @param {number} lastIndex The index of item past the last in viewport. |
1056 * @param {number} itemHeight The height of the item. | |
1057 * @return {number} The height of after filler. | 1053 * @return {number} The height of after filler. |
1058 */ | 1054 */ |
1059 getAfterFillerHeight: function(lastIndex) { | 1055 getAfterFillerHeight: function(lastIndex) { |
1060 if (this.fixedHeight_) { | 1056 if (this.fixedHeight_) { |
1061 var itemHeight = this.getDefaultItemHeight_(); | 1057 var itemHeight = this.getDefaultItemHeight_(); |
1062 return (this.dataModel.length - lastIndex) * itemHeight; | 1058 return (this.dataModel.length - lastIndex) * itemHeight; |
1063 } | 1059 } |
1064 | 1060 |
1065 var height = 0; | 1061 var height = 0; |
1066 for (var i = lastIndex; i < this.dataModel.length; i++) | 1062 for (var i = lastIndex; i < this.dataModel.length; i++) |
1067 height += this.getItemHeightByIndex_(i); | 1063 height += this.getItemHeightByIndex_(i); |
1068 return height; | 1064 return height; |
1069 }, | 1065 }, |
1070 | 1066 |
1071 /** | 1067 /** |
1072 * Redraws the viewport. | 1068 * Redraws the viewport. |
1073 */ | 1069 */ |
1074 redraw: function() { | 1070 redraw: function() { |
1075 if (this.batchCount_ != 0) | 1071 if (this.batchCount_ != 0) |
1076 return; | 1072 return; |
1077 | 1073 |
1078 var dataModel = this.dataModel; | 1074 var dataModel = this.dataModel; |
1079 if (!dataModel || !this.autoExpands_ && this.clientHeight == 0) { | 1075 if (!dataModel || !this.autoExpands_ && this.clientHeight == 0) { |
1080 this.cachedItems_ = {}; | 1076 this.cachedItems_ = {}; |
1081 this.firstIndex_ = 0; | 1077 this.firstIndex_ = 0; |
1082 this.lastIndex_ = 0; | 1078 this.lastIndex_ = 0; |
1083 this.remainingSpace_ = true; | 1079 this.remainingSpace_ = this.clientHeight != 0; |
1084 this.mergeItems(0, 0, {}, {}); | 1080 this.mergeItems(0, 0, {}, {}); |
1085 return; | 1081 return; |
1086 } | 1082 } |
1087 | 1083 |
1088 // Save the previous positions before any manipulation of elements. | 1084 // Save the previous positions before any manipulation of elements. |
1089 var scrollTop = this.scrollTop; | 1085 var scrollTop = this.scrollTop; |
1090 var clientHeight = this.clientHeight; | 1086 var clientHeight = this.clientHeight; |
1091 | 1087 |
1092 // Store all the item sizes into the cache in advance, to prevent | 1088 // Store all the item sizes into the cache in advance, to prevent |
1093 // interleave measuring with mutating dom. | 1089 // interleave measuring with mutating dom. |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1272 * because list items can contain controls that can be focused, and for some | 1268 * because list items can contain controls that can be focused, and for some |
1273 * purposes (e.g., styling), the list can still be conceptually focused at | 1269 * purposes (e.g., styling), the list can still be conceptually focused at |
1274 * that point even though it doesn't actually have the page focus. | 1270 * that point even though it doesn't actually have the page focus. |
1275 */ | 1271 */ |
1276 cr.defineProperty(List, 'hasElementFocus', cr.PropertyKind.BOOL_ATTR); | 1272 cr.defineProperty(List, 'hasElementFocus', cr.PropertyKind.BOOL_ATTR); |
1277 | 1273 |
1278 return { | 1274 return { |
1279 List: List | 1275 List: List |
1280 }; | 1276 }; |
1281 }); | 1277 }); |
OLD | NEW |