summaryrefslogtreecommitdiff
path: root/lib/dijit/tree/TreeStoreModel.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dijit/tree/TreeStoreModel.js')
-rw-r--r--lib/dijit/tree/TreeStoreModel.js145
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);
+}
+}});
+}