2 * Ext JS Library 2.2.1
\r
3 * Copyright(c) 2006-2009, Ext JS, LLC.
\r
4 * licensing@extjs.com
\r
6 * http://extjs.com/license
\r
10 * @class Ext.tree.DefaultSelectionModel
\r
11 * @extends Ext.util.Observable
\r
12 * The default single selection for a TreePanel.
\r
14 Ext.tree.DefaultSelectionModel = function(config){
\r
15 this.selNode = null;
\r
19 * @event selectionchange
\r
20 * Fires when the selected node changes
\r
21 * @param {DefaultSelectionModel} this
\r
22 * @param {TreeNode} node the new selection
\r
27 * @event beforeselect
\r
28 * Fires before the selected node changes, return false to cancel the change
\r
29 * @param {DefaultSelectionModel} this
\r
30 * @param {TreeNode} node the new selection
\r
31 * @param {TreeNode} node the old selection
\r
36 Ext.apply(this, config);
\r
37 Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);
\r
40 Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {
\r
41 init : function(tree){
\r
43 tree.getTreeEl().on("keydown", this.onKeyDown, this);
\r
44 tree.on("click", this.onNodeClick, this);
\r
47 onNodeClick : function(node, e){
\r
53 * @param {TreeNode} node The node to select
\r
54 * @return {TreeNode} The selected node
\r
56 select : function(node){
\r
57 var last = this.selNode;
\r
58 if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){
\r
60 last.ui.onSelectedChange(false);
\r
62 this.selNode = node;
\r
63 node.ui.onSelectedChange(true);
\r
64 this.fireEvent("selectionchange", this, node, last);
\r
71 * @param {TreeNode} node The node to unselect
\r
73 unselect : function(node){
\r
74 if(this.selNode == node){
\r
75 this.clearSelections();
\r
80 * Clear all selections
\r
82 clearSelections : function(){
\r
83 var n = this.selNode;
\r
85 n.ui.onSelectedChange(false);
\r
86 this.selNode = null;
\r
87 this.fireEvent("selectionchange", this, null);
\r
93 * Get the selected node
\r
94 * @return {TreeNode} The selected node
\r
96 getSelectedNode : function(){
\r
97 return this.selNode;
\r
101 * Returns true if the node is selected
\r
102 * @param {TreeNode} node The node to check
\r
103 * @return {Boolean}
\r
105 isSelected : function(node){
\r
106 return this.selNode == node;
\r
110 * Selects the node above the selected node in the tree, intelligently walking the nodes
\r
111 * @return TreeNode The new selection
\r
113 selectPrevious : function(){
\r
114 var s = this.selNode || this.lastSelNode;
\r
118 var ps = s.previousSibling;
\r
120 if(!ps.isExpanded() || ps.childNodes.length < 1){
\r
121 return this.select(ps);
\r
123 var lc = ps.lastChild;
\r
124 while(lc && lc.isExpanded() && lc.childNodes.length > 0){
\r
127 return this.select(lc);
\r
129 } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
\r
130 return this.select(s.parentNode);
\r
136 * Selects the node above the selected node in the tree, intelligently walking the nodes
\r
137 * @return TreeNode The new selection
\r
139 selectNext : function(){
\r
140 var s = this.selNode || this.lastSelNode;
\r
144 if(s.firstChild && s.isExpanded()){
\r
145 return this.select(s.firstChild);
\r
146 }else if(s.nextSibling){
\r
147 return this.select(s.nextSibling);
\r
148 }else if(s.parentNode){
\r
150 s.parentNode.bubble(function(){
\r
151 if(this.nextSibling){
\r
152 newS = this.getOwnerTree().selModel.select(this.nextSibling);
\r
161 onKeyDown : function(e){
\r
162 var s = this.selNode || this.lastSelNode;
\r
163 // undesirable, but required
\r
168 var k = e.getKey();
\r
176 this.selectPrevious();
\r
179 e.preventDefault();
\r
180 if(s.hasChildNodes()){
\r
181 if(!s.isExpanded()){
\r
183 }else if(s.firstChild){
\r
184 this.select(s.firstChild, e);
\r
189 e.preventDefault();
\r
190 if(s.hasChildNodes() && s.isExpanded()){
\r
192 }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
\r
193 this.select(s.parentNode, e);
\r
201 * @class Ext.tree.MultiSelectionModel
\r
202 * @extends Ext.util.Observable
\r
203 * Multi selection for a TreePanel.
\r
205 Ext.tree.MultiSelectionModel = function(config){
\r
206 this.selNodes = [];
\r
210 * @event selectionchange
\r
211 * Fires when the selected nodes change
\r
212 * @param {MultiSelectionModel} this
\r
213 * @param {Array} nodes Array of the selected nodes
\r
217 Ext.apply(this, config);
\r
218 Ext.tree.MultiSelectionModel.superclass.constructor.call(this);
\r
221 Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {
\r
222 init : function(tree){
\r
224 tree.getTreeEl().on("keydown", this.onKeyDown, this);
\r
225 tree.on("click", this.onNodeClick, this);
\r
228 onNodeClick : function(node, e){
\r
229 this.select(node, e, e.ctrlKey);
\r
234 * @param {TreeNode} node The node to select
\r
235 * @param {EventObject} e (optional) An event associated with the selection
\r
236 * @param {Boolean} keepExisting True to retain existing selections
\r
237 * @return {TreeNode} The selected node
\r
239 select : function(node, e, keepExisting){
\r
240 if(keepExisting !== true){
\r
241 this.clearSelections(true);
\r
243 if(this.isSelected(node)){
\r
244 this.lastSelNode = node;
\r
247 this.selNodes.push(node);
\r
248 this.selMap[node.id] = node;
\r
249 this.lastSelNode = node;
\r
250 node.ui.onSelectedChange(true);
\r
251 this.fireEvent("selectionchange", this, this.selNodes);
\r
257 * @param {TreeNode} node The node to unselect
\r
259 unselect : function(node){
\r
260 if(this.selMap[node.id]){
\r
261 node.ui.onSelectedChange(false);
\r
262 var sn = this.selNodes;
\r
263 var index = sn.indexOf(node);
\r
265 this.selNodes.splice(index, 1);
\r
267 delete this.selMap[node.id];
\r
268 this.fireEvent("selectionchange", this, this.selNodes);
\r
273 * Clear all selections
\r
275 clearSelections : function(suppressEvent){
\r
276 var sn = this.selNodes;
\r
278 for(var i = 0, len = sn.length; i < len; i++){
\r
279 sn[i].ui.onSelectedChange(false);
\r
281 this.selNodes = [];
\r
283 if(suppressEvent !== true){
\r
284 this.fireEvent("selectionchange", this, this.selNodes);
\r
290 * Returns true if the node is selected
\r
291 * @param {TreeNode} node The node to check
\r
292 * @return {Boolean}
\r
294 isSelected : function(node){
\r
295 return this.selMap[node.id] ? true : false;
\r
299 * Returns an array of the selected nodes
\r
302 getSelectedNodes : function(){
\r
303 return this.selNodes;
\r
306 onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
\r
308 selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
\r
310 selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
\r