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.js | 195 |
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 @@ | |||
1 | YAHOO.ext.tree.DefaultSelectionModel = function(){ | ||
2 | this.selNode = null; | ||
3 | |||
4 | this.events = { | ||
5 | 'selectionchange' : true | ||
6 | }; | ||
7 | }; | ||
8 | |||
9 | YAHOO.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 | |||
118 | YAHOO.ext.tree.MultiSelectionModel = function(){ | ||
119 | this.selNodes = []; | ||
120 | this.selMap = {}; | ||
121 | this.events = { | ||
122 | 'selectionchange' : true | ||
123 | }; | ||
124 | }; | ||
125 | |||
126 | YAHOO.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 | }); | ||