_Grid.js 19 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._Grid"]){dojo._hasResource["dojox.grid._Grid"]=true;dojo.provide("dojox.grid._Grid");dojo.require("dijit.dijit");dojo.require("dijit.Menu");dojo.require("dojox.html.metrics");dojo.require("dojox.grid.util");dojo.require("dojox.grid._Scroller");dojo.require("dojox.grid._Layout");dojo.require("dojox.grid._View");dojo.require("dojox.grid._ViewManager");dojo.require("dojox.grid._RowManager");dojo.require("dojox.grid._FocusManager");dojo.require("dojox.grid._EditManager");dojo.require("dojox.grid.Selection");dojo.require("dojox.grid._RowSelector");dojo.require("dojox.grid._Events");dojo.requireLocalization("dijit","loading",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");(function(){if(!dojo.isCopyKey){dojo.isCopyKey=dojo.dnd.getCopyKeyState;}dojo.declare("dojox.grid._Grid",[dijit._Widget,dijit._Templated,dojox.grid._Events],{templateString:"<div class=\"dojoxGrid\" hidefocus=\"hidefocus\" wairole=\"grid\" dojoAttachEvent=\"onmouseout:_mouseOut\">\n\t<div class=\"dojoxGridMasterHeader\" dojoAttachPoint=\"viewsHeaderNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterView\" dojoAttachPoint=\"viewsNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterMessages\" style=\"display: none;\" dojoAttachPoint=\"messagesNode\"></div>\n\t<span dojoAttachPoint=\"lastFocusNode\" tabindex=\"0\"></span>\n</div>\n",classTag:"dojoxGrid",get:function(_1){},rowCount:5,keepRows:75,rowsPerPage:25,autoWidth:false,initialWidth:"",autoHeight:"",rowHeight:0,autoRender:true,defaultHeight:"15em",height:"",structure:null,elasticView:-1,singleClickEdit:false,selectionMode:"extended",rowSelector:"",columnReordering:false,headerMenu:null,placeholderLabel:"GridColumns",selectable:false,_click:null,loadingMessage:"<span class='dojoxGridLoading'>${loadingState}</span>",errorMessage:"<span class='dojoxGridError'>${errorState}</span>",noDataMessage:"",escapeHTMLInData:true,formatterScope:null,editable:false,sortInfo:0,themeable:true,_placeholders:null,_layoutClass:dojox.grid._Layout,buildRendering:function(){this.inherited(arguments);if(this.get==dojox.grid._Grid.prototype.get){this.get=null;}if(!this.domNode.getAttribute("tabIndex")){this.domNode.tabIndex="0";}this.createScroller();this.createLayout();this.createViews();this.createManagers();this.createSelection();this.connect(this.selection,"onSelected","onSelected");this.connect(this.selection,"onDeselected","onDeselected");this.connect(this.selection,"onChanged","onSelectionChanged");dojox.html.metrics.initOnFontResize();this.connect(dojox.html.metrics,"onFontResize","textSizeChanged");dojox.grid.util.funnelEvents(this.domNode,this,"doKeyEvent",dojox.grid.util.keyEvents);if(this.selectionMode!="none"){dojo.attr(this.domNode,"aria-multiselectable",this.selectionMode=="single"?"false":"true");}},postMixInProperties:function(){this.inherited(arguments);var _2=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_2);this.errorMessage=dojo.string.substitute(this.errorMessage,_2);if(this.srcNodeRef&&this.srcNodeRef.style.height){this.height=this.srcNodeRef.style.height;}this._setAutoHeightAttr(this.autoHeight,true);this.lastScrollTop=this.scrollTop=0;},postCreate:function(){this._placeholders=[];this._setHeaderMenuAttr(this.headerMenu);this._setStructureAttr(this.structure);this._click=[];this.inherited(arguments);if(this.domNode&&this.autoWidth&&this.initialWidth){this.domNode.style.width=this.initialWidth;}if(this.domNode&&!this.editable){dojo.attr(this.domNode,"aria-readonly","true");}},destroy:function(){this.domNode.onReveal=null;this.domNode.onSizeChange=null;delete this._click;this.edit.destroy();delete this.edit;this.views.destroyViews();if(this.scroller){this.scroller.destroy();delete this.scroller;}if(this.focus){this.focus.destroy();delete this.focus;}if(this.headerMenu&&this._placeholders.length){dojo.forEach(this._placeholders,function(p){p.unReplace(true);});this.headerMenu.unBindDomNode(this.viewsHeaderNode);}this.inherited(arguments);},_setAutoHeightAttr:function(ah,_3){if(typeof ah=="string"){if(!ah||ah=="false"){ah=false;}else{if(ah=="true"){ah=true;}else{ah=window.parseInt(ah,10);}}}if(typeof ah=="number"){if(isNaN(ah)){ah=false;}if(ah<0){ah=true;}else{if(ah===0){ah=false;}}}this.autoHeight=ah;if(typeof ah=="boolean"){this._autoHeight=ah;}else{if(typeof ah=="number"){this._autoHeight=(ah>=this.attr("rowCount"));}else{this._autoHeight=false;}}if(this._started&&!_3){this.render();}},_getRowCountAttr:function(){return this.updating&&this.invalidated&&this.invalidated.rowCount!=undefined?this.invalidated.rowCount:this.rowCount;},textSizeChanged:function(){this.render();},sizeChange:function(){this.update();},createManagers:function(){this.rows=new dojox.grid._RowManager(this);this.focus=new dojox.grid._FocusManager(this);this.edit=new dojox.grid._EditManager(this);},createSelection:function(){this.selection=new dojox.grid.Selection(this);},createScroller:function(){this.scroller=new dojox.grid._Scroller();this.scroller.grid=this;this.scroller.renderRow=dojo.hitch(this,"renderRow");this.scroller.removeRow=dojo.hitch(this,"rowRemoved");},createLayout:function(){this.layout=new this._layoutClass(this);this.connect(this.layout,"moveColumn","onMoveColumn");},onMoveColumn:function(){this.render();},onResizeColumn:function(_4){},createViews:function(){this.views=new dojox.grid._ViewManager(this);this.views.createView=dojo.hitch(this,"createView");},createView:function(_5,_6){var c=dojo.getObject(_5);var _7=new c({grid:this,index:_6});this.viewsNode.appendChild(_7.domNode);this.viewsHeaderNode.appendChild(_7.headerNode);this.views.addView(_7);return _7;},buildViews:function(){for(var i=0,vs;(vs=this.layout.structure[i]);i++){this.createView(vs.type||dojox._scopeName+".grid._View",i).setStructure(vs);}this.scroller.setContentNodes(this.views.getContentNodes());},_setStructureAttr:function(_8){var s=_8;if(s&&dojo.isString(s)){dojo.deprecated("dojox.grid._Grid.attr('structure', 'objVar')","use dojox.grid._Grid.attr('structure', objVar) instead","2.0");s=dojo.getObject(s);}this.structure=s;if(!s){if(this.layout.structure){s=this.layout.structure;}else{return;}}this.views.destroyViews();if(s!==this.layout.structure){this.layout.setStructure(s);}this._structureChanged();},setStructure:function(_9){dojo.deprecated("dojox.grid._Grid.setStructure(obj)","use dojox.grid._Grid.attr('structure', obj) instead.","2.0");this._setStructureAttr(_9);},getColumnTogglingItems:function(){return dojo.map(this.layout.cells,function(_a){if(!_a.menuItems){_a.menuItems=[];}var _b=this;var _c=new dijit.CheckedMenuItem({label:_a.name,checked:!_a.hidden,_gridCell:_a,onChange:function(_d){if(_b.layout.setColumnVisibility(this._gridCell.index,_d)){var _e=this._gridCell.menuItems;if(_e.length>1){dojo.forEach(_e,function(_f){if(_f!==this){_f.setAttribute("checked",_d);}},this);}_d=dojo.filter(_b.layout.cells,function(c){if(c.menuItems.length>1){dojo.forEach(c.menuItems,"item.attr('disabled', false);");}else{c.menuItems[0].attr("disabled",false);}return !c.hidden;});if(_d.length==1){dojo.forEach(_d[0].menuItems,"item.attr('disabled', true);");}}},destroy:function(){var _10=dojo.indexOf(this._gridCell.menuItems,this);this._gridCell.menuItems.splice(_10,1);delete this._gridCell;dijit.CheckedMenuItem.prototype.destroy.apply(this,arguments);}});_a.menuItems.push(_c);return _c;},this);},_setHeaderMenuAttr:function(_11){if(this._placeholders&&this._placeholders.length){dojo.forEach(this._placeholders,function(p){p.unReplace(true);});this._placeholders=[];}if(this.headerMenu){this.headerMenu.unBindDomNode(this.viewsHeaderNode);}this.headerMenu=_11;if(!_11){return;}this.headerMenu.bindDomNode(this.viewsHeaderNode);if(this.headerMenu.getPlaceholders){this._placeholders=this.headerMenu.getPlaceholders(this.placeholderLabel);}},setHeaderMenu:function(_12){dojo.deprecated("dojox.grid._Grid.setHeaderMenu(obj)","use dojox.grid._Grid.attr('headerMenu', obj) instead.","2.0");this._setHeaderMenuAttr(_12);},setupHeaderMenu:function(){if(this._placeholders&&this._placeholders.length){dojo.forEach(this._placeholders,function(p){if(p._replaced){p.unReplace(true);}p.replace(this.getColumnTogglingItems());},this);}},_fetch:function(_13){this.setScrollTop(0);},getItem:function(_14){return null;},showMessage:function(_15){if(_15){this.messagesNode.innerHTML=_15;this.messagesNode.style.display="";}else{this.messagesNode.innerHTML="";this.messagesNode.style.display="none";}},_structureChanged:function(){this.buildViews();if(this.autoRender&&this._started){this.render();}},hasLayout:function(){return this.layout.cells.length;},resize:function(_16,_17){this._pendingChangeSize=_16;this._pendingResultSize=_17;this.sizeChange();},_getPadBorder:function(){this._padBorder=this._padBorder||dojo._getPadBorderExtents(this.domNode);return this._padBorder;},_getHeaderHeight:function(){var vns=this.viewsHeaderNode.style,t=vns.display=="none"?0:this.views.measureHeader();vns.height=t+"px";this.views.normalizeHeaderNodeHeight();return t;},_resize:function(_18,_19){_18=_18||this._pendingChangeSize;_19=_19||this._pendingResultSize;delete this._pendingChangeSize;delete this._pendingResultSize;if(!this.domNode){return;}var pn=this.domNode.parentNode;if(!pn||pn.nodeType!=1||!this.hasLayout()||pn.style.visibility=="hidden"||pn.style.display=="none"){return;}var _1a=this._getPadBorder();var hh=undefined;var h;if(this._autoHeight){this.domNode.style.height="auto";this.viewsNode.style.height="";}else{if(typeof this.autoHeight=="number"){h=hh=this._getHeaderHeight();h+=(this.scroller.averageRowHeight*this.autoHeight);this.domNode.style.height=h+"px";}else{if(this.domNode.clientHeight<=_1a.h){if(pn==document.body){this.domNode.style.height=this.defaultHeight;}else{if(this.height){this.domNode.style.height=this.height;}else{this.fitTo="parent";}}}}}if(_19){_18=_19;}if(_18){dojo.marginBox(this.domNode,_18);this.height=this.domNode.style.height;delete this.fitTo;}else{if(this.fitTo=="parent"){h=this._parentContentBoxHeight=this._parentContentBoxHeight||dojo._getContentBox(pn).h;this.domNode.style.height=Math.max(0,h)+"px";}}var _1b=dojo.some(this.views.views,function(v){return v.flexCells;});if(!this._autoHeight&&(h||dojo._getContentBox(this.domNode).h)===0){this.viewsHeaderNode.style.display="none";}else{this.viewsHeaderNode.style.display="block";if(!_1b&&hh===undefined){hh=this._getHeaderHeight();}}if(_1b){hh=undefined;}this.adaptWidth();this.adaptHeight(hh);this.postresize();},adaptWidth:function(){var _1c=(!this.initialWidth&&this.autoWidth);var w=_1c?0:this.domNode.clientWidth||(this.domNode.offsetWidth-this._getPadBorder().w),vw=this.views.arrange(1,w);this.views.onEach("adaptWidth");if(_1c){this.domNode.style.width=vw+"px";}},adaptHeight:function(_1d){var t=_1d===undefined?this._getHeaderHeight():_1d;var h=(this._autoHeight?-1:Math.max(this.domNode.clientHeight-t,0)||0);this.views.onEach("setSize",[0,h]);this.views.onEach("adaptHeight");if(!this._autoHeight){var _1e=0,_1f=0;var _20=dojo.filter(this.views.views,function(v){var has=v.hasHScrollbar();if(has){_1e++;}else{_1f++;}return (!has);});if(_1e>0&&_1f>0){dojo.forEach(_20,function(v){v.adaptHeight(true);});}}if(this.autoHeight===true||h!=-1||(typeof this.autoHeight=="number"&&this.autoHeight>=this.attr("rowCount"))){this.scroller.windowHeight=h;}else{this.scroller.windowHeight=Math.max(this.domNode.clientHeight-t,0);}},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.autoRender){this.render();}},render:function(){if(!this.domNode){return;}if(!this._started){return;}if(!this.hasLayout()){this.scroller.init(0,this.keepRows,this.rowsPerPage);return;}this.update=this.defaultUpdate;this._render();},_render:function(){this.scroller.init(this.attr("rowCount"),this.keepRows,this.rowsPerPage);this.prerender();this.setScrollTop(0);this.postrender();},prerender:function(){this.keepRows=this._autoHeight?0:this.keepRows;this.scroller.setKeepInfo(this.keepRows);this.views.render();this._resize();},postrender:function(){this.postresize();this.focus.initFocusView();dojo.setSelectable(this.domNode,this.selectable);},postresize:function(){if(this._autoHeight){var _21=Math.max(this.views.measureContent())+"px";this.viewsNode.style.height=_21;}},renderRow:function(_22,_23){this.views.renderRow(_22,_23,this._skipRowRenormalize);},rowRemoved:function(_24){this.views.rowRemoved(_24);},invalidated:null,updating:false,beginUpdate:function(){this.invalidated=[];this.updating=true;},endUpdate:function(){this.updating=false;var i=this.invalidated,r;if(i.all){this.update();}else{if(i.rowCount!=undefined){this.updateRowCount(i.rowCount);}else{for(r in i){this.updateRow(Number(r));}}}this.invalidated=[];},defaultUpdate:function(){if(!this.domNode){return;}if(this.updating){this.invalidated.all=true;return;}this.lastScrollTop=this.scrollTop;this.prerender();this.scroller.invalidateNodes();this.setScrollTop(this.lastScrollTop);this.postrender();},update:function(){this.render();},updateRow:function(_25){_25=Number(_25);if(this.updating){this.invalidated[_25]=true;}else{this.views.updateRow(_25);this.scroller.rowHeightChanged(_25);}},updateRows:function(_26,_27){_26=Number(_26);_27=Number(_27);var i;if(this.updating){for(i=0;i<_27;i++){this.invalidated[i+_26]=true;}}else{for(i=0;i<_27;i++){this.views.updateRow(i+_26,this._skipRowRenormalize);}this.scroller.rowHeightChanged(_26);}},updateRowCount:function(_28){if(this.updating){this.invalidated.rowCount=_28;}else{this.rowCount=_28;this._setAutoHeightAttr(this.autoHeight,true);if(this.layout.cells.length){this.scroller.updateRowCount(_28);}this._resize();if(this.layout.cells.length){this.setScrollTop(this.scrollTop);}}},updateRowStyles:function(_29){this.views.updateRowStyles(_29);},getRowNode:function(_2a){if(this.focus.focusView&&!(this.focus.focusView instanceof dojox.grid._RowSelector)){return this.focus.focusView.rowNodes[_2a];}else{for(var i=0,_2b;(_2b=this.views.views[i]);i++){if(!(_2b instanceof dojox.grid._RowSelector)){return _2b.rowNodes[_2a];}}}return null;},rowHeightChanged:function(_2c){this.views.renormalizeRow(_2c);this.scroller.rowHeightChanged(_2c);},fastScroll:true,delayScroll:false,scrollRedrawThreshold:(dojo.isIE?100:50),scrollTo:function(_2d){if(!this.fastScroll){this.setScrollTop(_2d);return;}var _2e=Math.abs(this.lastScrollTop-_2d);this.lastScrollTop=_2d;if(_2e>this.scrollRedrawThreshold||this.delayScroll){this.delayScroll=true;this.scrollTop=_2d;this.views.setScrollTop(_2d);if(this._pendingScroll){window.clearTimeout(this._pendingScroll);}var _2f=this;this._pendingScroll=window.setTimeout(function(){delete _2f._pendingScroll;_2f.finishScrollJob();},200);}else{this.setScrollTop(_2d);}},finishScrollJob:function(){this.delayScroll=false;this.setScrollTop(this.scrollTop);},setScrollTop:function(_30){this.scroller.scroll(this.views.setScrollTop(_30));},scrollToRow:function(_31){this.setScrollTop(this.scroller.findScrollTop(_31)+1);},styleRowNode:function(_32,_33){if(_33){this.rows.styleRowNode(_32,_33);}},_mouseOut:function(e){this.rows.setOverRow(-2);},getCell:function(_34){return this.layout.cells[_34];},setCellWidth:function(_35,_36){this.getCell(_35).unitWidth=_36;},getCellName:function(_37){return "Cell "+_37.index;},canSort:function(_38){},sort:function(){},getSortAsc:function(_39){_39=_39==undefined?this.sortInfo:_39;return Boolean(_39>0);},getSortIndex:function(_3a){_3a=_3a==undefined?this.sortInfo:_3a;return Math.abs(_3a)-1;},setSortIndex:function(_3b,_3c){var si=_3b+1;if(_3c!=undefined){si*=(_3c?1:-1);}else{if(this.getSortIndex()==_3b){si=-this.sortInfo;}}this.setSortInfo(si);},setSortInfo:function(_3d){if(this.canSort(_3d)){this.sortInfo=_3d;this.sort();this.update();}},doKeyEvent:function(e){e.dispatch="do"+e.type;this.onKeyEvent(e);},_dispatch:function(m,e){if(m in this){return this[m](e);}return false;},dispatchKeyEvent:function(e){this._dispatch(e.dispatch,e);},dispatchContentEvent:function(e){this.edit.dispatchEvent(e)||e.sourceView.dispatchContentEvent(e)||this._dispatch(e.dispatch,e);},dispatchHeaderEvent:function(e){e.sourceView.dispatchHeaderEvent(e)||this._dispatch("doheader"+e.type,e);},dokeydown:function(e){this.onKeyDown(e);},doclick:function(e){if(e.cellNode){this.onCellClick(e);}else{this.onRowClick(e);}},dodblclick:function(e){if(e.cellNode){this.onCellDblClick(e);}else{this.onRowDblClick(e);}},docontextmenu:function(e){if(e.cellNode){this.onCellContextMenu(e);}else{this.onRowContextMenu(e);}},doheaderclick:function(e){if(e.cellNode){this.onHeaderCellClick(e);}else{this.onHeaderClick(e);}},doheaderdblclick:function(e){if(e.cellNode){this.onHeaderCellDblClick(e);}else{this.onHeaderDblClick(e);}},doheadercontextmenu:function(e){if(e.cellNode){this.onHeaderCellContextMenu(e);}else{this.onHeaderContextMenu(e);}},doStartEdit:function(_3e,_3f){this.onStartEdit(_3e,_3f);},doApplyCellEdit:function(_40,_41,_42){this.onApplyCellEdit(_40,_41,_42);},doCancelEdit:function(_43){this.onCancelEdit(_43);},doApplyEdit:function(_44){this.onApplyEdit(_44);},addRow:function(){this.updateRowCount(this.attr("rowCount")+1);},removeSelectedRows:function(){if(this.allItemsSelected){this.updateRowCount(0);}else{this.updateRowCount(Math.max(0,this.attr("rowCount")-this.selection.getSelected().length));}this.selection.clear();}});dojox.grid._Grid.markupFactory=function(_45,_46,_47,_48){var d=dojo;var _49=function(n){var w=d.attr(n,"width")||"auto";if((w!="auto")&&(w.slice(-2)!="em")&&(w.slice(-1)!="%")){w=parseInt(w,10)+"px";}return w;};if(!_45.structure&&_46.nodeName.toLowerCase()=="table"){_45.structure=d.query("> colgroup",_46).map(function(cg){var sv=d.attr(cg,"span");var v={noscroll:(d.attr(cg,"noscroll")=="true")?true:false,__span:(!!sv?parseInt(sv,10):1),cells:[]};if(d.hasAttr(cg,"width")){v.width=_49(cg);}return v;});if(!_45.structure.length){_45.structure.push({__span:Infinity,cells:[]});}d.query("thead > tr",_46).forEach(function(tr,_4a){var _4b=0;var _4c=0;var _4d;var _4e=null;d.query("> th",tr).map(function(th){if(!_4e){_4d=0;_4e=_45.structure[0];}else{if(_4b>=(_4d+_4e.__span)){_4c++;_4d+=_4e.__span;var _4f=_4e;_4e=_45.structure[_4c];}}var _50={name:d.trim(d.attr(th,"name")||th.innerHTML),colSpan:parseInt(d.attr(th,"colspan")||1,10),type:d.trim(d.attr(th,"cellType")||""),id:d.trim(d.attr(th,"id")||"")};_4b+=_50.colSpan;var _51=d.attr(th,"rowspan");if(_51){_50.rowSpan=_51;}if(d.hasAttr(th,"width")){_50.width=_49(th);}if(d.hasAttr(th,"relWidth")){_50.relWidth=window.parseInt(dojo.attr(th,"relWidth"),10);}if(d.hasAttr(th,"hidden")){_50.hidden=d.attr(th,"hidden")=="true";}if(_48){_48(th,_50);}_50.type=_50.type?dojo.getObject(_50.type):dojox.grid.cells.Cell;if(_50.type&&_50.type.markupFactory){_50.type.markupFactory(th,_50);}if(!_4e.cells[_4a]){_4e.cells[_4a]=[];}_4e.cells[_4a].push(_50);});});}return new _47(_45,_46);};})();}