Project

General

Profile

2988_1.txt

Sergey Ivanovskiy, 04/19/2016 04:11 PM

Download (17.7 KB)

 
1
=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js'
2
--- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js	2016-04-09 16:41:00 +0000
3
+++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js	2016-04-19 19:57:19 +0000
4
@@ -24,6 +24,9 @@
5
 **     SBI 20160310 Added getEvents() to MouseMovable, fixed undeclared variable that was hidden
6
 **                  by the variable "parent".
7
 ** 008 HC  20160406 Overhaul of window-activation logic.
8
+** 009 SBI 20160419 MouseMovable, MousePopupable, WindowClose, WindowIconify, WindowMaximize,
9
+**                  WindowStateChangedWorker are changed to catch mouse events from the global
10
+**                  mouse events dispatcher.
11
 */
12
 
13
 "use strict";
14
@@ -331,7 +334,7 @@
15
    document.addEventListener("mousedown",   processMouseDragStart("mousedown"));
16
    document.addEventListener("mouseup",     processMouseDragStop ("mouseup"));
17
    document.addEventListener("mousemove",   processMouseDrag     ("mousemove"));
18
-   
19
+
20
    /**
21
     * Resizes the peer canvas according to given area.
22
     * 
23
@@ -348,7 +351,6 @@
24
       ctx.fillRect(0, 0, area.width, area.height);
25
       ctx.strokeStyle = "black";
26
       ctx.strokeRect(0, 0, area.width, area.height);
27
-
28
    }
29
    
30
    /**
31
@@ -860,6 +862,20 @@
32
    {
33
       return { "mouseenter" : true, "mouseleave" : true};
34
    };
35
+   
36
+   /**
37
+    * Invokes a mouse event listener of the target mouse event type.
38
+    * 
39
+    * @param    {String} mouseOp
40
+    *           The mouse events name
41
+    * @param    {MouseEvent} evt
42
+    *           The raised mouse event
43
+    */
44
+   this.handle = function(mouseOp, evt)
45
+   {
46
+      // no ops
47
+   };
48
+
49
 };
50
 
51
 /**
52
@@ -881,6 +897,9 @@
53
  */
54
 function MouseMovable(win, wid, x, y, width, height)
55
 {
56
+   /** Placeholder for the required mouse events listeners */
57
+   var handlers = {};
58
+   
59
    var mouseDrag = false;
60
    var ma = { "x" : x, "y" : y, "width" : width, "height" : height };
61
    // register the listeners
62
@@ -893,12 +912,12 @@
63
                     processMouseDragStop (this, "dblclick"), processMouseDragStart(this, "mousedown"),
64
                     processMouseDragStop (this, "mouseup"), processMouseDrag     (this, "mousemove"),
65
                     processMouseDragStop (this, "mouseleave"), processMouseDragStop (this, "mouseout")];
66
-   // win.canvas.addEventListener("drag", processMouseDrag(this, "drag"));
67
-   addListeners(win, mops, listeners);
68
+
69
+   addListeners(handlers, mops, listeners);
70
    
71
    this.deregisterListeners = function()
72
    {
73
-      removeListeners(win, mops, listeners);
74
+      removeListeners(handlers, mops, listeners);
75
    };
76
 
77
    this.getEvents = function()
78
@@ -915,6 +934,23 @@
79
       return events;
80
    };
81
 
82
+   /**
83
+    * Invokes a mouse event listener of the target mouse event type.
84
+    * 
85
+    * @param    {String} mouseOp
86
+    *           The mouse events name
87
+    * @param    {MouseEvent} evt
88
+    *           The raised mouse event
89
+    */
90
+   this.handle = function(mouseOp, evt)
91
+   {
92
+      var listener = handlers[mouseOp];
93
+      if (listener !== undefined)
94
+      {
95
+         listener(evt);
96
+      }
97
+   };
98
+
99
    function processMouseDragStop(mThis, mouseOp)
100
    {
101
       return function(evt)
102
@@ -956,7 +992,7 @@
103
          }
104
 
105
          var mousePos = win.getMousePos(evt);
106
-   
107
+         
108
          if (mousePos.x >= ma.x            &&
109
              mousePos.x <= ma.x + ma.width &&
110
              mousePos.y >= ma.y            &&
111
@@ -984,7 +1020,6 @@
112
          {
113
             return;
114
          }
115
-
116
          var mousePos = win.getMousePos(evt);
117
 
118
          var dx = evt.clientX - mThis.lastMouseEvent.clientX;
119
@@ -1027,7 +1062,7 @@
120
  * @param    {Function} stateChangedCallback
121
  *           A callback function for this window state change action.
122
  */
123
-function WindowStateChangedWorker(win, wid, x, y, width, height, stateChangedCallback)
124
+function WindowStateChangedWorker(win, wid, x, y, width, height, stateChangedCallback, handlers)
125
 {
126
    var ma = { "x" : x, "y" : y, "width" : width, "height" : height };
127
    var mops = ["dblclick", "click", "mousedown", "mouseup"];
128
@@ -1036,7 +1071,7 @@
129
    {
130
       listeners[i] = processWindowState(this, mops[i]);
131
    }
132
-   addListeners(win, mops, listeners);
133
+   addListeners(handlers, mops, listeners);
134
    
135
    function processWindowState(mThis, mouseOp)
136
    {
137
@@ -1048,7 +1083,7 @@
138
          {
139
             return;
140
          }
141
-
142
+         
143
          var mousePos = win.getMousePos(evt);
144
          
145
          if (mousePos.x >= ma.x            &&
146
@@ -1057,7 +1092,6 @@
147
              mousePos.y <= ma.y + ma.height)
148
          {
149
             stateChangedCallback(win, evt, mousePos, opCode);
150
-            
151
             evt.preventDefault();
152
          }
153
       };
154
@@ -1070,7 +1104,7 @@
155
 
156
    this.deregisterListeners = function()
157
    {
158
-      removeListeners(win, mops, listeners);
159
+      removeListeners(handlers, mops, listeners);
160
    };
161
 };
162
 
163
@@ -1092,7 +1126,10 @@
164
  */
165
 function WindowClose(win, wid, x, y, width, height)
166
 {
167
-   this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowCloseCallback);
168
+   /** Placeholder for the required mouse events listeners */
169
+   var handlers = {};
170
+   
171
+   this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowCloseCallback, handlers);
172
 
173
    function windowCloseCallback(win, evt, mousePos, opCode)
174
    {
175
@@ -1111,6 +1148,23 @@
176
    {
177
       this.wsc.deregisterListeners();
178
    };
179
+   
180
+   /**
181
+    * Invokes a mouse event listener of the target mouse event type.
182
+    * 
183
+    * @param    {String} mouseOp
184
+    *           The mouse events name
185
+    * @param    {MouseEvent} evt
186
+    *           The raised mouse event
187
+    */
188
+   this.handle = function(mouseOp, evt)
189
+   {
190
+      var listener = handlers[mouseOp];
191
+      if (listener !== undefined)
192
+      {
193
+         listener(evt);
194
+      }
195
+   };
196
 };
197
 
198
 /**
199
@@ -1131,12 +1185,14 @@
200
  */
201
 function WindowIconify(win, wid, x, y, width, height)
202
 {
203
-   this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowIconifyCallback);
204
+   /** Placeholder for the required mouse events listeners */
205
+   var handlers = {};
206
+   
207
+   this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowIconifyCallback, handlers);
208
 
209
    function windowIconifyCallback(win, evt, mousePos, opCode)
210
    {
211
       win.iconify();
212
-      
213
       p2j.socket.sendWindowIconState(win.id, true);
214
    };
215
 
216
@@ -1149,6 +1205,23 @@
217
    {
218
       this.wsc.deregisterListeners();
219
    };
220
+   
221
+   /**
222
+    * Invokes a mouse event listener of the target mouse event type.
223
+    * 
224
+    * @param    {String} mouseOp
225
+    *           The mouse events name
226
+    * @param    {MouseEvent} evt
227
+    *           The raised mouse event
228
+    */
229
+   this.handle = function(mouseOp, evt)
230
+   {
231
+      var listener = handlers[mouseOp];
232
+      if (listener !== undefined)
233
+      {
234
+         listener(evt);
235
+      }
236
+   };
237
 };
238
 
239
 /**
240
@@ -1169,7 +1242,10 @@
241
  */
242
 function WindowMaximize(win, wid, x, y, width, height)
243
 {
244
-   this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowMaximizeCallback);
245
+   /** Placeholder for the required mouse events listeners */
246
+   var handlers = {};
247
+
248
+   this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowMaximizeCallback, handlers);
249
 
250
    function windowMaximizeCallback(win, evt, mousePos, opCode)
251
    {
252
@@ -1188,6 +1264,23 @@
253
    {
254
       this.wsc.deregisterListeners();
255
    };
256
+
257
+   /**
258
+    * Invokes a mouse event listener of the target mouse event type.
259
+    * 
260
+    * @param    {String} mouseOp
261
+    *           The mouse events name
262
+    * @param    {MouseEvent} evt
263
+    *           The raised mouse event
264
+    */
265
+   this.handle = function(mouseOp, evt)
266
+   {
267
+      var listener = handlers[mouseOp];
268
+      if (listener !== undefined)
269
+      {
270
+         listener(evt);
271
+      }
272
+   };
273
 };
274
 
275
 /**
276
@@ -1212,10 +1305,13 @@
277
  */
278
 function MousePopupable(win, wid, x, y, width, height, btnId)
279
 {
280
+   /** Placeholder for the required mouse events listeners */
281
+   var handlers = {};
282
+
283
    var ma = { "x" : x, "y" : y, "width" : width, "height" : height };
284
    var mops = ["click", "mousedown"];
285
    var listeners = [processPopup(this, "click"), processPopup(this, "mousedown")];
286
-   addListeners(win, mops, listeners);
287
+   addListeners(handlers, mops, listeners);
288
    
289
    function processPopup(mThis, mouseOp)
290
    {
291
@@ -1247,13 +1343,30 @@
292
 
293
    this.deregisterListeners = function()
294
    {
295
-      removeListeners(win, mops, listeners);
296
+      removeListeners(handlers, mops, listeners);
297
    };
298
 
299
    this.getEvents = function()
300
    {
301
       return { "click" : true, "mouseDown" : true };
302
    };
303
+   
304
+   /**
305
+    * Invokes a mouse event listener of the target mouse event type.
306
+    * 
307
+    * @param    {String} mouseOp
308
+    *           The mouse events name
309
+    * @param    {MouseEvent} evt
310
+    *           The raised mouse event
311
+    */
312
+   this.handle = function(mouseOp, evt)
313
+   {
314
+      var listener = handlers[mouseOp];
315
+      if (listener !== undefined)
316
+      {
317
+         listener(evt);
318
+      }
319
+   };
320
 };
321
 
322
 /**
323
@@ -1282,35 +1395,35 @@
324
 /**
325
  * Adds window events listeners.
326
  * 
327
- * @param    {Window} win
328
- *           The window for which the target events listeners must be added.
329
+ * @param    {Object} obj
330
+ *           The place-holder of the target events listeners.
331
  * @param    {Array} mops
332
  *           The handled events.
333
  * @param    {Array} listeners
334
  *           The target listeners corresponding to their handled events
335
  */
336
-function addListeners(win, mops, listeners)
337
+function addListeners(obj, mops, listeners)
338
 {
339
   for(var i = 0; i < listeners.length; i++)
340
   {
341
-     win.canvas.addEventListener(mops[i], listeners[i]);
342
+     obj[mops[i]] = listeners[i];
343
   }
344
 }
345
 
346
 /**
347
  * Removes window events listeners.
348
  * 
349
- * @param    {Window} win
350
- *           The window for which the target events handlers must be removed.
351
+ * @param    {Object} obj
352
+ *           The place-holder of the target events listeners.
353
  * @param    {Array} mops
354
  *           The handled events to remove.
355
  * @param    {Array} listeners
356
  *           The target listeners corresponding to their handled events
357
  */
358
-function removeListeners(win, mops, listeners)
359
+function removeListeners(obj, mops, listeners)
360
 {
361
    for(var i = 0; i < listeners.length; i++)
362
    {
363
-      win.canvas.removeEventListener(mops[i], listeners[i]);
364
+      delete obj[mops[i]];
365
    }
366
 }
367

    
368
=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js'
369
--- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2016-04-15 07:35:01 +0000
370
+++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2016-04-19 19:49:14 +0000
371
@@ -45,7 +45,9 @@
372
 **                  the desktop background color and to notify the enclosed window about it,
373
 **                  fixed TypedArray.slice is unsupported by IE. 
374
 ** 011 HC  20160406 Overhaul of window-activation logic.
375
-** 012 SBI 20160414 Fixed  doWindowActivationChange(...) and activateTopVisibleWindow(...).
376
+** 012 SBI 20160419 Fixed  doWindowActivationChange(...) and activateTopVisibleWindow(...). Added
377
+**                  p2j.screen.getEventTarget(evt), changed MouseEventDispatcher to deliver mouse
378
+**                  events to the registered OS mouse widgets.
379
 */
380
 
381
 "use strict";
382
@@ -223,9 +225,17 @@
383
     */
384
    me.globalCache = {};
385
    
386
+   /**
387
+    * The mouse events global dispatcher.
388
+    */
389
    var mouseEventDispatcher = new MouseEventDispatcher();
390
    
391
    /**
392
+    * The global resize listener.
393
+    */
394
+   var resizeHandler;
395
+   
396
+   /**
397
     * Dispatch mouse events to the registered widgets. 
398
     */
399
    function MouseEventDispatcher()
400
@@ -235,13 +245,45 @@
401
       var targetWidget;
402
       var targetWindow;
403
       var dragTimeout;
404
-      var downTimeStamp;
405
-
406
-      document.addEventListener("mousedown", mouseDownHandler, false);
407
-      document.addEventListener("mouseup", mouseUpHandler, false);
408
-      document.addEventListener("mousemove", mouseMoveHandler, false);
409
-      document.addEventListener("click", mouseClickHandler, false);
410
-
411
+
412
+      document.addEventListener("mousedown", mouseDownHandler,  false);
413
+      document.addEventListener("mouseup",   mouseUpHandler,    false);
414
+      document.addEventListener("mousemove", mouseMoveHandler,  false);
415
+      document.addEventListener("click",     mouseClickHandler, false);
416
+      
417
+      document.addEventListener("contextmenu", commonHandler, false);
418
+      document.addEventListener("dblclick" ,   commonHandler, false);
419
+      document.addEventListener("mouseenter",  commonHandler, false);
420
+      document.addEventListener("mouseleave",  commonHandler, false);
421
+      document.addEventListener("mouseover",   commonHandler, false);
422
+      document.addEventListener("mouseout",    commonHandler, false);
423
+      document.addEventListener("wheel",       commonHandler, false);
424
+      document.addEventListener("drag",        commonHandler, false);
425
+
426
+      /**
427
+       * Dispatches a document widen events: "contextmenu", "dblclick", "mouseover", "mouseout",
428
+       * "mouseenter/mouseleave", "wheel", "drag" to the registered OS mouse widgets.
429
+       * 
430
+       * @param    {Event} evt
431
+       *           The raised mouse event.
432
+       */
433
+      function commonHandler(evt)
434
+      {
435
+         var mouseOp = evt.type;
436
+         
437
+         if (!down && !up)
438
+         {
439
+            targetWindow = p2j.screen.getEventTarget(evt);
440
+         }
441
+         
442
+         if (targetWindow === undefined)
443
+         {
444
+            return;
445
+         }
446
+         
447
+         dispatchEventToOSMouseWidgets(mouseOp, evt);
448
+      }
449
+      
450
       /**
451
        * Handles a document widen "mousedown" event.
452
        * 
453
@@ -251,13 +293,15 @@
454
       function mouseDownHandler(evt)
455
       {
456
          down = true;
457
-         up = false;
458
-         downTimeStamp = Date.now();
459
-         targetWindow = p2j.screen.topVisibleWindow();
460
+         up   = false;
461
+         
462
+         targetWindow = p2j.screen.getEventTarget(evt);
463
+         
464
          if (targetWindow !== undefined)
465
          {
466
             targetWidget = targetWindow.findMouseSource(evt, targetWindow.mouseAwareWidgets["mousedown"]);
467
          }
468
+         
469
          dispatchEvent("mousedown", evt);
470
       }
471
       
472
@@ -269,7 +313,7 @@
473
        */
474
       function mouseUpHandler(evt)
475
       {
476
-         up = true;
477
+         up   = true;
478
          down = false;
479
          dispatchEvent("mouseup", evt);
480
       }
481
@@ -283,6 +327,7 @@
482
       function mouseClickHandler(evt)
483
       {
484
          dispatchEvent("click", evt);
485
+         up = false;
486
       }
487
 
488
       /**
489
@@ -297,7 +342,10 @@
490
          {
491
             return;
492
          }
493
+         var mouseOp = evt.type;
494
 
495
+         dispatchEventToOSMouseWidgets(mouseOp, evt);
496
+         
497
          if (!dragTimeout)
498
          {
499
             //Sends drag notifications with the frequency that doesn't exceed one event per 100 ms.
500
@@ -325,7 +373,15 @@
501
             return;
502
          }
503
          
504
+         dispatchEventToOSMouseWidgets(mouseOp, evt);
505
+         
506
+         if (targetWidget === undefined)
507
+         {
508
+            return;
509
+         }
510
+         
511
          var mousePos = targetWindow.getMousePos(evt);
512
+         
513
          // check if targetWidget belongs to "any mouse" widgets (listen all events)
514
          // than sending mouseOp message is send to targetWidget
515
          if (!targetWindow.anyMouseAwareWidgets.hasOwnProperty(targetWidget))
516
@@ -333,10 +389,6 @@
517
             dispatchEventToAnyMouseWidgets(mouseOp, evt, mousePos);
518
          }
519
          
520
-         if (targetWidget === undefined)
521
-         {
522
-            return;
523
-         }
524
          
525
          if (!targetWindow.processOsEvents || !p2j.screen.processMouse)
526
          {
527
@@ -353,6 +405,42 @@
528
       }
529
 
530
       /**
531
+       * Dispatches a mouse event to the registered OS mouse widgets.
532
+       * 
533
+       * @param    {String} mouseOp
534
+       *           The mouse events name
535
+       * @param    {MouseEvent} evt
536
+       *           The raised mouse event
537
+       */
538
+      function dispatchEventToOSMouseWidgets(mouseOp, evt)
539
+      {
540
+         if (targetWindow === undefined)
541
+         {
542
+            return;
543
+         }
544
+         
545
+         for (var osOp in targetWindow.osAwareWidgets)
546
+         {
547
+            if (targetWindow.osAwareWidgets.hasOwnProperty(osOp))
548
+            {
549
+               var osWidgets = targetWindow.osAwareWidgets[osOp];
550
+               for(var wid in osWidgets)
551
+               {
552
+                  if (osWidgets.hasOwnProperty(wid))
553
+                  {
554
+                     var osWidget = osWidgets[wid];
555
+                     if (evt.defaultPrevented)
556
+                     {
557
+                        return;
558
+                     }
559
+                     osWidget.handle(mouseOp, evt);
560
+                  }
561
+               }
562
+            }
563
+         }
564
+      }
565
+      
566
+      /**
567
        * Dispatches event to any mouse widgets.
568
        * 
569
        * @param    {String} mouseOp
570
@@ -2845,7 +2933,29 @@
571
       return getWindow(wid);
572
    };
573
    
574
-   /*
575
+   /**
576
+    * Get a target window that is a target for the received mouse event.
577
+    *
578
+    * @param    evt
579
+    *           The received mouse event.
580
+    *
581
+    * @return   The window instance if there is a window that is a target for the received event,
582
+    *           otherwise undefined.
583
+    */
584
+   me.getEventTarget = function(evt)
585
+   {
586
+      var el = evt.target;
587
+      if (el.id && el.id.indexOf("pwindow_") == 0)
588
+      {
589
+         var id = parseInt(el.id.substring(8));
590
+         
591
+         return getWindow(id);
592
+      }
593
+      
594
+      return undefined;
595
+   };
596
+   
597
+   /**
598
     * Retrieve the current font used to draw text.
599
     *
600
     * @return   See above.
601
@@ -3062,7 +3172,7 @@
602
          
603
          // register listener for window resize; this is added to the document, to allow event 
604
          // notification during mouse drag even if mouse is outside of the window
605
-         var resizeHandler = new MouseResizeable();
606
+         resizeHandler = new MouseResizeable();
607
       }
608
    };
609
 
610