214 lines
6.4 KiB
JavaScript
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;
|
||
|
}
|
||
|
});
|