188 lines
5.2 KiB
JavaScript
188 lines
5.2 KiB
JavaScript
// Tree
|
|
// ---------------------------------
|
|
|
|
function Tree(parent, width, do_animate) {
|
|
this.width = width;
|
|
this.nodes = {};
|
|
this.allnodes = {};
|
|
this.cur_node;
|
|
this.is_root = 1;
|
|
this.do_animate = do_animate;
|
|
var me = this;
|
|
this.exp_img = 'images/icons/plus.gif';
|
|
this.col_img = 'images/icons/minus.gif';
|
|
|
|
this.body = $a(parent, 'div');
|
|
if(width)$w(this.body, width);
|
|
|
|
this.addNode = function(parent, id, imagesrc, onclick, onexpand, opts, label) {
|
|
var t = new TreeNode(me, parent, id, imagesrc, onclick, onexpand, opts, label);
|
|
|
|
if(!parent) {
|
|
me.nodes[id]=t; // add to roots
|
|
} else {
|
|
parent.nodes[id]=t; // add to the node
|
|
}
|
|
me.allnodes[id] = t;
|
|
|
|
// note: this will only be for groups
|
|
if(onexpand)
|
|
t.create_expimage();
|
|
t.expanded_once = 0;
|
|
|
|
return t;
|
|
|
|
}
|
|
var me = this;
|
|
this.collapseall = function() {
|
|
for(n in me.allnodes) {
|
|
me.allnodes[n].collapse();
|
|
}
|
|
}
|
|
}
|
|
|
|
function TreeNode(tree, parent, id, imagesrc, onclick, onexpand, opts, label) {
|
|
var me = this;
|
|
if(!parent) parent = tree;
|
|
this.parent = parent;
|
|
this.nodes = {};
|
|
this.onclick = onclick;
|
|
this.onexpand = onexpand;
|
|
this.text = label ? label : id;
|
|
this.tree = tree;
|
|
|
|
if(opts)
|
|
this.opts = opts;
|
|
else
|
|
this.opts = {
|
|
show_exp_img:1
|
|
,show_icon:1
|
|
,label_style:{padding:'2px', cursor: 'pointer', fontSize:'11px'}
|
|
,onselect_style:{fontWeight: 'bold'}
|
|
,ondeselect_style:{fontWeight: 'normal'}
|
|
} // only useful for 1st node in the tree
|
|
|
|
var tc = 1;
|
|
if(this.opts.show_exp_img) tc+=1;
|
|
|
|
if(!this.parent.tab) {
|
|
this.parent.tab = make_table(this.parent.body, 2, tc, '100%');
|
|
$y(this.parent.tab,{tableLayout:'fixed',borderCollapse: 'collapse'});
|
|
} else {
|
|
this.parent.tab.append_row(); this.parent.tab.append_row();
|
|
}
|
|
|
|
var mytab = this.parent.tab;
|
|
|
|
// expand / collapse
|
|
if(this.opts.show_exp_img) {
|
|
this.exp_cell=$td(mytab,mytab.rows.length-2, 0);
|
|
$y(this.exp_cell, {cursor:'pointer', textAlign:'center', verticalAlign:'middle',width:'20px'});
|
|
this.exp_cell.innerHTML = ' ';
|
|
} else {
|
|
// pass
|
|
}
|
|
this.create_expimage = function() {
|
|
if(!me.opts.show_exp_img) return; // no expand image
|
|
if(!me.expimage) {
|
|
me.exp_cell.innerHTML='';
|
|
me.expimage = $a(me.exp_cell, 'img');
|
|
me.expimage.src = me.exp_img ? me.exp_img : me.tree.exp_img;
|
|
me.expimage.onclick = me.toggle;
|
|
}
|
|
}
|
|
|
|
// label
|
|
this.label = $a($td(mytab, mytab.rows.length-2, tc-1), 'div');
|
|
$y(this.label, this.opts.label_style);
|
|
|
|
// image
|
|
if(this.opts.show_icon) { // for second row, where children will come icon to be included
|
|
var t2 = make_table($a(this.label,'div'), 1, 2, '100%', ['20px',null]);
|
|
$y(t2,{borderCollapse:'collapse'});
|
|
this.img_cell = $td(t2, 0, 0);
|
|
$y(this.img_cell, {cursor:'pointer',verticalAlign:'middle',width:'20px'});
|
|
if(!imagesrc) imagesrc = "images/icons/folder.gif";
|
|
this.usrimg = $a(this.img_cell, 'img');
|
|
this.usrimg.src = imagesrc;
|
|
|
|
this.label = $td(t2, 0, 1);
|
|
$y(this.label,{verticalAlign:'middle'});
|
|
}
|
|
|
|
this.loading_div = $a($td(mytab, mytab.rows.length-1, this.opts.show_exp_img ? 1 : 0), "div", "comment", {fontSize:'11px'});
|
|
$dh(this.loading_div);
|
|
this.loading_div.innerHTML = 'Loading...';
|
|
|
|
this.body = $a($td(mytab, mytab.rows.length-1, this.opts.show_exp_img ? 1 : 0), "div", '', {overflow:'hidden', display:'none'});
|
|
|
|
this.select = function() {
|
|
me.show_selected();
|
|
if(me.onclick)me.onclick(me);
|
|
}
|
|
|
|
this.show_selected = function() {
|
|
if(me.tree.cur_node)me.tree.cur_node.deselect();
|
|
if(me.opts.onselect_style) $y(me.label,me.opts.onselect_style)
|
|
//me.label.style.fontWeight = 'bold';
|
|
me.tree.cur_node = me;
|
|
}
|
|
|
|
this.deselect = function() {
|
|
if(me.opts.ondeselect_style) $y(me.label,me.opts.ondeselect_style)
|
|
//me.label.style.fontWeight = 'normal';
|
|
me.tree.cur_node=null
|
|
}
|
|
|
|
this.expanded = 0;
|
|
this.toggle = function() {
|
|
if(me.expanded)
|
|
me.collapse();
|
|
else
|
|
me.expand();
|
|
}
|
|
this.collapse = function() {
|
|
me.expanded = 0;
|
|
$(me.body).slideUp();
|
|
me.expimage.src = me.exp_img ? me.exp_img : me.tree.exp_img;
|
|
}
|
|
this.expand = function() {
|
|
if(me.onexpand && !me.expanded_once){
|
|
me.onexpand(me);
|
|
if(!me.tree.do_animate) me.show_expanded(); // else to be called from expand (for animation)
|
|
} else {
|
|
me.show_expanded();
|
|
}
|
|
me.expanded = 1;
|
|
me.expanded_once = 1;
|
|
me.expimage.src = me.col_img ? me.col_img : me.tree.col_img;
|
|
}
|
|
this.show_expanded = function() {
|
|
if(me.tree.do_animate && (!keys(me.nodes).length)) return; // no children
|
|
$(me.body).slideDown();
|
|
}
|
|
|
|
this.setlabel = function(l) {
|
|
me.label.value = l;
|
|
me.label.innerHTML = l;
|
|
}
|
|
|
|
this.setlabel(this.text);
|
|
|
|
this.setcolor = function(c) {
|
|
this.backColor = c;
|
|
if(cur_node!=this)
|
|
$bg(this.body,this.backColor);
|
|
}
|
|
|
|
this.label.onclick= function(e) { me.select(); }
|
|
this.label.ondblclick = function(e) { me.select(); if(me.ondblclick)me.ondblclick(me); }
|
|
|
|
this.clear_child_nodes = function() {
|
|
if(this.tab){
|
|
this.tab.parentNode.removeChild(this.tab);
|
|
delete this.tab;
|
|
}
|
|
this.expanded_once = 0;
|
|
}
|
|
}
|