blob: 88217c1f31c5768970844780750801dd7ccd8fed [file] [log] [blame]
/*
Copyright (c) 2004-2009, 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["dojox.grid.compat._data.model"]){
dojo._hasResource["dojox.grid.compat._data.model"]=true;
dojo.provide("dojox.grid.compat._data.model");
dojo.require("dojox.grid.compat._data.fields");
dojo.declare("dojox.grid.data.Model",null,{constructor:function(_1,_2){
this.observers=[];
this.fields=new dojox.grid.data.Fields();
if(_1){
this.fields.set(_1);
}
this.setData(_2);
},count:0,updating:0,observer:function(_3,_4){
this.observers.push({o:_3,p:_4||"model"});
},notObserver:function(_5){
for(var i=0,m,o;(o=this.observers[i]);i++){
if(o.o==_5){
this.observers.splice(i,1);
return;
}
}
},notify:function(_9,_a){
var a=_a||[];
for(var i=0,m,o;(o=this.observers[i]);i++){
m=o.p+_9;
o=o.o;
(m in o)&&(o[m].apply(o,a));
}
},clear:function(){
this.fields.clear();
this.clearData();
},beginUpdate:function(){
this.notify("BeginUpdate",arguments);
},endUpdate:function(){
this.notify("EndUpdate",arguments);
},clearData:function(){
this.setData(null);
},change:function(){
this.notify("Change",arguments);
},insertion:function(){
this.notify("Insertion",arguments);
this.notify("Change",arguments);
},removal:function(){
this.notify("Removal",arguments);
this.notify("Change",arguments);
},insert:function(_f){
if(!this._insert.apply(this,arguments)){
return false;
}
this.insertion.apply(this,dojo._toArray(arguments,1));
return true;
},remove:function(_10){
if(!this._remove.apply(this,arguments)){
return false;
}
this.removal.apply(this,arguments);
return true;
},canSort:function(){
return this.sort!=null;
},generateComparator:function(_11,_12,_13,_14){
return function(a,b){
var _17=_11(a[_12],b[_12]);
return _17?(_13?_17:-_17):_14&&_14(a,b);
};
},makeComparator:function(_18){
var idx,col,_1b,_1c=null;
for(var i=_18.length-1;i>=0;i--){
idx=_18[i];
col=Math.abs(idx)-1;
if(col>=0){
_1b=this.fields.get(col);
_1c=this.generateComparator(_1b.compare,_1b.key,idx>0,_1c);
}
}
return _1c;
},sort:null,dummy:0});
dojo.declare("dojox.grid.data.Rows",dojox.grid.data.Model,{allChange:function(){
this.notify("AllChange",arguments);
this.notify("Change",arguments);
},rowChange:function(){
this.notify("RowChange",arguments);
},datumChange:function(){
this.notify("DatumChange",arguments);
},beginModifyRow:function(_1e){
if(!this.cache[_1e]){
this.cache[_1e]=this.copyRow(_1e);
}
},endModifyRow:function(_1f){
var _20=this.cache[_1f];
if(_20){
var _21=this.getRow(_1f);
if(!dojox.grid.arrayCompare(_20,_21)){
this.update(_20,_21,_1f);
}
delete this.cache[_1f];
}
},cancelModifyRow:function(_22){
var _23=this.cache[_22];
if(_23){
this.setRow(_23,_22);
delete this.cache[_22];
}
}});
dojo.declare("dojox.grid.data.Table",dojox.grid.data.Rows,{constructor:function(){
this.cache=[];
},colCount:0,data:null,cache:null,measure:function(){
this.count=this.getRowCount();
this.colCount=this.getColCount();
this.allChange();
},getRowCount:function(){
return (this.data?this.data.length:0);
},getColCount:function(){
return (this.data&&this.data.length?this.data[0].length:this.fields.count());
},badIndex:function(_24,_25){
console.error("dojox.grid.data.Table: badIndex");
},isGoodIndex:function(_26,_27){
return (_26>=0&&_26<this.count&&(arguments.length<2||(_27>=0&&_27<this.colCount)));
},getRow:function(_28){
return this.data[_28];
},copyRow:function(_29){
return this.getRow(_29).slice(0);
},getDatum:function(_2a,_2b){
return this.data[_2a][_2b];
},get:function(){
throw ("Plain \"get\" no longer supported. Use \"getRow\" or \"getDatum\".");
},setData:function(_2c){
this.data=(_2c||[]);
this.allChange();
},setRow:function(_2d,_2e){
this.data[_2e]=_2d;
this.rowChange(_2d,_2e);
this.change();
},setDatum:function(_2f,_30,_31){
this.data[_30][_31]=_2f;
this.datumChange(_2f,_30,_31);
},set:function(){
throw ("Plain \"set\" no longer supported. Use \"setData\", \"setRow\", or \"setDatum\".");
},setRows:function(_32,_33){
for(var i=0,l=_32.length,r=_33;i<l;i++,r++){
this.setRow(_32[i],r);
}
},update:function(_37,_38,_39){
return true;
},_insert:function(_3a,_3b){
dojox.grid.arrayInsert(this.data,_3b,_3a);
this.count++;
return true;
},_remove:function(_3c){
for(var i=_3c.length-1;i>=0;i--){
dojox.grid.arrayRemove(this.data,_3c[i]);
}
this.count-=_3c.length;
return true;
},sort:function(){
this.data.sort(this.makeComparator(arguments));
},swap:function(_3e,_3f){
dojox.grid.arraySwap(this.data,_3e,_3f);
this.rowChange(this.getRow(_3e),_3e);
this.rowChange(this.getRow(_3f),_3f);
this.change();
},dummy:0});
dojo.declare("dojox.grid.data.Objects",dojox.grid.data.Table,{constructor:function(_40,_41,_42){
if(!_40){
this.autoAssignFields();
}
},allChange:function(){
this.notify("FieldsChange");
this.inherited(arguments);
},autoAssignFields:function(){
var d=this.data[0],i=0,_45;
for(var f in d){
_45=this.fields.get(i++);
if(!dojo.isString(_45.key)){
_45.key=f;
}
}
},setData:function(_47){
this.data=(_47||[]);
this.autoAssignFields();
this.allChange();
},getDatum:function(_48,_49){
return this.data[_48][this.fields.get(_49).key];
}});
dojo.declare("dojox.grid.data.Dynamic",dojox.grid.data.Table,{constructor:function(){
this.page=[];
this.pages=[];
},page:null,pages:null,rowsPerPage:100,requests:0,bop:-1,eop:-1,clearData:function(){
this.pages=[];
this.bop=this.eop=-1;
this.setData([]);
},getRowCount:function(){
return this.count;
},getColCount:function(){
return this.fields.count();
},setRowCount:function(_4a){
this.count=_4a;
this.change();
},requestsPending:function(_4b){
},rowToPage:function(_4c){
return (this.rowsPerPage?Math.floor(_4c/this.rowsPerPage):_4c);
},pageToRow:function(_4d){
return (this.rowsPerPage?this.rowsPerPage*_4d:_4d);
},requestRows:function(_4e,_4f){
},rowsProvided:function(_50,_51){
this.requests--;
if(this.requests==0){
this.requestsPending(false);
}
},requestPage:function(_52){
var row=this.pageToRow(_52);
var _54=Math.min(this.rowsPerPage,this.count-row);
if(_54>0){
this.requests++;
this.requestsPending(true);
setTimeout(dojo.hitch(this,"requestRows",row,_54),1);
}
},needPage:function(_55){
if(!this.pages[_55]){
this.pages[_55]=true;
this.requestPage(_55);
}
},preparePage:function(_56,_57){
if(_56<this.bop||_56>=this.eop){
var _58=this.rowToPage(_56);
this.needPage(_58);
this.bop=_58*this.rowsPerPage;
this.eop=this.bop+(this.rowsPerPage||this.count);
}
},isRowLoaded:function(_59){
return Boolean(this.data[_59]);
},removePages:function(_5a){
for(var i=0,r;((r=_5a[i])!=undefined);i++){
this.pages[this.rowToPage(r)]=false;
}
this.bop=this.eop=-1;
},remove:function(_5d){
this.removePages(_5d);
dojox.grid.data.Table.prototype.remove.apply(this,arguments);
},getRow:function(_5e){
var row=this.data[_5e];
if(!row){
this.preparePage(_5e);
}
return row;
},getDatum:function(_60,_61){
var row=this.getRow(_60);
return (row?row[_61]:this.fields.get(_61).na);
},setDatum:function(_63,_64,_65){
var row=this.getRow(_64);
if(row){
row[_65]=_63;
this.datumChange(_63,_64,_65);
}else{
console.error("["+this.declaredClass+"] dojox.grid.data.dynamic.set: cannot set data on a non-loaded row");
}
},canSort:function(){
return false;
}});
dojox.grid.data.table=dojox.grid.data.Table;
dojox.grid.data.dynamic=dojox.grid.data.Dynamic;
dojo.declare("dojox.grid.data.DojoData",dojox.grid.data.Dynamic,{constructor:function(_67,_68,_69){
this.count=1;
this._rowIdentities={};
this._currentlyProcessing=[];
if(_69){
dojo.mixin(this,_69);
}
if(this.store){
var f=this.store.getFeatures();
this._canNotify=f["dojo.data.api.Notification"];
this._canWrite=f["dojo.data.api.Write"];
this._canIdentify=f["dojo.data.api.Identity"];
if(this._canNotify){
dojo.connect(this.store,"onSet",this,"_storeDatumChange");
dojo.connect(this.store,"onDelete",this,"_storeDatumDelete");
dojo.connect(this.store,"onNew",this,"_storeDatumNew");
}
if(this._canWrite){
dojo.connect(this.store,"revert",this,"refresh");
}
}
},markupFactory:function(_6b,_6c){
return new dojox.grid.data.DojoData(null,null,_6b);
},query:{name:"*"},store:null,_currentlyProcessing:null,_canNotify:false,_canWrite:false,_canIdentify:false,_rowIdentities:{},clientSort:false,sortFields:null,queryOptions:null,setData:function(_6d){
this.store=_6d;
this.data=[];
this.allChange();
},setRowCount:function(_6e){
this.count=_6e;
this.allChange();
},beginReturn:function(_6f){
if(this.count!=_6f){
this.setRowCount(_6f);
}
},_setupFields:function(_70){
if(this.fields._nameMaps){
return;
}
var m={};
var _72=dojo.map(this.store.getAttributes(_70),function(_73,idx){
m[_73]=idx;
m[idx+".idx"]=_73;
return {name:_73,key:_73};
},this);
this.fields._nameMaps=m;
this.fields.set(_72);
this.notify("FieldsChange");
},_getRowFromItem:function(_75){
},_createRow:function(_76){
var row={};
row.__dojo_data_item=_76;
dojo.forEach(this.fields.values,function(a){
var _79=this.store.getValue(_76,a.name);
row[a.name]=(_79===undefined||_79===null)?"":_79;
},this);
return row;
},processRows:function(_7a,_7b){
if(!_7a||_7a.length==0){
return;
}
this._setupFields(_7a[0]);
dojo.forEach(_7a,function(_7c,idx){
var row=this._createRow(_7c);
this._setRowId(_7c,_7b.start,idx);
this.setRow(row,_7b.start+idx);
},this);
this.endUpdate();
},requestRows:function(_7f,_80){
this.beginUpdate();
var row=_7f||0;
var _82={start:row,count:this.rowsPerPage,query:this.query,sort:this.sortFields,queryOptions:this.queryOptions,onBegin:dojo.hitch(this,"beginReturn"),onComplete:dojo.hitch(this,"processRows"),onError:dojo.hitch(this,"processError")};
this.store.fetch(_82);
},getDatum:function(_83,_84){
var row=this.getRow(_83);
var _86=this.fields.values[_84];
return row&&_86?row[_86.name]:_86?_86.na:"?";
},setDatum:function(_87,_88,_89){
var n=this.fields._nameMaps[_89+".idx"];
if(n){
this.data[_88][n]=_87;
this.datumChange(_87,_88,_89);
}
},copyRow:function(_8b){
var row={};
var _8d={};
var src=this.getRow(_8b);
for(var x in src){
if(src[x]!=_8d[x]){
row[x]=src[x];
}
}
return row;
},_attrCompare:function(_90,_91){
dojo.forEach(this.fields.values,function(a){
if(_90[a.name]!=_91[a.name]){
return false;
}
},this);
return true;
},endModifyRow:function(_93){
var _94=this.cache[_93];
if(_94){
var _95=this.getRow(_93);
if(!this._attrCompare(_94,_95)){
this.update(_94,_95,_93);
}
delete this.cache[_93];
}
},cancelModifyRow:function(_96){
var _97=this.cache[_96];
if(_97){
this.setRow(_97,_96);
delete this.cache[_96];
}
},_setRowId:function(_98,_99,idx){
if(this._canIdentify){
this._rowIdentities[this.store.getIdentity(_98)]={rowId:_99+idx,item:_98};
}else{
var _9b=dojo.toJson(this.query)+":start:"+_99+":idx:"+idx+":sort:"+dojo.toJson(this.sortFields);
this._rowIdentities[_9b]={rowId:_99+idx,item:_98};
}
},_getRowId:function(_9c,_9d){
var _9e=null;
if(this._canIdentify&&!_9d){
var _9f=this._rowIdentities[this.store.getIdentity(_9c)];
if(_9f){
_9e=_9f.rowId;
}
}else{
var id;
for(id in this._rowIdentities){
if(this._rowIdentities[id].item===_9c){
_9e=this._rowIdentities[id].rowId;
break;
}
}
}
return _9e;
},_storeDatumChange:function(_a1,_a2,_a3,_a4){
var _a5=this._getRowId(_a1);
var row=this.getRow(_a5);
if(row){
row[_a2]=_a4;
var _a7=this.fields._nameMaps[_a2];
this.notify("DatumChange",[_a4,_a5,_a7]);
}
},_storeDatumDelete:function(_a8){
if(dojo.indexOf(this._currentlyProcessing,_a8)!=-1){
return;
}
var _a9=this._getRowId(_a8,true);
if(_a9!=null){
this._removeItems([_a9]);
}
},_storeDatumNew:function(_aa){
if(this._disableNew){
return;
}
this._insertItem(_aa,this.data.length);
},insert:function(_ab,_ac){
this._disableNew=true;
var i=this.store.newItem(_ab);
this._disableNew=false;
this._insertItem(i,_ac);
},_insertItem:function(_ae,_af){
if(!this.fields._nameMaps){
this._setupFields(_ae);
}
var row=this._createRow(_ae);
for(var i in this._rowIdentities){
var _b2=this._rowIdentities[i];
if(_b2.rowId>=_af){
_b2.rowId++;
}
}
this._setRowId(_ae,0,_af);
dojox.grid.data.Dynamic.prototype.insert.apply(this,[row,_af]);
},datumChange:function(_b3,_b4,_b5){
if(this._canWrite){
var row=this.getRow(_b4);
var _b7=this.fields._nameMaps[_b5+".idx"];
this.store.setValue(row.__dojo_data_item,_b7,_b3);
}else{
this.notify("DatumChange",arguments);
}
},insertion:function(){
this.notify("Insertion",arguments);
this.notify("Change",arguments);
},removal:function(){
this.notify("Removal",arguments);
this.notify("Change",arguments);
},remove:function(_b8){
for(var i=_b8.length-1;i>=0;i--){
var _ba=this.data[_b8[i]].__dojo_data_item;
this._currentlyProcessing.push(_ba);
this.store.deleteItem(_ba);
}
this._removeItems(_b8);
this._currentlyProcessing=[];
},_removeItems:function(_bb){
dojox.grid.data.Dynamic.prototype.remove.apply(this,arguments);
this._rowIdentities={};
for(var i=0;i<this.data.length;i++){
this._setRowId(this.data[i].__dojo_data_item,0,i);
}
},canSort:function(){
return true;
},sort:function(_bd){
var col=Math.abs(_bd)-1;
this.sortFields=[{"attribute":this.fields.values[col].name,"descending":(_bd>0)}];
this.refresh();
},refresh:function(){
this.clearData(true);
this.requestRows();
},clearData:function(_bf){
this._rowIdentities={};
this.pages=[];
this.bop=this.eop=-1;
this.count=0;
this.setData((_bf?this.store:[]));
},processError:function(_c0,_c1){
}});
}