📄 sys_tree.js
字号:
//***************************************************************************************
// 7WX API set 1.0 for Action Orient Programming (Leebai 200212)
// Copyright 2002 DEEPSOFT Corp. libq@deepsoft.com.cn
// 本程序可以在任何自由软件或商业软件中使用,但在源代码中必须保留上面的版权说明,否则视为侵权。
//***************************************************************************************
// 7WX Public Function
//============================================
//=======3.树api==============================
//==============================================================
var imgPath = systemPath.path+"/js/treeimg/";
//init function
//Only expandCallback,defRootIcon,defNodeIcon may be null.
function XinitTree(xtree,array,rootID,callback,expandCallback,expandLevel,selectable,defRootIcon,defNodeIcon,selectedIds){
//para checking......
xtree.rootID = rootID+"";
xtree.callback = callback;
xtree.expandCallback = expandCallback;
xtree.expandLevel = expandLevel;
xtree.selectable = selectable;
xtree.defRootIcon = defRootIcon==null?(imgPath+"root.gif"):defRootIcon;
xtree.defNodeIcon = defNodeIcon==null?(imgPath+"node.gif"):defNodeIcon;
xtree.nodeMap = new Array();
xtree.selectedNodes = new Array();
xtree.currentNode=null;
//public method
xtree.addNode=XaddNode;
xtree.addNodes=XaddNodes;
xtree.nodeToSubTree=XnodeToSubTree;
xtree.delNode=XdelNode;
xtree.refreshNode=XrefreshNode;
xtree.renameNode=XrenameNode;
xtree.updateNode=XupdateNode;
// xtree.delSelectedNodes=XdelSelectedNodes;
xtree.getSelectedNodes=XgetSelectedNodes;
xtree.getSubNodeIDs=XgetSubNodeIDs;
xtree.getSubNodeIDsAuto=XgetSubNodeIDsAuto;
xtree.setCurrentNode=XsetCurrentNode;
xtree.cancelCurrentNode=XcancelCurrentNode;// for avoid ie4 bug
xtree.getNodeByID=XgetNodeByID;
//private method
xtree._parseArray=_XparseArray;
xtree._drowTree=_XdrowTree;
xtree._drawNode=_XdrawNode;
xtree._drawSubs=_XdrawSubs;
xtree._expandClick=_XexpandClick;
xtree._isSubNode=_XisSubNode;//for jump focus when:collapse father when current focus at sub
xtree._nodeClick=_XnodeClick;
xtree._saveNodeSelectInfo=_XsaveNodeSelectInfo;
xtree._initSelectedIds=_XinitSelectedIds;
//display tree
xtree.style.paddingTop=3;
xtree.style.paddingLeft=3;
xtree.style.textAlign="left";
xtree.style.verticalAlign ="top";
// var tt1,tt0=new Date(); tt0=tt0.getTime();
if(xtree._parseArray(array)){
if(typeof(selectedIds)!='undefined' && selectedIds!=null)
xtree._initSelectedIds(selectedIds);
// tt1=new Date(); tt1=tt1.getTime();
xtree._drowTree();
}
// var tt2=new Date(); tt2=tt2.getTime();
// alert("use Time(ms):" + (tt1-tt0) + "-" + (tt2-tt1));// + "-" + (tt3-tt2));
}
//==============================================================
//public method implement
function XaddNode(array,fid,img){//add sub node to current node
var arrays = new Array();
arrays[0] = array;
this.addNodes(arrays,fid,img);
}
function XaddNodes(array,fid,img){//add sub nodes to current node
if(array.length<=0)return;
if(typeof(fid)=="undefined"||fid==null){
if(this.currentNode==null){alert("请选择要插入子节点的父节点。");return;}
fid = this.currentNode[1];
}
var fNode = eval("xn"+fid);
var fNodeData=this.nodeMap["x"+fid];
var fNodeDiv = eval("xd"+fid);
if(fNodeData["subs"].length>0)
fNodeData["subs"][fNodeData["subs"].length-1]["isBottom"]=false;
for(var i=0;i<array.length;i++){
var tmpNodeData = new Array();
tmpNodeData[0] = fid;
for(var j=0;j<array[i].length;j++)
tmpNodeData[j+1]=array[i][j];
if(typeof(img)!="undefined" && img!=null)
tmpNodeData[3]=img;
tmpNodeData["expand"]=false;
tmpNodeData["subs"]=new Array();
tmpNodeData["isBottom"] = (i==array.length-1);
fNodeData["subs"][fNodeData["subs"].length] = tmpNodeData;
this.nodeMap["x"+tmpNodeData[1]] = tmpNodeData;
}
fNodeData["expand"]=true;
fNodeDiv.outerHTML="";
// document.body.style.cursor="wait";
fNode.outerHTML = this._drawNode(fNodeData);
// document.body.style.cursor="default";
this.setCurrentNode(fNodeData[1]);
}
function XnodeToSubTree(node,subsArray){//add decendence subs data to node(XaddNodes算法改为同此?)
if(subsArray.length==0) return;
this._parseArray(subsArray);
if(node["subs"].length!=0)node["subs"][node["subs"].length-1]["isBottom"]=false;
for(var i=0; i<subsArray.length; i++)
if(subsArray[i][0]==node[1])
node["subs"][node["subs"].length] = subsArray[i];
if(node["subs"].length!=0)node["subs"][node["subs"].length-1]["isBottom"]=true;
this.refreshNode(node[1]);
}
function XrefreshNode(nodeID){//redraw specify node
var isCurrent = false;
if(typeof(nodeID)=="undefined"||nodeID==null){
if(this.currentNode==null){alert("请选择或指定要删除的节点。");return;}
nodeID=this.currentNode[1];isCurrent = true;
}else
if(this.currentNode!=null&&this.currentNode[1]==nodeID)isCurrent = true;
// document.body.style.cursor="wait";
eval("xn"+nodeID).outerHTML =this._drawNode(this.nodeMap["x"+nodeID],true);
// document.body.style.cursor="default";
if(isCurrent){this.setCurrentNode(nodeID)};
}
function XrenameNode(nodeID,newName){//rename specify node
var node = this.nodeMap["x"+nodeID];
if(typeof(node)=="undefined")alert("找不到要改名的节点。id为"+nodeID);
node[2] = newName;
//平仔添加,修改无法将树名子改过来问题
//var temp = eval("xn"+nodeID);
//temp.all(temp.all.length-1).innerText = newName;
}
//平仔添加,修改树的数据
function XupdateNode(nodeID,index,value){//update specify node
var node = this.nodeMap["x"+nodeID];
if(typeof(node)=="undefined")alert("找不到要改数据的节点。id为"+nodeID);
node[index] = value;
}
function XdelNode(nodeID){//delete specify node
var isCurrent = false;
if(typeof(nodeID)=="undefined"||nodeID==null){
if(this.currentNode==null){alert("请选择或指定要删除的节点。");return;}
nodeID=this.currentNode[1];isCurrent = true;
}else
if(this.currentNode!=null&&this.currentNode[1]==nodeID)isCurrent = true;
if(nodeID==this.rootID)return;
var fNodeData = this.nodeMap["x"+this.nodeMap["x"+nodeID][0]];
var fNode = eval("xn"+fNodeData[1]);
var fNodeDiv = eval("xd"+fNodeData[1]);
var oldSub = fNodeData["subs"];
var newSub = new Array();
for(var i=0;i<oldSub.length;i++)
if(oldSub[i][1]!=nodeID)newSub[newSub.length]=oldSub[i];
else if(i==oldSub.length-1)if(i>0)newSub[i-1]["isBottom"]=true;
fNodeData["subs"] = newSub;
fNodeDiv.outerHTML="";
// document.body.style.cursor="wait";
fNode.outerHTML =this._drawNode(fNodeData);
// document.body.style.cursor="default";
if(isCurrent){this.setCurrentNode(fNodeData[1])};
}
function XdelSelectedNodes(){//delete selected node
var ids = this.getSelectedNodes();
for(var i=0;i<ids.length;i++)
this.delNode(ids[i]);
}
function XgetSelectedNodes(){//get selected node
var ids = new Array();
for(var i=0;i<this.selectedNodes.length;i++)
if(this.selectedNodes[i][1]==true)
ids[ids.length]=this.selectedNodes[i][0];
return ids;
}
function XsetCurrentNode(id){
if(this.currentNode!=null){
var span0=document.all["xn"+this.currentNode[1]];
if(typeof(span0)!="undefined"){
span0 = span0.children(span0.children.length-1);
span0.style.backgroundColor=this.style.backgroundColor;
span0.style.color=this.style.color;
}
}
span=eval("xn"+id);
span = span.children(span.children.length-1);
span.style.backgroundColor=this.style.color;
span.style.color=this.style.backgroundColor;
this.currentNode = this.nodeMap["x"+id];
}
function XcancelCurrentNode(){ //for avoid ie4 bug when expand
if(this.currentNode!=null){
var span0=document.all["xn"+this.currentNode[1]];
if(typeof(span0)!="undefined"){
span0 = span0.children(span0.children.length-1);
span0.style.backgroundColor=this.style.backgroundColor;
span0.style.color=this.style.color;
}
this.currentNode=null;
}
}
function XgetSubNodeIDs(node){
var snIDs=",'"+node[1]+"'";
for(var i=0;i<node["subs"].length;i++)
snIDs += this.getSubNodeIDs(node["subs"][i]);
return snIDs;
}
function XgetSubNodeIDsAuto(node){
var ids= node['expand'] ? this.getSubNodeIDs(node).substring(1) : ("'"+node[1]+"'");
// alert("selected:\n\n"+ ids);
return ids;
}
function XgetNodeByID(nodeId){
return this.nodeMap["x"+nodeId];
}
//==============================================================
//private method implement
function _XinitSelectedIds(selectedIds){//Init selected nodes
for(var i=0;i<selectedIds.length;i++)
this._saveNodeSelectInfo(selectedIds[i],true)
}
function _XparseArray(array){
var subs = new Array();
for(var i=0;i<array.length;i++){
if(array[i][0]==array[i][1])
if(array[i][0]==this.rootID){array[i][0]="_x_";continue;}
else{alert("第"+i+"条数据不符合要求:非根节点的父节点不能是是其自身。");return false;}
var tfid = "s"+array[i][0];
if(typeof(subs[tfid])=="undefined")subs[tfid]=new Array();
subs[tfid][subs[tfid].length]=array[i];
}
for(var i=0; i<array.length;i++){
this.nodeMap["x"+array[i][1]] = array[i];//*
array[i]["subs"] = new Array();
if(typeof(subs["s"+array[i][1]])!="undefined"){
array[i]["subs"] = subs["s"+array[i][1]];//*
for(var j=0;j<array[i]["subs"].length;j++)
array[i]["subs"][j]["isBottom"] = (j == (array[i]["subs"].length-1));//*
}
}
return true;
}
function _XdrowTree(){
var rootData = this.nodeMap["x"+this.rootID];
if(typeof(rootData)=="undefined"||rootData==null){
alert("树节点数组数据错误,找不到指定的根节点:"+this.rootID);
return;
}
rootData["level"]=0;
rootData["tcode"]="x";
rootData["expand"]=true;
var htm = this._drawNode(rootData);
this.expandLevel = -1;//*expandLevel only affect tree initial
this.innerHTML = htm;
}
function _XdrawNode(nodeData,update){
var tabCode = nodeData["tcode"];
var htm = "\n<div nowrap id='xn"+nodeData[1]+"' style='height:18px'>";
if(tabCode != "x"){
//1.tab line
htm += tabCode;
//2.expand&collapse
var mORb = nodeData["isBottom"] ? 'b' : 'm';
var hasSubs = nodeData["subs"].length>0 ? '1' : '0';
var eORc = hasSubs=='0' ? '' : (nodeData["expand"] ? '0' : '1');
htm += "<img align=absmiddle src='" + imgPath + mORb + hasSubs + eORc + '.gif' + "' ";
if(hasSubs=="1")htm += "onclick=\""+this.id+"._expandClick(this,'"+nodeData[1]+"');\"";
htm += ">";
}
//3.icon
htm += _XimageTag((typeof(nodeData[3])=="undefined" || nodeData[3].length==0) ?
(tabCode == "x" ? this.defRootIcon : this.defNodeIcon) : (nodeData[3]=="-"?"":nodeData[3]) );//'-' for no icon
//4.selecting
if(this.selectable) htm += "<input align=absmiddle type=checkbox "+ (nodeData["selected"]?"checked":"")
+" onclick=\""+ this.id+"._saveNodeSelectInfo('"+nodeData[1]+"',this.checked);"+"\" style='height:18px'>";
//5.title
htm += "<span style='cursor:hand;padding:2px;height;18px;font-weight:"+(nodeData["level"]<2?'bold':'normal')+"' onclick=\""+this.id+"._nodeClick('" +nodeData[1]+"');\" ondblclick=\""+this.id+"._expandClick(this,'"+nodeData[1]+"');\" title='"+nodeData[2]+"'><span style='position:relative;top:2px'>" + nodeData[2] + "</span></span></div>";
if(typeof(update)=="undefined"||update!=true){
//6.sub div
var hasSub = nodeData["subs"].length>0;
htm += "\n<div id='xd"+nodeData[1]+"' style='display:"+((nodeData["expand"]&&hasSub)?"":"none")+";'>";
if(nodeData["expand"]&&hasSub){//drawONexpand
tabCode = tabCode=="x" ? "" : (tabCode + (mORb=="m" ? _XimageTag(imgPath + 'iii.gif') : _XimageTag(imgPath + 'ooo.gif')));
htm += this._drawSubs(nodeData,tabCode);
}
htm += "</div>";
}
return htm;
}
function _XdrawSubs(nodeData,tabCode){
var htm = "";
for(var i=0;i<nodeData["subs"].length;i++){
var nd = nodeData["subs"][i];
nd["level"]=nodeData["level"]+1;
nd["tcode"] = tabCode;
if(this.expandLevel!=-1) nd["expand"]=nd["level"]<this.expandLevel;
htm += this._drawNode(nd);
}
return htm;
}
function _XisSubNode(nodeF,nodeS){//for _XexpandClick
if(nodeF==null || nodeS ==null)
return false;
var node = this.nodeMap["x"+nodeS[0]];
while(node!=null && node[1]!=nodeF[1]){
node = this.nodeMap["x"+node[0]];
}
return (node!=null && node[1]==nodeF[1]);
}
function _XexpandClick(img,id){
if(img.tagName!="IMG"){//when double click node title
var brothers = img.parentElement.children;
for(var i=0; i<brothers.length; i++)
if(brothers[i].tagName=="IMG" && brothers[i].onclick!=null)
break;
if(i==brothers.length)return;//root node
img = brothers[i];
}
// var tt0=new Date(); tt0=tt0.getTime();
var nodeData = this.nodeMap["x"+id];
var nodeDiv=eval("xd"+nodeData[1]);
nodeData["expand"]=!nodeData["expand"];
// var tt1=new Date(); tt1=tt1.getTime();
var curNodeInSubs = this._isSubNode(nodeData,this.currentNode);
if(curNodeInSubs)this.cancelCurrentNode();
if(nodeDiv.innerHTML.length>0){
nodeDiv.style.display=(nodeDiv.style.display=='none') ? '' : 'none';
img.src=img.src.indexOf('0.gif')>0 ? img.src.replace('0.gif','1.gif') : img.src.replace('1.gif','0.gif');
}else{
nodeDiv.outerHTML="";
eval("xn"+nodeData[1]).outerHTML =this._drawNode(nodeData);
}
if(curNodeInSubs)this._nodeClick(nodeData[1]);
// var tt2=new Date(); tt2=tt2.getTime();
// alert("use Time(ms):" + (tt1-tt0) + "-" + (tt2-tt1));// + "-" + (tt3-tt2));
if(this.expandCallback!=null) this.expandCallback(nodeData);
}
function _XnodeClick(id){
this.setCurrentNode(id);
var nodeData = this.nodeMap["x"+id];
this.callback(nodeData);
}
function _XsaveNodeSelectInfo(nodeID,onoff){
var node = this.nodeMap["x"+nodeID];
if(typeof(node)=='undefined'){
alert("要对节点id为"+nodeID+"的节点设置选择状态时,发现该节点并不存在。");
return;
}
node["selected"] = onoff;
for(var i=0;i<this.selectedNodes.length;i++){
if(this.selectedNodes[i][0]==nodeID){
this.selectedNodes[i][1]=onoff;
return;
}
}
if(onoff==true)
this.selectedNodes[this.selectedNodes.length]=[nodeID,true];
}
//==============================================================
//other function
function _XimageTag(img){ return img.length>0 ? "<img align=absmiddle src='" + img + "'>" : "";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -