seitime-frappe/js/widgets/tree.js
2011-06-08 14:24:18 +05:30

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;
}
}