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._browserEvent = 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.getButton = function() {
  26.         if (!this._browserEvent) return "left";
  27.         var b = this._browserEvent.which;
  28.         if (b==2) return "middle";
  29.         if (b==3) return "right";
  30.         else return "left";
  31. };
  32. p._init = function(type,e,src) {
  33.         this.type = type;
  34.         this._browserEvent = e;
  35.         this.origin = src;
  36.         this.bubbleChild = null;
  37.         this.pageX = e.pageX-this._dyndoc.frame.pageXOffset;
  38.         this.pageY = e.pageY-this._dyndoc.frame.pageYOffset;
  39.         if (e.target._dynobj == src) {
  40.                 this.x = e.layerX;
  41.                 this.y = e.layerY;
  42.         }
  43.         else {
  44.                 this.x = e.pageX - (src.pageX||0);
  45.                 this.y = e.pageY - (src.pageY||0);
  46.         }
  47.         this.defaultValue = true;
  48.         this.bubble = true;
  49. };
  50. p._invoke = function() {
  51.         var o = this.origin;
  52.         //if (this.type=='mousedown' && o._textSelectable==false) this.defaultValue = false;
  53.         o.invokeEvent(this.type,this);
  54.  
  55.         // synthetic click event
  56.         if (this.type=='mouseup') {
  57.                 this._init('click',this._browserEvent,o);
  58.                 this._invoke();
  59.                
  60.                 // synthetic dblclick event
  61.                 if (dynapi.ua.other);
  62.         }
  63. };
  64.  
  65. function main() {
  66.         dynapi.document._mouseEvent = new MouseEvent(dynapi.document);
  67. };
  68. if (!dynapi.loaded) main();
  69.  
  70. MouseEvent._docMoveHandler = function(e) {
  71.         var dyndoc = this._dynobj;
  72.         var src = e.target;
  73.         var dynobj = src._dynobj || src._dynobji;
  74.        
  75.         if (!dynobj || !dynobj._hasMouseEvents) {
  76.                 var rel=dyndoc._moveOver;
  77.                 if(rel && dynobj && !dynobj.isChildOf(rel)) {
  78.                         var me = dyndoc._mouseEvent;
  79.                         me._init('mouseout',e,rel);
  80.                         me._invoke();
  81.                         dyndoc._moveOver = null;
  82.                 }
  83.                 if(dynobj){
  84.                         dynobj=dynobj.parent;
  85.                         while (dynobj && !dynobj._hasMouseEvents){
  86.                                 dynobj=dynobj.parent;
  87.                         }
  88.                 }
  89.                 if(!dynobj) return true;
  90.         }
  91.        
  92.         var me = dyndoc._mouseEvent;
  93.         //dynapi.debug.status('move '+dynobj.name+' '+e.layerX+' '+e.layerY);
  94.         me._init('mousemove',e,dynobj);
  95.         me._invoke();
  96.         var defaultVal = me.defaultValue;
  97.        
  98.         // synthetic mouseover/out events
  99.         if (dyndoc._moveOver!=dynobj) {
  100.                 var rel = dyndoc._moveOver;
  101.                 //var bubble = true;
  102.                 // mouse out
  103.                 if (rel && !dynobj.isChildOf(rel)) {  //   && !rel.isChildOf(dynobj)
  104.                         // during mouseout e.getRelated() is which elm it is moving to
  105.                         //bubble = !dynobj.isChildOf(rel);
  106.                         me._init('mouseout',e,rel);
  107.                         //prevent bubbling from child to parent for mouseout
  108.                         if (rel.isChildOf(dynobj)) me.bubble=false;
  109.                         me._relative = dynobj;
  110.                         me._invoke();
  111.                         //MouseEvent._generateEvent('mouseout',e,me,rel,dynobj,bubble);  // out occurs before over
  112.                 }              
  113.                 // mouse over
  114.                 dyndoc._moveOver = dynobj;
  115.                 //if (rel) var bubble = !rel.isChildOf(dynobj);
  116.                 //var bubble = !dynobj.isChildOf(rel);
  117.                 // during mouseover e.getRelated() is which elm it is moving to
  118.                 if(!rel || !rel.isChildOf(dynobj)){
  119.                         me._init('mouseover',e,dynobj);
  120.                         //prevent bubbling from child to parent for mouseover
  121.                         if(dynobj.isChildOf(rel)) me.bubble=false;
  122.                         me._relative = rel;
  123.                         me._invoke();
  124.                 }
  125.                 //MouseEvent._generateEvent('mouseover',e,me,dynobj,rel);
  126.         }
  127.         return defaultVal;
  128. };
  129.  
  130. MouseEvent._eventHandler = function(e) {
  131.         var src = e.target;
  132.         var dynobj = this._dynobj;
  133.         if (!dynobj) return true;
  134.        
  135.         var dyndoc = dynobj._dyndoc;
  136.         var me = dyndoc._mouseEvent;
  137.         me._wasHandled = false;
  138.  
  139.         var r = routeEvent(e);
  140.         if (!me._wasHandled) {
  141.                 //if (src._dynobji) {  // src._dynobji == dynlayer.doc.images[x]._dynobji
  142.                 //      me._init(e.type,e,src._dynobji);
  143.                 //      if (e.type=='mousedown') me.defaultValue = false;
  144.                 //      me._invoke();
  145.                 //}
  146.                 // else
  147.                 if (src._dynobj) {  // src._dynobj == dynlayer.doc._dynobj,dynlayer.doc.images[x]._dynobj,dynlayer.doc.links[x]._dynobj
  148.                         me._init(e.type,e,src._dynobj);
  149.                         me._invoke();
  150.                 }
  151.                 else {  // dynobj == dynlayer.elm._dynobj
  152.                         me._init(e.type,e,dynobj);
  153.                         me._invoke();
  154.                 }
  155.                 me._wasHandled = true;
  156.         }
  157.  
  158.         dynobj = (src._dynobj)? src._dynobj:dynobj;
  159.  
  160.         // prevent image dragging
  161.         if (e.type=='mousedown' && (e.target+'')=='[object Image]') {
  162.                 me.defaultValue=false;
  163.         }
  164.                
  165.         // disable text select
  166.         if (e.type=='mousedown' && dynobj._textSelectable==false) {
  167.                 // ns4 will disable hyperlinks. this is my workaround
  168.                 me.defaultValue =(e.target.href)? null:false;
  169.         }
  170.        
  171.         return me.defaultValue;
  172. };
  173.  
  174. DynElement.prototype.captureMouseEvents = function() {
  175.         this._hasMouseEvents = true;
  176.         var elm = this.elm;
  177.         if (elm) {
  178.                 elm.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP | Event.DBLCLICK);
  179.                 elm.onmousedown = elm.onmouseup = elm.ondblclick = MouseEvent._eventHandler;
  180.                
  181.                 if (this.getClassName()=='DynDocument') {  // move/over/out events are generated from the document
  182.                         this.doc.captureEvents(Event.MOUSEMOVE);
  183.                         elm.onmousemove = MouseEvent._docMoveHandler;
  184.                 }
  185.                 elm._dynobj = this;
  186.                 this.doc._dynobj = this;
  187.                 if(this._blkBoardElm) this.elm.document._dynobj = this;
  188.                 for (var i=0;i<this.doc.images.length;i++) this.doc.images[i]._dynobj=this; // was _dynobji
  189.                 for (var i=0;i<this.doc.links.length;i++) this.doc.links[i]._dynobj=this;
  190.         }
  191. };
  192.  
  193. DynElement.prototype.releaseMouseEvents = function() {
  194.         this._hasMouseEvents = false;
  195.         var elm = this.elm;
  196.         if (elm) {
  197.                 elm.releaseEvents(Event.MOUSEDOWN | Event.MOUSEUP | Event.DBLCLICK);
  198.                 elm.onmousedown = elm.onmouseup = elm.ondblclick = null;
  199.                
  200.                 if (this.getClassName()=='DynDocument') {
  201.                         elm.releaseEvents(Event.MOUSEMOVE);
  202.                         elm.onmousemove = null;
  203.                 }
  204.                 elm._dynobj = null;
  205.                 this.doc._dynobj = null;
  206.                 for (var i=0;i<this.doc.images.length;i++) this.doc.images[i]._dynobji=null;
  207.                 for (var i=0;i<this.doc.links.length;i++) this.doc.links[i]._dynobj=null;
  208.         }
  209. };
  210.