414 lines
11 KiB
JavaScript
414 lines
11 KiB
JavaScript
/*
|
|
Product Name: dhtmlxSuite
|
|
Version: 5.2.0
|
|
Edition: Professional
|
|
License: content of this file is covered by DHTMLX Commercial or Enterprise license. Usage without proper license is prohibited. To obtain it contact sales@dhtmlx.com
|
|
Copyright UAB Dinamenta http://www.dhtmlx.com
|
|
*/
|
|
|
|
/**
|
|
* @desc: enables smart rendering mode (usefull for big trees with lots f items on each level)
|
|
* @edition: professional
|
|
* @type: public
|
|
*/
|
|
dhtmlXTreeObject.prototype.enableSmartRendering=function(){
|
|
this.enableSmartXMLParsing(true);
|
|
this._srnd=true;
|
|
this.itemHeight=18;
|
|
var that=this;
|
|
this.allTree.onscroll=function(){
|
|
if (that._srndT) return;
|
|
that._srndT=window.setTimeout(function(){
|
|
that._srndT=null;
|
|
that._renderState();
|
|
|
|
},300);
|
|
};
|
|
|
|
this.attachEvent("onXLE",function(){
|
|
that._renderState();
|
|
});
|
|
this._singleTimeSRND();
|
|
}
|
|
|
|
dhtmlXTreeObject.prototype._renderState=function(){
|
|
//var z=this.allTree.parentNode;
|
|
//var t=z.removeChild(this.allTree);
|
|
|
|
|
|
if (!this._idpull[this.rootId]._sready)
|
|
this.prepareSR(this.rootId,true);
|
|
var top=this.allTree.scrollTop;
|
|
var pos=Math.floor(top/this.itemHeight);
|
|
var height=Math.ceil(this.allTree.offsetHeight/this.itemHeight);
|
|
|
|
this._group_render=true;
|
|
this._getItemByPos(top,this.itemHeight,height,null,false,this._renderItemSRND);
|
|
this._group_render=false;
|
|
|
|
//z.appendChild(this.allTree);
|
|
}
|
|
|
|
dhtmlXTreeObject.prototype._renderItemSRND=function(a,b){
|
|
if (!a.span){
|
|
//render row
|
|
a.span=-1;
|
|
var z=a.parentObject.htmlNode.childNodes[0].childNodes;
|
|
var count=b*this.itemHeight; var x=null;
|
|
for (var i=1; i<z.length; i++) {
|
|
|
|
x=z[i];
|
|
var y=x.nodem?this.itemHeight:(x.offsetHeight||parseInt(x.childNodes[1].firstChild.style.height));
|
|
|
|
count-=y;
|
|
if (count<0) {
|
|
if (count==-1) { count++; continue; } //magic
|
|
var h=x.childNodes[1].firstChild;
|
|
// console.log("top: "+this.allTree.scrollTop+",original: "+y+",stop at:"+count+", current height:"+(parseInt(h.style.height))+",new height:"+(parseInt(h.style.height)-(y-Math.abs(count)+this.itemHeight))+"px");
|
|
h.style.height=(parseInt(h.style.height)-(y-Math.abs(count)+this.itemHeight))+"px";
|
|
if (Math.abs(count)!=y){
|
|
// console.log("add new as "+(count+y));
|
|
var fill=this._drawNewHolder(count+y,true);
|
|
x.parentNode.insertBefore(fill,x)
|
|
|
|
}
|
|
x.tr={nextSibling:x};
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (h && h.style.height!="0px" && !x.offsetHeight)
|
|
{ var rh=this._hAdI; this._hAdI=true; }
|
|
this._parseItem(a._sxml,a.parentObject,null,x);
|
|
if (h && h.style.height!="0px" && !x.offsetHeight)
|
|
{ this._hAdI=rh; }
|
|
if (a.unParsed) this._correctPlus(a);
|
|
if (h && h.style.height=="0px") x.parentNode.removeChild(x);
|
|
}
|
|
}
|
|
|
|
dhtmlXTreeObject.prototype._buildSRND=function(z,skipParsing){
|
|
if (z.parentObject)
|
|
this._globalIdStorageFind(z.parentObject.id);
|
|
if (!this._idpull[this.rootId]._sready)
|
|
this.prepareSR(this.rootId,true);
|
|
|
|
this._renderItemSRND(z,this._getIndex(z));
|
|
if ((z.unParsed)&&(!skipParsing))
|
|
this.reParse(z,0);
|
|
|
|
if (!z.prepareSR)
|
|
this.prepareSR(z.id);
|
|
}
|
|
|
|
dhtmlXTreeObject.prototype._getIndex=function(z){
|
|
for (var a=0; a<z.parentObject.childsCount; a++)
|
|
if (z.parentObject.childNodes[a]==z) return a;
|
|
};
|
|
|
|
dhtmlXTreeObject.prototype.prepareSR=function(it,mode){
|
|
it=this._idpull[it];
|
|
if (it._sready) return;
|
|
var tr=this._drawNewHolder(this.itemHeight*it.childsCount,mode);
|
|
it.htmlNode.childNodes[0].appendChild(tr);
|
|
it._sready=true;
|
|
//it.tr=tr; tr.nodem=it;
|
|
}
|
|
|
|
|
|
|
|
dhtmlXTreeObject.prototype._drawNewHolder=function(s,mode){
|
|
var t=document.createElement("TR");
|
|
var b=document.createElement("TD");
|
|
var b2=document.createElement("TD");
|
|
var z=document.createElement("DIV");
|
|
z.innerHTML=" ";
|
|
b.appendChild(z)
|
|
t.appendChild(b2); t.appendChild(b);
|
|
if (!mode){
|
|
t.style.display="none";
|
|
}
|
|
|
|
z.style.height=s+'px';
|
|
return t;
|
|
}
|
|
|
|
dhtmlXTreeObject.prototype._getNextNodeSR=function(item,mode){
|
|
if ((!mode)&&(item.childsCount)) return item.childNodes[0];
|
|
if (item==this.htmlNode)
|
|
return -1;
|
|
if ((item.tr)&&(item.tr.nextSibling)&&(item.tr.nextSibling.nodem))
|
|
return item.tr.nextSibling.nodem;
|
|
|
|
return this._getNextNode(item.parentObject,true);
|
|
};
|
|
|
|
dhtmlXTreeObject.prototype._getItemByPos=function(pos,h,l,i,m,f){
|
|
/*
|
|
current implementation can be slow in case of deep hierarchy, in future we can move
|
|
counter login in HideShow function, so each top level item will know it real position
|
|
*/
|
|
if (!i){
|
|
this._pos_c=pos;
|
|
i=this._idpull[this.rootId];
|
|
}
|
|
|
|
for (var j=0; j<i.childsCount; j++){
|
|
this._pos_c-=h;
|
|
if (this._pos_c<=0) m=true;
|
|
if (m) {
|
|
f.apply(this,[i.childNodes[j],j]);
|
|
l--;}
|
|
if (l<0) return l;
|
|
if (i.childNodes[j]._open){
|
|
l=this._getItemByPos(null,h,l,i.childNodes[j],m,f);
|
|
if (l<0) return l;
|
|
}
|
|
}
|
|
return l;
|
|
}
|
|
|
|
|
|
dhtmlXTreeObject.prototype._addItemSRND=function(pid,id,p){
|
|
var parentObject=this._idpull[pid];
|
|
var Count=parentObject.childsCount;
|
|
var Nodes=parentObject.childNodes;
|
|
|
|
|
|
|
|
Nodes[Count]=new dhtmlXTreeItemObject(id,"",parentObject,this,null,1);
|
|
itemId = Nodes[Count].id;
|
|
Nodes[Count]._sxml=p.clone();
|
|
|
|
parentObject.childsCount++;
|
|
}
|
|
|
|
|
|
dhtmlXTreeObject.prototype._singleTimeSRND=function(){
|
|
this._redrawFrom=function(){}
|
|
var _originalTreeItem=dhtmlXTreeItemObject;
|
|
this._singleTimeSRND=function(){};
|
|
window.dhtmlXTreeItemObject=function(itemId,itemText,parentObject,treeObject,actionHandler,mode){
|
|
if (!treeObject._srnd) {
|
|
return _originalTreeItem.call(this,itemId,itemText,parentObject,treeObject,actionHandler,mode);
|
|
}
|
|
this.htmlNode="";
|
|
this.acolor="";
|
|
this.scolor="";
|
|
this.tr=0;
|
|
this.childsCount=0;
|
|
this.tempDOMM=0;
|
|
this.tempDOMU=0;
|
|
this.dragSpan=0;
|
|
this.dragMove=0;
|
|
this.span=0;
|
|
this.closeble=1;
|
|
this.childNodes=new Array();
|
|
this.userData=new cObject();
|
|
|
|
|
|
this.checkstate=0;
|
|
this.treeNod=treeObject;
|
|
this.label=itemText;
|
|
this.parentObject=parentObject;
|
|
this.actionHandler=actionHandler;
|
|
this.images=new Array(treeObject.imageArray[0],treeObject.imageArray[1],treeObject.imageArray[2]);
|
|
|
|
|
|
this.id=treeObject._globalIdStorageAdd(itemId,this);
|
|
|
|
if (itemId==treeObject.rootId){
|
|
if (this.treeNod.checkBoxOff ) this.htmlNode=this.treeNod._createItem(1,this,mode);
|
|
else this.htmlNode=this.treeNod._createItem(0,this,mode);
|
|
this.htmlNode.objBelong=this;
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
/*
|
|
|
|
Updates to existing code
|
|
|
|
|
|
*/
|
|
this.setCheckSR=this.setCheck;
|
|
this.setCheck=function(itemId,state){
|
|
this._globalIdStorageFind(itemId);
|
|
return this.setCheckSR(itemId,state);
|
|
};
|
|
this._get_srnd_p=function(id){
|
|
var p=[];
|
|
while(id!=this.rootId){
|
|
var pid=this.getParentId(id);
|
|
for (var i=0; i < this._idpull[pid].childsCount; i++)
|
|
if (this._idpull[pid].childNodes[i].id==id){
|
|
p.push([pid,i])
|
|
break;
|
|
}
|
|
id=pid;
|
|
}
|
|
p.reverse();
|
|
return p
|
|
};
|
|
this._get_srnd_p_last=function(id,p,mask){
|
|
p=p||[];
|
|
|
|
var pos=0;
|
|
while (true){
|
|
var i=this._idpull[id];
|
|
if (i._sxml && this.findStrInXML(i._sxml.d,"text",mask))
|
|
this._globalIdStorageFind(i.id);
|
|
var pos=i.childsCount;
|
|
if (!pos) break;
|
|
p.push([id,pos-1])
|
|
id=i.childNodes[pos-1].id;
|
|
}
|
|
|
|
return p;
|
|
};
|
|
this._get_prev_srnd=function(p,mask){
|
|
var last;
|
|
if (!p.length){
|
|
p.push.apply(p,this._get_srnd_p_last(this.rootId,null,mask));
|
|
last=p[p.length-1];
|
|
return this._idpull[last[0]].childNodes[last[1]];
|
|
}
|
|
last=p[p.length-1];
|
|
if (last[1]) {
|
|
last[1]--;
|
|
var curr=this._idpull[last[0]].childNodes[last[1]];
|
|
this._get_srnd_p_last(curr.id,p,mask);
|
|
var last=p[p.length-1];
|
|
return this._idpull[last[0]].childNodes[last[1]];
|
|
} else {
|
|
p.pop();
|
|
if (!p.length) return this._get_prev_srnd(p,mask)
|
|
var last=p[p.length-1];
|
|
return this._idpull[last[0]].childNodes[last[1]];
|
|
}
|
|
};
|
|
|
|
this._get_next_srnd=function(p,skip){
|
|
if (!p.length){
|
|
p.push([this.rootId,0]);
|
|
return this._idpull[this.rootId].childNodes[0];
|
|
}
|
|
|
|
var last=p[p.length-1];
|
|
var curr=this._idpull[last[0]].childNodes[last[1]];
|
|
if (curr.childsCount && !skip){
|
|
p.push([curr.id,0]);
|
|
return curr.childNodes[0];
|
|
}
|
|
last[1]++;
|
|
var curr=this._idpull[last[0]].childNodes[last[1]];
|
|
if (curr)
|
|
return curr;
|
|
p.pop();
|
|
if (!p.length)
|
|
return this.htmlNode;
|
|
|
|
return this._get_next_srnd(p,true);
|
|
};
|
|
this._findNodeByLabel=function(searchStr,direction,fromNode){
|
|
//default next|prev locators is not reliable
|
|
var searchStr=searchStr.replace(new RegExp("^( )+"),"").replace(new RegExp("( )+$"),"");
|
|
searchStr = new RegExp(searchStr.replace(/([\*\+\\\[\]\(\)]{1})/gi,"\\$1").replace(/ /gi,".*"),"gi");
|
|
|
|
//get start node
|
|
if (!fromNode)
|
|
{
|
|
fromNode=this._selected[0];
|
|
if (!fromNode) fromNode=this.htmlNode;
|
|
}
|
|
var startNode=fromNode;
|
|
var p=this._get_srnd_p(startNode.id);
|
|
while (fromNode=(direction?this._get_prev_srnd(p,searchStr):this._get_next_srnd(p))){
|
|
if (fromNode.label){
|
|
if (fromNode.label.search(searchStr)!=-1) return fromNode
|
|
} else {
|
|
if (fromNode._sxml){
|
|
if (fromNode._sxml.get("text").search(searchStr)!=-1)
|
|
return fromNode;
|
|
if (this.findStrInXML(fromNode._sxml.d,"text",searchStr))
|
|
this._globalIdStorageFind(fromNode.id);
|
|
}
|
|
}
|
|
|
|
if ((fromNode.unParsed)&&(this.findStrInXML(fromNode.unParsed.d,"text",searchStr)))
|
|
this.reParse(fromNode);
|
|
|
|
if (startNode.id==fromNode.id) break;
|
|
if(direction&&p.length==1&&p[0][1]==0)
|
|
break;
|
|
|
|
}
|
|
|
|
return null;
|
|
};
|
|
this.deleteChildItems=function(id){
|
|
if (this.rootId==id){
|
|
this._selected=new Array();
|
|
this._idpull={};
|
|
this._p=this._pos_c=this._pullSize=null;
|
|
this.allTree.removeChild(this.htmlNode.htmlNode);
|
|
|
|
this.htmlNode=new dhtmlXTreeItemObject(this.rootId,"",0,this);
|
|
this.htmlNode.htmlNode.childNodes[0].childNodes[0].style.display="none";
|
|
this.htmlNode.htmlNode.childNodes[0].childNodes[0].childNodes[0].className="hiddenRow";
|
|
|
|
this.allTree.insertBefore(this.htmlNode.htmlNode,this.selectionBar);
|
|
if(_isFF){
|
|
this.allTree.childNodes[0].width="100%";
|
|
this.allTree.childNodes[0].style.overflow="hidden";
|
|
}
|
|
}
|
|
}
|
|
this._HideShow=function(itemObject,mode){
|
|
if ((this.XMLsource)&&(!itemObject.XMLload)) {
|
|
if (mode==1) return; //close for not loaded node - ignore it
|
|
itemObject.XMLload=1;
|
|
this._loadDynXML(itemObject.id);
|
|
return; };
|
|
//#__pro_feature:01112006{
|
|
//#smart_parsing:01112006{
|
|
if (!itemObject.span)
|
|
this._buildSRND(itemObject);
|
|
|
|
if (itemObject.unParsed){
|
|
this.reParse(itemObject);
|
|
this.prepareSR(itemObject.id);
|
|
}
|
|
|
|
if (itemObject.childsCount==0) return;
|
|
//#}
|
|
//#}
|
|
var Nodes=itemObject.htmlNode.childNodes[0].childNodes; var Count=Nodes.length;
|
|
if (Count>1){
|
|
if ( ( (Nodes[1].style.display!="none") || (mode==1) ) && (mode!=2) ) {
|
|
//nb:solves standard doctype prb in IE
|
|
this.allTree.childNodes[0].border = "1";
|
|
this.allTree.childNodes[0].border = "0";
|
|
var nodestyle="none";
|
|
itemObject._open=false;
|
|
}
|
|
else {
|
|
var nodestyle="";
|
|
itemObject._open=true;
|
|
}
|
|
|
|
for (var i=1; i<Count; i++)
|
|
Nodes[i].style.display=nodestyle;
|
|
|
|
this._renderState();
|
|
}
|
|
this._correctPlus(itemObject);
|
|
}
|
|
}
|
|
|
|
//(c)dhtmlx ltd. www.dhtmlx.com
|
|
|
|
|
|
|