From 541bb378ddece2eab135a8066a16994e94436dea Mon Sep 17 00:00:00 2001 From: Giulio Cesare Solaroli Date: Mon, 03 Oct 2011 16:04:12 +0000 Subject: Merge pull request #1 from gcsolaroli/master First version of the restructured repository --- (limited to 'frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js') diff --git a/frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js b/frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js new file mode 100644 index 0000000..4fed88e --- a/dev/null +++ b/frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js @@ -0,0 +1,195 @@ +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 +}); -- cgit v0.9.0.2