You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.8 KiB
JavaScript
146 lines
3.8 KiB
JavaScript
14 years ago
|
/*
|
||
|
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);
|
||
|
}
|
||
|
}});
|
||
|
}
|