_Builder.js 14 KB

12345678
  1. /*
  2. Copyright (c) 2004-2009, 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. if(!dojo._hasResource["dojox.grid._Builder"]){dojo._hasResource["dojox.grid._Builder"]=true;dojo.provide("dojox.grid._Builder");dojo.require("dojox.grid.util");dojo.require("dojo.dnd.Moveable");(function(){var dg=dojox.grid;var _1=function(td){return td.cellIndex>=0?td.cellIndex:dojo.indexOf(td.parentNode.cells,td);};var _2=function(tr){return tr.rowIndex>=0?tr.rowIndex:dojo.indexOf(tr.parentNode.childNodes,tr);};var _3=function(_4,_5){return _4&&((_4.rows||0)[_5]||_4.childNodes[_5]);};var _6=function(_7){for(var n=_7;n&&n.tagName!="TABLE";n=n.parentNode){}return n;};var _8=function(_9,_a){for(var n=_9;n&&_a(n);n=n.parentNode){}return n;};var _b=function(_c){var _d=_c.toUpperCase();return function(_e){return _e.tagName!=_d;};};var _f=dojox.grid.util.rowIndexTag;var _10=dojox.grid.util.gridViewTag;dg._Builder=dojo.extend(function(_11){if(_11){this.view=_11;this.grid=_11.grid;}},{view:null,_table:"<table class=\"dojoxGridRowTable\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\"",getTableArray:function(){var _12=[this._table];if(this.view.viewWidth){_12.push([" style=\"width:",this.view.viewWidth,";\""].join(""));}_12.push(">");return _12;},generateCellMarkup:function(_13,_14,_15,_16){var _17=[],_18;if(_16){var _19=_13.index!=_13.grid.getSortIndex()?"":_13.grid.sortInfo>0?"aria-sort=\"ascending\"":"aria-sort=\"descending\"";if(!_13.id){_13.id=this.grid.id+"Hdr"+_13.index;}_18=["<th tabIndex=\"-1\" aria-readonly=\"true\" role=\"columnheader\"",_19,"id=\"",_13.id,"\""];}else{var _1a=this.grid.editable&&!_13.editable?"aria-readonly=\"true\"":"";_18=["<td tabIndex=\"-1\" role=\"gridcell\"",_1a];}if(_13.colSpan){_18.push(" colspan=\"",_13.colSpan,"\"");}if(_13.rowSpan){_18.push(" rowspan=\"",_13.rowSpan,"\"");}_18.push(" class=\"dojoxGridCell ");if(_13.classes){_18.push(_13.classes," ");}if(_15){_18.push(_15," ");}_17.push(_18.join(""));_17.push("");_18=["\" idx=\"",_13.index,"\" style=\""];if(_14&&_14[_14.length-1]!=";"){_14+=";";}_18.push(_13.styles,_14||"",_13.hidden?"display:none;":"");if(_13.unitWidth){_18.push("width:",_13.unitWidth,";");}_17.push(_18.join(""));_17.push("");_18=["\""];if(_13.attrs){_18.push(" ",_13.attrs);}_18.push(">");_17.push(_18.join(""));_17.push("");_17.push(_16?"</th>":"</td>");return _17;},isCellNode:function(_1b){return Boolean(_1b&&_1b!=dojo.doc&&dojo.attr(_1b,"idx"));},getCellNodeIndex:function(_1c){return _1c?Number(dojo.attr(_1c,"idx")):-1;},getCellNode:function(_1d,_1e){for(var i=0,row;(row=_3(_1d.firstChild,i));i++){for(var j=0,_1f;(_1f=row.cells[j]);j++){if(this.getCellNodeIndex(_1f)==_1e){return _1f;}}}return null;},findCellTarget:function(_20,_21){var n=_20;while(n&&(!this.isCellNode(n)||(n.offsetParent&&_10 in n.offsetParent.parentNode&&n.offsetParent.parentNode[_10]!=this.view.id))&&(n!=_21)){n=n.parentNode;}return n!=_21?n:null;},baseDecorateEvent:function(e){e.dispatch="do"+e.type;e.grid=this.grid;e.sourceView=this.view;e.cellNode=this.findCellTarget(e.target,e.rowNode);e.cellIndex=this.getCellNodeIndex(e.cellNode);e.cell=(e.cellIndex>=0?this.grid.getCell(e.cellIndex):null);},findTarget:function(_22,_23){var n=_22;while(n&&(n!=this.domNode)&&(!(_23 in n)||(_10 in n&&n[_10]!=this.view.id))){n=n.parentNode;}return (n!=this.domNode)?n:null;},findRowTarget:function(_24){return this.findTarget(_24,_f);},isIntraNodeEvent:function(e){try{return (e.cellNode&&e.relatedTarget&&dojo.isDescendant(e.relatedTarget,e.cellNode));}catch(x){return false;}},isIntraRowEvent:function(e){try{var row=e.relatedTarget&&this.findRowTarget(e.relatedTarget);return !row&&(e.rowIndex==-1)||row&&(e.rowIndex==row.gridRowIndex);}catch(x){return false;}},dispatchEvent:function(e){if(e.dispatch in this){return this[e.dispatch](e);}return false;},domouseover:function(e){if(e.cellNode&&(e.cellNode!=this.lastOverCellNode)){this.lastOverCellNode=e.cellNode;this.grid.onMouseOver(e);}this.grid.onMouseOverRow(e);},domouseout:function(e){if(e.cellNode&&(e.cellNode==this.lastOverCellNode)&&!this.isIntraNodeEvent(e,this.lastOverCellNode)){this.lastOverCellNode=null;this.grid.onMouseOut(e);if(!this.isIntraRowEvent(e)){this.grid.onMouseOutRow(e);}}},domousedown:function(e){if(e.cellNode){this.grid.onMouseDown(e);}this.grid.onMouseDownRow(e);}});dg._ContentBuilder=dojo.extend(function(_25){dg._Builder.call(this,_25);},dg._Builder.prototype,{update:function(){this.prepareHtml();},prepareHtml:function(){var _26=this.grid.get,_27=this.view.structure.cells;for(var j=0,row;(row=_27[j]);j++){for(var i=0,_28;(_28=row[i]);i++){_28.get=_28.get||(_28.value==undefined)&&_26;_28.markup=this.generateCellMarkup(_28,_28.cellStyles,_28.cellClasses,false);if(!this.grid.editable&&_28.editable){this.grid.editable=true;}}}},generateHtml:function(_29,_2a){var _2b=this.getTableArray(),v=this.view,_2c=v.structure.cells,_2d=this.grid.getItem(_2a);dojox.grid.util.fire(this.view,"onBeforeRow",[_2a,_2c]);for(var j=0,row;(row=_2c[j]);j++){if(row.hidden||row.header){continue;}_2b.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");for(var i=0,_2e,m,cc,cs;(_2e=row[i]);i++){m=_2e.markup;cc=_2e.customClasses=[];cs=_2e.customStyles=[];m[5]=_2e.format(_2a,_2d);m[1]=cc.join(" ");m[3]=cs.join(";");_2b.push.apply(_2b,m);}_2b.push("</tr>");}_2b.push("</table>");return _2b.join("");},decorateEvent:function(e){e.rowNode=this.findRowTarget(e.target);if(!e.rowNode){return false;}e.rowIndex=e.rowNode[_f];this.baseDecorateEvent(e);e.cell=this.grid.getCell(e.cellIndex);return true;}});dg._HeaderBuilder=dojo.extend(function(_2f){this.moveable=null;dg._Builder.call(this,_2f);},dg._Builder.prototype,{_skipBogusClicks:false,overResizeWidth:4,minColWidth:1,update:function(){if(this.tableMap){this.tableMap.mapRows(this.view.structure.cells);}else{this.tableMap=new dg._TableMap(this.view.structure.cells);}},generateHtml:function(_30,_31){var _32=this.getTableArray(),_33=this.view.structure.cells;dojox.grid.util.fire(this.view,"onBeforeRow",[-1,_33]);for(var j=0,row;(row=_33[j]);j++){if(row.hidden){continue;}_32.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");for(var i=0,_34,_35;(_34=row[i]);i++){_34.customClasses=[];_34.customStyles=[];if(this.view.simpleStructure){if(_34.draggable){if(_34.headerClasses){if(_34.headerClasses.indexOf("dojoDndItem")==-1){_34.headerClasses+=" dojoDndItem";}}else{_34.headerClasses="dojoDndItem";}}if(_34.attrs){if(_34.attrs.indexOf("dndType='gridColumn_")==-1){_34.attrs+=" dndType='gridColumn_"+this.grid.id+"'";}}else{_34.attrs="dndType='gridColumn_"+this.grid.id+"'";}}_35=this.generateCellMarkup(_34,_34.headerStyles,_34.headerClasses,true);_35[5]=(_31!=undefined?_31:_30(_34));_35[3]=_34.customStyles.join(";");_35[1]=_34.customClasses.join(" ");_32.push(_35.join(""));}_32.push("</tr>");}_32.push("</table>");return _32.join("");},getCellX:function(e){var n,x=e.layerX;if(dojo.isMoz){n=_8(e.target,_b("th"));x-=(n&&n.offsetLeft)||0;var t=e.sourceView.getScrollbarWidth();if(!dojo._isBodyLtr()&&e.sourceView.headerNode.scrollLeft<t){x-=t;}}n=_8(e.target,function(){if(!n||n==e.cellNode){return false;}x+=(n.offsetLeft<0?0:n.offsetLeft);return true;});return x;},decorateEvent:function(e){this.baseDecorateEvent(e);e.rowIndex=-1;e.cellX=this.getCellX(e);return true;},prepareResize:function(e,mod){do{var i=_1(e.cellNode);e.cellNode=(i?e.cellNode.parentNode.cells[i+mod]:null);e.cellIndex=(e.cellNode?this.getCellNodeIndex(e.cellNode):-1);}while(e.cellNode&&e.cellNode.style.display=="none");return Boolean(e.cellNode);},canResize:function(e){if(!e.cellNode||e.cellNode.colSpan>1){return false;}var _36=this.grid.getCell(e.cellIndex);return !_36.noresize&&_36.canResize();},overLeftResizeArea:function(e){if(dojo.hasClass(dojo.body(),"dojoDndMove")){return false;}if(dojo.isIE){var tN=e.target;if(dojo.hasClass(tN,"dojoxGridArrowButtonNode")||dojo.hasClass(tN,"dojoxGridArrowButtonChar")){return false;}}if(dojo._isBodyLtr()){return (e.cellIndex>0)&&(e.cellX<this.overResizeWidth)&&this.prepareResize(e,-1);}var t=e.cellNode&&(e.cellX<this.overResizeWidth);return t;},overRightResizeArea:function(e){if(dojo.hasClass(dojo.body(),"dojoDndMove")){return false;}if(dojo.isIE){var tN=e.target;if(dojo.hasClass(tN,"dojoxGridArrowButtonNode")||dojo.hasClass(tN,"dojoxGridArrowButtonChar")){return false;}}if(dojo._isBodyLtr()){return e.cellNode&&(e.cellX>=e.cellNode.offsetWidth-this.overResizeWidth);}return (e.cellIndex>0)&&(e.cellX>=e.cellNode.offsetWidth-this.overResizeWidth)&&this.prepareResize(e,-1);},domousemove:function(e){if(!this.moveable){var c=(this.overRightResizeArea(e)?"dojoxGridColResize":(this.overLeftResizeArea(e)?"dojoxGridColResize":""));if(c&&!this.canResize(e)){c="dojoxGridColNoResize";}dojo.toggleClass(e.sourceView.headerNode,"dojoxGridColNoResize",(c=="dojoxGridColNoResize"));dojo.toggleClass(e.sourceView.headerNode,"dojoxGridColResize",(c=="dojoxGridColResize"));if(dojo.isIE){var t=e.sourceView.headerNode.scrollLeft;e.sourceView.headerNode.scrollLeft=t;}if(c){dojo.stopEvent(e);}}},domousedown:function(e){if(!this.moveable){if((this.overRightResizeArea(e)||this.overLeftResizeArea(e))&&this.canResize(e)){this.beginColumnResize(e);}else{this.grid.onMouseDown(e);this.grid.onMouseOverRow(e);}}},doclick:function(e){if(this._skipBogusClicks){dojo.stopEvent(e);return true;}return false;},colResizeSetup:function(e,_37){var _38=dojo.contentBox(e.sourceView.headerNode);if(_37){this.lineDiv=document.createElement("div");var vw=(dojo.position||dojo._abs)(e.sourceView.headerNode,true);var _39=dojo.contentBox(e.sourceView.domNode);dojo.style(this.lineDiv,{top:vw.y+"px",left:e.clientX+"px",height:(_39.h+_38.h)+"px"});dojo.addClass(this.lineDiv,"dojoxGridResizeColLine");this.lineDiv._origLeft=e.clientX;dojo.body().appendChild(this.lineDiv);}var _3a=[],_3b=this.tableMap.findOverlappingNodes(e.cellNode);for(var i=0,_3c;(_3c=_3b[i]);i++){_3a.push({node:_3c,index:this.getCellNodeIndex(_3c),width:_3c.offsetWidth});}var _3d=e.sourceView;var adj=dojo._isBodyLtr()?1:-1;var _3e=e.grid.views.views;var _3f=[];for(var j=_3d.idx+adj,_40;(_40=_3e[j]);j=j+adj){_3f.push({node:_40.headerNode,left:window.parseInt(_40.headerNode.style.left)});}var _41=_3d.headerContentNode.firstChild;var _42={scrollLeft:e.sourceView.headerNode.scrollLeft,view:_3d,node:e.cellNode,index:e.cellIndex,w:dojo.contentBox(e.cellNode).w,vw:_38.w,table:_41,tw:dojo.contentBox(_41).w,spanners:_3a,followers:_3f};return _42;},beginColumnResize:function(e){this.moverDiv=document.createElement("div");dojo.style(this.moverDiv,{position:"absolute",left:0});dojo.body().appendChild(this.moverDiv);dojo.addClass(this.grid.domNode,"dojoxGridColumnResizing");var m=(this.moveable=new dojo.dnd.Moveable(this.moverDiv));var _43=this.colResizeSetup(e,true);m.onMove=dojo.hitch(this,"doResizeColumn",_43);dojo.connect(m,"onMoveStop",dojo.hitch(this,function(){this.endResizeColumn(_43);if(_43.node.releaseCapture){_43.node.releaseCapture();}this.moveable.destroy();delete this.moveable;this.moveable=null;dojo.removeClass(this.grid.domNode,"dojoxGridColumnResizing");}));if(e.cellNode.setCapture){e.cellNode.setCapture();}m.onMouseDown(e);},doResizeColumn:function(_44,_45,_46){var _47=_46.l;var _48={deltaX:_47,w:_44.w+_47,vw:_44.vw+_47,tw:_44.tw+_47};this.dragRecord={inDrag:_44,mover:_45,leftTop:_46};if(_48.w>=this.minColWidth){if(!_45){this.doResizeNow(_44,_48);}else{dojo.style(this.lineDiv,"left",(this.lineDiv._origLeft+_48.deltaX)+"px");}}},endResizeColumn:function(_49){if(this.dragRecord){var _4a=this.dragRecord.leftTop;var _4b=dojo._isBodyLtr()?_4a.l:-_4a.l;_4b+=Math.max(_49.w+_4b,this.minColWidth)-(_49.w+_4b);if(dojo.isWebKit&&_49.spanners.length){_4b+=dojo._getPadBorderExtents(_49.spanners[0].node).w;}var _4c={deltaX:_4b,w:_49.w+_4b,vw:_49.vw+_4b,tw:_49.tw+_4b};this.doResizeNow(_49,_4c);}dojo.destroy(this.lineDiv);dojo.destroy(this.moverDiv);dojo.destroy(this.moverDiv);delete this.moverDiv;this._skipBogusClicks=true;_49.view.update();this._skipBogusClicks=false;this.grid.onResizeColumn(_49.index);},doResizeNow:function(_4d,_4e){_4d.view.convertColPctToFixed();if(_4d.view.flexCells&&!_4d.view.testFlexCells()){var t=_6(_4d.node);if(t){(t.style.width="");}}var i,s,sw,f,fl;for(i=0;(s=_4d.spanners[i]);i++){sw=s.width+_4e.deltaX;s.node.style.width=sw+"px";_4d.view.setColWidth(s.index,sw);}for(i=0;(f=_4d.followers[i]);i++){fl=f.left+_4e.deltaX;f.node.style.left=fl+"px";}_4d.node.style.width=_4e.w+"px";_4d.view.setColWidth(_4d.index,_4e.w);_4d.view.headerNode.style.width=_4e.vw+"px";_4d.view.setColumnsWidth(_4e.tw);if(!dojo._isBodyLtr()){_4d.view.headerNode.scrollLeft=_4d.scrollLeft+_4e.deltaX;}}});dg._TableMap=dojo.extend(function(_4f){this.mapRows(_4f);},{map:null,mapRows:function(_50){var _51=_50.length;if(!_51){return;}this.map=[];var row;for(var k=0;(row=_50[k]);k++){this.map[k]=[];}for(var j=0;(row=_50[j]);j++){for(var i=0,x=0,_52,_53,_54;(_52=row[i]);i++){while(this.map[j][x]){x++;}this.map[j][x]={c:i,r:j};_54=_52.rowSpan||1;_53=_52.colSpan||1;for(var y=0;y<_54;y++){for(var s=0;s<_53;s++){this.map[j+y][x+s]=this.map[j][x];}}x+=_53;}}},dumpMap:function(){for(var j=0,row,h="";(row=this.map[j]);j++,h=""){for(var i=0,_55;(_55=row[i]);i++){h+=_55.r+","+_55.c+" ";}}},getMapCoords:function(_56,_57){for(var j=0,row;(row=this.map[j]);j++){for(var i=0,_58;(_58=row[i]);i++){if(_58.c==_57&&_58.r==_56){return {j:j,i:i};}}}return {j:-1,i:-1};},getNode:function(_59,_5a,_5b){var row=_59&&_59.rows[_5a];return row&&row.cells[_5b];},_findOverlappingNodes:function(_5c,_5d,_5e){var _5f=[];var m=this.getMapCoords(_5d,_5e);for(var j=0,row;(row=this.map[j]);j++){if(j==m.j){continue;}var rw=row[m.i];var n=(rw?this.getNode(_5c,rw.r,rw.c):null);if(n){_5f.push(n);}}return _5f;},findOverlappingNodes:function(_60){return this._findOverlappingNodes(_6(_60),_2(_60.parentNode),_1(_60));}});})();}