Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / src / widgets / tree / TreeEventModel.js
diff --git a/src/widgets/tree/TreeEventModel.js b/src/widgets/tree/TreeEventModel.js
new file mode 100644 (file)
index 0000000..f22589f
--- /dev/null
@@ -0,0 +1,169 @@
+/*!
+ * Ext JS Library 3.0.0
+ * Copyright(c) 2006-2009 Ext JS, LLC
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+Ext.tree.TreeEventModel = function(tree){\r
+    this.tree = tree;\r
+    this.tree.on('render', this.initEvents, this);\r
+}\r
+\r
+Ext.tree.TreeEventModel.prototype = {\r
+    initEvents : function(){\r
+        var el = this.tree.getTreeEl();\r
+        el.on('click', this.delegateClick, this);\r
+        if(this.tree.trackMouseOver !== false){\r
+            this.tree.innerCt.on('mouseover', this.delegateOver, this);\r
+            this.tree.innerCt.on('mouseout', this.delegateOut, this);\r
+        }\r
+        el.on('dblclick', this.delegateDblClick, this);\r
+        el.on('contextmenu', this.delegateContextMenu, this);\r
+    },\r
+\r
+    getNode : function(e){\r
+        var t;\r
+        if(t = e.getTarget('.x-tree-node-el', 10)){\r
+            var id = Ext.fly(t, '_treeEvents').getAttribute('tree-node-id', 'ext');\r
+            if(id){\r
+                return this.tree.getNodeById(id);\r
+            }\r
+        }\r
+        return null;\r
+    },\r
+\r
+    getNodeTarget : function(e){\r
+        var t = e.getTarget('.x-tree-node-icon', 1);\r
+        if(!t){\r
+            t = e.getTarget('.x-tree-node-el', 6);\r
+        }\r
+        return t;\r
+    },\r
+\r
+    delegateOut : function(e, t){\r
+        if(!this.beforeEvent(e)){\r
+            return;\r
+        }\r
+        if(e.getTarget('.x-tree-ec-icon', 1)){\r
+            var n = this.getNode(e);\r
+            this.onIconOut(e, n);\r
+            if(n == this.lastEcOver){\r
+                delete this.lastEcOver;\r
+            }\r
+        }\r
+        if((t = this.getNodeTarget(e)) && !e.within(t, true)){\r
+            this.onNodeOut(e, this.getNode(e));\r
+        }\r
+    },\r
+\r
+    delegateOver : function(e, t){\r
+        if(!this.beforeEvent(e)){\r
+            return;\r
+        }\r
+        if(Ext.isGecko && !this.trackingDoc){ // prevent hanging in FF\r
+            Ext.getBody().on('mouseover', this.trackExit, this);\r
+            this.trackingDoc = true;\r
+        }\r
+        if(this.lastEcOver){ // prevent hung highlight\r
+            this.onIconOut(e, this.lastEcOver);\r
+            delete this.lastEcOver;\r
+        }\r
+        if(e.getTarget('.x-tree-ec-icon', 1)){\r
+            this.lastEcOver = this.getNode(e);\r
+            this.onIconOver(e, this.lastEcOver);\r
+        }\r
+        if(t = this.getNodeTarget(e)){\r
+            this.onNodeOver(e, this.getNode(e));\r
+        }\r
+    },\r
+\r
+    trackExit : function(e){\r
+        if(this.lastOverNode && !e.within(this.lastOverNode.ui.getEl())){\r
+            this.onNodeOut(e, this.lastOverNode);\r
+            delete this.lastOverNode;\r
+            Ext.getBody().un('mouseover', this.trackExit, this);\r
+            this.trackingDoc = false;\r
+        }\r
+    },\r
+\r
+    delegateClick : function(e, t){\r
+        if(!this.beforeEvent(e)){\r
+            return;\r
+        }\r
+\r
+        if(e.getTarget('input[type=checkbox]', 1)){\r
+            this.onCheckboxClick(e, this.getNode(e));\r
+        }\r
+        else if(e.getTarget('.x-tree-ec-icon', 1)){\r
+            this.onIconClick(e, this.getNode(e));\r
+        }\r
+        else if(this.getNodeTarget(e)){\r
+            this.onNodeClick(e, this.getNode(e));\r
+        }\r
+    },\r
+\r
+    delegateDblClick : function(e, t){\r
+        if(this.beforeEvent(e) && this.getNodeTarget(e)){\r
+            this.onNodeDblClick(e, this.getNode(e));\r
+        }\r
+    },\r
+\r
+    delegateContextMenu : function(e, t){\r
+        if(this.beforeEvent(e) && this.getNodeTarget(e)){\r
+            this.onNodeContextMenu(e, this.getNode(e));\r
+        }\r
+    },\r
+\r
+    onNodeClick : function(e, node){\r
+        node.ui.onClick(e);\r
+    },\r
+\r
+    onNodeOver : function(e, node){\r
+        this.lastOverNode = node;\r
+        node.ui.onOver(e);\r
+    },\r
+\r
+    onNodeOut : function(e, node){\r
+        node.ui.onOut(e);\r
+    },\r
+\r
+    onIconOver : function(e, node){\r
+        node.ui.addClass('x-tree-ec-over');\r
+    },\r
+\r
+    onIconOut : function(e, node){\r
+        node.ui.removeClass('x-tree-ec-over');\r
+    },\r
+\r
+    onIconClick : function(e, node){\r
+        node.ui.ecClick(e);\r
+    },\r
+\r
+    onCheckboxClick : function(e, node){\r
+        node.ui.onCheckChange(e);\r
+    },\r
+\r
+    onNodeDblClick : function(e, node){\r
+        node.ui.onDblClick(e);\r
+    },\r
+\r
+    onNodeContextMenu : function(e, node){\r
+        node.ui.onContextMenu(e);\r
+    },\r
+\r
+    beforeEvent : function(e){\r
+        if(this.disabled){\r
+            e.stopEvent();\r
+            return false;\r
+        }\r
+        return true;\r
+    },\r
+\r
+    disable: function(){\r
+        this.disabled = true;\r
+    },\r
+\r
+    enable: function(){\r
+        this.disabled = false;\r
+    }\r
+};
\ No newline at end of file