Subversion Repositories wimsdev

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.         DynAPI Distribution
  3.         MouseEvent Class
  4.  
  5.         The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
  6.        
  7.         requires: dynapi.api.DynDocument
  8. */
  9.  
  10. function MouseEvent(dyndoc) {
  11.         this.DynEvent = DynEvent;
  12.         this.DynEvent();
  13.         this.bubble = true;
  14.         this._mouseEvent = null;
  15.         this._relative = null;
  16.         this._dyndoc = dyndoc;
  17. };
  18. var p = dynapi.setPrototype('MouseEvent','DynEvent');
  19. p.getX = function() {return this.x};
  20. p.getY = function() {return this.y};
  21. p.getPageX = function() {return this.pageX};
  22. p.getPageY = function() {return this.pageY};
  23. p.trapMouseUp = dynapi.functions.Null;
  24. p.getRelative = function() {return this._relative};
  25. p.preventBubble = function() {
  26.         this.bubble = false;
  27. };
  28. p.getButton = function() {
  29.         if (!this._mouseEvent) return "left";
  30.         var b = this._mouseEvent.which;
  31.         if (b==2) return "middle";
  32.         if (b==3) return "right";
  33.         else return "left";
  34. };
  35. p._init = function(type,e,src) {
  36.         this.type = type;
  37.         this._mouseEvent = e;
  38.         this.origin = src;
  39.         this.bubbleChild = null;
  40.         this.defaultValue = true;
  41.         this.bubble = true;
  42. };
  43. p._invoke = function() {
  44.         var o = this.origin;
  45.         o.invokeEvent(this.type,this);
  46. };
  47. MouseEvent._getContainerLayerOf = function(element) {
  48.         if (!element) return null;
  49.         while (!element._dynobj && element.parentNode && element.parentNode!=element) {
  50.                 element = element.parentNode;
  51.         }
  52.         return element._dynobj;
  53. };
  54. MouseEvent._eventHandler = function(e) {
  55.         var dynobj = this._dynobj;
  56.         if (!dynobj) return true;
  57.         var dyndoc = dynobj._dyndoc;
  58.         var target = e.target;
  59.  
  60.         var me = dyndoc._mouseEvent;
  61.         var src = MouseEvent._getContainerLayerOf(target);
  62.         me._init(e.type,e,src);
  63.         var rel = e.relatedTarget;
  64.         var r = me._relative = MouseEvent._getContainerLayerOf(rel);
  65.         if (e.type=="mouseout" || e.type=="mouseover") {
  66.                 if(!r && dynapi.ua.opera) return; //fix for #15
  67.                 if (r && (r==src||src.isParentOf(r))) return; // fix for #15
  68.                 if (r && (r==src.parent||r.isChildOf(src.parent))) me.bubble=false;
  69.         }
  70.         me.pageX = e.clientX;
  71.         me.pageY = e.clientY;
  72.         if(!src) return;
  73.         me.x = me.pageX - src.getPageX(); //offsetX;
  74.         me.y = me.pageY - src.getPageY(); //offsetY;
  75.         e.cancelBubble = true;
  76.         me._invoke();
  77.  
  78.         var tn=(target.tagName+'').toLowerCase();
  79.        
  80.         // fix for form elements inside drag-enabled layer #08
  81.         if(e.type=='mousedown' && tn=='input'||tn=='textarea'||tn=='button') {
  82.                 var de=dynapi.frame.DragEvent;
  83.                 de=(de && de.dragevent)? de.dragevent:null;
  84.                 if(de && de.isDragging) de.cancelDrag();
  85.         }
  86.  
  87.         // prevent image dragging
  88.         if(tn=='img' && typeof(target.onmousedown)!="function") {
  89.                 target.onmousedown=dynapi.functions.False;
  90.         }
  91.        
  92.         // disable text select
  93.         if (e.type=='mousedown' && src._textSelectable==false) {
  94.                 e.preventDefault();
  95.                 return false;
  96.         }
  97.        
  98. };
  99.  
  100. DynElement.prototype.captureMouseEvents = function() {
  101.         this._hasMouseEvents = true;
  102.         var elm = (this.getClassName()=='DynDocument')? this.doc : this.elm;
  103.         if(elm) {
  104.                 elm.addEventListener("mousemove",MouseEvent._eventHandler,false);
  105.                 elm.addEventListener("mousedown",MouseEvent._eventHandler,false);
  106.                 elm.addEventListener("mouseup",MouseEvent._eventHandler,false);
  107.                 elm.addEventListener("mouseover",MouseEvent._eventHandler,false);
  108.                 elm.addEventListener("mouseout",MouseEvent._eventHandler,false);
  109.                 elm.addEventListener("click",MouseEvent._eventHandler,false);
  110.                 elm.addEventListener("dblclick",MouseEvent._eventHandler,false);
  111.         }
  112. };
  113. DynElement.prototype.releaseMouseEvents=function() {
  114.         this._hasMouseEvents = false;
  115.         var elm = (this.getClassName()=='DynDocument')? this.doc : this.elm;
  116.         if (typeof(elm)=='object') {
  117.         /*      elm.removeEventListener("mousemove",MouseEvent._eventHandler,false);
  118.                 elm.removeEventListener("mousedown",MouseEvent._eventHandler,false);
  119.                 elm.removeEventListener("mouseup",MouseEvent._eventHandler,false);
  120.                 elm.removeEventListener("mouseover",MouseEvent._eventHandler,false);
  121.                 elm.removeEventListener("mouseout",MouseEvent._eventHandler,false);
  122.                 elm.removeEventListener("click",MouseEvent._eventHandler,false);
  123.                 elm.removeEventListener("dblclick",MouseEvent._eventHandler,false);*/
  124.         }
  125. };
  126.  
  127. function main() {
  128.         dynapi.document._mouseEvent = new MouseEvent(dynapi.document);
  129. };
  130. if (!dynapi.loaded) main();
  131.