root / trunk / web / dojo / dojox / grid / _Scroller.js @ 10
History | View | Annotate | Download (10.1 KB)
1 | 9 | andrej.cim | /*
|
---|---|---|---|
2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
4 | see: http://dojotoolkit.org/license for details
|
||
5 | */
|
||
6 | |||
7 | |||
8 | if(!dojo._hasResource["dojox.grid._Scroller"]){ |
||
9 | dojo._hasResource["dojox.grid._Scroller"]=true; |
||
10 | dojo.provide("dojox.grid._Scroller");
|
||
11 | (function(){
|
||
12 | var _1=function(_2){ |
||
13 | var i=0,n,p=_2.parentNode; |
||
14 | while((n=p.childNodes[i++])){
|
||
15 | if(n==_2){
|
||
16 | return i-1; |
||
17 | } |
||
18 | } |
||
19 | return -1; |
||
20 | }; |
||
21 | var _3=function(_4){ |
||
22 | if(!_4){
|
||
23 | return;
|
||
24 | } |
||
25 | var _5=function(_6){ |
||
26 | return _6.domNode&&dojo.isDescendant(_6.domNode,_4,true); |
||
27 | }; |
||
28 | var ws=dijit.registry.filter(_5);
|
||
29 | for(var i=0,w;(w=ws[i]);i++){ |
||
30 | w.destroy(); |
||
31 | } |
||
32 | delete ws;
|
||
33 | }; |
||
34 | var _7=function(_8){ |
||
35 | var _9=dojo.byId(_8);
|
||
36 | return (_9&&_9.tagName?_9.tagName.toLowerCase():""); |
||
37 | }; |
||
38 | var _a=function(_b,_c){ |
||
39 | var _d=[];
|
||
40 | var i=0,n; |
||
41 | while((n=_b.childNodes[i])){
|
||
42 | i++; |
||
43 | if(_7(n)==_c){
|
||
44 | _d.push(n); |
||
45 | } |
||
46 | } |
||
47 | return _d;
|
||
48 | }; |
||
49 | var _e=function(_f){ |
||
50 | return _a(_f,"div"); |
||
51 | }; |
||
52 | dojo.declare("dojox.grid._Scroller",null,{constructor:function(_10){ |
||
53 | this.setContentNodes(_10);
|
||
54 | this.pageHeights=[];
|
||
55 | this.pageNodes=[];
|
||
56 | this.stack=[];
|
||
57 | },rowCount:0,defaultRowHeight:32,keepRows:100,contentNode:null,scrollboxNode:null,defaultPageHeight:0,keepPages:10,pageCount:0,windowHeight:0,firstVisibleRow:0,lastVisibleRow:0,averageRowHeight:0,page:0,pageTop:0,init:function(_11,_12,_13){ |
||
58 | switch(arguments.length){ |
||
59 | case 3: |
||
60 | this.rowsPerPage=_13;
|
||
61 | case 2: |
||
62 | this.keepRows=_12;
|
||
63 | case 1: |
||
64 | this.rowCount=_11;
|
||
65 | default:
|
||
66 | break;
|
||
67 | } |
||
68 | this.defaultPageHeight=this.defaultRowHeight*this.rowsPerPage; |
||
69 | this.pageCount=this._getPageCount(this.rowCount,this.rowsPerPage); |
||
70 | this.setKeepInfo(this.keepRows); |
||
71 | this.invalidate();
|
||
72 | if(this.scrollboxNode){ |
||
73 | this.scrollboxNode.scrollTop=0; |
||
74 | this.scroll(0); |
||
75 | this.scrollboxNode.onscroll=dojo.hitch(this,"onscroll"); |
||
76 | } |
||
77 | },_getPageCount:function(_14,_15){ |
||
78 | return _14?(Math.ceil(_14/_15)||1):0; |
||
79 | },destroy:function(){ |
||
80 | this.invalidateNodes();
|
||
81 | delete this.contentNodes; |
||
82 | delete this.contentNode; |
||
83 | delete this.scrollboxNode; |
||
84 | },setKeepInfo:function(_16){ |
||
85 | this.keepRows=_16;
|
||
86 | this.keepPages=!this.keepRows?this.keepPages:Math.max(Math.ceil(this.keepRows/this.rowsPerPage),2); |
||
87 | },setContentNodes:function(_17){ |
||
88 | this.contentNodes=_17;
|
||
89 | this.colCount=(this.contentNodes?this.contentNodes.length:0); |
||
90 | this.pageNodes=[];
|
||
91 | for(var i=0;i<this.colCount;i++){ |
||
92 | this.pageNodes[i]=[];
|
||
93 | } |
||
94 | },getDefaultNodes:function(){ |
||
95 | return this.pageNodes[0]||[]; |
||
96 | },invalidate:function(){ |
||
97 | this._invalidating=true; |
||
98 | this.invalidateNodes();
|
||
99 | this.pageHeights=[];
|
||
100 | this.height=(this.pageCount?(this.pageCount-1)*this.defaultPageHeight+this.calcLastPageHeight():0); |
||
101 | this.resize();
|
||
102 | this._invalidating=false; |
||
103 | },updateRowCount:function(_18){ |
||
104 | this.invalidateNodes();
|
||
105 | this.rowCount=_18;
|
||
106 | var _19=this.pageCount; |
||
107 | if(_19===0){ |
||
108 | this.height=1; |
||
109 | } |
||
110 | this.pageCount=this._getPageCount(this.rowCount,this.rowsPerPage); |
||
111 | if(this.pageCount<_19){ |
||
112 | for(var i=_19-1;i>=this.pageCount;i--){ |
||
113 | this.height-=this.getPageHeight(i); |
||
114 | delete this.pageHeights[i]; |
||
115 | } |
||
116 | }else{
|
||
117 | if(this.pageCount>_19){ |
||
118 | this.height+=this.defaultPageHeight*(this.pageCount-_19-1)+this.calcLastPageHeight(); |
||
119 | } |
||
120 | } |
||
121 | this.resize();
|
||
122 | },pageExists:function(_1a){ |
||
123 | return Boolean(this.getDefaultPageNode(_1a)); |
||
124 | },measurePage:function(_1b){ |
||
125 | if(this.grid.rowHeight){ |
||
126 | var _1c=this.grid.rowHeight+1; |
||
127 | return ((_1b+1)*this.rowsPerPage>this.rowCount?this.rowCount-_1b*this.rowsPerPage:this.rowsPerPage)*_1c; |
||
128 | } |
||
129 | var n=this.getDefaultPageNode(_1b); |
||
130 | return (n&&n.innerHTML)?n.offsetHeight:undefined; |
||
131 | },positionPage:function(_1d,_1e){ |
||
132 | for(var i=0;i<this.colCount;i++){ |
||
133 | this.pageNodes[i][_1d].style.top=_1e+"px"; |
||
134 | } |
||
135 | },repositionPages:function(_1f){ |
||
136 | var _20=this.getDefaultNodes(); |
||
137 | var _21=0; |
||
138 | for(var i=0;i<this.stack.length;i++){ |
||
139 | _21=Math.max(this.stack[i],_21);
|
||
140 | } |
||
141 | var n=_20[_1f];
|
||
142 | var y=(n?this.getPageNodePosition(n)+this.getPageHeight(_1f):0); |
||
143 | for(var p=_1f+1;p<=_21;p++){ |
||
144 | n=_20[p]; |
||
145 | if(n){
|
||
146 | if(this.getPageNodePosition(n)==y){ |
||
147 | return;
|
||
148 | } |
||
149 | this.positionPage(p,y);
|
||
150 | } |
||
151 | y+=this.getPageHeight(p);
|
||
152 | } |
||
153 | },installPage:function(_22){ |
||
154 | for(var i=0;i<this.colCount;i++){ |
||
155 | this.contentNodes[i].appendChild(this.pageNodes[i][_22]); |
||
156 | } |
||
157 | },preparePage:function(_23,_24){ |
||
158 | var p=(_24?this.popPage():null); |
||
159 | for(var i=0;i<this.colCount;i++){ |
||
160 | var _25=this.pageNodes[i]; |
||
161 | var _26=(p===null?this.createPageNode():this.invalidatePageNode(p,_25)); |
||
162 | _26.pageIndex=_23; |
||
163 | _25[_23]=_26; |
||
164 | } |
||
165 | },renderPage:function(_27){ |
||
166 | var _28=[];
|
||
167 | var i,j;
|
||
168 | for(i=0;i<this.colCount;i++){ |
||
169 | _28[i]=this.pageNodes[i][_27];
|
||
170 | } |
||
171 | for(i=0,j=_27*this.rowsPerPage;(i<this.rowsPerPage)&&(j<this.rowCount);i++,j++){ |
||
172 | this.renderRow(j,_28);
|
||
173 | } |
||
174 | },removePage:function(_29){ |
||
175 | for(var i=0,j=_29*this.rowsPerPage;i<this.rowsPerPage;i++,j++){ |
||
176 | this.removeRow(j);
|
||
177 | } |
||
178 | },destroyPage:function(_2a){ |
||
179 | for(var i=0;i<this.colCount;i++){ |
||
180 | var n=this.invalidatePageNode(_2a,this.pageNodes[i]); |
||
181 | if(n){
|
||
182 | dojo.destroy(n); |
||
183 | } |
||
184 | } |
||
185 | },pacify:function(_2b){ |
||
186 | },pacifying:false,pacifyTicks:200,setPacifying:function(_2c){ |
||
187 | if(this.pacifying!=_2c){ |
||
188 | this.pacifying=_2c;
|
||
189 | this.pacify(this.pacifying); |
||
190 | } |
||
191 | },startPacify:function(){ |
||
192 | this.startPacifyTicks=new Date().getTime(); |
||
193 | },doPacify:function(){ |
||
194 | var _2d=(new Date().getTime()-this.startPacifyTicks)>this.pacifyTicks; |
||
195 | this.setPacifying(true); |
||
196 | this.startPacify();
|
||
197 | return _2d;
|
||
198 | },endPacify:function(){ |
||
199 | this.setPacifying(false); |
||
200 | },resize:function(){ |
||
201 | if(this.scrollboxNode){ |
||
202 | this.windowHeight=this.scrollboxNode.clientHeight; |
||
203 | } |
||
204 | for(var i=0;i<this.colCount;i++){ |
||
205 | dojox.grid.util.setStyleHeightPx(this.contentNodes[i],Math.max(1,this.height)); |
||
206 | } |
||
207 | var _2e=(!this._invalidating); |
||
208 | if(!_2e){
|
||
209 | var ah=this.grid.attr("autoHeight"); |
||
210 | if(typeof ah=="number"&&ah<=Math.min(this.rowsPerPage,this.rowCount)){ |
||
211 | _2e=true;
|
||
212 | } |
||
213 | } |
||
214 | if(_2e){
|
||
215 | this.needPage(this.page,this.pageTop); |
||
216 | } |
||
217 | var _2f=(this.page<this.pageCount-1)?this.rowsPerPage:((this.rowCount%this.rowsPerPage)||this.rowsPerPage); |
||
218 | var _30=this.getPageHeight(this.page); |
||
219 | this.averageRowHeight=(_30>0&&_2f>0)?(_30/_2f):0; |
||
220 | },calcLastPageHeight:function(){ |
||
221 | if(!this.pageCount){ |
||
222 | return 0; |
||
223 | } |
||
224 | var _31=this.pageCount-1; |
||
225 | var _32=((this.rowCount%this.rowsPerPage)||(this.rowsPerPage))*this.defaultRowHeight; |
||
226 | this.pageHeights[_31]=_32;
|
||
227 | return _32;
|
||
228 | },updateContentHeight:function(_33){ |
||
229 | this.height+=_33;
|
||
230 | this.resize();
|
||
231 | },updatePageHeight:function(_34,_35){ |
||
232 | if(this.pageExists(_34)){ |
||
233 | var oh=this.getPageHeight(_34); |
||
234 | var h=(this.measurePage(_34)); |
||
235 | if(h===undefined){ |
||
236 | h=oh; |
||
237 | } |
||
238 | this.pageHeights[_34]=h;
|
||
239 | if(oh!=h){
|
||
240 | this.updateContentHeight(h-oh);
|
||
241 | var ah=this.grid.attr("autoHeight"); |
||
242 | if((typeof ah=="number"&&ah>this.rowCount)||(ah===true&&!_35)){ |
||
243 | this.grid.sizeChange();
|
||
244 | }else{
|
||
245 | this.repositionPages(_34);
|
||
246 | } |
||
247 | } |
||
248 | return h;
|
||
249 | } |
||
250 | return 0; |
||
251 | },rowHeightChanged:function(_36){ |
||
252 | this.updatePageHeight(Math.floor(_36/this.rowsPerPage),false); |
||
253 | },invalidateNodes:function(){ |
||
254 | while(this.stack.length){ |
||
255 | this.destroyPage(this.popPage()); |
||
256 | } |
||
257 | },createPageNode:function(){ |
||
258 | var p=document.createElement("div"); |
||
259 | dojo.attr(p,"role","presentation"); |
||
260 | p.style.position="absolute";
|
||
261 | p.style[dojo._isBodyLtr()?"left":"right"]="0"; |
||
262 | return p;
|
||
263 | },getPageHeight:function(_37){ |
||
264 | var ph=this.pageHeights[_37]; |
||
265 | return (ph!==undefined?ph:this.defaultPageHeight); |
||
266 | },pushPage:function(_38){ |
||
267 | return this.stack.push(_38); |
||
268 | },popPage:function(){ |
||
269 | return this.stack.shift(); |
||
270 | },findPage:function(_39){ |
||
271 | var i=0,h=0; |
||
272 | for(var ph=0;i<this.pageCount;i++,h+=ph){ |
||
273 | ph=this.getPageHeight(i);
|
||
274 | if(h+ph>=_39){
|
||
275 | break;
|
||
276 | } |
||
277 | } |
||
278 | this.page=i;
|
||
279 | this.pageTop=h;
|
||
280 | },buildPage:function(_3a,_3b,_3c){ |
||
281 | this.preparePage(_3a,_3b);
|
||
282 | this.positionPage(_3a,_3c);
|
||
283 | this.installPage(_3a);
|
||
284 | this.renderPage(_3a);
|
||
285 | this.pushPage(_3a);
|
||
286 | },needPage:function(_3d,_3e){ |
||
287 | var h=this.getPageHeight(_3d),oh=h; |
||
288 | if(!this.pageExists(_3d)){ |
||
289 | this.buildPage(_3d,this.keepPages&&(this.stack.length>=this.keepPages),_3e); |
||
290 | h=this.updatePageHeight(_3d,true); |
||
291 | }else{
|
||
292 | this.positionPage(_3d,_3e);
|
||
293 | } |
||
294 | return h;
|
||
295 | },onscroll:function(){ |
||
296 | this.scroll(this.scrollboxNode.scrollTop); |
||
297 | },scroll:function(_3f){ |
||
298 | this.grid.scrollTop=_3f;
|
||
299 | if(this.colCount){ |
||
300 | this.startPacify();
|
||
301 | this.findPage(_3f);
|
||
302 | var h=this.height; |
||
303 | var b=this.getScrollBottom(_3f); |
||
304 | for(var p=this.page,y=this.pageTop;(p<this.pageCount)&&((b<0)||(y<b));p++){ |
||
305 | y+=this.needPage(p,y);
|
||
306 | } |
||
307 | this.firstVisibleRow=this.getFirstVisibleRow(this.page,this.pageTop,_3f); |
||
308 | this.lastVisibleRow=this.getLastVisibleRow(p-1,y,b); |
||
309 | if(h!=this.height){ |
||
310 | this.repositionPages(p-1); |
||
311 | } |
||
312 | this.endPacify();
|
||
313 | } |
||
314 | },getScrollBottom:function(_40){ |
||
315 | return (this.windowHeight>=0?_40+this.windowHeight:-1); |
||
316 | },processNodeEvent:function(e,_41){ |
||
317 | var t=e.target;
|
||
318 | while(t&&(t!=_41)&&t.parentNode&&(t.parentNode.parentNode!=_41)){
|
||
319 | t=t.parentNode; |
||
320 | } |
||
321 | if(!t||!t.parentNode||(t.parentNode.parentNode!=_41)){
|
||
322 | return false; |
||
323 | } |
||
324 | var _42=t.parentNode;
|
||
325 | e.topRowIndex=_42.pageIndex*this.rowsPerPage;
|
||
326 | e.rowIndex=e.topRowIndex+_1(t); |
||
327 | e.rowTarget=t; |
||
328 | return true; |
||
329 | },processEvent:function(e){ |
||
330 | return this.processNodeEvent(e,this.contentNode); |
||
331 | },renderRow:function(_43,_44){ |
||
332 | },removeRow:function(_45){ |
||
333 | },getDefaultPageNode:function(_46){ |
||
334 | return this.getDefaultNodes()[_46]; |
||
335 | },positionPageNode:function(_47,_48){ |
||
336 | },getPageNodePosition:function(_49){ |
||
337 | return _49.offsetTop;
|
||
338 | },invalidatePageNode:function(_4a,_4b){ |
||
339 | var p=_4b[_4a];
|
||
340 | if(p){
|
||
341 | delete _4b[_4a];
|
||
342 | this.removePage(_4a,p);
|
||
343 | _3(p); |
||
344 | p.innerHTML="";
|
||
345 | } |
||
346 | return p;
|
||
347 | },getPageRow:function(_4c){ |
||
348 | return _4c*this.rowsPerPage; |
||
349 | },getLastPageRow:function(_4d){ |
||
350 | return Math.min(this.rowCount,this.getPageRow(_4d+1))-1; |
||
351 | },getFirstVisibleRow:function(_4e,_4f,_50){ |
||
352 | if(!this.pageExists(_4e)){ |
||
353 | return 0; |
||
354 | } |
||
355 | var row=this.getPageRow(_4e); |
||
356 | var _51=this.getDefaultNodes(); |
||
357 | var _52=_e(_51[_4e]);
|
||
358 | for(var i=0,l=_52.length;i<l&&_4f<_50;i++,row++){ |
||
359 | _4f+=_52[i].offsetHeight; |
||
360 | } |
||
361 | return (row?row-1:row); |
||
362 | },getLastVisibleRow:function(_53,_54,_55){ |
||
363 | if(!this.pageExists(_53)){ |
||
364 | return 0; |
||
365 | } |
||
366 | var _56=this.getDefaultNodes(); |
||
367 | var row=this.getLastPageRow(_53); |
||
368 | var _57=_e(_56[_53]);
|
||
369 | for(var i=_57.length-1;i>=0&&_54>_55;i--,row--){ |
||
370 | _54-=_57[i].offsetHeight; |
||
371 | } |
||
372 | return row+1; |
||
373 | },findTopRow:function(_58){ |
||
374 | var _59=this.getDefaultNodes(); |
||
375 | var _5a=_e(_59[this.page]); |
||
376 | for(var i=0,l=_5a.length,t=this.pageTop,h;i<l;i++){ |
||
377 | h=_5a[i].offsetHeight; |
||
378 | t+=h; |
||
379 | if(t>=_58){
|
||
380 | this.offset=h-(t-_58);
|
||
381 | return i+this.page*this.rowsPerPage; |
||
382 | } |
||
383 | } |
||
384 | return -1; |
||
385 | },findScrollTop:function(_5b){ |
||
386 | var _5c=Math.floor(_5b/this.rowsPerPage); |
||
387 | var t=0; |
||
388 | var i,l;
|
||
389 | for(i=0;i<_5c;i++){ |
||
390 | t+=this.getPageHeight(i);
|
||
391 | } |
||
392 | this.pageTop=t;
|
||
393 | this.needPage(_5c,this.pageTop); |
||
394 | var _5d=this.getDefaultNodes(); |
||
395 | var _5e=_e(_5d[_5c]);
|
||
396 | var r=_5b-this.rowsPerPage*_5c; |
||
397 | for(i=0,l=_5e.length;i<l&&i<r;i++){ |
||
398 | t+=_5e[i].offsetHeight; |
||
399 | } |
||
400 | return t;
|
||
401 | },dummy:0}); |
||
402 | })(); |
||
403 | } |