Subversion Repositories wimsdev

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 reyssat 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
};