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 930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 return { | 941 return { |
942 first: firstIndex, | 942 first: firstIndex, |
943 length: lastIndex - firstIndex + 1, | 943 length: lastIndex - firstIndex + 1, |
944 last: lastIndex + 1}; | 944 last: lastIndex + 1}; |
945 } | 945 } |
946 }, | 946 }, |
947 | 947 |
948 /** | 948 /** |
949 * Merges list items currently existing in the list with items in the range | 949 * Merges list items currently existing in the list with items in the range |
950 * [firstIndex, lastIndex). Removes or adds items if needed. | 950 * [firstIndex, lastIndex). Removes or adds items if needed. |
951 * Doesn't delete {@code this.pinnedItem_} if it presents (instead hides if | 951 * Doesn't delete {@code this.pinnedItem_} if it is present (instead hides |
952 * it's out of the range). Also adds the items to {@code newCachedItems}. | 952 * it if it is out of the range). Adds items to {@code newCachedItems}. |
953 * @param {number} firstIndex The index of first item, inclusively. | 953 * @param {number} firstIndex The index of first item, inclusively. |
954 * @param {number} lastIndex The index of last item, exclusively. | 954 * @param {number} lastIndex The index of last item, exclusively. |
955 * @param {Object.<string, ListItem>} cachedItems Old items cache. | 955 * @param {Object.<string, ListItem>} cachedItems Old items cache. |
956 * @param {Object.<string, ListItem>} newCachedItems New items cache. | 956 * @param {Object.<string, ListItem>} newCachedItems New items cache. |
957 */ | 957 */ |
958 mergeItems: function(firstIndex, lastIndex, cachedItems, newCachedItems) { | 958 mergeItems: function(firstIndex, lastIndex, cachedItems, newCachedItems) { |
| 959 var self = this; |
959 var dataModel = this.dataModel; | 960 var dataModel = this.dataModel; |
| 961 var currentIndex = firstIndex; |
960 | 962 |
961 function insert(to) { | 963 function insert() { |
962 var dataItem = dataModel.item(currentIndex); | 964 var dataItem = dataModel.item(currentIndex); |
963 var newItem = cachedItems[currentIndex] || to.createItem(dataItem); | 965 var newItem = cachedItems[currentIndex] || self.createItem(dataItem); |
964 newItem.listIndex = currentIndex; | 966 newItem.listIndex = currentIndex; |
965 newCachedItems[currentIndex] = newItem; | 967 newCachedItems[currentIndex] = newItem; |
966 to.insertBefore(newItem, item); | 968 self.insertBefore(newItem, item); |
967 currentIndex++; | 969 currentIndex++; |
968 } | 970 } |
969 | 971 |
970 function remove(from) { | 972 function remove() { |
971 var next = item.nextSibling; | 973 var next = item.nextSibling; |
972 if (item != from.pinnedItem_) | 974 if (item != self.pinnedItem_) |
973 from.removeChild(item); | 975 self.removeChild(item); |
974 item = next; | 976 item = next; |
975 } | 977 } |
976 | 978 |
977 var currentIndex = firstIndex; | |
978 for (var item = this.beforeFiller_.nextSibling; | 979 for (var item = this.beforeFiller_.nextSibling; |
979 item != this.afterFiller_ && currentIndex < lastIndex;) { | 980 item != this.afterFiller_ && currentIndex < lastIndex;) { |
980 if (!this.isItem(item)) { | 981 if (!this.isItem(item)) { |
981 item = item.nextSibling; | 982 item = item.nextSibling; |
982 continue; | 983 continue; |
983 } | 984 } |
984 | 985 |
985 var index = item.listIndex; | 986 var index = item.listIndex; |
986 if (cachedItems[index] != item || index < currentIndex) { | 987 if (cachedItems[index] != item || index < currentIndex) { |
987 remove(this); | 988 remove(); |
988 } else if (index == currentIndex) { | 989 } else if (index == currentIndex) { |
989 newCachedItems[currentIndex] = item; | 990 newCachedItems[currentIndex] = item; |
990 item = item.nextSibling; | 991 item = item.nextSibling; |
991 currentIndex++; | 992 currentIndex++; |
992 } else { // index > currentIndex | 993 } else { // index > currentIndex |
993 insert(this); | 994 insert(); |
994 } | 995 } |
995 } | 996 } |
996 | 997 |
997 while (item != this.afterFiller_) { | 998 while (item != this.afterFiller_) { |
998 if (this.isItem(item)) | 999 if (this.isItem(item)) |
999 remove(this); | 1000 remove(); |
1000 else | 1001 else |
1001 item = item.nextSibling; | 1002 item = item.nextSibling; |
1002 } | 1003 } |
1003 | 1004 |
1004 if (this.pinnedItem_) { | 1005 if (this.pinnedItem_) { |
1005 var index = this.pinnedItem_.listIndex; | 1006 var index = this.pinnedItem_.listIndex; |
1006 this.pinnedItem_.hidden = index < firstIndex || index >= lastIndex; | 1007 this.pinnedItem_.hidden = index < firstIndex || index >= lastIndex; |
1007 newCachedItems[index] = this.pinnedItem_; | 1008 newCachedItems[index] = this.pinnedItem_; |
1008 if (index >= lastIndex) | 1009 if (index >= lastIndex) |
1009 item = this.pinnedItem_; // Insert new items before this one. | 1010 item = this.pinnedItem_; // Insert new items before this one. |
1010 } | 1011 } |
1011 | 1012 |
1012 while (currentIndex < lastIndex) | 1013 while (currentIndex < lastIndex) |
1013 insert(this); | 1014 insert(); |
1014 }, | 1015 }, |
1015 | 1016 |
1016 /** | 1017 /** |
1017 * Ensures that all the item sizes in the list have been already cached. | 1018 * Ensures that all the item sizes in the list have been already cached. |
1018 */ | 1019 */ |
1019 ensureAllItemSizesInCache: function() { | 1020 ensureAllItemSizesInCache: function() { |
1020 var measuringIndexes = []; | 1021 var measuringIndexes = []; |
1021 var isElementAppended = []; | 1022 var isElementAppended = []; |
1022 for (var y = 0; y < this.dataModel.length; y++) { | 1023 for (var y = 0; y < this.dataModel.length; y++) { |
1023 if (!this.cachedItemHeights_[y]) { | 1024 if (!this.cachedItemHeights_[y]) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 }, | 1081 }, |
1081 | 1082 |
1082 /** | 1083 /** |
1083 * Redraws the viewport. | 1084 * Redraws the viewport. |
1084 */ | 1085 */ |
1085 redraw: function() { | 1086 redraw: function() { |
1086 if (this.batchCount_ != 0) | 1087 if (this.batchCount_ != 0) |
1087 return; | 1088 return; |
1088 | 1089 |
1089 var dataModel = this.dataModel; | 1090 var dataModel = this.dataModel; |
1090 if (!dataModel) { | 1091 if (!dataModel || !this.autoExpands_ && this.clientHeight == 0) { |
1091 this.cachedItems_ = {}; | 1092 this.cachedItems_ = {}; |
1092 this.firstIndex_ = 0; | 1093 this.firstIndex_ = 0; |
1093 this.lastIndex_ = 0; | 1094 this.lastIndex_ = 0; |
1094 this.remainingSpace_ = true; | 1095 this.remainingSpace_ = true; |
1095 this.mergeItems(0, 0, {}, {}); | 1096 this.mergeItems(0, 0, {}, {}); |
1096 return; | 1097 return; |
1097 } | 1098 } |
1098 | 1099 |
1099 // Save the previous positions before any manipulation of elements. | 1100 // Save the previous positions before any manipulation of elements. |
1100 var scrollTop = this.scrollTop; | 1101 var scrollTop = this.scrollTop; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 * because list items can contain controls that can be focused, and for some | 1283 * because list items can contain controls that can be focused, and for some |
1283 * purposes (e.g., styling), the list can still be conceptually focused at | 1284 * purposes (e.g., styling), the list can still be conceptually focused at |
1284 * that point even though it doesn't actually have the page focus. | 1285 * that point even though it doesn't actually have the page focus. |
1285 */ | 1286 */ |
1286 cr.defineProperty(List, 'hasElementFocus', cr.PropertyKind.BOOL_ATTR); | 1287 cr.defineProperty(List, 'hasElementFocus', cr.PropertyKind.BOOL_ATTR); |
1287 | 1288 |
1288 return { | 1289 return { |
1289 List: List | 1290 List: List |
1290 }; | 1291 }; |
1291 }); | 1292 }); |
OLD | NEW |