summaryrefslogtreecommitdiff
path: root/frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js
Unidiff
Diffstat (limited to 'frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js195
1 files changed, 195 insertions, 0 deletions
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 @@
1YAHOO.ext.tree.DefaultSelectionModel = function(){
2 this.selNode = null;
3
4 this.events = {
5 'selectionchange' : true
6 };
7};
8
9YAHOO.extendX(YAHOO.ext.tree.DefaultSelectionModel, YAHOO.ext.util.Observable, {
10 init : function(tree){
11 this.tree = tree;
12 tree.el.mon('keydown', this.onKeyDown, this, true);
13 tree.on('click', this.onNodeClick, this, true);
14 },
15
16 onNodeClick : function(node, e){
17 this.select(node);
18 },
19
20 select : function(node){
21 if(this.selNode && this.selNode != node){
22 this.selNode.ui.onSelectedChange(false);
23 }
24 this.selNode = node;
25 node.ui.onSelectedChange(true);
26 this.fireEvent('selectionchange', this, node);
27 return node;
28 },
29
30 unselect : function(node){
31 if(this.selNode == node){
32 this.clearSelections();
33 }
34 },
35
36 clearSelections : function(){
37 var n = this.selNode;
38 if(n){
39 n.ui.onSelectedChange(false);
40 this.selNode = null;
41 this.fireEvent('selectionchange', this, null);
42 }
43 return n;
44 },
45
46 getSelectedNode : function(){
47 return this.selNode;
48 },
49
50 isSelected : function(node){
51 return this.selNode == node;
52 },
53
54 onKeyDown : function(e){
55 var s = this.selNode || this.lastSelNode;
56 // undesirable, but required
57 var sm = this;
58 if(!s){
59 return;
60 }
61 var k = e.getKey();
62 //alert(k)
63 switch(k){
64 case e.DOWN:
65 e.preventDefault();
66 if(s.firstChild && s.isExpanded()){
67 this.select(s.firstChild, e);
68 }else if(s.nextSibling){
69 this.select(s.nextSibling, e);
70 }else if(s.parentNode){
71 s.parentNode.bubble(function(){
72 if(this.nextSibling){
73 sm.select(this.nextSibling, e);
74 return false;
75 }
76 });
77 }
78 break;
79 case e.UP:
80 e.preventDefault();
81 var ps = s.previousSibling;
82 if(ps){
83 if(!ps.isExpanded()){
84 this.select(ps, e);
85 }else{
86 var lc = ps.lastChild;
87 while(lc && lc.isExpanded()){
88 lc = lc.lastChild;
89 }
90 this.select(lc, e);
91 }
92 }else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
93 this.select(s.parentNode, e);
94 }
95 break;
96 case e.RIGHT:
97 e.preventDefault();
98 if(s.hasChildNodes()){
99 if(!s.isExpanded()){
100 s.expand();
101 }else if(s.firstChild){
102 this.select(s.firstChild, e);
103 }
104 }
105 break;
106 case e.LEFT:
107 e.preventDefault();
108 if(s.hasChildNodes() && s.isExpanded()){
109 s.collapse();
110 }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
111 this.select(s.parentNode, e);
112 }
113 break;
114 };
115 }
116});
117
118YAHOO.ext.tree.MultiSelectionModel = function(){
119 this.selNodes = [];
120 this.selMap = {};
121 this.events = {
122 'selectionchange' : true
123 };
124};
125
126YAHOO.extendX(YAHOO.ext.tree.MultiSelectionModel, YAHOO.ext.util.Observable, {
127 init : function(tree){
128 this.tree = tree;
129 tree.el.mon('keydown', this.onKeyDown, this, true);
130 tree.on('click', this.onNodeClick, this, true);
131 },
132
133 onNodeClick : function(node, e){
134 this.select(node, e, e.ctrlKey);
135 },
136
137 select : function(node, e, keepExisting){
138 if(keepExisting !== true){
139 this.clearSelections(true);
140 }
141 this.selNodes.push(node);
142 this.selMap[node.id] = node;
143 this.lastSelNode = node;
144 node.ui.onSelectedChange(true);
145 this.fireEvent('selectionchange', this, this.selNodes);
146 return node;
147 },
148
149 unselect : function(node){
150 if(this.selMap[node.id]){
151 node.ui.onSelectedChange(false);
152 var sn = this.selNodes;
153 var index = -1;
154 if(sn.indexOf){
155 index = sn.indexOf(node);
156 }else{
157 for(var i = 0, len = sn.length; i < len; i++){
158 if(sn[i] == node){
159 index = i;
160 break;
161 }
162 }
163 }
164 if(index != -1){
165 this.selNodes.splice(index, 1);
166 }
167 delete this.selMap[node.id];
168 this.fireEvent('selectionchange', this, this.selNodes);
169 }
170 },
171
172 clearSelections : function(suppressEvent){
173 var sn = this.selNodes;
174 if(sn.length > 0){
175 for(var i = 0, len = sn.length; i < len; i++){
176 sn[i].ui.onSelectedChange(false);
177 }
178 this.selNodes = [];
179 this.selMap = {};
180 if(suppressEvent !== true){
181 this.fireEvent('selectionchange', this, this.selNodes);
182 }
183 }
184 },
185
186 isSelected : function(node){
187 return this.selMap[node.id] ? true : false;
188 },
189
190 getSelectedNodes : function(){
191 return this.selNodes;
192 },
193
194 onKeyDown : YAHOO.ext.tree.DefaultSelectionModel.prototype.onKeyDown
195});