root / trunk / web / dojo / dojox / grid / _Scroller.js @ 11
History | View | Annotate | Download (10.1 KB)
| 1 |
/*
|
|---|---|
| 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 |
} |