=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js' --- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js 2016-04-19 20:02:45 +0000 +++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.mouse.js 2016-04-20 18:13:33 +0000 @@ -793,6 +793,11 @@ this.defaultPtr = defaultPtr; this.forceDefault = forceDefault; this.active = false; + // define a widget's region + this.x = x; + this.y = y; + this.width = width; + this.height = height; this.mouseExit = function(evt) { @@ -874,6 +879,7 @@ this.handle = function(mouseOp, evt) { // no ops + return false; }; }; @@ -915,6 +921,12 @@ addListeners(handlers, mops, listeners); + // define a widget's region + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.deregisterListeners = function() { removeListeners(handlers, mops, listeners); @@ -923,12 +935,9 @@ this.getEvents = function() { var events = {}; - for (var prop in mops) + for (var i = 0; i < mops.length; i++) { - if (mops.hasOwnProperty(prop)) - { - events[prop] = true; - } + events[mops[i]] = true; } return events; @@ -947,17 +956,20 @@ var listener = handlers[mouseOp]; if (listener !== undefined) { - listener(evt); + return listener(evt); } + + return false; }; function processMouseDragStop(mThis, mouseOp) { return function(evt) { + console.debug("drag stop " + mouseOp); if (!mThis.mouseDrag || !p2j.screen.canProcessOsEvent(evt, win)) { - return; + return false; } // send the window location @@ -969,7 +981,7 @@ mThis.dragOwner = undefined; // event was processed, cancel other listeners - evt.preventDefault(); + return true; }; }; @@ -977,18 +989,18 @@ { return function(evt) { + console.debug("drag start " + mouseOp); // only left button can trigger move if (evt.which != 1 || - !p2j.screen.canProcessOsEvent(evt, win) || - !win.canProcessWidget(wid, evt, mouseOp)) + !p2j.screen.canProcessOsEvent(evt, win) ) { - return; + return false; } if (mThis.mouseDrag) { - evt.preventDefault(); - return; +// evt.preventDefault(); + return false; } var mousePos = win.getMousePos(evt); @@ -1007,7 +1019,7 @@ mThis.dragOwner = wid; // event was processed, cancel other listeners - evt.preventDefault(); + return true; } }; }; @@ -1016,9 +1028,10 @@ { return function(evt) { + console.debug("drag " + mouseOp); if (mThis.dragOwner != wid || !mThis.mouseDrag || !p2j.screen.canProcessOsEvent(evt, win)) { - return; + return false; } var mousePos = win.getMousePos(evt); @@ -1039,7 +1052,7 @@ mThis.lastMouseEvent = evt; // event was processed, cancel other listeners - evt.preventDefault(); + return true; }; }; }; @@ -1081,7 +1094,7 @@ { if (evt.which != 1 || !p2j.screen.canProcessOsEvent(evt, win)) { - return; + return false; } var mousePos = win.getMousePos(evt); @@ -1092,8 +1105,10 @@ mousePos.y <= ma.y + ma.height) { stateChangedCallback(win, evt, mousePos, opCode); - evt.preventDefault(); + return true; } + + return false; }; }; @@ -1128,6 +1143,11 @@ { /** Placeholder for the required mouse events listeners */ var handlers = {}; + // define a widget's region + this.x = x; + this.y = y; + this.width = width; + this.height = height; this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowCloseCallback, handlers); @@ -1162,8 +1182,10 @@ var listener = handlers[mouseOp]; if (listener !== undefined) { - listener(evt); + return listener(evt); } + + return false; }; }; @@ -1187,6 +1209,11 @@ { /** Placeholder for the required mouse events listeners */ var handlers = {}; + // define a widget's region + this.x = x; + this.y = y; + this.width = width; + this.height = height; this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowIconifyCallback, handlers); @@ -1219,8 +1246,10 @@ var listener = handlers[mouseOp]; if (listener !== undefined) { - listener(evt); + return listener(evt); } + + return false; }; }; @@ -1245,6 +1274,11 @@ /** Placeholder for the required mouse events listeners */ var handlers = {}; + // define a widget's region + this.x = x; + this.y = y; + this.width = width; + this.height = height; this.wsc = new WindowStateChangedWorker(win, wid, x, y, width, height, windowMaximizeCallback, handlers); function windowMaximizeCallback(win, evt, mousePos, opCode) @@ -1278,8 +1312,10 @@ var listener = handlers[mouseOp]; if (listener !== undefined) { - listener(evt); + return listener(evt); } + + return false; }; }; @@ -1312,6 +1348,11 @@ var mops = ["click", "mousedown"]; var listeners = [processPopup(this, "click"), processPopup(this, "mousedown")]; addListeners(handlers, mops, listeners); + // define a widget's region + this.x = x; + this.y = y; + this.width = width; + this.height = height; function processPopup(mThis, mouseOp) { @@ -1319,9 +1360,9 @@ return function(evt) { - if (evt.which != btnId || !p2j.screen.canProcessOsEvent(evt, win)) + if (evt.which != btnId /*|| !p2j.screen.canProcessOsEvent(evt, win)*/) { - return; + return false; } var mousePos = win.getMousePos(evt); @@ -1331,12 +1372,14 @@ mousePos.y >= ma.y && mousePos.y <= ma.y + ma.height) { - // send the event and consume it + // send the event mousedown only + // click event is not prevented and it follows mousedown win.sendMouseEvent(evt, mousePos, win, opCode, wid); - - evt.preventDefault(); + + return true; } + return false; // let the event be processed by other widgets }; }; @@ -1348,7 +1391,7 @@ this.getEvents = function() { - return { "click" : true, "mouseDown" : true }; + return { "click" : true, "mousedown" : true }; }; /** @@ -1364,8 +1407,10 @@ var listener = handlers[mouseOp]; if (listener !== undefined) { - listener(evt); + return listener(evt); } + + return false; }; }; === modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js' --- src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js 2016-04-19 20:02:45 +0000 +++ src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js 2016-04-20 17:57:45 +0000 @@ -270,18 +270,17 @@ function commonHandler(evt) { var mouseOp = evt.type; - + console.debug("commonHandler " + mouseOp); if (!down && !up) { targetWindow = p2j.screen.getEventTarget(evt); - } - - if (targetWindow === undefined) - { - return; - } - - dispatchEventToOSMouseWidgets(mouseOp, evt); + if (targetWindow !== undefined) + { + targetWidget = targetWindow.findMouseSource(evt, targetWindow.mouseAwareWidgets[mouseOp]); + } + } + + dispatchEvent(mouseOp, evt) } /** @@ -295,14 +294,16 @@ down = true; up = false; + var mouseOp = evt.type; + targetWindow = p2j.screen.getEventTarget(evt); if (targetWindow !== undefined) { - targetWidget = targetWindow.findMouseSource(evt, targetWindow.mouseAwareWidgets["mousedown"]); + targetWidget = targetWindow.findMouseSource(evt, targetWindow.mouseAwareWidgets[mouseOp]); } - - dispatchEvent("mousedown", evt); + + dispatchEvent(mouseOp, evt); } /** @@ -344,18 +345,18 @@ } var mouseOp = evt.type; - dispatchEventToOSMouseWidgets(mouseOp, evt); + dispatchEvent("mousemove", evt); - if (!dragTimeout) - { - //Sends drag notifications with the frequency that doesn't exceed one event per 100 ms. - dragTimeout = setTimeout( - function() - { - dragTimeout = null; - dispatchEvent("drag", evt); - }, 100); - } +// if (!dragTimeout) +// { +// //Sends drag notifications with the frequency that doesn't exceed one event per 100 ms. +// dragTimeout = setTimeout( +// function() +// { +// dragTimeout = null; +// dispatchEvent("drag", evt); +// }, 100); +// } } /** @@ -373,35 +374,67 @@ return; } - dispatchEventToOSMouseWidgets(mouseOp, evt); + + var mousePos = targetWindow.getMousePos(evt); if (targetWidget === undefined) { + console.debug("targetWidget === undefined"); + dispatchEventToAnyMouseWidgets(mouseOp, evt, mousePos); return; } - var mousePos = targetWindow.getMousePos(evt); - // check if targetWidget belongs to "any mouse" widgets (listen all events) // than sending mouseOp message is send to targetWidget if (!targetWindow.anyMouseAwareWidgets.hasOwnProperty(targetWidget)) { dispatchEventToAnyMouseWidgets(mouseOp, evt, mousePos); } - + else + { + console.debug("!!!any mouse widgets are ignored due to wid " + targetWidget + " for " + mouseOp); + } if (!targetWindow.processOsEvents || !p2j.screen.processMouse) { return; } - - if (p2j.screen.hasOsEvent(evt, targetWindow, mouseOp, targetWidget)) + + var widgetList = targetWindow.mouseAwareWidgets[evt.type]; + + // go through the widgets via the z-order + for (var idx = 0; idx < targetWindow.zOrder.length; idx++) { - // high-level event, do not process here - return; + var wid = targetWindow.zOrder[idx]; + + if (targetWindow.isInside(mousePos, wid, widgetList)) + { + var osWidget = p2j.screen.getOsEvent(evt, targetWindow, mouseOp, wid); + if (osWidget) + { + if (osWidget.handle(mouseOp, evt)) + { + return; + } + } + } } +// +// var osWidget = p2j.screen.getOsEvent(evt, targetWindow, mouseOp, targetWidget); +// if (osWidget === undefined) +// { +// osWidget = targetWindow.findTargetOSWidget(evt); +// } +// if (osWidget) +// { +// osWidget.handle(mouseOp, evt); +// //dispatchEventToOSMouseWidgets(mouseOp, evt); +// // high-level event, do not process here +// return; +// } targetWindow.sendMouseEvent(evt, mousePos, targetWindow, p2j.screen.mouseOps[mouseOp], targetWidget); + console.debug("sendMouseEvent: " + targetWindow.id + " -> " + mouseOp + " to wid " + targetWidget); } /** @@ -416,7 +449,7 @@ { if (targetWindow === undefined) { - return; + return false; } for (var osOp in targetWindow.osAwareWidgets) @@ -429,15 +462,17 @@ if (osWidgets.hasOwnProperty(wid)) { var osWidget = osWidgets[wid]; - if (evt.defaultPrevented) + if (osWidget.handle(mouseOp, evt)) { - return; + console.debug("!!! dispatchEventToOSMouseWidgets('" + mouseOp + "', evt) to wid = " + wid + " " + osOp); + return true; } - osWidget.handle(mouseOp, evt); } } } } + + return false; } /** @@ -464,9 +499,10 @@ { // check if a given widget is a registered widget for mouseOp // to prevent sending the same event twice - if (!targetWindow.mouseAwareWidgets[mouseOp].hasOwnProperty(wid)) + if ((targetWidget === undefined) || !targetWindow.mouseAwareWidgets[mouseOp].hasOwnProperty(wid)) { targetWindow.sendMouseEvent(evt, mousePos, targetWindow, p2j.screen.mouseOps[mouseOp], wid); + console.debug("dispatchEventToAnyMouseWidgets('" + mouseOp + "', evt) to wid = " + wid + ", " + JSON.stringify(mousePos)); } } } @@ -573,10 +609,10 @@ { // cannot use an array here because some indexes are negative numbers this.mouseAwareWidgets[mouseOp] = {}; - if (mouseOp !== "drag" && mouseOp !== "click" && mouseOp !== "mouseup" && mouseOp !== "mousedown") - { - this.canvas.addEventListener(mouseOp, this.raiseMouseEvent(this, mouseOp)); - } +// if (mouseOp !== "drag" && mouseOp !== "click" && mouseOp !== "mouseup" && mouseOp !== "mousedown") +// { +// this.canvas.addEventListener(mouseOp, this.raiseMouseEvent(this, mouseOp)); +// } } } @@ -665,6 +701,32 @@ } return undefined; }; + + Window.prototype.findTargetOSWidget = function(evt) + { + var mouseOp = evt.type; + + var mousePos = this.getMousePos(evt); + + var widgetList = this.mouseAwareWidgets[evt.type]; + + // go through the widgets via the z-order + for (var idx = 0; idx < this.zOrder.length; idx++) + { + var wid = this.zOrder[idx]; + + if (this.isInside(mousePos, wid, widgetList)) + { + var osWidget = p2j.screen.getOsEvent(evt, this, mouseOp, wid); + if (osWidget) + { + return osWidget; + } + } + } + + return undefined; + }; /** * Check if the widgets is in the list and mouse position is within its bounds @@ -820,7 +882,7 @@ */ Window.prototype.setWidgetZOrder = function(zOrder) { - //console.debug(JSON.stringify(zOrder)); + console.debug(JSON.stringify(zOrder)); this.zOrder = zOrder; } @@ -909,29 +971,29 @@ */ Window.prototype.registerMouseWidget = function(wid, x, y, width, height, actions) { -// var widActions = ""; -// for (var opName in mouseOps) -// { -// if (mouseOps.hasOwnProperty(opName)) -// { -// if ((actions & (1 << mouseOps[opName])) == (1 << mouseOps[opName])) -// { -// widActions = widActions + " " + opName; -// } -// } -// } -// for (var opName in osOps) -// { -// if (osOps.hasOwnProperty(opName)) -// { -// if ((actions & (1 << osOps[opName])) == (1 << osOps[opName])) -// { -// widActions = widActions + " " + opName; -// } -// } -// } -// console.debug("registerMouseWidget( " + wid + ", x=" + x + ", y=" + y + ", width=" + width -// + ", height=" + height + ", actions=" + widActions + ")"); + var widActions = ""; + for (var opName in mouseOps) + { + if (mouseOps.hasOwnProperty(opName)) + { + if ((actions & (1 << mouseOps[opName])) == (1 << mouseOps[opName])) + { + widActions = widActions + " " + opName; + } + } + } + for (var opName in osOps) + { + if (osOps.hasOwnProperty(opName)) + { + if ((actions & (1 << osOps[opName])) == (1 << osOps[opName])) + { + widActions = widActions + " " + opName; + } + } + } + console.debug("registerMouseWidget( " + wid + ", x=" + x + ", y=" + y + ", width=" + width + + ", height=" + height + ", actions=" + widActions + ")"); // // register the widget aware of mouse (existing entry will be overwritten) for (var opName in mouseOps) { @@ -956,41 +1018,74 @@ if ((actions & (1 << opCode)) == (1 << opCode)) { - var mactions = this.osAwareWidgets[opName]; + var mactions = this.osAwareWidgets[opName]; + var osWidget = createOSWidget(this, opName, wid, x, y, width, height); + if (osWidget) + { + mactions[wid] = osWidget; + addOSWidgetToMouseWidgets(this, wid, osWidget); + } - if (opName == "movable") - { - mactions[wid] = new MouseMovable(this, wid, x, y, width, height); - } - else if (opName == "editable") - { -// mactions[wid] = new MouseEditable(this, wid, x, y, width, height); - } - else if (opName == "window_closed") - { - mactions[wid] = new WindowClose(this, wid, x, y, width, height); - } - else if (opName == "window_iconified") - { - mactions[wid] = new WindowIconify(this, wid, x, y, width, height); - } - else if (opName == "window_maximized") - { - mactions[wid] = new WindowMaximize(this, wid, x, y, width, height); - } - else if (opName == "popupable_left") - { - mactions[wid] = new MousePopupable(this, wid, x, y, width, height, 1); - } - else if (opName == "popupable_right") - { - mactions[wid] = new MousePopupable(this, wid, x, y, width, height, 3); - } } } } }; + function addOSWidgetToMouseWidgets(container, wid, osWidget) + { + var mouseEvents = osWidget.getEvents(); + for (var evt in mouseEvents) + { + if (mouseEvents.hasOwnProperty(evt)) + { + var mouseWidgets = container.mouseAwareWidgets[evt]; + if (mouseWidgets) + { + mouseWidgets[wid] = osWidget; + } + else + { + console.debug("[" + evt + "] !!!!!!!!!!!!!!!"); + } + } + } + } + + function createOSWidget(container, opName, wid, x, y, width, height) + { + var osWidget; + if (opName == "movable") + { + osWidget = new MouseMovable(container, wid, x, y, width, height); + } + else if (opName == "editable") + { +// osWidget = new MouseEditable(container, wid, x, y, width, height); + } + else if (opName == "window_closed") + { + osWidget = new WindowClose(container, wid, x, y, width, height); + } + else if (opName == "window_iconified") + { + osWidget = new WindowIconify(container, wid, x, y, width, height); + } + else if (opName == "window_maximized") + { + osWidget = new WindowMaximize(container, wid, x, y, width, height); + } + else if (opName == "popupable_left") + { + osWidget = new MousePopupable(container, wid, x, y, width, height, 1); + } + else if (opName == "popupable_right") + { + osWidget = new MousePopupable(container, wid, x, y, width, height, 3); + } + + return osWidget; + } + /** * Deregister the specified widget for mouse events. * @@ -1930,7 +2025,7 @@ // send the mouse event p2j.socket.sendMouseEvent(mouseEvent); - + console.debug("sendMouseEvent " + JSON.stringify(mouseEvent)); // events are generated for the first widget which should respond for this mouse // action; it's the P2J runtimes responsibility to determine which actual widget // should interpret the event (i.e. z-order, etc) @@ -2527,22 +2622,20 @@ */ me.getOsEvent = function(evt, wThis, mouseOp, id) { - var mousePos = wThis.getMousePos(evt); - for (var osOp in wThis.osAwareWidgets) { - var ma = wThis.osAwareWidgets[osOp][id]; - - if (ma == undefined) - { - continue; - } - - var osEvents = ma.getEvents(); - - if (osEvents[mouseOp] != undefined) - { - return wThis.osAwareWidgets[osOp][id]; + if (wThis.osAwareWidgets.hasOwnProperty(osOp)) + { + var osWidgets = wThis.osAwareWidgets[osOp]; + if (osWidgets.hasOwnProperty(id)) + { + var osWidget = osWidgets[id]; + var osEvents = osWidget.getEvents(); + if (osEvents.hasOwnProperty(mouseOp)) + { + return osWidget; + } + } } }