196 lines
5.9 KiB
JavaScript
196 lines
5.9 KiB
JavaScript
YAHOO.ext.tree.DefaultSelectionModel = function(){
|
|
this.selNode = null;
|
|
|
|
this.events = {
|
|
'selectionchange' : true
|
|
};
|
|
};
|
|
|
|
YAHOO.extendX(YAHOO.ext.tree.DefaultSelectionModel, YAHOO.ext.util.Observable, {
|
|
init : function(tree){
|
|
this.tree = tree;
|
|
tree.el.mon('keydown', this.onKeyDown, this, true);
|
|
tree.on('click', this.onNodeClick, this, true);
|
|
},
|
|
|
|
onNodeClick : function(node, e){
|
|
this.select(node);
|
|
},
|
|
|
|
select : function(node){
|
|
if(this.selNode && this.selNode != node){
|
|
this.selNode.ui.onSelectedChange(false);
|
|
}
|
|
this.selNode = node;
|
|
node.ui.onSelectedChange(true);
|
|
this.fireEvent('selectionchange', this, node);
|
|
return node;
|
|
},
|
|
|
|
unselect : function(node){
|
|
if(this.selNode == node){
|
|
this.clearSelections();
|
|
}
|
|
},
|
|
|
|
clearSelections : function(){
|
|
var n = this.selNode;
|
|
if(n){
|
|
n.ui.onSelectedChange(false);
|
|
this.selNode = null;
|
|
this.fireEvent('selectionchange', this, null);
|
|
}
|
|
return n;
|
|
},
|
|
|
|
getSelectedNode : function(){
|
|
return this.selNode;
|
|
},
|
|
|
|
isSelected : function(node){
|
|
return this.selNode == node;
|
|
},
|
|
|
|
onKeyDown : function(e){
|
|
var s = this.selNode || this.lastSelNode;
|
|
// undesirable, but required
|
|
var sm = this;
|
|
if(!s){
|
|
return;
|
|
}
|
|
var k = e.getKey();
|
|
//alert(k)
|
|
switch(k){
|
|
case e.DOWN:
|
|
e.preventDefault();
|
|
if(s.firstChild && s.isExpanded()){
|
|
this.select(s.firstChild, e);
|
|
}else if(s.nextSibling){
|
|
this.select(s.nextSibling, e);
|
|
}else if(s.parentNode){
|
|
s.parentNode.bubble(function(){
|
|
if(this.nextSibling){
|
|
sm.select(this.nextSibling, e);
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
break;
|
|
case e.UP:
|
|
e.preventDefault();
|
|
var ps = s.previousSibling;
|
|
if(ps){
|
|
if(!ps.isExpanded()){
|
|
this.select(ps, e);
|
|
}else{
|
|
var lc = ps.lastChild;
|
|
while(lc && lc.isExpanded()){
|
|
lc = lc.lastChild;
|
|
}
|
|
this.select(lc, e);
|
|
}
|
|
}else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
|
|
this.select(s.parentNode, e);
|
|
}
|
|
break;
|
|
case e.RIGHT:
|
|
e.preventDefault();
|
|
if(s.hasChildNodes()){
|
|
if(!s.isExpanded()){
|
|
s.expand();
|
|
}else if(s.firstChild){
|
|
this.select(s.firstChild, e);
|
|
}
|
|
}
|
|
break;
|
|
case e.LEFT:
|
|
e.preventDefault();
|
|
if(s.hasChildNodes() && s.isExpanded()){
|
|
s.collapse();
|
|
}else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
|
|
this.select(s.parentNode, e);
|
|
}
|
|
break;
|
|
};
|
|
}
|
|
});
|
|
|
|
YAHOO.ext.tree.MultiSelectionModel = function(){
|
|
this.selNodes = [];
|
|
this.selMap = {};
|
|
this.events = {
|
|
'selectionchange' : true
|
|
};
|
|
};
|
|
|
|
YAHOO.extendX(YAHOO.ext.tree.MultiSelectionModel, YAHOO.ext.util.Observable, {
|
|
init : function(tree){
|
|
this.tree = tree;
|
|
tree.el.mon('keydown', this.onKeyDown, this, true);
|
|
tree.on('click', this.onNodeClick, this, true);
|
|
},
|
|
|
|
onNodeClick : function(node, e){
|
|
this.select(node, e, e.ctrlKey);
|
|
},
|
|
|
|
select : function(node, e, keepExisting){
|
|
if(keepExisting !== true){
|
|
this.clearSelections(true);
|
|
}
|
|
this.selNodes.push(node);
|
|
this.selMap[node.id] = node;
|
|
this.lastSelNode = node;
|
|
node.ui.onSelectedChange(true);
|
|
this.fireEvent('selectionchange', this, this.selNodes);
|
|
return node;
|
|
},
|
|
|
|
unselect : function(node){
|
|
if(this.selMap[node.id]){
|
|
node.ui.onSelectedChange(false);
|
|
var sn = this.selNodes;
|
|
var index = -1;
|
|
if(sn.indexOf){
|
|
index = sn.indexOf(node);
|
|
}else{
|
|
for(var i = 0, len = sn.length; i < len; i++){
|
|
if(sn[i] == node){
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(index != -1){
|
|
this.selNodes.splice(index, 1);
|
|
}
|
|
delete this.selMap[node.id];
|
|
this.fireEvent('selectionchange', this, this.selNodes);
|
|
}
|
|
},
|
|
|
|
clearSelections : function(suppressEvent){
|
|
var sn = this.selNodes;
|
|
if(sn.length > 0){
|
|
for(var i = 0, len = sn.length; i < len; i++){
|
|
sn[i].ui.onSelectedChange(false);
|
|
}
|
|
this.selNodes = [];
|
|
this.selMap = {};
|
|
if(suppressEvent !== true){
|
|
this.fireEvent('selectionchange', this, this.selNodes);
|
|
}
|
|
}
|
|
},
|
|
|
|
isSelected : function(node){
|
|
return this.selMap[node.id] ? true : false;
|
|
},
|
|
|
|
getSelectedNodes : function(){
|
|
return this.selNodes;
|
|
},
|
|
|
|
onKeyDown : YAHOO.ext.tree.DefaultSelectionModel.prototype.onKeyDown
|
|
});
|