X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/ee06f37b0f6f6d94cd05a6ffae556660f7c4a2bc..c930e9176a5a85509c5b0230e2bff5c22a591432:/src/widgets/tree/TreeEventModel.js diff --git a/src/widgets/tree/TreeEventModel.js b/src/widgets/tree/TreeEventModel.js new file mode 100644 index 00000000..f22589f6 --- /dev/null +++ b/src/widgets/tree/TreeEventModel.js @@ -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){ + this.tree = tree; + this.tree.on('render', this.initEvents, this); +} + +Ext.tree.TreeEventModel.prototype = { + initEvents : function(){ + var el = this.tree.getTreeEl(); + el.on('click', this.delegateClick, this); + if(this.tree.trackMouseOver !== false){ + this.tree.innerCt.on('mouseover', this.delegateOver, this); + this.tree.innerCt.on('mouseout', this.delegateOut, this); + } + el.on('dblclick', this.delegateDblClick, this); + el.on('contextmenu', this.delegateContextMenu, this); + }, + + getNode : function(e){ + var t; + if(t = e.getTarget('.x-tree-node-el', 10)){ + var id = Ext.fly(t, '_treeEvents').getAttribute('tree-node-id', 'ext'); + if(id){ + return this.tree.getNodeById(id); + } + } + return null; + }, + + getNodeTarget : function(e){ + var t = e.getTarget('.x-tree-node-icon', 1); + if(!t){ + t = e.getTarget('.x-tree-node-el', 6); + } + return t; + }, + + delegateOut : function(e, t){ + if(!this.beforeEvent(e)){ + return; + } + if(e.getTarget('.x-tree-ec-icon', 1)){ + var n = this.getNode(e); + this.onIconOut(e, n); + if(n == this.lastEcOver){ + delete this.lastEcOver; + } + } + if((t = this.getNodeTarget(e)) && !e.within(t, true)){ + this.onNodeOut(e, this.getNode(e)); + } + }, + + delegateOver : function(e, t){ + if(!this.beforeEvent(e)){ + return; + } + if(Ext.isGecko && !this.trackingDoc){ // prevent hanging in FF + Ext.getBody().on('mouseover', this.trackExit, this); + this.trackingDoc = true; + } + if(this.lastEcOver){ // prevent hung highlight + this.onIconOut(e, this.lastEcOver); + delete this.lastEcOver; + } + if(e.getTarget('.x-tree-ec-icon', 1)){ + this.lastEcOver = this.getNode(e); + this.onIconOver(e, this.lastEcOver); + } + if(t = this.getNodeTarget(e)){ + this.onNodeOver(e, this.getNode(e)); + } + }, + + trackExit : function(e){ + if(this.lastOverNode && !e.within(this.lastOverNode.ui.getEl())){ + this.onNodeOut(e, this.lastOverNode); + delete this.lastOverNode; + Ext.getBody().un('mouseover', this.trackExit, this); + this.trackingDoc = false; + } + }, + + delegateClick : function(e, t){ + if(!this.beforeEvent(e)){ + return; + } + + if(e.getTarget('input[type=checkbox]', 1)){ + this.onCheckboxClick(e, this.getNode(e)); + } + else if(e.getTarget('.x-tree-ec-icon', 1)){ + this.onIconClick(e, this.getNode(e)); + } + else if(this.getNodeTarget(e)){ + this.onNodeClick(e, this.getNode(e)); + } + }, + + delegateDblClick : function(e, t){ + if(this.beforeEvent(e) && this.getNodeTarget(e)){ + this.onNodeDblClick(e, this.getNode(e)); + } + }, + + delegateContextMenu : function(e, t){ + if(this.beforeEvent(e) && this.getNodeTarget(e)){ + this.onNodeContextMenu(e, this.getNode(e)); + } + }, + + onNodeClick : function(e, node){ + node.ui.onClick(e); + }, + + onNodeOver : function(e, node){ + this.lastOverNode = node; + node.ui.onOver(e); + }, + + onNodeOut : function(e, node){ + node.ui.onOut(e); + }, + + onIconOver : function(e, node){ + node.ui.addClass('x-tree-ec-over'); + }, + + onIconOut : function(e, node){ + node.ui.removeClass('x-tree-ec-over'); + }, + + onIconClick : function(e, node){ + node.ui.ecClick(e); + }, + + onCheckboxClick : function(e, node){ + node.ui.onCheckChange(e); + }, + + onNodeDblClick : function(e, node){ + node.ui.onDblClick(e); + }, + + onNodeContextMenu : function(e, node){ + node.ui.onContextMenu(e); + }, + + beforeEvent : function(e){ + if(this.disabled){ + e.stopEvent(); + return false; + } + return true; + }, + + disable: function(){ + this.disabled = true; + }, + + enable: function(){ + this.disabled = false; + } +}; \ No newline at end of file