You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.4 KiB
135 lines
4.4 KiB
/* |
|
DynAPI Distribution |
|
MouseEvent Class |
|
|
|
The DynAPI Distribution is distributed under the terms of the GNU LGPL license. |
|
|
|
requires: dynapi.api.DynDocument |
|
*/ |
|
|
|
function MouseEvent(dyndoc) { |
|
this.DynEvent = DynEvent; |
|
this.DynEvent(); |
|
this.bubble = true; |
|
this._mouseEvent = null; |
|
this._relative = null; |
|
this._dyndoc = dyndoc; |
|
}; |
|
var p = dynapi.setPrototype('MouseEvent','DynEvent'); |
|
p.getX = function() {return this.x}; |
|
p.getY = function() {return this.y}; |
|
p.getPageX = function() {return this.pageX}; |
|
p.getPageY = function() {return this.pageY}; |
|
//p.trapMouseUp = dynapi.functions.Null; |
|
p.getRelative = function() {return this._relative}; |
|
p.preventBubble = function() { |
|
this.bubble = false; |
|
}; |
|
p.getButton = function() { |
|
if (!this._mouseEvent) return "left"; |
|
var b = this._mouseEvent.which; |
|
if (b==2) return "middle"; |
|
if (b==3) return "right"; |
|
else return "left"; |
|
}; |
|
p._init = function(type,e,src) { |
|
this.type = type; |
|
this._mouseEvent = e; |
|
this.origin = src; |
|
this.bubbleChild = null; |
|
this.defaultValue = true; |
|
this.bubble = true; |
|
}; |
|
p._invoke = function() { |
|
var o = this.origin; |
|
o.invokeEvent(this.type,this); |
|
}; |
|
MouseEvent._getContainerLayerOf = function(element) { |
|
if (!element) return null; |
|
while (!element._dynobj && element.parentNode && element.parentNode!=element) { |
|
element = element.parentNode; |
|
} |
|
return element._dynobj; |
|
}; |
|
MouseEvent._eventHandler = function(e) { |
|
var dynobj = this._dynobj; |
|
if (!dynobj) return true; |
|
var dyndoc = dynobj._dyndoc; |
|
var target = e.target; |
|
|
|
var me = dyndoc._mouseEvent; |
|
var src = MouseEvent._getContainerLayerOf(target); |
|
me._init(e.type,e,src); |
|
var rel = e.relatedTarget; |
|
var r = me._relative = MouseEvent._getContainerLayerOf(rel); |
|
if (e.type=="mouseout" || e.type=="mouseover") { |
|
if(!r && dynapi.ua.opera) return; //fix for #15 |
|
if (r && (r==src||src.isParentOf(r))) return; // fix for #15 |
|
if (r && (r==src.parent||r.isChildOf(src.parent))) me.bubble=false; |
|
} |
|
me.pageX = e.clientX; |
|
me.pageY = e.clientY; |
|
if(!src) return; |
|
me.x = (me.pageX+(window.pageXOffset||0)) - src.getPageX(); //offsetX; |
|
me.y = (me.pageY+(window.pageYOffset||0)) - src.getPageY(); //offsetY; |
|
e.cancelBubble = true; |
|
me._invoke(); |
|
|
|
var tn=(target.tagName+'').toLowerCase(); |
|
|
|
// fix for form elements inside drag-enabled layer #08 |
|
if(e.type=='mousedown' && tn=='input'||tn=='textarea'||tn=='button') { |
|
var de=dynapi.frame.DragEvent; |
|
de=(de && de.dragevent)? de.dragevent:null; |
|
if(de && de.isDragging) de.cancelDrag(); |
|
} |
|
|
|
// prevent image dragging |
|
if(tn=='img' && typeof(target.onmousedown)!="function") { |
|
target.onmousedown=dynapi.functions.False; |
|
} |
|
|
|
// disable text select |
|
if (e.type=='mousedown' && src._textSelectable==false) { |
|
e.preventDefault(); |
|
return false; |
|
} |
|
|
|
}; |
|
|
|
DynElement.prototype.disableContextMenu = function(){ |
|
this._noContextMenu = true; |
|
if(this.elm) this.elm.addEventListener("contextmenu",MouseEvent._eventHandler,false); |
|
}; |
|
DynElement.prototype.captureMouseEvents = function() { |
|
this._hasMouseEvents = true; |
|
var elm = (this.getClassName()=='DynDocument')? this.doc : this.elm; |
|
if(elm) { |
|
elm.addEventListener("mousemove",MouseEvent._eventHandler,false); |
|
elm.addEventListener("mousedown",MouseEvent._eventHandler,false); |
|
elm.addEventListener("mouseup",MouseEvent._eventHandler,false); |
|
elm.addEventListener("mouseover",MouseEvent._eventHandler,false); |
|
elm.addEventListener("mouseout",MouseEvent._eventHandler,false); |
|
elm.addEventListener("click",MouseEvent._eventHandler,false); |
|
elm.addEventListener("dblclick",MouseEvent._eventHandler,false); |
|
if(this._noContextMenu) elm.addEventListener("contextmenu",MouseEvent._eventHandler,false); |
|
} |
|
}; |
|
DynElement.prototype.releaseMouseEvents=function() { |
|
this._hasMouseEvents = false; |
|
var elm = (this.getClassName()=='DynDocument')? this.doc : this.elm; |
|
if (typeof(elm)=='object') { |
|
/* elm.removeEventListener("mousemove",MouseEvent._eventHandler,false); |
|
elm.removeEventListener("mousedown",MouseEvent._eventHandler,false); |
|
elm.removeEventListener("mouseup",MouseEvent._eventHandler,false); |
|
elm.removeEventListener("mouseover",MouseEvent._eventHandler,false); |
|
elm.removeEventListener("mouseout",MouseEvent._eventHandler,false); |
|
elm.removeEventListener("click",MouseEvent._eventHandler,false); |
|
elm.removeEventListener("dblclick",MouseEvent._eventHandler,false);*/ |
|
} |
|
}; |
|
|
|
function main_mouse_dom() { |
|
dynapi.document._mouseEvent = new MouseEvent(dynapi.document); |
|
}; |
|
if (!dynapi.loaded) main_mouse_dom();
|
|
|