Upgrade to ExtJS 3.1.1 - Released 02/08/2010
[extjs.git] / src / widgets / tree / TreeEventModel.js
1 /*!
2  * Ext JS Library 3.1.1
3  * Copyright(c) 2006-2010 Ext JS, LLC
4  * licensing@extjs.com
5  * http://www.extjs.com/license
6  */
7 Ext.tree.TreeEventModel = function(tree){\r
8     this.tree = tree;\r
9     this.tree.on('render', this.initEvents, this);\r
10 }\r
11 \r
12 Ext.tree.TreeEventModel.prototype = {\r
13     initEvents : function(){\r
14         var t = this.tree;\r
15 \r
16         if(t.trackMouseOver !== false){\r
17             t.mon(t.innerCt, {\r
18                 scope: this,\r
19                 mouseover: this.delegateOver,\r
20                 mouseout: this.delegateOut\r
21             });\r
22         }\r
23         t.mon(t.getTreeEl(), {\r
24             scope: this,\r
25             click: this.delegateClick,\r
26             dblclick: this.delegateDblClick,\r
27             contextmenu: this.delegateContextMenu\r
28         });\r
29     },\r
30 \r
31     getNode : function(e){\r
32         var t;\r
33         if(t = e.getTarget('.x-tree-node-el', 10)){\r
34             var id = Ext.fly(t, '_treeEvents').getAttribute('tree-node-id', 'ext');\r
35             if(id){\r
36                 return this.tree.getNodeById(id);\r
37             }\r
38         }\r
39         return null;\r
40     },\r
41 \r
42     getNodeTarget : function(e){\r
43         var t = e.getTarget('.x-tree-node-icon', 1);\r
44         if(!t){\r
45             t = e.getTarget('.x-tree-node-el', 6);\r
46         }\r
47         return t;\r
48     },\r
49 \r
50     delegateOut : function(e, t){\r
51         if(!this.beforeEvent(e)){\r
52             return;\r
53         }\r
54         if(e.getTarget('.x-tree-ec-icon', 1)){\r
55             var n = this.getNode(e);\r
56             this.onIconOut(e, n);\r
57             if(n == this.lastEcOver){\r
58                 delete this.lastEcOver;\r
59             }\r
60         }\r
61         if((t = this.getNodeTarget(e)) && !e.within(t, true)){\r
62             this.onNodeOut(e, this.getNode(e));\r
63         }\r
64     },\r
65 \r
66     delegateOver : function(e, t){\r
67         if(!this.beforeEvent(e)){\r
68             return;\r
69         }\r
70         if(Ext.isGecko && !this.trackingDoc){ // prevent hanging in FF\r
71             Ext.getBody().on('mouseover', this.trackExit, this);\r
72             this.trackingDoc = true;\r
73         }\r
74         if(this.lastEcOver){ // prevent hung highlight\r
75             this.onIconOut(e, this.lastEcOver);\r
76             delete this.lastEcOver;\r
77         }\r
78         if(e.getTarget('.x-tree-ec-icon', 1)){\r
79             this.lastEcOver = this.getNode(e);\r
80             this.onIconOver(e, this.lastEcOver);\r
81         }\r
82         if(t = this.getNodeTarget(e)){\r
83             this.onNodeOver(e, this.getNode(e));\r
84         }\r
85     },\r
86 \r
87     trackExit : function(e){\r
88         if(this.lastOverNode){\r
89             if(this.lastOverNode.ui && !e.within(this.lastOverNode.ui.getEl())){\r
90                 this.onNodeOut(e, this.lastOverNode);\r
91             }\r
92             delete this.lastOverNode;\r
93             Ext.getBody().un('mouseover', this.trackExit, this);\r
94             this.trackingDoc = false;\r
95         }\r
96 \r
97     },\r
98 \r
99     delegateClick : function(e, t){\r
100         if(this.beforeEvent(e)){\r
101             if(e.getTarget('input[type=checkbox]', 1)){\r
102                 this.onCheckboxClick(e, this.getNode(e));\r
103             }else if(e.getTarget('.x-tree-ec-icon', 1)){\r
104                 this.onIconClick(e, this.getNode(e));\r
105             }else if(this.getNodeTarget(e)){\r
106                 this.onNodeClick(e, this.getNode(e));\r
107             }else{\r
108                 this.onContainerEvent(e, 'click');\r
109             }\r
110         }\r
111     },\r
112 \r
113     delegateDblClick : function(e, t){\r
114         if(this.beforeEvent(e)){\r
115             if(this.getNodeTarget(e)){\r
116                 this.onNodeDblClick(e, this.getNode(e));\r
117             }else{\r
118                 this.onContainerEvent(e, 'dblclick');\r
119             }\r
120         }\r
121     },\r
122 \r
123     delegateContextMenu : function(e, t){\r
124         if(this.beforeEvent(e)){\r
125             if(this.getNodeTarget(e)){\r
126                 this.onNodeContextMenu(e, this.getNode(e));\r
127             }else{\r
128                 this.onContainerEvent(e, 'contextmenu');\r
129             }\r
130         }\r
131     },\r
132 \r
133     onContainerEvent: function(e, type){\r
134         this.tree.fireEvent('container' + type, this.tree, e);\r
135     },\r
136 \r
137     onNodeClick : function(e, node){\r
138         node.ui.onClick(e);\r
139     },\r
140 \r
141     onNodeOver : function(e, node){\r
142         this.lastOverNode = node;\r
143         node.ui.onOver(e);\r
144     },\r
145 \r
146     onNodeOut : function(e, node){\r
147         node.ui.onOut(e);\r
148     },\r
149 \r
150     onIconOver : function(e, node){\r
151         node.ui.addClass('x-tree-ec-over');\r
152     },\r
153 \r
154     onIconOut : function(e, node){\r
155         node.ui.removeClass('x-tree-ec-over');\r
156     },\r
157 \r
158     onIconClick : function(e, node){\r
159         node.ui.ecClick(e);\r
160     },\r
161 \r
162     onCheckboxClick : function(e, node){\r
163         node.ui.onCheckChange(e);\r
164     },\r
165 \r
166     onNodeDblClick : function(e, node){\r
167         node.ui.onDblClick(e);\r
168     },\r
169 \r
170     onNodeContextMenu : function(e, node){\r
171         node.ui.onContextMenu(e);\r
172     },\r
173 \r
174     beforeEvent : function(e){\r
175         var node = this.getNode(e);\r
176         if(this.disabled || !node || !node.ui){\r
177             e.stopEvent();\r
178             return false;\r
179         }\r
180         return true;\r
181     },\r
182 \r
183     disable: function(){\r
184         this.disabled = true;\r
185     },\r
186 \r
187     enable: function(){\r
188         this.disabled = false;\r
189     }\r
190 };