4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 <title>The source code</title>
6 <link href="../prettify/prettify.css" type="text/css" rel="stylesheet" />
7 <script type="text/javascript" src="../prettify/prettify.js"></script>
8 <style type="text/css">
9 .highlight { display: block; background-color: #ddd; }
11 <script type="text/javascript">
12 function highlight() {
13 document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
17 <body onload="prettyPrint(); highlight();">
18 <pre class="prettyprint lang-js"><span id='Ext-grid-PagingScroller'>/**
19 </span> * @class Ext.grid.PagingScroller
20 * @extends Ext.grid.Scroller
24 Ext.define('Ext.grid.PagingScroller', {
25 extend: 'Ext.grid.Scroller',
26 alias: 'widget.paginggridscroller',
29 // '<tpl for="pages">',
30 // '<div class="' + Ext.baseCSSPrefix + 'stretcher" style="width: {width}px;height: {height}px;"></div>',
33 <span id='Ext-grid-PagingScroller-cfg-percentageFromEdge'> /**
34 </span> * @cfg {Number} percentageFromEdge This is a number above 0 and less than 1 which specifies
35 * at what percentage to begin fetching the next page. For example if the pageSize is 100
36 * and the percentageFromEdge is the default of 0.35, the paging scroller will prefetch pages
37 * when scrolling up between records 0 and 34 and when scrolling down between records 65 and 99.
39 percentageFromEdge: 0.35,
41 <span id='Ext-grid-PagingScroller-cfg-scrollToLoadBuffer'> /**
42 </span> * @cfg {Number} scrollToLoadBuffer This is the time in milliseconds to buffer load requests
43 * when scrolling the PagingScrollbar.
45 scrollToLoadBuffer: 200,
54 initComponent: function() {
58 ds.on('guaranteedrange', this.onGuaranteedRange, this);
59 this.callParent(arguments);
63 onGuaranteedRange: function(range, start, end) {
67 // this should never happen
68 if (range.length && me.visibleStart < range[0].index) {
72 ds.loadRecords(range);
78 me.on('afterrender', this.invalidate, this, {single: true});
91 scrollerElDom = this.el.dom,
92 rowOffset = me.visibleStart - store.guaranteedStart,
93 scrollBy = rowOffset * me.rowHeight,
94 scrollHeight = scrollerElDom.scrollHeight,
95 clientHeight = scrollerElDom.clientHeight,
96 scrollTop = scrollerElDom.scrollTop,
99 // BrowserBug: clientHeight reports 0 in IE9 StrictMode
100 // Instead we are using offsetHeight and hardcoding borders
101 if (Ext.isIE9 && Ext.isStrict) {
102 clientHeight = scrollerElDom.offsetHeight + 2;
105 // This should always be zero or greater than zero but staying
106 // safe and less than 0 we'll scroll to the bottom.
107 useMaximum = (scrollHeight - clientHeight - scrollTop <= 0);
108 this.setViewScrollTop(scrollBy, useMaximum);
111 getPageData : function(){
112 var panel = this.getPanel(),
114 totalCount = store.getTotalCount();
118 currentPage : store.currentPage,
119 pageCount: Math.ceil(totalCount / store.pageSize),
120 fromRecord: ((store.currentPage - 1) * store.pageSize) + 1,
121 toRecord: Math.min(store.currentPage * store.pageSize, totalCount)
125 onElScroll: function(e, t) {
127 panel = me.getPanel(),
129 pageSize = store.pageSize,
130 guaranteedStart = store.guaranteedStart,
131 guaranteedEnd = store.guaranteedEnd,
132 totalCount = store.getTotalCount(),
133 numFromEdge = Math.ceil(me.percentageFromEdge * store.pageSize),
134 position = t.scrollTop,
135 visibleStart = Math.floor(position / me.rowHeight),
136 view = panel.down('tableview'),
138 visibleHeight = viewEl.getHeight(),
139 visibleAhead = Math.ceil(visibleHeight / me.rowHeight),
140 visibleEnd = visibleStart + visibleAhead,
141 prevPage = Math.floor(visibleStart / store.pageSize),
142 nextPage = Math.floor(visibleEnd / store.pageSize) + 2,
143 lastPage = Math.ceil(totalCount / store.pageSize),
144 //requestStart = visibleStart,
145 requestStart = Math.floor(visibleStart / me.snapIncrement) * me.snapIncrement,
146 requestEnd = requestStart + pageSize - 1,
147 activePrefetch = me.activePrefetch;
149 me.visibleStart = visibleStart;
150 me.visibleEnd = visibleEnd;
153 me.syncScroll = true;
154 if (totalCount >= pageSize) {
155 // end of request was past what the total is, grab from the end back a pageSize
156 if (requestEnd > totalCount - 1) {
158 if (store.rangeSatisfied(totalCount - pageSize, totalCount - 1)) {
159 me.syncScroll = true;
161 store.guaranteeRange(totalCount - pageSize, totalCount - 1);
162 // Out of range, need to reset the current data set
163 } else if (visibleStart < guaranteedStart || visibleEnd > guaranteedEnd) {
164 if (store.rangeSatisfied(requestStart, requestEnd)) {
166 store.guaranteeRange(requestStart, requestEnd);
169 me.attemptLoad(requestStart, requestEnd);
171 // dont sync the scroll view immediately, sync after the range has been guaranteed
172 me.syncScroll = false;
173 } else if (activePrefetch && visibleStart < (guaranteedStart + numFromEdge) && prevPage > 0) {
174 me.syncScroll = true;
175 store.prefetchPage(prevPage);
176 } else if (activePrefetch && visibleEnd > (guaranteedEnd - numFromEdge) && nextPage < lastPage) {
177 me.syncScroll = true;
178 store.prefetchPage(nextPage);
188 getSizeCalculation: function() {
189 // Use the direct ownerCt here rather than the scrollerOwner
190 // because we are calculating widths/heights.
191 var owner = this.ownerCt,
192 view = owner.getView(),
199 if (!this.rowHeight) {
200 this.rowHeight = view.el.down(view.getItemSelector()).getHeight(false, true);
203 height = store.getTotalCount() * this.rowHeight;
217 attemptLoad: function(start, end) {
220 me.loadTask = Ext.create('Ext.util.DelayedTask', me.doAttemptLoad, me, []);
222 me.loadTask.delay(me.scrollToLoadBuffer, me.doAttemptLoad, me, [start, end]);
225 cancelLoad: function() {
227 this.loadTask.cancel();
231 doAttemptLoad: function(start, end) {
232 var store = this.getPanel().store;
233 store.guaranteeRange(start, end);
236 setViewScrollTop: function(scrollTop, useMax) {
237 var owner = this.getPanel(),
238 items = owner.query('tableview'),
245 scrollerElDom = this.el.dom;
247 owner.virtualScrollTop = scrollTop;
249 center = items[1] || items[0];
250 centerEl = center.el.dom;
252 maxScrollTop = ((owner.store.pageSize * this.rowHeight) - centerEl.clientHeight);
253 calcScrollTop = (scrollTop % ((owner.store.pageSize * this.rowHeight) + 1));
255 calcScrollTop = maxScrollTop;
257 if (calcScrollTop > maxScrollTop) {
258 //Ext.Error.raise("Calculated scrollTop was larger than maxScrollTop");
260 // calcScrollTop = maxScrollTop;
262 for (; i < len; i++) {
263 items[i].el.dom.scrollTop = calcScrollTop;