columnLock_wev8.js
15.1 KB
Ext.grid.LockingGridPanel=Ext.extend(Ext.grid.GridPanel,{getView:function(){if(!this.view){this.view=new Ext.grid.LockingGridView(this.viewConfig)}return this.view},initComponent:function(){if(!this.cm){this.cm=new Ext.grid.LockingColumnModel(this.columns);delete this.columns}Ext.grid.LockingGridPanel.superclass.initComponent.call(this)}});Ext.grid.LockingEditorGridPanel=Ext.extend(Ext.grid.EditorGridPanel,{getView:function(){if(!this.view){this.view=new Ext.grid.LockingGridView(this.viewConfig)}return this.view},initComponent:function(){if(!this.cm){this.cm=new Ext.grid.LockingColumnModel(this.columns);delete this.columns}Ext.grid.LockingEditorGridPanel.superclass.initComponent.call(this)}});Ext.grid.LockingGridView=function(a){Ext.apply(this,a);if(!this.templates){this.templates={}}if(!this.templates.master){this.templates.master=new Ext.Template('<div class="x-grid3" hidefocus="true">','<div class="x-grid3-locked">','<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset">{lockedHeader}</div></div><div class="x-clear"></div></div>','<div class="x-grid3-scroller"><div class="x-grid3-body">{lockedBody}</div></div>',"</div>",'<div class="x-grid3-viewport">','<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset">{header}</div></div><div class="x-clear"></div></div>','<div class="x-grid3-scroller"><div class="x-grid3-body">{body}</div><a href="#" class="x-grid3-focus" tabIndex="-1"></a></div>',"</div>",'<div class="x-grid3-resize-marker"> </div>','<div class="x-grid3-resize-proxy"> </div>',"</div>")}Ext.grid.LockingGridView.superclass.constructor.call(this)};Ext.extend(Ext.grid.LockingGridView,Ext.grid.GridView,{lockText:"Lock",unlockText:"Unlock",initElements:function(){var c=Ext.Element;var b=this.grid.getGridEl();b=b.dom.firstChild;var a=b.childNodes;this.el=new c(b);this.lockedWrap=new c(a[0]);this.lockedHd=new c(this.lockedWrap.dom.firstChild);this.lockedInnerHd=this.lockedHd.dom.firstChild;this.lockedScroller=new c(this.lockedWrap.dom.childNodes[1]);this.lockedBody=new c(this.lockedScroller.dom.firstChild);this.mainWrap=new c(a[1]);this.mainHd=new c(this.mainWrap.dom.firstChild);this.innerHd=this.mainHd.dom.firstChild;this.scroller=new c(this.mainWrap.dom.childNodes[1]);if(this.forceFit){this.scroller.setStyle("overflow-x","hidden")}this.mainBody=new c(this.scroller.dom.firstChild);this.focusEl=new c(this.scroller.dom.childNodes[1]);this.focusEl.swallowEvent("click",true);this.resizeMarker=new c(a[2]);this.resizeProxy=new c(a[3])},getLockedRows:function(){return this.hasRows()?this.lockedBody.dom.childNodes:[]},getLockedRow:function(a){return this.getLockedRows()[a]},getCell:function(d,b){var a=this.cm.getLockedCount();var c;if(b<a){c=this.getLockedRow(d)}else{c=this.getRow(d);b-=a}return c.getElementsByTagName("td")[b]},getHeaderCell:function(b){var a=this.cm.getLockedCount();if(b<a){return this.lockedHd.dom.getElementsByTagName("td")[b]}else{return this.mainHd.dom.getElementsByTagName("td")[(b-a)]}},scrollToTop:function(){Ext.grid.LockingGridView.superclass.scrollToTop.call(this);this.syncScroll()},syncScroll:function(a){Ext.grid.LockingGridView.superclass.syncScroll.call(this,a);var b=this.scroller.dom;this.lockedScroller.dom.scrollTop=b.scrollTop},processRows:function(g,e){if(this.ds.getCount()<1){return}e=e||!this.grid.stripeRows;g=g||0;var h=" x-grid3-row-alt ";var l=this.getRows();var d=this.getLockedRows();for(var b=g,c=l.length;b<c;b++){var k=l[b];var f=d[b];k.rowIndex=b;f.rowIndex=b;if(!e){var a=((b+1)%2==0);var j=(" "+k.className+" ").indexOf(h)!=-1;if(a==j){continue}if(a){k.className+=" x-grid3-row-alt";f.className+=" x-grid3-row-alt"}else{k.className=k.className.replace("x-grid3-row-alt","");f.className=f.className.replace("x-grid3-row-alt","")}}}},updateSortIcon:function(c,b){var f=this.sortClasses;var a=this.cm.getColumnCount();var g=this.cm.getLockedCount();var e=this.mainHd.select("td").removeClass(f);var d=this.lockedHd.select("td").removeClass(f);if(g>0&&c<g){d.item(c).addClass(f[b=="DESC"?1:0])}else{e.item(c-g).addClass(f[b=="DESC"?1:0])}},updateAllColumnWidths:function(){var g=this.cm.getTotalWidth();var b=this.cm.getTotalLockedWidth();var m=this.cm.getColumnCount();var c=this.cm.getLockedCount();var k=[];for(var e=0;e<m;e++){k[e]=this.getColumnWidth(e)}this.innerHd.firstChild.firstChild.style.width=(g-b)+"px";this.mainWrap.dom.style.left=b+"px";this.lockedInnerHd.firstChild.firstChild.style.width=b+"px";for(var e=0;e<m;e++){var f=this.getHeaderCell(e);f.style.width=k[e]+"px"}var l=this.getRows();var a=this.getLockedRows();for(var e=0,h=l.length;e<h;e++){l[e].style.width=(g-b)+"px";l[e].firstChild.style.width=(g-b)+"px";a[e].style.width=b+"px";a[e].firstChild.style.width=b+"px";for(var d=0;d<c;d++){var n=a[e].firstChild.rows[0];n.childNodes[d].style.width=k[d]+"px"}for(var d=c;d<m;d++){var n=l[e].firstChild.rows[0];n.childNodes[d].style.width=k[d]+"px"}}this.onAllColumnWidthsUpdated(k,g)},updateColumnWidth:function(b,a){var k=this.cm.getColumnWidth(b);var g=this.cm.getTotalWidth();var d=this.cm.getLockedCount();var c=this.cm.getTotalLockedWidth();var f=this.getHeaderCell(b);f.style.width=k+"px";var j,l;if(b<d){j=this.getLockedRows();l=c;this.lockedInnerHd.firstChild.firstChild.style.width=l+"px";this.mainWrap.dom.style.left=this.cm.getTotalLockedWidth()+"px";this.mainWrap.dom.style.display="none";this.mainWrap.dom.style.display=""}else{j=this.getRows();l=g-c;b-=d;this.innerHd.firstChild.firstChild.style.width=l+"px"}for(var e=0,h=j.length;e<h;e++){j[e].style.width=l+"px";j[e].firstChild.style.width=l+"px";j[e].firstChild.rows[0].childNodes[b].style.width=k+"px"}this.onColumnWidthUpdated(b,k,g);this.layout()},updateColumnHidden:function(a,g){var f=this.cm.getTotalWidth();var b=this.cm.getTotalLockedWidth();var c=this.cm.getLockedCount();this.innerHd.firstChild.firstChild.style.width=f+"px";var j=g?"none":"";var e=this.getHeaderCell(a);e.style.display=j;var k,l;if(a<c){k=this.getLockedRows();l=b;this.lockedHd.dom.firstChild.firstChild.style.width=l+"px";this.mainWrap.dom.style.left=this.cm.getTotalLockedWidth()+"px"}else{k=this.getRows();l=f-b;a-=c;this.innerHd.firstChild.firstChild.style.width=l+"px"}for(var d=0,h=k.length;d<h;d++){k[d].style.width=l+"px";k[d].firstChild.style.width=l+"px";k[d].firstChild.rows[0].childNodes[a].style.display=j}this.onColumnHiddenUpdated(a,g,f);delete this.lastViewWidth;this.layout()},syncHeaderHeight:function(){if(this.lockedInnerHd==undefined||this.innerHd==undefined){return}this.lockedInnerHd.firstChild.firstChild.style.height="auto";this.innerHd.firstChild.firstChild.style.height="auto";var a=(this.lockedInnerHd.firstChild.firstChild.offsetHeight>this.innerHd.firstChild.firstChild.offsetHeight)?this.lockedInnerHd.firstChild.firstChild.offsetHeight:this.innerHd.firstChild.firstChild.offsetHeight;this.lockedInnerHd.firstChild.firstChild.style.height=a+"px";this.innerHd.firstChild.firstChild.style.height=a+"px"},doRender:function(h,m,v,a,u,z){var b=this.templates,f=b.cell,k=b.row,o=u-1;var G=this.cm.getTotalWidth();var g=this.cm.getTotalLockedWidth();var s=this.cm.getColumnCount();var e=this.cm.getLockedCount();var d="width:"+this.getTotalWidth()+";";var C=[],F=[],x,l,D,w={},n={tstyle:d},t;for(var y=0,B=m.length;y<B;y++){t=m[y];x=[];l=[];var q=(y+a);for(var A=0;A<u;A++){D=h[A];w.id=D.id;w.css=A==0?"x-grid3-cell-first ":(A==o?"x-grid3-cell-last ":"");w.attr=w.cellAttr="";w.value=D.renderer(t.data[D.name],w,t,q,A,v);w.style=D.style;if(w.value==undefined||w.value===""){w.value=" "}if(t.dirty&&typeof t.modified[D.name]!=="undefined"){w.css+=" x-grid3-dirty-cell"}if(D.locked){l[l.length]=f.apply(w)}else{x[x.length]=f.apply(w)}}var E=[];if(z&&((q+1)%2==0)){E[0]="x-grid3-row-alt"}if(t.dirty){E[1]=" x-grid3-dirty-row"}n.cols=u;if(this.getRowClass){E[2]=this.getRowClass(t,q,n,v)}n.alt=E.join(" ");n.cells=l.join("");n.tstyle="width:"+g+"px;";F[F.length]=k.apply(n);n.cells=x.join("");n.tstyle="width:"+(G-g)+"px;";C[C.length]=k.apply(n)}return[C.join(""),F.join("")]},renderUI:function(){var f=this.renderHeaders();var b=this.templates.body.apply({rows:""});var c=this.templates.master.apply({body:b,header:f[0],lockedBody:b,lockedHeader:f[1]});var d=this.grid;d.getGridEl().dom.innerHTML=c;this.initElements();var e=this.renderRows();if(e==""){e=["",""]}this.mainBody.dom.innerHTML=e[0];this.lockedBody.dom.innerHTML=e[1];this.processRows(0,true);Ext.fly(this.innerHd).on("click",this.handleHdDown,this);Ext.fly(this.lockedInnerHd).on("click",this.handleHdDown,this);this.mainHd.on("mouseover",this.handleHdOver,this);this.mainHd.on("mouseout",this.handleHdOut,this);this.mainHd.on("mousemove",this.handleHdMove,this);this.lockedHd.on("mouseover",this.handleHdOver,this);this.lockedHd.on("mouseout",this.handleHdOut,this);this.lockedHd.on("mousemove",this.handleHdMove,this);this.mainWrap.dom.style.left=this.cm.getTotalLockedWidth()+"px";this.scroller.on("scroll",this.syncScroll,this);if(d.enableColumnResize!==false){this.splitone=new Ext.grid.GridView.SplitDragZone(d,this.lockedHd.dom);this.splitone.setOuterHandleElId(Ext.id(this.lockedHd.dom));this.splitone.setOuterHandleElId(Ext.id(this.mainHd.dom))}if(d.enableColumnMove){this.columnDrag=new Ext.grid.GridView.ColumnDragZone(d,this.innerHd);this.columnDrop=new Ext.grid.HeaderDropZone(d,this.mainHd.dom)}if(d.enableHdMenu!==false){if(d.enableColumnHide!==false){this.colMenu=new Ext.menu.Menu({id:d.id+"-hcols-menu"});this.colMenu.on("beforeshow",this.beforeColMenuShow,this);this.colMenu.on("itemclick",this.handleHdMenuClick,this)}this.hmenu=new Ext.menu.Menu({id:d.id+"-hctx"});this.hmenu.add({id:"asc",text:this.sortAscText,cls:"xg-hmenu-sort-asc"},{id:"desc",text:this.sortDescText,cls:"xg-hmenu-sort-desc"});if(this.grid.enableColLock!==false){this.hmenu.add("-",{id:"lock",text:this.lockText,cls:"xg-hmenu-lock"},{id:"unlock",text:this.unlockText,cls:"xg-hmenu-unlock"})}if(d.enableColumnHide!==false){this.hmenu.add("-",{id:"columns",text:this.columnsText,menu:this.colMenu,iconCls:"x-cols-icon"})}this.hmenu.on("itemclick",this.handleHdMenuClick,this)}if(d.enableDragDrop||d.enableDrag){var a=new Ext.grid.GridDragZone(d,{ddGroup:d.ddGroup||"GridDD"})}this.updateHeaderSortState()},layout:function(){if(!this.mainBody){return}var h=this.grid;var j=h.getGridEl(),l=this.cm,d=h.autoExpandColumn,a=this;var b=l.getTotalLockedWidth();var e=j.getSize(true);var k=e.width;if(k<20||e.height<20){return}this.syncHeaderHeight();if(h.autoHeight){this.scroller.dom.style.overflow="visible";this.lockedScroller.dom.style.overflow="visible"}else{this.el.setSize(e.width,e.height);var i=this.mainHd.getHeight();var f=e.height-(i);this.scroller.setSize(k-b,f);var m=(this.scroller.dom.scrollWidth>this.scroller.dom.clientWidth)?17:0;this.lockedScroller.setSize(l.getTotalLockedWidth(),f-m);if(this.innerHd){this.innerHd.style.width=(k)+"px"}}if(this.forceFit){if(this.lastViewWidth!=k){this.fitColumns(false,false);this.lastViewWidth=k}}else{this.autoExpand();b=l.getTotalLockedWidth()}this.mainWrap.dom.style.left=b+"px";this.onLayout(k,f)},renderHeaders:function(){var m=this.cm,k=this.templates;var h=k.hcell;var g=this.cm.getTotalWidth();var d=this.cm.getTotalLockedWidth();var e=[],b=[],l=[],c=[],a={};for(var f=0,j=m.getColumnCount();f<j;f++){a.id=m.getColumnId(f);a.value=m.getColumnHeader(f)||"";a.style=this.getColumnStyle(f,true);a.tooltip=this.getColumnTooltip(f);if(m.config[f].align=="right"){a.istyle="padding-right:16px"}if(m.isLocked(f)){b[b.length]=h.apply(a)}else{e[e.length]=h.apply(a)}}return[k.header.apply({cells:e.join(""),tstyle:"width:"+(g-d)+";"}),k.header.apply({cells:b.join(""),tstyle:"width:"+(d)+";"})]},getColumnTooltip:function(a){var b=this.cm.getColumnTooltip(a);if(b){if(Ext.QuickTips.isEnabled()){return'ext:qtip="'+b+'"'}else{return'title="'+b+'"'}}return""},updateHeaders:function(){var a=this.renderHeaders();this.innerHd.firstChild.innerHTML=a[0];this.lockedInnerHd.firstChild.innerHTML=a[1]},insertRows:function(a,f,c,e){if(f===0&&c==a.getCount()-1){this.refresh()}else{if(!e){this.fireEvent("beforerowsinserted",this,f,c)}var b=this.renderRows(f,c);var d=this.getRow(f);var g=this.getLockedRow(f);if(d){Ext.DomHelper.insertHtml("beforeBegin",d,b[0])}else{Ext.DomHelper.insertHtml("beforeEnd",this.mainBody.dom,b[0])}var g=this.getLockedRow(f);if(g){Ext.DomHelper.insertHtml("beforeBegin",g,b[1])}else{Ext.DomHelper.insertHtml("beforeEnd",this.lockedBody.dom,b[1])}if(!e){this.fireEvent("rowsinserted",this,f,c);this.processRows(f)}}},removeRow:function(a){Ext.removeNode(this.getRow(a));if(this.cm.getLockedCount()>0){Ext.removeNode(this.getLockedRow(a))}},getColumnData:function(){var d=[],a=this.cm,e=a.getColumnCount();for(var c=0;c<e;c++){var b=a.getDataIndex(c);d[c]={name:(typeof b=="undefined"?this.ds.fields.get(c).name:b),renderer:a.getRenderer(c),id:a.getColumnId(c),style:this.getColumnStyle(c),locked:a.isLocked(c)}}return d},renderBody:function(){var a=this.renderRows();return[this.templates.body.apply({rows:a[0]}),this.templates.body.apply({rows:a[1]})]},refresh:function(b){this.fireEvent("beforerefresh",this);this.grid.stopEditing();var a=this.renderBody();this.mainBody.update(a[0]);this.lockedBody.update(a[1]);if(b===true){this.updateHeaders();this.updateHeaderSortState()}this.processRows(0,true);this.layout();this.applyEmptyText();this.fireEvent("refresh",this)},handleLockChange:function(){this.refresh(true)},onDenyColumnHide:function(){},onColumnLock:function(){this.handleLockChange.apply(this,arguments)},addRowClass:function(c,a){var b=this.getRow(c);if(b){this.fly(b).addClass(a);b=this.getLockedRow(c);this.fly(b).addClass(a)}},removeRowClass:function(c,a){var b=this.getRow(c);if(b){this.fly(b).removeClass(a);b=this.getLockedRow(c);this.fly(b).removeClass(a)}},handleHdMenuClick:function(d){var b=this.hdCtxIndex;var a=this.cm,e=this.ds;switch(d.id){case"asc":e.sort(a.getDataIndex(b),"ASC");break;case"desc":e.sort(a.getDataIndex(b),"DESC");break;case"lock":var c=a.getLockedCount();if(a.getColumnCount(true)<=c+1){this.onDenyColumnLock();return}if(c!=b){a.setLocked(b,true,true);a.moveColumn(b,c);this.grid.fireEvent("columnmove",b,c)}else{a.setLocked(b,true)}break;case"unlock":var c=a.getLockedCount();if((c-1)!=b){a.setLocked(b,false,true);a.moveColumn(b,c-1);this.grid.fireEvent("columnmove",b,c-1)}else{a.setLocked(b,false)}break;default:b=a.getIndexById(d.id.substr(4));if(b!=-1){if(d.checked&&a.getColumnsBy(this.isHideableColumn,this).length<=1){this.onDenyColumnHide();return false}a.setHidden(b,d.checked)}}return true},handleHdDown:function(g,d){if(Ext.fly(d).hasClass("x-grid3-hd-btn")){g.stopEvent();var f=this.findHeaderCell(d);Ext.fly(f).addClass("x-grid3-hd-menu-open");var c=this.getCellIndex(f);this.hdCtxIndex=c;var b=this.hmenu.items,a=this.cm;b.get("asc").setDisabled(!a.isSortable(c));b.get("desc").setDisabled(!a.isSortable(c));if(this.grid.enableColLock!==false){b.get("lock").setDisabled(a.isLocked(c));b.get("unlock").setDisabled(!a.isLocked(c))}this.hmenu.on("hide",function(){Ext.fly(f).removeClass("x-grid3-hd-menu-open")},this,{single:true});this.hmenu.show(d,"tl-bl?")}}});Ext.grid.LockingColumnModel=function(a){Ext.grid.LockingColumnModel.superclass.constructor.call(this,a)};Ext.extend(Ext.grid.LockingColumnModel,Ext.grid.ColumnModel,{getTotalLockedWidth:function(){var a=0;for(var b=0;b<this.config.length;b++){if(this.isLocked(b)&&!this.isHidden(b)){a+=this.getColumnWidth(b)}}return a}});