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