Upgrade to ExtJS 3.0.3 - Released 10/11/2009
[extjs.git] / docs / source / TreeSelectionModel.html
1 <html>
2 <head>
3   <title>The source code</title>
4     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
5     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
6 </head>
7 <body  onload="prettyPrint();">
8     <pre class="prettyprint lang-js">/*!
9  * Ext JS Library 3.0.3
10  * Copyright(c) 2006-2009 Ext JS, LLC
11  * licensing@extjs.com
12  * http://www.extjs.com/license
13  */
14 <div id="cls-Ext.tree.DefaultSelectionModel"></div>/**\r
15  * @class Ext.tree.DefaultSelectionModel\r
16  * @extends Ext.util.Observable\r
17  * The default single selection for a TreePanel.\r
18  */\r
19 Ext.tree.DefaultSelectionModel = function(config){\r
20    this.selNode = null;\r
21    \r
22    this.addEvents(\r
23        <div id="event-Ext.tree.DefaultSelectionModel-selectionchange"></div>/**\r
24         * @event selectionchange\r
25         * Fires when the selected node changes\r
26         * @param {DefaultSelectionModel} this\r
27         * @param {TreeNode} node the new selection\r
28         */\r
29        "selectionchange",\r
30 \r
31        <div id="event-Ext.tree.DefaultSelectionModel-beforeselect"></div>/**\r
32         * @event beforeselect\r
33         * Fires before the selected node changes, return false to cancel the change\r
34         * @param {DefaultSelectionModel} this\r
35         * @param {TreeNode} node the new selection\r
36         * @param {TreeNode} node the old selection\r
37         */\r
38        "beforeselect"\r
39    );\r
40 \r
41     Ext.apply(this, config);\r
42     Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);\r
43 };\r
44 \r
45 Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {\r
46     init : function(tree){\r
47         this.tree = tree;\r
48         tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this);\r
49         tree.on("click", this.onNodeClick, this);\r
50     },\r
51     \r
52     onNodeClick : function(node, e){\r
53         this.select(node);\r
54     },\r
55     \r
56     <div id="method-Ext.tree.DefaultSelectionModel-select"></div>/**\r
57      * Select a node.\r
58      * @param {TreeNode} node The node to select\r
59      * @return {TreeNode} The selected node\r
60      */\r
61     select : function(node, /* private*/ selectNextNode){\r
62         // If node is hidden, select the next node in whatever direction was being moved in.\r
63         if (!Ext.fly(node.ui.wrap).isVisible() && selectNextNode) {\r
64             return selectNextNode.call(this, node);\r
65         }\r
66         var last = this.selNode;\r
67         if(node == last){\r
68             node.ui.onSelectedChange(true);\r
69         }else if(this.fireEvent('beforeselect', this, node, last) !== false){\r
70             if(last){\r
71                 last.ui.onSelectedChange(false);\r
72             }\r
73             this.selNode = node;\r
74             node.ui.onSelectedChange(true);\r
75             this.fireEvent("selectionchange", this, node, last);\r
76         }\r
77         return node;\r
78     },\r
79     \r
80     <div id="method-Ext.tree.DefaultSelectionModel-unselect"></div>/**\r
81      * Deselect a node.\r
82      * @param {TreeNode} node The node to unselect\r
83      */\r
84     unselect : function(node){\r
85         if(this.selNode == node){\r
86             this.clearSelections();\r
87         }    \r
88     },\r
89     \r
90     <div id="method-Ext.tree.DefaultSelectionModel-clearSelections"></div>/**\r
91      * Clear all selections\r
92      */\r
93     clearSelections : function(){\r
94         var n = this.selNode;\r
95         if(n){\r
96             n.ui.onSelectedChange(false);\r
97             this.selNode = null;\r
98             this.fireEvent("selectionchange", this, null);\r
99         }\r
100         return n;\r
101     },\r
102     \r
103     <div id="method-Ext.tree.DefaultSelectionModel-getSelectedNode"></div>/**\r
104      * Get the selected node\r
105      * @return {TreeNode} The selected node\r
106      */\r
107     getSelectedNode : function(){\r
108         return this.selNode;    \r
109     },\r
110     \r
111     <div id="method-Ext.tree.DefaultSelectionModel-isSelected"></div>/**\r
112      * Returns true if the node is selected\r
113      * @param {TreeNode} node The node to check\r
114      * @return {Boolean}\r
115      */\r
116     isSelected : function(node){\r
117         return this.selNode == node;  \r
118     },\r
119 \r
120     <div id="method-Ext.tree.DefaultSelectionModel-selectPrevious"></div>/**\r
121      * Selects the node above the selected node in the tree, intelligently walking the nodes\r
122      * @return TreeNode The new selection\r
123      */\r
124     selectPrevious : function(/* private */ s){\r
125         if(!(s = s || this.selNode || this.lastSelNode)){\r
126             return null;\r
127         }\r
128         // Here we pass in the current function to select to indicate the direction we're moving\r
129         var ps = s.previousSibling;\r
130         if(ps){\r
131             if(!ps.isExpanded() || ps.childNodes.length < 1){\r
132                 return this.select(ps, this.selectPrevious);\r
133             } else{\r
134                 var lc = ps.lastChild;\r
135                 while(lc && lc.isExpanded() && Ext.fly(lc.ui.wrap).isVisible() && lc.childNodes.length > 0){\r
136                     lc = lc.lastChild;\r
137                 }\r
138                 return this.select(lc, this.selectPrevious);\r
139             }\r
140         } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){\r
141             return this.select(s.parentNode, this.selectPrevious);\r
142         }\r
143         return null;\r
144     },\r
145 \r
146     <div id="method-Ext.tree.DefaultSelectionModel-selectNext"></div>/**\r
147      * Selects the node above the selected node in the tree, intelligently walking the nodes\r
148      * @return TreeNode The new selection\r
149      */\r
150     selectNext : function(/* private */ s){\r
151         if(!(s = s || this.selNode || this.lastSelNode)){\r
152             return null;\r
153         }\r
154         // Here we pass in the current function to select to indicate the direction we're moving\r
155         if(s.firstChild && s.isExpanded() && Ext.fly(s.ui.wrap).isVisible()){\r
156              return this.select(s.firstChild, this.selectNext);\r
157          }else if(s.nextSibling){\r
158              return this.select(s.nextSibling, this.selectNext);\r
159          }else if(s.parentNode){\r
160             var newS = null;\r
161             s.parentNode.bubble(function(){\r
162                 if(this.nextSibling){\r
163                     newS = this.getOwnerTree().selModel.select(this.nextSibling, this.selectNext);\r
164                     return false;\r
165                 }\r
166             });\r
167             return newS;\r
168          }\r
169         return null;\r
170     },\r
171 \r
172     onKeyDown : function(e){\r
173         var s = this.selNode || this.lastSelNode;\r
174         // undesirable, but required\r
175         var sm = this;\r
176         if(!s){\r
177             return;\r
178         }\r
179         var k = e.getKey();\r
180         switch(k){\r
181              case e.DOWN:\r
182                  e.stopEvent();\r
183                  this.selectNext();\r
184              break;\r
185              case e.UP:\r
186                  e.stopEvent();\r
187                  this.selectPrevious();\r
188              break;\r
189              case e.RIGHT:\r
190                  e.preventDefault();\r
191                  if(s.hasChildNodes()){\r
192                      if(!s.isExpanded()){\r
193                          s.expand();\r
194                      }else if(s.firstChild){\r
195                          this.select(s.firstChild, e);\r
196                      }\r
197                  }\r
198              break;\r
199              case e.LEFT:\r
200                  e.preventDefault();\r
201                  if(s.hasChildNodes() && s.isExpanded()){\r
202                      s.collapse();\r
203                  }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){\r
204                      this.select(s.parentNode, e);\r
205                  }\r
206              break;\r
207         };\r
208     }\r
209 });\r
210 \r
211 <div id="cls-Ext.tree.MultiSelectionModel"></div>/**\r
212  * @class Ext.tree.MultiSelectionModel\r
213  * @extends Ext.util.Observable\r
214  * Multi selection for a TreePanel.\r
215  */\r
216 Ext.tree.MultiSelectionModel = function(config){\r
217    this.selNodes = [];\r
218    this.selMap = {};\r
219    this.addEvents(\r
220        <div id="event-Ext.tree.MultiSelectionModel-selectionchange"></div>/**\r
221         * @event selectionchange\r
222         * Fires when the selected nodes change\r
223         * @param {MultiSelectionModel} this\r
224         * @param {Array} nodes Array of the selected nodes\r
225         */\r
226        "selectionchange"\r
227    );\r
228     Ext.apply(this, config);\r
229     Ext.tree.MultiSelectionModel.superclass.constructor.call(this);\r
230 };\r
231 \r
232 Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {\r
233     init : function(tree){\r
234         this.tree = tree;\r
235         tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this);\r
236         tree.on("click", this.onNodeClick, this);\r
237     },\r
238     \r
239     onNodeClick : function(node, e){\r
240         if(e.ctrlKey && this.isSelected(node)){\r
241             this.unselect(node);\r
242         }else{\r
243             this.select(node, e, e.ctrlKey);\r
244         }\r
245     },\r
246     \r
247     <div id="method-Ext.tree.MultiSelectionModel-select"></div>/**\r
248      * Select a node.\r
249      * @param {TreeNode} node The node to select\r
250      * @param {EventObject} e (optional) An event associated with the selection\r
251      * @param {Boolean} keepExisting True to retain existing selections\r
252      * @return {TreeNode} The selected node\r
253      */\r
254     select : function(node, e, keepExisting){\r
255         if(keepExisting !== true){\r
256             this.clearSelections(true);\r
257         }\r
258         if(this.isSelected(node)){\r
259             this.lastSelNode = node;\r
260             return node;\r
261         }\r
262         this.selNodes.push(node);\r
263         this.selMap[node.id] = node;\r
264         this.lastSelNode = node;\r
265         node.ui.onSelectedChange(true);\r
266         this.fireEvent("selectionchange", this, this.selNodes);\r
267         return node;\r
268     },\r
269     \r
270     <div id="method-Ext.tree.MultiSelectionModel-unselect"></div>/**\r
271      * Deselect a node.\r
272      * @param {TreeNode} node The node to unselect\r
273      */\r
274     unselect : function(node){\r
275         if(this.selMap[node.id]){\r
276             node.ui.onSelectedChange(false);\r
277             var sn = this.selNodes;\r
278             var index = sn.indexOf(node);\r
279             if(index != -1){\r
280                 this.selNodes.splice(index, 1);\r
281             }\r
282             delete this.selMap[node.id];\r
283             this.fireEvent("selectionchange", this, this.selNodes);\r
284         }\r
285     },\r
286     \r
287     <div id="method-Ext.tree.MultiSelectionModel-clearSelections"></div>/**\r
288      * Clear all selections\r
289      */\r
290     clearSelections : function(suppressEvent){\r
291         var sn = this.selNodes;\r
292         if(sn.length > 0){\r
293             for(var i = 0, len = sn.length; i < len; i++){\r
294                 sn[i].ui.onSelectedChange(false);\r
295             }\r
296             this.selNodes = [];\r
297             this.selMap = {};\r
298             if(suppressEvent !== true){\r
299                 this.fireEvent("selectionchange", this, this.selNodes);\r
300             }\r
301         }\r
302     },\r
303     \r
304     <div id="method-Ext.tree.MultiSelectionModel-isSelected"></div>/**\r
305      * Returns true if the node is selected\r
306      * @param {TreeNode} node The node to check\r
307      * @return {Boolean}\r
308      */\r
309     isSelected : function(node){\r
310         return this.selMap[node.id] ? true : false;  \r
311     },\r
312     \r
313     <div id="method-Ext.tree.MultiSelectionModel-getSelectedNodes"></div>/**\r
314      * Returns an array of the selected nodes\r
315      * @return {Array}\r
316      */\r
317     getSelectedNodes : function(){\r
318         return this.selNodes;    \r
319     },\r
320 \r
321     onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,\r
322 \r
323     selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,\r
324 \r
325     selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious\r
326 });</pre>
327 </body>
328 </html>