Tree.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["dijit.Tree"]){dojo._hasResource["dijit.Tree"]=true;dojo.provide("dijit.Tree");dojo.require("dojo.fx");dojo.require("dojo.DeferredList");dojo.require("dijit._Widget");dojo.require("dijit._Templated");dojo.require("dijit._Container");dojo.require("dijit._Contained");dojo.require("dojo.cookie");dojo.declare("dijit._TreeNode",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained],{item:null,isTreeNode:true,label:"",isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:dojo.cache("dijit","templates/TreeNode.html","<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitTreeIcon\" waiRole=\"presentation\"\n\t\t\t><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onLabelFocus, onblur:_onLabelBlur\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" waiRole=\"presentation\" style=\"display: none;\"></div>\n</div>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"labelNode",type:"innerText"},tooltip:{node:"rowNode",type:"attribute",attribute:"title"}}),postCreate:function(){this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}},_setIndentAttr:function(_1){this.indent=_1;var _2=(Math.max(_1,0)*this.tree._nodePixelIndent)+"px";dojo.style(this.domNode,"backgroundPosition",_2+" 0px");dojo.style(this.rowNode,dojo._isBodyLtr()?"paddingLeft":"paddingRight",_2);dojo.forEach(this.getChildren(),function(_3){_3.attr("indent",_1+1);});},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(_4){var _5=this.tree,_6=_5.model;if(_5._v10Compat&&_4===_6.root){_4=null;}this._applyClassAndStyle(_4,"icon","Icon");this._applyClassAndStyle(_4,"label","Label");this._applyClassAndStyle(_4,"row","Row");},_applyClassAndStyle:function(_7,_8,_9){var _a="_"+_8+"Class";var _b=_8+"Node";if(this[_a]){dojo.removeClass(this[_b],this[_a]);}this[_a]=this.tree["get"+_9+"Class"](_7,this.isExpanded);if(this[_a]){dojo.addClass(this[_b],this[_a]);}dojo.style(this[_b],this.tree["get"+_9+"Style"](_7,this.isExpanded)||{});},_updateLayout:function(){var _c=this.getParent();if(!_c||_c.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_d){var _e=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_f=["*","-","+","*"],idx=_d?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.removeClass(this.expandoNode,_e);dojo.addClass(this.expandoNode,_e[idx]);this.expandoNodeText.innerHTML=_f[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();this.isExpanded=true;dijit.setWaiState(this.labelNode,"expanded","true");dijit.setWaiRole(this.containerNode,"group");dojo.addClass(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(this==this.tree.rootNode){dijit.setWaiState(this.tree.domNode,"expanded","true");}var def,_10=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new dojo.Deferred(function(){_10.stop();}));_10.play();return def;},collapse:function(){if(!this.isExpanded){return;}if(this._expandDeferred){this._expandDeferred.cancel();delete this._expandDeferred;}this.isExpanded=false;dijit.setWaiState(this.labelNode,"expanded","false");if(this==this.tree.rootNode){dijit.setWaiState(this.tree.domNode,"expanded","false");}dojo.removeClass(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(!this._wipeOut){this._wipeOut=dojo.fx.wipeOut({node:this.containerNode,duration:dijit.defaultDuration});}this._wipeOut.play();},indent:0,setChildItems:function(_11){var _12=this.tree,_13=_12.model,_14=[];this.getChildren().forEach(function(_15){dijit._Container.prototype.removeChild.call(this,_15);},this);this.state="LOADED";if(_11&&_11.length>0){this.isExpandable=true;dojo.forEach(_11,function(_16){var id=_13.getIdentity(_16),_17=_12._itemNodesMap[id],_18;if(_17){for(var i=0;i<_17.length;i++){if(_17[i]&&!_17[i].getParent()){_18=_17[i];_18.attr("indent",this.indent+1);break;}}}if(!_18){_18=this.tree._createTreeNode({item:_16,tree:_12,isExpandable:_13.mayHaveChildren(_16),label:_12.getLabel(_16),tooltip:_12.getTooltip(_16),indent:this.indent+1});if(_17){_17.push(_18);}else{_12._itemNodesMap[id]=[_18];}}this.addChild(_18);if(this.tree.autoExpand||this.tree._state(_16)){_14.push(_12._expandNode(_18));}},this);dojo.forEach(this.getChildren(),function(_19,idx){_19._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}if(this==_12.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setSelected(true);_12.lastFocused=fc;}else{_12.domNode.setAttribute("tabIndex","0");}}return new dojo.DeferredList(_14);},removeChild:function(_1a){this.inherited(arguments);var _1b=this.getChildren();if(_1b.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_1b,function(_1c){_1c._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(evt){dojo.addClass(this.labelNode,"dijitTreeLabelFocused");this.tree._onNodeFocus(this);},_onLabelBlur:function(evt){dojo.removeClass(this.labelNode,"dijitTreeLabelFocused");},setSelected:function(_1d){var _1e=this.labelNode;_1e.setAttribute("tabIndex",_1d?"0":"-1");dijit.setWaiState(_1e,"selected",_1d);dojo.toggleClass(this.rowNode,"dijitTreeNodeSelected",_1d);},_onClick:function(evt){this.tree._onClick(this,evt);},_onDblClick:function(evt){this.tree._onDblClick(this,evt);},_onMouseEnter:function(evt){dojo.addClass(this.rowNode,"dijitTreeNodeHover");this.tree._onNodeMouseEnter(this,evt);},_onMouseLeave:function(evt){dojo.removeClass(this.rowNode,"dijitTreeNodeHover");this.tree._onNodeMouseLeave(this,evt);}});dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],path:[],selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:dojo.cache("dijit","templates/Tree.html","<div class=\"dijitTree dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetector\"></div>\n</div>\n"),persist:true,autoExpand:false,dndController:null,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance","dragThreshold","betweenThreshold"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,dragThreshold:5,betweenThreshold:0,_nodePixelIndent:19,_publish:function(_1f,_20){dojo.publish(this.id,[dojo.mixin({tree:this,event:_1f},_20||{})]);},postMixInProperties:function(){this.tree=this;this._itemNodesMap={};if(!this.cookieName){this.cookieName=this.id+"SaveStateCookie";}this._loadDeferred=new dojo.Deferred();this.inherited(arguments);},postCreate:function(){this._initState();if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this.connect(this.model,"onDelete","_onItemDelete");this._load();this.inherited(arguments);if(this.dndController){if(dojo.isString(this.dndController)){this.dndController=dojo.getObject(this.dndController);}var _21={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_21[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_21);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _22={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_22.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_22.getChildren=dojo.hitch(this,function(_23,_24,_25){this.getItemChildren((this._v10Compat&&_23===this.model.root)?null:_23,_24,_25);});}this.model=new dijit.tree.ForestStoreModel(_22);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){this.model.getRoot(dojo.hitch(this,function(_26){var rn=(this.rootNode=this.tree._createTreeNode({item:_26,tree:this,isExpandable:true,label:this.label||this.getLabel(_26),indent:this.showRoot?0:-1}));if(!this.showRoot){rn.rowNode.style.display="none";}this.domNode.appendChild(rn.domNode);var _27=this.model.getIdentity(_26);if(this._itemNodesMap[_27]){this._itemNodesMap[_27].push(rn);}else{this._itemNodesMap[_27]=[rn];}rn._updateLayout();this._expandNode(rn).addCallback(dojo.hitch(this,function(){this._loadDeferred.callback(true);this.onLoad();}));}),function(err){console.error(this,": error loading root: ",err);});},getNodesByItem:function(_28){if(!_28){return [];}var _29=dojo.isString(_28)?_28:this.model.getIdentity(_28);return [].concat(this._itemNodesMap[_29]);},_setSelectedItemAttr:function(_2a){var _2b=this.attr("selectedItem");var _2c=(!_2a||dojo.isString(_2a))?_2a:this.model.getIdentity(_2a);if(_2c==_2b?this.model.getIdentity(_2b):null){return;}var _2d=this._itemNodesMap[_2c];if(_2d&&_2d.length){this.focusNode(_2d[0]);}else{if(this.lastFocused){this.lastFocused.setSelected(false);this.lastFocused=null;}}},_getSelectedItemAttr:function(){return this.lastFocused&&this.lastFocused.item;},_setPathAttr:function(_2e){if(!_2e||!_2e.length){return;}this._loadDeferred.addCallback(dojo.hitch(this,function(){if(!this.rootNode){return;}if(_2e[0]!==this.rootNode.item&&(dojo.isString(_2e[0])&&_2e[0]!=this.model.getIdentity(this.rootNode.item))){console.error(this,":path[0] doesn't match this.rootNode.item. Maybe you are using the wrong tree.");return;}_2e.shift();var _2f=this.rootNode;function _30(){var _31=_2e.shift(),_32=dojo.isString(_31)?_31:this.model.getIdentity(_31);dojo.some(this._itemNodesMap[_32],function(n){if(n.getParent()==_2f){_2f=n;return true;}return false;});if(_2e.length){this._expandNode(_2f).addCallback(dojo.hitch(this,_30));}else{if(this.lastFocused!=_2f){this.focusNode(_2f);}}};this._expandNode(_2f).addCallback(dojo.hitch(this,_30));}));},_getPathAttr:function(){if(!this.lastFocused){return;}var res=[];var _33=this.lastFocused;while(_33&&_33!==this.rootNode){res.unshift(_33.item);_33=_33.getParent();}res.unshift(this.rootNode.item);return res;},mayHaveChildren:function(_34){},getItemChildren:function(_35,_36){},getLabel:function(_37){return this.model.getLabel(_37);},getIconClass:function(_38,_39){return (!_38||this.model.mayHaveChildren(_38))?(_39?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(_3a,_3b){},getRowClass:function(_3c,_3d){},getIconStyle:function(_3e,_3f){},getLabelStyle:function(_40,_41){},getRowStyle:function(_42,_43){},getTooltip:function(_44){return "";},_onKeyPress:function(e){if(e.altKey){return;}var dk=dojo.keys;var _45=dijit.getEnclosingWidget(e.target);if(!_45){return;}var key=e.charOrCode;if(typeof key=="string"){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_45,key:key.toLowerCase()});dojo.stopEvent(e);}}else{if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}var map=this._keyHandlerMap;if(!map){map={};map[dk.ENTER]="_onEnterKey";map[this.isLeftToRight()?dk.LEFT_ARROW:dk.RIGHT_ARROW]="_onLeftArrow";map[this.isLeftToRight()?dk.RIGHT_ARROW:dk.LEFT_ARROW]="_onRightArrow";map[dk.UP_ARROW]="_onUpArrow";map[dk.DOWN_ARROW]="_onDownArrow";map[dk.HOME]="_onHomeKey";map[dk.END]="_onEndKey";this._keyHandlerMap=map;}if(this._keyHandlerMap[key]){this[this._keyHandlerMap[key]]({node:_45,item:_45.item,evt:e});dojo.stopEvent(e);}}},_onEnterKey:function(_46,evt){this._publish("execute",{item:_46.item,node:_46.node});this.onClick(_46.item,_46.node,evt);},_onDownArrow:function(_47){var _48=this._getNextNode(_47.node);if(_48&&_48.isTreeNode){this.focusNode(_48);}},_onUpArrow:function(_49){var _4a=_49.node;var _4b=_4a.getPreviousSibling();if(_4b){_4a=_4b;while(_4a.isExpandable&&_4a.isExpanded&&_4a.hasChildren()){var _4c=_4a.getChildren();_4a=_4c[_4c.length-1];}}else{var _4d=_4a.getParent();if(!(!this.showRoot&&_4d===this.rootNode)){_4a=_4d;}}if(_4a&&_4a.isTreeNode){this.focusNode(_4a);}},_onRightArrow:function(_4e){var _4f=_4e.node;if(_4f.isExpandable&&!_4f.isExpanded){this._expandNode(_4f);}else{if(_4f.hasChildren()){_4f=_4f.getChildren()[0];if(_4f&&_4f.isTreeNode){this.focusNode(_4f);}}}},_onLeftArrow:function(_50){var _51=_50.node;if(_51.isExpandable&&_51.isExpanded){this._collapseNode(_51);}else{var _52=_51.getParent();if(_52&&_52.isTreeNode&&!(!this.showRoot&&_52===this.rootNode)){this.focusNode(_52);}}},_onHomeKey:function(){var _53=this._getRootOrFirstNode();if(_53){this.focusNode(_53);}},_onEndKey:function(_54){var _55=this.rootNode;while(_55.isExpanded){var c=_55.getChildren();_55=c[c.length-1];}if(_55&&_55.isTreeNode){this.focusNode(_55);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_56){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_56.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_56.key,startNode:_56.node};}var _57=this;cs.timer=setTimeout(function(){delete _57._curSearch;},this.multiCharSearchDuration);var _58=cs.startNode;do{_58=this._getNextNode(_58);if(!_58){_58=this._getRootOrFirstNode();}}while(_58!==cs.startNode&&(_58.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(_58&&_58.isTreeNode){if(_58!==cs.startNode){this.focusNode(_58);}}},_onClick:function(_59,e){var _5a=e.target;if((this.openOnClick&&_59.isExpandable)||(_5a==_59.expandoNode||_5a==_59.expandoNodeText)){if(_59.isExpandable){this._onExpandoClick({node:_59});}}else{this._publish("execute",{item:_59.item,node:_59,evt:e});this.onClick(_59.item,_59,e);this.focusNode(_59);}dojo.stopEvent(e);},_onDblClick:function(_5b,e){var _5c=e.target;if((this.openOnDblClick&&_5b.isExpandable)||(_5c==_5b.expandoNode||_5c==_5b.expandoNodeText)){if(_5b.isExpandable){this._onExpandoClick({node:_5b});}}else{this._publish("execute",{item:_5b.item,node:_5b,evt:e});this.onDblClick(_5b.item,_5b,e);this.focusNode(_5b);}dojo.stopEvent(e);},_onExpandoClick:function(_5d){var _5e=_5d.node;this.focusNode(_5e);if(_5e.isExpanded){this._collapseNode(_5e);}else{this._expandNode(_5e);}},onClick:function(_5f,_60,evt){},onDblClick:function(_61,_62,evt){},onOpen:function(_63,_64){},onClose:function(_65,_66){},_getNextNode:function(_67){if(_67.isExpandable&&_67.isExpanded&&_67.hasChildren()){return _67.getChildren()[0];}else{while(_67&&_67.isTreeNode){var _68=_67.getNextSibling();if(_68){return _68;}_67=_67.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(_69){if(_69._expandNodeDeferred){delete _69._expandNodeDeferred;}if(_69.isExpandable){if(_69.state=="LOADING"){return;}_69.collapse();this.onClose(_69.item,_69);if(_69.item){this._state(_69.item,false);this._saveState();}}},_expandNode:function(_6a,_6b){if(_6a._expandNodeDeferred&&!_6b){return _6a._expandNodeDeferred;}var _6c=this.model,_6d=_6a.item,_6e=this;switch(_6a.state){case "UNCHECKED":_6a.markProcessing();var def=(_6a._expandNodeDeferred=new dojo.Deferred());_6c.getChildren(_6d,function(_6f){_6a.unmarkProcessing();var _70=_6a.setChildItems(_6f);var ed=_6e._expandNode(_6a,true);_70.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_6e,": error loading root children: ",err);});break;default:def=(_6a._expandNodeDeferred=_6a.expand());this.onOpen(_6a.item,_6a);if(_6d){this._state(_6d,true);this._saveState();}}return def;},focusNode:function(_71){dijit.focus(_71.labelNode);},_onNodeFocus:function(_72){if(_72){if(_72!=this.lastFocused&&this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setSelected(false);}_72.setSelected(true);this.lastFocused=_72;}},_onNodeMouseEnter:function(_73){},_onNodeMouseLeave:function(_74){},_onItemChange:function(_75){var _76=this.model,_77=_76.getIdentity(_75),_78=this._itemNodesMap[_77];if(_78){var _79=this;dojo.forEach(_78,function(_7a){_7a.attr({label:_79.getLabel(_75),tooltip:_79.getTooltip(_75)});_7a._updateItemClasses(_75);});}},_onItemChildrenChange:function(_7b,_7c){var _7d=this.model,_7e=_7d.getIdentity(_7b),_7f=this._itemNodesMap[_7e];if(_7f){dojo.forEach(_7f,function(_80){_80.setChildItems(_7c);});}},_onItemDelete:function(_81){var _82=this.model,_83=_82.getIdentity(_81),_84=this._itemNodesMap[_83];if(_84){dojo.forEach(_84,function(_85){var _86=_85.getParent();if(_86){_86.removeChild(_85);}_85.destroyRecursive();});delete this._itemNodesMap[_83];}},_initState:function(){if(this.persist){var _87=dojo.cookie(this.cookieName);this._openedItemIds={};if(_87){dojo.forEach(_87.split(","),function(_88){this._openedItemIds[_88]=true;},this);}}},_state:function(_89,_8a){if(!this.persist){return false;}var id=this.model.getIdentity(_89);if(arguments.length===1){return this._openedItemIds[id];}if(_8a){this._openedItemIds[id]=true;}else{delete this._openedItemIds[id];}},_saveState:function(){if(!this.persist){return;}var ary=[];for(var id in this._openedItemIds){ary.push(id);}dojo.cookie(this.cookieName,ary.join(","),{expires:365});},destroy:function(){if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}if(this.rootNode){this.rootNode.destroyRecursive();}if(this.dndController&&!dojo.isString(this.dndController)){this.dndController.destroy();}this.rootNode=null;this.inherited(arguments);},destroyRecursive:function(){this.destroy();},resize:function(_8b){if(_8b){dojo.marginBox(this.domNode,_8b);dojo.style(this.domNode,"overflow","auto");}this._nodePixelIndent=dojo.marginBox(this.tree.indentDetector).w;if(this.tree.rootNode){this.tree.rootNode.attr("indent",this.showRoot?0:-1);}},_createTreeNode:function(_8c){return new dijit._TreeNode(_8c);}});dojo.require("dijit.tree.TreeStoreModel");dojo.require("dijit.tree.ForestStoreModel");}