3 * Copyright(c) 2006-2010 Ext JS, Inc.
5 * http://www.extjs.com/license
7 Ext.tree.TreeEventModel = function(tree){
9 this.tree.on('render', this.initEvents, this);
12 Ext.tree.TreeEventModel.prototype = {
13 initEvents : function(){
16 if(t.trackMouseOver !== false){
19 mouseover: this.delegateOver,
20 mouseout: this.delegateOut
23 t.mon(t.getTreeEl(), {
25 click: this.delegateClick,
26 dblclick: this.delegateDblClick,
27 contextmenu: this.delegateContextMenu
31 getNode : function(e){
33 if(t = e.getTarget('.x-tree-node-el', 10)){
34 var id = Ext.fly(t, '_treeEvents').getAttribute('tree-node-id', 'ext');
36 return this.tree.getNodeById(id);
42 getNodeTarget : function(e){
43 var t = e.getTarget('.x-tree-node-icon', 1);
45 t = e.getTarget('.x-tree-node-el', 6);
50 delegateOut : function(e, t){
51 if(!this.beforeEvent(e)){
54 if(e.getTarget('.x-tree-ec-icon', 1)){
55 var n = this.getNode(e);
57 if(n == this.lastEcOver){
58 delete this.lastEcOver;
61 if((t = this.getNodeTarget(e)) && !e.within(t, true)){
62 this.onNodeOut(e, this.getNode(e));
66 delegateOver : function(e, t){
67 if(!this.beforeEvent(e)){
70 if(Ext.isGecko && !this.trackingDoc){ // prevent hanging in FF
71 Ext.getBody().on('mouseover', this.trackExit, this);
72 this.trackingDoc = true;
74 if(this.lastEcOver){ // prevent hung highlight
75 this.onIconOut(e, this.lastEcOver);
76 delete this.lastEcOver;
78 if(e.getTarget('.x-tree-ec-icon', 1)){
79 this.lastEcOver = this.getNode(e);
80 this.onIconOver(e, this.lastEcOver);
82 if(t = this.getNodeTarget(e)){
83 this.onNodeOver(e, this.getNode(e));
87 trackExit : function(e){
88 if(this.lastOverNode){
89 if(this.lastOverNode.ui && !e.within(this.lastOverNode.ui.getEl())){
90 this.onNodeOut(e, this.lastOverNode);
92 delete this.lastOverNode;
93 Ext.getBody().un('mouseover', this.trackExit, this);
94 this.trackingDoc = false;
99 delegateClick : function(e, t){
100 if(this.beforeEvent(e)){
101 if(e.getTarget('input[type=checkbox]', 1)){
102 this.onCheckboxClick(e, this.getNode(e));
103 }else if(e.getTarget('.x-tree-ec-icon', 1)){
104 this.onIconClick(e, this.getNode(e));
105 }else if(this.getNodeTarget(e)){
106 this.onNodeClick(e, this.getNode(e));
109 this.checkContainerEvent(e, 'click');
113 delegateDblClick : function(e, t){
114 if(this.beforeEvent(e)){
115 if(this.getNodeTarget(e)){
116 this.onNodeDblClick(e, this.getNode(e));
119 this.checkContainerEvent(e, 'dblclick');
123 delegateContextMenu : function(e, t){
124 if(this.beforeEvent(e)){
125 if(this.getNodeTarget(e)){
126 this.onNodeContextMenu(e, this.getNode(e));
129 this.checkContainerEvent(e, 'contextmenu');
133 checkContainerEvent: function(e, type){
138 this.onContainerEvent(e, type);
141 onContainerEvent: function(e, type){
142 this.tree.fireEvent('container' + type, this.tree, e);
145 onNodeClick : function(e, node){
149 onNodeOver : function(e, node){
150 this.lastOverNode = node;
154 onNodeOut : function(e, node){
158 onIconOver : function(e, node){
159 node.ui.addClass('x-tree-ec-over');
162 onIconOut : function(e, node){
163 node.ui.removeClass('x-tree-ec-over');
166 onIconClick : function(e, node){
170 onCheckboxClick : function(e, node){
171 node.ui.onCheckChange(e);
174 onNodeDblClick : function(e, node){
175 node.ui.onDblClick(e);
178 onNodeContextMenu : function(e, node){
179 node.ui.onContextMenu(e);
182 beforeEvent : function(e){
183 var node = this.getNode(e);
184 if(this.disabled || !node || !node.ui){
192 this.disabled = true;
196 this.disabled = false;