diff options
Diffstat (limited to 'lib/dijit/tree/TreeStoreModel.js')
-rw-r--r-- | lib/dijit/tree/TreeStoreModel.js | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/lib/dijit/tree/TreeStoreModel.js b/lib/dijit/tree/TreeStoreModel.js new file mode 100644 index 000000000..c03bef526 --- /dev/null +++ b/lib/dijit/tree/TreeStoreModel.js @@ -0,0 +1,145 @@ +/* + Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + + +if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){ +dojo._hasResource["dijit.tree.TreeStoreModel"]=true; +dojo.provide("dijit.tree.TreeStoreModel"); +dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_1){ +dojo.mixin(this,_1); +this.connects=[]; +var _2=this.store; +if(!_2.getFeatures()["dojo.data.api.Identity"]){ +throw new Error("dijit.Tree: store must support dojo.data.Identity"); +} +if(_2.getFeatures()["dojo.data.api.Notification"]){ +this.connects=this.connects.concat([dojo.connect(_2,"onNew",this,"onNewItem"),dojo.connect(_2,"onDelete",this,"onDeleteItem"),dojo.connect(_2,"onSet",this,"onSetItem")]); +} +},destroy:function(){ +dojo.forEach(this.connects,dojo.disconnect); +},getRoot:function(_3,_4){ +if(this.root){ +_3(this.root); +}else{ +this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_5){ +if(_5.length!=1){ +throw new Error(this.declaredClass+": query "+dojo.toJson(this.query)+" returned "+_5.length+" items, but must return exactly one item"); +} +this.root=_5[0]; +_3(this.root); +}),onError:_4}); +} +},mayHaveChildren:function(_6){ +return dojo.some(this.childrenAttrs,function(_7){ +return this.store.hasAttribute(_6,_7); +},this); +},getChildren:function(_8,_9,_a){ +var _b=this.store; +if(!_b.isItemLoaded(_8)){ +var _c=dojo.hitch(this,arguments.callee); +_b.loadItem({item:_8,onItem:function(_d){ +_c(_d,_9,_a); +},onError:_a}); +return; +} +var _e=[]; +for(var i=0;i<this.childrenAttrs.length;i++){ +var _f=_b.getValues(_8,this.childrenAttrs[i]); +_e=_e.concat(_f); +} +var _10=0; +if(!this.deferItemLoadingUntilExpand){ +dojo.forEach(_e,function(_11){ +if(!_b.isItemLoaded(_11)){ +_10++; +} +}); +} +if(_10==0){ +_9(_e); +}else{ +dojo.forEach(_e,function(_12,idx){ +if(!_b.isItemLoaded(_12)){ +_b.loadItem({item:_12,onItem:function(_13){ +_e[idx]=_13; +if(--_10==0){ +_9(_e); +} +},onError:_a}); +} +}); +} +},isItem:function(_14){ +return this.store.isItem(_14); +},fetchItemByIdentity:function(_15){ +this.store.fetchItemByIdentity(_15); +},getIdentity:function(_16){ +return this.store.getIdentity(_16); +},getLabel:function(_17){ +if(this.labelAttr){ +return this.store.getValue(_17,this.labelAttr); +}else{ +return this.store.getLabel(_17); +} +},newItem:function(_18,_19,_1a){ +var _1b={parent:_19,attribute:this.childrenAttrs[0],insertIndex:_1a}; +if(this.newItemIdAttr&&_18[this.newItemIdAttr]){ +this.fetchItemByIdentity({identity:_18[this.newItemIdAttr],scope:this,onItem:function(_1c){ +if(_1c){ +this.pasteItem(_1c,null,_19,true,_1a); +}else{ +this.store.newItem(_18,_1b); +} +}}); +}else{ +this.store.newItem(_18,_1b); +} +},pasteItem:function(_1d,_1e,_1f,_20,_21){ +var _22=this.store,_23=this.childrenAttrs[0]; +if(_1e){ +dojo.forEach(this.childrenAttrs,function(_24){ +if(_22.containsValue(_1e,_24,_1d)){ +if(!_20){ +var _25=dojo.filter(_22.getValues(_1e,_24),function(x){ +return x!=_1d; +}); +_22.setValues(_1e,_24,_25); +} +_23=_24; +} +}); +} +if(_1f){ +if(typeof _21=="number"){ +var _26=_22.getValues(_1f,_23).slice(); +_26.splice(_21,0,_1d); +_22.setValues(_1f,_23,_26); +}else{ +_22.setValues(_1f,_23,_22.getValues(_1f,_23).concat(_1d)); +} +} +},onChange:function(_27){ +},onChildrenChange:function(_28,_29){ +},onDelete:function(_2a,_2b){ +},onNewItem:function(_2c,_2d){ +if(!_2d){ +return; +} +this.getChildren(_2d.item,dojo.hitch(this,function(_2e){ +this.onChildrenChange(_2d.item,_2e); +})); +},onDeleteItem:function(_2f){ +this.onDelete(_2f); +},onSetItem:function(_30,_31,_32,_33){ +if(dojo.indexOf(this.childrenAttrs,_31)!=-1){ +this.getChildren(_30,dojo.hitch(this,function(_34){ +this.onChildrenChange(_30,_34); +})); +}else{ +this.onChange(_30); +} +}}); +} |