password-manager/frontend/beta/js/YUI-extensions/tree/TreePanel.js
2011-10-03 00:56:18 +01:00

214 lines
6.4 KiB
JavaScript

YAHOO.namespace('ext.tree');
YAHOO.ext.tree.TreePanel = function(el, config){
YAHOO.ext.tree.TreePanel.superclass.constructor.call(this);
this.el = getEl(el);
this.id = this.el.id;
YAHOO.ext.util.Config.apply(this, config || {}, {
rootVisible : true,
lines : true,
enableDD : false,
hlDrop : true/*,
hlColor: null,
ddGroup : 'TreeDD'
hlBaseColor : 'FFFFFF'*/
});
YAHOO.ext.util.Config.apply(this.events, {
'beforeload' : true,
'load' : true,
'textchange' : true,
'beforeexpand' : true,
'beforecollapse' : true,
'expand' : true,
'collapse' : true,
'disabledchange' : true,
'beforeclick':true,
'click':true,
'dblclick':true,
'contentmenu':true,
'beforechildrenrendered':true,
/**
* @event startdrag
* Fires when a node starts being dragged
* @param {YAHOO.ext.tree.TreePanel} this
* @param {YAHOO.ext.tree.TreeNode} node
* @param {event} e The raw browser event
*/
'startdrag' : true,
/**
* @event enddrag
* Fires when a drag operation is complete
* @param {YAHOO.ext.tree.TreePanel} this
* @param {YAHOO.ext.tree.TreeNode} node
* @param {event} e The raw browser event
*/
'enddrag' : true,
/**
* @event dragdrop
* Fires when a dragged node is dropped on a valid DD target
* @param {YAHOO.ext.tree.TreePanel} this
* @param {YAHOO.ext.tree.TreeNode} node
* @param {DD} dd The dd it was dropped on
* @param {event} e The raw browser event
*/
'dragdrop' : true,
/**
* @event beforenodedrop
* Fires when a DD object is dropped on a node in this tree for preprocessing. This event can cancel.
* @param {Object} dropEvent
*/
'beforenodedrop' : true,
/**
* @event nodedrop
* Fires after a DD object is dropped on a node in this tree
* @param {Object} dropEvent
*/
'nodedrop' : true,
/**
* @event nodedragover
* Fires when a tree node is being target
* @param {Object} dragOverEvent
*/
'nodedragover' : true
});
if(this.singleExpand){
this.on('beforeexpand', this.restrictExpand, this, true);
}
// problem with safari and animation
// I am investigating
if(YAHOO.ext.util.Browser.isSafari){
this.animate = false;
}
};
YAHOO.extendX(YAHOO.ext.tree.TreePanel, YAHOO.ext.data.Tree, {
restrictExpand : function(node){
var p = node.parentNode;
if(p){
if(p.expandedChild && p.expandedChild.parentNode == p){
p.expandedChild.collapse();
}
p.expandedChild = node;
}
},
setRootNode : function(node){
YAHOO.ext.tree.TreePanel.superclass.setRootNode.call(this, node);
if(!this.rootVisible){
node.ui = new YAHOO.ext.tree.RootTreeNodeUI(node);
}
return node;
},
getEl : function(){
return this.el;
},
getLoader : function(){
return this.loader;
},
expandAll : function(){
this.root.expand(true);
},
collapseAll : function(){
this.root.collapse(true);
},
getSelectionModel : function(){
if(!this.selModel){
this.selModel = new YAHOO.ext.tree.DefaultSelectionModel();
}
return this.selModel;
},
expandPath : function(path, attr, callback){
attr = attr || 'id';
var keys = path.split(this.pathSeparator);
var curNode = this.root;
if(curNode.attributes[attr] != keys[1]){ // invalid root
if(callback){
callback(false, null);
}
return;
}
var index = 1;
var f = function(){
if(++index == keys.length){
if(callback){
callback(true, curNode);
}
return;
}
var c = curNode.findChild(attr, keys[index]);
if(!c){
if(callback){
callback(false, curNode);
}
return;
}
curNode = c;
c.expand(false, false, f);
}
curNode.expand(false, false, f);
},
selectPath : function(path, attr, callback){
attr = attr || 'id';
var keys = path.split(this.pathSeparator);
var v = keys.pop();
if(keys.length > 0){
var f = function(success, node){
if(success && node){
var n = node.findChild(attr, v);
if(n){
n.select();
if(callback){
callback(true, n);
}
}
}else{
if(callback){
callback(false, n);
}
}
};
this.expandPath(keys.join(this.pathSeparator), attr, f);
}else{
this.root.select();
if(callback){
callback(true, this.root);
}
}
},
render : function(){
this.container = this.el.createChild({tag:'ul',
cls:'ytree-root-ct ' +
(this.lines ? 'ytree-lines' : 'ytree-no-lines')});
if(this.containerScroll){
YAHOO.ext.dd.ScrollManager.register(this.el);
}
if((this.enableDD || this.enableDrop) && !this.dropZone){
this.dropZone = new YAHOO.ext.tree.TreeDropZone(this, this.dropConfig || {
ddGroup: this.ddGroup || 'TreeDD'
});
}
if((this.enableDD || this.enableDrag) && !this.dragZone){
this.dragZone = new YAHOO.ext.tree.TreeDragZone(this, this.dragConfig || {
ddGroup: this.ddGroup || 'TreeDD',
scroll: this.ddScroll
});
}
this.getSelectionModel().init(this);
this.root.render();
if(!this.rootVisible){
this.root.renderChildren();
}
return this;
}
});