From 946cd33350d31e86ce53639e1ef26629b0b3c946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 28 Jun 2012 22:33:29 +0200 Subject: [PATCH 01/54] make ol.Map inherit from goog.EventTarget, and add an ol.handler.Drag --- src/ol.js | 2 +- src/ol/Map.js | 42 +++++++++--------- src/ol/control/Navigation.js | 14 +++--- src/ol/event/Drag.js | 83 ------------------------------------ src/ol/handler/Drag.js | 63 +++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 113 deletions(-) delete mode 100644 src/ol/event/Drag.js create mode 100644 src/ol/handler/Drag.js diff --git a/src/ol.js b/src/ol.js index f85b363567..548bd95579 100644 --- a/src/ol.js +++ b/src/ol.js @@ -5,9 +5,9 @@ goog.require('ol.bounds'); goog.require('ol.control.Attribution'); goog.require('ol.control.Navigation'); goog.require('ol.control.Zoom'); -goog.require('ol.event.Drag'); goog.require('ol.event.Events'); goog.require('ol.event.Scroll'); +goog.require('ol.handler.Drag'); goog.require("ol.map"); goog.require("ol.loc"); goog.require("ol.feature"); diff --git a/src/ol/Map.js b/src/ol/Map.js index 180e5a11c2..84ea212dd2 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -3,25 +3,28 @@ goog.provide('ol.Map'); goog.require('ol.Loc'); goog.require('ol.Bounds'); goog.require('ol.Projection'); -goog.require('ol.event'); -goog.require('ol.event.Events'); goog.require('ol.control.Control'); goog.require('ol.renderer.MapRenderer'); +goog.require('ol.handler.Drag'); goog.require('goog.dom'); goog.require('goog.math'); goog.require('goog.asserts'); +goog.require('goog.events.EventTarget'); /** * @export * @constructor + * @extends {goog.events.EventTarget} * * @event layeradd Fires when a layer is added to the map. The event object * contains a 'layer' property referencing the added layer. */ ol.Map = function() { + goog.base(this); + /** * @private * @type {ol.Projection} @@ -100,21 +103,20 @@ ol.Map = function() { */ this.staticOverlay_ = null; - /** - * @private - * @type {ol.event.Events} - */ - this.events_ = new ol.event.Events( - this, undefined, false, ['drag', 'scroll'] - ); - /** * @private * @type {Element} */ this.container_ = null; + /** + * @private + * @type {ol.handler.Drag} + */ + this.dragHandler_ = null; + }; +goog.inherits(ol.Map, goog.events.EventTarget); /** @const @@ -140,7 +142,7 @@ ol.Map.DEFAULT_TILE_SIZE = 256; @const @type {Array.} */ -ol.Map.DEFAULT_CONTROLS = ["attribution", "navigation", "zoom"]; +ol.Map.DEFAULT_CONTROLS = ["navigation"]; /** * @return {ol.Loc} Map center in map projection. @@ -394,7 +396,7 @@ ol.Map.prototype.addLayers = function(layers) { for (var i=0, ii=layers.length; i Date: Mon, 2 Jul 2012 17:33:01 +0200 Subject: [PATCH 02/54] rely on registerDisposable --- src/ol/Map.js | 11 ++--------- src/ol/handler/Drag.js | 12 +++++++----- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/ol/Map.js b/src/ol/Map.js index 84ea212dd2..d4326e4ec7 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -108,13 +108,6 @@ ol.Map = function() { * @type {Element} */ this.container_ = null; - - /** - * @private - * @type {ol.handler.Drag} - */ - this.dragHandler_ = null; - }; goog.inherits(ol.Map, goog.events.EventTarget); @@ -472,7 +465,8 @@ ol.Map.prototype.setViewport = function() { 'class': 'ol-viewport', 'style': 'width:100%;height:100%;top:0;left:0;position:relative;overflow:hidden' })); - this.dragHandler_ = new ol.handler.Drag(this, this.viewport_); + var dragHandler = new ol.handler.Drag(this, this.viewport_); + this.registerDisposable(dragHandler); } goog.dom.appendChild(this.container_, this.viewport_); }; @@ -545,7 +539,6 @@ ol.Map.prototype.disposeInternal = function() { for (var key in this) { delete this[key]; } - this.dragHandler_.dispose(); }; diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index ef27acd4c2..77837c7268 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -12,8 +12,10 @@ goog.require('goog.Disposable'); */ ol.handler.Drag = function(map, elt) { - this.dragger_ = new goog.fx.Dragger(elt); - this.dragger_.defaultAction = function() {}; + var dragger = new goog.fx.Dragger(elt); + this.registerDisposable(dragger); + + dragger.defaultAction = function() {}; var prevX = 0, prevY = 0; @@ -44,11 +46,11 @@ ol.handler.Drag = function(map, elt) { goog.events.dispatchEvent(map, newE); }; - goog.events.listen(this.dragger_, goog.fx.Dragger.EventType.START, + goog.events.listen(dragger, goog.fx.Dragger.EventType.START, handleDragStart, false, this); - goog.events.listen(this.dragger_, goog.fx.Dragger.EventType.DRAG, + goog.events.listen(dragger, goog.fx.Dragger.EventType.DRAG, handleDrag, false, this); - goog.events.listen(this.dragger_, goog.fx.Dragger.EventType.END, + goog.events.listen(dragger, goog.fx.Dragger.EventType.END, handleDragEnd, false, this); }; goog.inherits(ol.handler.Drag, goog.Disposable); From 8e36850e7fbbed5b02b9e0cc0cb5d9bc0aac335a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 5 Jul 2012 13:55:57 +0200 Subject: [PATCH 03/54] create parent event target for the map, to allow stopping event propagation --- src/ol/Map.js | 7 +++++++ src/ol/control/Navigation.js | 15 +++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/ol/Map.js b/src/ol/Map.js index d4326e4ec7..a90674e76f 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -108,6 +108,13 @@ ol.Map = function() { * @type {Element} */ this.container_ = null; + + // Create an EventTarget and set it as the map's parent EventTarget. With + // this we can have two groups of listeners: "map listeners" and "map + // parent listeners". And map listeners can stop event propagation, and + // thereby prevent map parent listeners from receiving events. + this.setParentEventTarget(new goog.events.EventTarget()); + }; goog.inherits(ol.Map, goog.events.EventTarget); diff --git a/src/ol/control/Navigation.js b/src/ol/control/Navigation.js index c1b2ff05d8..2a3eb0b070 100644 --- a/src/ol/control/Navigation.js +++ b/src/ol/control/Navigation.js @@ -27,9 +27,12 @@ goog.inherits(ol.control.Navigation, ol.control.Control); ol.control.Navigation.prototype.activate = function() { var active = goog.base(this, 'activate'); if (active) { - var map = this.map_; - goog.events.listen(map, 'drag', this.moveMap, false, this); - goog.events.listen(map, 'scroll', this.zoomMap, false, this); + // Listen to the map's parent EventTarget here. This is to + // give other, higher-level, controls a chance to stop the + // navigation control. + var target = this.map_.getParentEventTarget(); + goog.events.listen(target, 'drag', this.moveMap, false, this); + goog.events.listen(target, 'scroll', this.zoomMap, false, this); } return active; }; @@ -38,9 +41,9 @@ ol.control.Navigation.prototype.activate = function() { ol.control.Navigation.prototype.deactivate = function() { var inactive = goog.base(this, 'deactivate'); if (inactive) { - var map = this.map_; - goog.events.unlisten(map, 'drag', this.moveMap, false, this); - goog.events.unlisten(map, 'scroll', this.zoomMap, false, this); + var target = this.map_.getParentEventTarget(); + goog.events.unlisten(target, 'drag', this.moveMap, false, this); + goog.events.unlisten(target, 'scroll', this.zoomMap, false, this); } return inactive; }; From 2fcd76bd54069056c0bb255e525b97799a6d1196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 5 Jul 2012 14:01:44 +0200 Subject: [PATCH 04/54] ol.handler.Drag no longer needs a disposeInternal method --- src/ol/handler/Drag.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 77837c7268..0be5ecaeab 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -54,12 +54,3 @@ ol.handler.Drag = function(map, elt) { handleDragEnd, false, this); }; goog.inherits(ol.handler.Drag, goog.Disposable); - -/** - * @inheritDoc - */ -ol.handler.Drag.prototype.disposeInternal = function() { - goog.base(this, 'disposeInternal'); - this.dragger_.dispose(); - delete this.dragger_; -}; From 22e7dc67d6d411fae394d47700a1fc476a4309b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 5 Jul 2012 14:02:13 +0200 Subject: [PATCH 05/54] add a @fileoverview to ol/handler/Drag.js --- src/ol/handler/Drag.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 0be5ecaeab..8a8bf1597d 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -1,3 +1,11 @@ +/** + * @fileoverview Drag Handler. + * + * A drag handler uses a goog.fx.Dragger object to receive dragstart, drag, dragend + * events for a DOM element, and re-dispatches these events to the map. + * + */ + goog.provide('ol.handler.Drag'); goog.require('goog.fx.Dragger'); From 2c61e16b55e740ee9193225d3dd375d08deeec9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:27:36 +0200 Subject: [PATCH 06/54] add a mouse wheel handler --- src/ol.js | 1 + src/ol/handler/MouseWheel.js | 37 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/ol/handler/MouseWheel.js diff --git a/src/ol.js b/src/ol.js index 548bd95579..d22946802e 100644 --- a/src/ol.js +++ b/src/ol.js @@ -8,6 +8,7 @@ goog.require('ol.control.Zoom'); goog.require('ol.event.Events'); goog.require('ol.event.Scroll'); goog.require('ol.handler.Drag'); +goog.require('ol.handler.MouseWheel'); goog.require("ol.map"); goog.require("ol.loc"); goog.require("ol.feature"); diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js new file mode 100644 index 0000000000..ac0a3e4682 --- /dev/null +++ b/src/ol/handler/MouseWheel.js @@ -0,0 +1,37 @@ +/** + * @fileoverview Map Mouse Wheel Handler. + * + * Provides a class for listening to mousewheel events on a DOM element + * and re-dispatching to a map instance. + */ + +goog.provide('ol.handler.MouseWheel'); + +goog.require('goog.Disposable'); +goog.require('goog.events.MouseWheelHandler'); + + +/** + * @constructor + * @extends {goog.Disposable} + * @param {ol.Map} map The map instance. + * @param {Element} elt The element we listen to mousewheel on. + */ +ol.handler.MouseWheel = function(map, elt) { + goog.base(this); + + var handler = new goog.events.MouseWheelHandler(elt); + this.registerDisposable(handler); + + var handleMouseWheel = function(e) { + e.position = goog.style.getRelativePosition(e, elt); + e.type = 'mousewheel'; + goog.events.dispatchEvent(map, e); + }; + + goog.events.listen(handler, + goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, + handleMouseWheel); + +}; +goog.inherits(ol.handler.MouseWheel, goog.Disposable); From 9e693f29c556d19459a4ac489ad4e7fc612b3b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:28:56 +0200 Subject: [PATCH 07/54] use the mousewheel handler --- src/ol/Map.js | 16 ++++++++++++++-- src/ol/control/Navigation.js | 6 +++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/ol/Map.js b/src/ol/Map.js index 64fe7cea0e..23fbd6b9b3 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -504,12 +504,24 @@ ol.Map.prototype.setViewport = function() { 'class': 'ol-viewport', 'style': 'width:100%;height:100%;top:0;left:0;position:relative;overflow:hidden' })); - var dragHandler = new ol.handler.Drag(this, this.viewport_); - this.registerDisposable(dragHandler); + this.initHandlers(); } goog.dom.appendChild(this.container_, this.viewport_); }; +/** + * Init the map event handlers. + */ +ol.Map.prototype.initHandlers = function() { + goog.asserts.assert(!goog.isNull(this.viewport_)); + + var dragHandler = new ol.handler.Drag(this, this.viewport_); + this.registerDisposable(dragHandler); + + var mouseWheelHandler = new ol.handler.MouseWheel(this, this.viewport_); + this.registerDisposable(mouseWheelHandler); +}; + ol.Map.prototype.createRenderer = function() { var Renderer = ol.renderer.MapRenderer.pickRendererType( diff --git a/src/ol/control/Navigation.js b/src/ol/control/Navigation.js index 64ac0737cf..d38cecdc9b 100644 --- a/src/ol/control/Navigation.js +++ b/src/ol/control/Navigation.js @@ -38,7 +38,7 @@ ol.control.Navigation.prototype.activate = function() { // navigation control. var target = this.map_.getParentEventTarget(); goog.events.listen(target, 'drag', this.moveMap, false, this); - goog.events.listen(target, 'scroll', this.zoomMap, false, this); + goog.events.listen(target, 'mousewheel', this.zoomMap, false, this); } return active; }; @@ -49,7 +49,7 @@ ol.control.Navigation.prototype.deactivate = function() { if (inactive) { var target = this.map_.getParentEventTarget(); goog.events.unlisten(target, 'drag', this.moveMap, false, this); - goog.events.unlisten(target, 'scroll', this.zoomMap, false, this); + goog.events.unlisten(target, 'mousewheel', this.zoomMap, false, this); } return inactive; }; @@ -76,7 +76,7 @@ ol.control.Navigation.prototype.zoomMap = function(evt) { var map = me.map_, step = evt.deltaY / Math.abs(evt.deltaY); - map.setZoom(map.getZoom()-step, map.getEvents().getPointerPosition(evt)); + map.setZoom(map.getZoom()-step, evt.position); // We don't want the page to scroll. evt.preventDefault(); return false; From e0b53360d21aec08c99c3c37c9885bd3596daf79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:30:34 +0200 Subject: [PATCH 08/54] ol.Popup no longer relies on map.getEvents --- src/ol/Popup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/Popup.js b/src/ol/Popup.js index 5a5beff366..cdad2ea22b 100644 --- a/src/ol/Popup.js +++ b/src/ol/Popup.js @@ -208,7 +208,8 @@ ol.Popup.prototype.doOpen = function(opt_arg) { goog.dom.appendChild(this.container_, closeButton); goog.dom.classes.add(closeButton, ol.Popup.CLASS_NAME+'-close'); } - this.map_.getEvents().register('click', this.clickHandler, this); + goog.events.listen(this.map_.getViewport(), 'click', this.clickHandler, + undefined, this); goog.dom.appendChild(this.map_.getMapOverlay(), this.container_); } From bc72e2e4444e3d81abc6497c5c012a6d8a2001d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:31:33 +0200 Subject: [PATCH 09/54] ol.control.Attribution no longer relies on map.getEvents --- src/ol/control/Attribution.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 35875a3de4..941b2fcb6b 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -55,7 +55,8 @@ ol.control.Attribution.prototype.setMap = function(map) { ol.control.Attribution.prototype.activate = function() { var active = goog.base(this, 'activate'); if (active) { - this.map_.getEvents().register('layeradd', this.update, this); + goog.events.listen(this.map_, 'layeradd', this.update, + undefined, this); this.update(); } return active; @@ -65,7 +66,8 @@ ol.control.Attribution.prototype.activate = function() { ol.control.Attribution.prototype.deactivate = function() { var inactive = goog.base(this, 'deactivate'); if (inactive) { - this.map_.getEvents().unregister('layeradd', this.update, this); + goog.events.unlisten(this.map_, 'layeradd', this.update, + undefined, this); } return inactive; }; @@ -89,4 +91,4 @@ ol.control.Attribution.prototype.destroy = function() { goog.base(this, 'destroy'); }; -ol.control.addControl('attribution', ol.control.Attribution); \ No newline at end of file +ol.control.addControl('attribution', ol.control.Attribution); From f2e0adc24f18569bd2e1c0e1534daed8a94171d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:32:18 +0200 Subject: [PATCH 10/54] make the drag handler prevent page scrolling --- src/ol/handler/Drag.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 8a8bf1597d..a08e0377c7 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -10,6 +10,7 @@ goog.provide('ol.handler.Drag'); goog.require('goog.fx.Dragger'); goog.require('goog.events'); +goog.require('goog.events.EventType'); goog.require('goog.Disposable'); /** @@ -60,5 +61,20 @@ ol.handler.Drag = function(map, elt) { handleDrag, false, this); goog.events.listen(dragger, goog.fx.Dragger.EventType.END, handleDragEnd, false, this); + + + // prevent page scrolling + this.moveListenerKey_ = goog.events.listen( + elt, + [goog.events.EventType.TOUCHMOVE, + goog.events.EventType.MOUSEMOVE], + function(e) { e.preventDefault(); }); }; goog.inherits(ol.handler.Drag, goog.Disposable); + +/** + * @inheritDoc + */ +ol.handler.Drag.prototype.disposeInternal = function() { + goog.events.unlistenByKey(this.moveListenerKey_); +}; From 406a2da46658b83180423f27efc15d4ef0b80145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:32:57 +0200 Subject: [PATCH 11/54] do no export ol.Map.prototype.destroy, it is gone --- src/ol.export.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol.export.js b/src/ol.export.js index 48f5786f8f..a948538215 100644 --- a/src/ol.export.js +++ b/src/ol.export.js @@ -13,7 +13,6 @@ goog.exportProperty( ol.Map.prototype, 'resolutions', ol.Map.prototype.resolutio goog.exportProperty( ol.Map.prototype, 'layers', ol.Map.prototype.layers ); goog.exportProperty( ol.Map.prototype, 'controls', ol.Map.prototype.controls ); goog.exportProperty( ol.Map.prototype, 'maxExtent', ol.Map.prototype.maxExtent ); -goog.exportProperty( ol.Map.prototype, 'destroy', ol.Map.prototype.destroy ); // ol.loc goog.exportSymbol('ol.loc', ol.loc ); From 1679a59835ef4714d6c75cf21aaa25a3fc472978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:33:32 +0200 Subject: [PATCH 12/54] reset the map DEFAULT_CONTROLS array --- src/ol/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/Map.js b/src/ol/Map.js index 23fbd6b9b3..90a2975ace 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -148,7 +148,7 @@ ol.Map.DEFAULT_TILE_SIZE = 256; @const @type {Array.} */ -ol.Map.DEFAULT_CONTROLS = ["navigation"]; +ol.Map.DEFAULT_CONTROLS = ["attribution", "navigation", "zoom"]; /** * @return {ol.Loc} Map center in map projection. From 484d0f8d04d3df196dba3cce9f28bfe89c21f1b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 09:33:53 +0200 Subject: [PATCH 13/54] use goog.events.dispatchEvent --- src/ol/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/Map.js b/src/ol/Map.js index 90a2975ace..0a3ee22b8c 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -428,7 +428,7 @@ ol.Map.prototype.addLayers = function(layers) { for (var i=0, ii=layers.length; i Date: Mon, 9 Jul 2012 20:50:59 +0200 Subject: [PATCH 14/54] [ol.handler.Drag] receive mousemove/touchmove events when dragstart and dragend only --- src/ol/handler/Drag.js | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index a08e0377c7..1e4f0d88c7 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -1,9 +1,8 @@ /** * @fileoverview Drag Handler. * - * A drag handler uses a goog.fx.Dragger object to receive dragstart, drag, dragend - * events for a DOM element, and re-dispatches these events to the map. - * + * Provides a class for listening to drag events on a DOM element and + * re-dispatching to a map instance. */ goog.provide('ol.handler.Drag'); @@ -22,12 +21,17 @@ goog.require('goog.Disposable'); ol.handler.Drag = function(map, elt) { var dragger = new goog.fx.Dragger(elt); - this.registerDisposable(dragger); - dragger.defaultAction = function() {}; + this.registerDisposable(dragger); + + var touchmove = goog.events.EventType.TOUCHMOVE, + mousemove = goog.events.EventType.MOUSEMOVE; + var prevX = 0, prevY = 0; + var preventDefault = function(e) { e.preventDefault(); }; + var handleDragStart = function(e) { prevX = e.clientX; prevY = e.clientY; @@ -35,6 +39,8 @@ ol.handler.Drag = function(map, elt) { type: 'dragstart' }; goog.events.dispatchEvent(map, newE); + // this to prevent page scrolling + goog.events.listen(elt, [touchmove, mousemove], preventDefault); }; var handleDrag = function(e) { @@ -53,6 +59,11 @@ ol.handler.Drag = function(map, elt) { type: 'dragend' }; goog.events.dispatchEvent(map, newE); + goog.events.unlisten(elt, [touchmove, mousemove], preventDefault); + }; + + var handleDragEarlyCancel = function(e) { + goog.events.unlisten(elt, [touchmove, mousemove], preventDefault); }; goog.events.listen(dragger, goog.fx.Dragger.EventType.START, @@ -61,20 +72,7 @@ ol.handler.Drag = function(map, elt) { handleDrag, false, this); goog.events.listen(dragger, goog.fx.Dragger.EventType.END, handleDragEnd, false, this); - - - // prevent page scrolling - this.moveListenerKey_ = goog.events.listen( - elt, - [goog.events.EventType.TOUCHMOVE, - goog.events.EventType.MOUSEMOVE], - function(e) { e.preventDefault(); }); + goog.events.listen(dragger, goog.fx.Dragger.EventType.EARLY_CANCEL, + handleDragEarlyCancel, false, this); }; goog.inherits(ol.handler.Drag, goog.Disposable); - -/** - * @inheritDoc - */ -ol.handler.Drag.prototype.disposeInternal = function() { - goog.events.unlistenByKey(this.moveListenerKey_); -}; From aebfb643acd6c70f7dbfe932bb9090580e33eebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 20:51:28 +0200 Subject: [PATCH 15/54] better type checking --- src/ol/control/Navigation.js | 4 ++-- src/ol/handler/MouseWheel.js | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Navigation.js b/src/ol/control/Navigation.js index d38cecdc9b..25427736ad 100644 --- a/src/ol/control/Navigation.js +++ b/src/ol/control/Navigation.js @@ -55,7 +55,7 @@ ol.control.Navigation.prototype.deactivate = function() { }; /** - * @param {Object} evt + * @param {{deltaX, deltaY}} evt */ ol.control.Navigation.prototype.moveMap = function(evt) { this.map_.moveByViewportPx(evt.deltaX, evt.deltaY); @@ -63,7 +63,7 @@ ol.control.Navigation.prototype.moveMap = function(evt) { }; /** - * @param {Event} evt + * @param {goog.events.MouseWheelEvent} evt */ ol.control.Navigation.prototype.zoomMap = function(evt) { var me = this; diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index ac0a3e4682..6a551db20c 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -23,6 +23,9 @@ ol.handler.MouseWheel = function(map, elt) { var handler = new goog.events.MouseWheelHandler(elt); this.registerDisposable(handler); + /** + * @param {goog.events.MouseWheelEvent} e + */ var handleMouseWheel = function(e) { e.position = goog.style.getRelativePosition(e, elt); e.type = 'mousewheel'; From 7c7cd08494b3eb5ff6dbcf673854a2c5d121a10b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 21:09:09 +0200 Subject: [PATCH 16/54] base tests for ol.handler.Drag and ol.handler.MouseWheel --- test/ol.html | 2 ++ test/spec/ol/handler/Drag.test.js | 17 +++++++++++++++++ test/spec/ol/handler/MouseWheel.test.js | 17 +++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 test/spec/ol/handler/Drag.test.js create mode 100644 test/spec/ol/handler/MouseWheel.test.js diff --git a/test/ol.html b/test/ol.html index b06b645fdf..956b331983 100644 --- a/test/ol.html +++ b/test/ol.html @@ -88,6 +88,8 @@ + + diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js new file mode 100644 index 0000000000..18b5e32117 --- /dev/null +++ b/test/spec/ol/handler/Drag.test.js @@ -0,0 +1,17 @@ +describe('ol.handler.Drag', function() { + var map, elt; + + beforeEach(function() { + map = new ol.Map(); + elt = goog.dom.createDom('div'); + }); + + describe('create a drag handler', function() { + + it('returns an ol.handler.Drag instance', function() { + var handler = new ol.handler.Drag(map, elt); + expect(handler).toBeA(ol.handler.Drag); + }); + + }); +}); diff --git a/test/spec/ol/handler/MouseWheel.test.js b/test/spec/ol/handler/MouseWheel.test.js new file mode 100644 index 0000000000..5135bfbc0f --- /dev/null +++ b/test/spec/ol/handler/MouseWheel.test.js @@ -0,0 +1,17 @@ +describe('ol.handler.MouseWheel', function() { + var map, elt; + + beforeEach(function() { + map = new ol.Map(); + elt = goog.dom.createDom('div'); + }); + + describe('create a mouse wheel handler', function() { + + it('returns an ol.handler.MouseWheel instance', function() { + var handler = new ol.handler.MouseWheel(map, elt); + expect(handler).toBeA(ol.handler.MouseWheel); + }); + + }); +}); From 04f87f8f73a42ce5da7f1f885d05b3a699ea30bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 21:09:42 +0200 Subject: [PATCH 17/54] ol.Map:destroy is back (api tests pass again) --- src/api/map.js | 7 +++++++ src/ol.export.js | 1 + src/ol/control/Control.js | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/api/map.js b/src/api/map.js index f6a090fe9b..3c2e1b50bd 100644 --- a/src/api/map.js +++ b/src/api/map.js @@ -7,6 +7,7 @@ goog.require('ol.loc'); goog.require('ol.projection'); goog.require('ol.error'); +goog.require('goog.dispose'); /** * @typedef {ol.Map|{center, zoom, numZoomLevels, projection, userProjection, maxExtent, maxResolution, resolutions, renderTo, layers, controls}|string} @@ -247,3 +248,9 @@ ol.Map.prototype.renderTo = function(arg) { this.setContainer(goog.dom.getElement(arg)); return this; }; + +/** + */ +ol.Map.prototype.destroy = function() { + goog.dispose(this); +}; diff --git a/src/ol.export.js b/src/ol.export.js index a948538215..48f5786f8f 100644 --- a/src/ol.export.js +++ b/src/ol.export.js @@ -13,6 +13,7 @@ goog.exportProperty( ol.Map.prototype, 'resolutions', ol.Map.prototype.resolutio goog.exportProperty( ol.Map.prototype, 'layers', ol.Map.prototype.layers ); goog.exportProperty( ol.Map.prototype, 'controls', ol.Map.prototype.controls ); goog.exportProperty( ol.Map.prototype, 'maxExtent', ol.Map.prototype.maxExtent ); +goog.exportProperty( ol.Map.prototype, 'destroy', ol.Map.prototype.destroy ); // ol.loc goog.exportSymbol('ol.loc', ol.loc ); diff --git a/src/ol/control/Control.js b/src/ol/control/Control.js index 12dc1c50a9..eaa1c693d6 100644 --- a/src/ol/control/Control.js +++ b/src/ol/control/Control.js @@ -82,4 +82,4 @@ ol.control.Control.prototype.deactivate = function() { ol.control.Control.prototype.destroy = function() { this.deactivate(); goog.object.clear(this); -}; \ No newline at end of file +}; From a3387bc6734c2c4b2f0fec016200dee78b03edd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 21:11:13 +0200 Subject: [PATCH 18/54] ol.Map requires ol.handler.MouseWheel --- src/ol/Map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/Map.js b/src/ol/Map.js index 0a3ee22b8c..00e324a9b3 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -6,6 +6,7 @@ goog.require('ol.Projection'); goog.require('ol.control.Control'); goog.require('ol.renderer.MapRenderer'); goog.require('ol.handler.Drag'); +goog.require('ol.handler.MouseWheel'); goog.require('goog.dom'); goog.require('goog.math'); From 77b809bead315f8e601b0025a521713e43bdc3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 21:31:56 +0200 Subject: [PATCH 19/54] ol.control.Attribution no longer require ol.event --- src/ol/control/Attribution.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 941b2fcb6b..2bcfedc788 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -1,6 +1,5 @@ goog.provide('ol.control.Attribution'); -goog.require('ol.event'); goog.require('ol.control.Control'); goog.require('goog.dom'); @@ -43,7 +42,7 @@ ol.control.Attribution.prototype.setMap = function(map) { var staticOverlay = map.getStaticOverlay(); if (goog.isNull(this.container_)) { this.container_ = goog.dom.createDom('div', this.CLS); - goog.events.listen(this.container_, 'click', ol.event.stopPropagation); + goog.events.listen(this.container_, 'click', this.stopEventPropagation); } if (!goog.isNull(staticOverlay)) { goog.dom.append(staticOverlay, this.container_); @@ -55,8 +54,7 @@ ol.control.Attribution.prototype.setMap = function(map) { ol.control.Attribution.prototype.activate = function() { var active = goog.base(this, 'activate'); if (active) { - goog.events.listen(this.map_, 'layeradd', this.update, - undefined, this); + goog.events.listen(this.map_, 'layeradd', this.update, undefined, this); this.update(); } return active; @@ -66,8 +64,7 @@ ol.control.Attribution.prototype.activate = function() { ol.control.Attribution.prototype.deactivate = function() { var inactive = goog.base(this, 'deactivate'); if (inactive) { - goog.events.unlisten(this.map_, 'layeradd', this.update, - undefined, this); + goog.events.unlisten(this.map_, 'layeradd', this.update, undefined, this); } return inactive; }; @@ -86,9 +83,16 @@ ol.control.Attribution.prototype.update = function() { }; ol.control.Attribution.prototype.destroy = function() { - goog.events.unlisten(this.container_, 'click', ol.event.stopPropagation); + goog.events.unlisten(this.container_, 'click', this.stopEventPropagation); goog.dom.removeNode(this.container_); goog.base(this, 'destroy'); }; +/** + * @param {goog.events.BrowserEvent} e + */ +ol.control.Attribution.prototype.stopEventPropagation = function(e) { + e.stopPropagation(); +}; + ol.control.addControl('attribution', ol.control.Attribution); From f9cb029a74e4c82e3952b5d99ee30d9b7aec3217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 21:32:10 +0200 Subject: [PATCH 20/54] ol.control.Zoom no longer require ol.event --- src/ol/control/Zoom.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ol/control/Zoom.js b/src/ol/control/Zoom.js index a25cbac6d7..59af75ec55 100644 --- a/src/ol/control/Zoom.js +++ b/src/ol/control/Zoom.js @@ -1,6 +1,5 @@ goog.provide('ol.control.Zoom'); -goog.require('ol.event'); goog.require('ol.control.Control'); goog.require('goog.dom'); @@ -120,4 +119,4 @@ ol.control.Zoom.RES = { OUT_CLS: 'ol-control-zoom-out', IN_TEXT: '+', OUT_TEXT: '\u2013' -}; \ No newline at end of file +}; From e4ff1a7574955ea256141711178b720cf46f9153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 21:33:08 +0200 Subject: [PATCH 21/54] ol.Tile inherits from goog.events.EventTarget --- src/ol/Tile.js | 19 ++++++++----------- src/ol/renderer/WebGL.js | 7 +++++-- test/spec/ol/Tile.test.js | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/ol/Tile.js b/src/ol/Tile.js index 8e9c7a7cc2..fb84b117a2 100644 --- a/src/ol/Tile.js +++ b/src/ol/Tile.js @@ -1,13 +1,15 @@ goog.provide('ol.Tile'); +goog.require('ol.Bounds'); + +goog.require('goog.events.EventTarget'); goog.require('goog.events'); goog.require('goog.asserts'); -goog.require('ol.Bounds'); -goog.require('ol.event.Events'); /** * The Tile class. * @constructor + * @extends {goog.events.EventTarget} * @param {string} url * @param {ol.Bounds|undefined} opt_bounds */ @@ -46,13 +48,8 @@ ol.Tile = function(url, opt_bounds) { this.handleImageLoad, false, this); goog.events.listenOnce(this.img_, goog.events.EventType.ERROR, this.handleImageError, false, this); - - /** - * @private - * @type {ol.event.Events} - */ - this.events_ = new ol.event.Events(this); }; +goog.inherits(ol.Tile, goog.events.EventTarget); /** * @protected @@ -104,7 +101,7 @@ ol.Tile.prototype.handleImageLoad = function(evt) { this.loaded_ = true; this.img_.style.visibility = "inherit"; this.img_.style.opacity = 1; // TODO: allow for layer opacity - this.events_.triggerEvent('load'); + goog.events.dispatchEvent(this, 'load'); }; /** @@ -113,7 +110,7 @@ ol.Tile.prototype.handleImageLoad = function(evt) { */ ol.Tile.prototype.handleImageError = function(evt) { this.loading_ = false; - this.events_.triggerEvent('error'); + goog.events.dispatchEvent(this, 'error'); }; /** @@ -136,7 +133,7 @@ ol.Tile.prototype.isLoading = function() { * */ ol.Tile.prototype.destroy = function() { - this.events_.triggerEvent('destroy'); + goog.events.dispatchEvent(this, 'destroy'); }; /** diff --git a/src/ol/renderer/WebGL.js b/src/ol/renderer/WebGL.js index ff86f4584e..53b3ba04aa 100644 --- a/src/ol/renderer/WebGL.js +++ b/src/ol/renderer/WebGL.js @@ -8,6 +8,7 @@ goog.require('ol.renderer.MapRenderer'); goog.require('ol.layer.Layer'); goog.require('ol.Loc'); +goog.require('goog.events'); goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.vec.Mat4'); @@ -237,8 +238,10 @@ ol.renderer.WebGL.prototype.draw = function(layers, center, resolution, animate) tile = row[j]; if (!tile.isLoaded()) { if (!tile.isLoading()) { - tile.register('load', this.handleTileLoad, this); - tile.register('destroy', this.handleTileDestroy, this); + goog.events.listen(tile, 'load', this.handleTileLoad, + undefined, this); + goog.events.listen(tile, 'destroy', this.handleTileDestroy, + undefined, this); tile.load(); } continue; diff --git a/test/spec/ol/Tile.test.js b/test/spec/ol/Tile.test.js index 554560f617..527d0ae6cb 100644 --- a/test/spec/ol/Tile.test.js +++ b/test/spec/ol/Tile.test.js @@ -34,7 +34,7 @@ describe("ol.Tile", function() { }); it("fires a load event", function() { var spy = jasmine.createSpy(); - tile.events_.register('load', spy); + goog.events.listen(tile, 'load', spy); tile.handleImageLoad(); expect(spy).toHaveBeenCalled(); }); @@ -57,7 +57,7 @@ describe("ol.Tile", function() { }); it("fires a load event", function() { var spy = jasmine.createSpy(); - tile.events_.register('error', spy); + goog.events.listen(tile, 'error', spy); tile.handleImageError(); expect(spy).toHaveBeenCalled(); }); From 82b5a596477f72e958028531895f51218f3fb96e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 9 Jul 2012 21:34:47 +0200 Subject: [PATCH 22/54] remove ol.event entirely --- src/ol.js | 2 - src/ol/event/Drag.js | 95 ----------- src/ol/event/Events.js | 327 ------------------------------------ src/ol/event/ISequence.js | 22 --- src/ol/event/Scroll.js | 45 ----- test/ol.html | 1 - test/spec/ol/Events.test.js | 175 ------------------- 7 files changed, 667 deletions(-) delete mode 100644 src/ol/event/Drag.js delete mode 100644 src/ol/event/Events.js delete mode 100644 src/ol/event/ISequence.js delete mode 100644 src/ol/event/Scroll.js delete mode 100644 test/spec/ol/Events.test.js diff --git a/src/ol.js b/src/ol.js index d22946802e..6223dc2f02 100644 --- a/src/ol.js +++ b/src/ol.js @@ -5,8 +5,6 @@ goog.require('ol.bounds'); goog.require('ol.control.Attribution'); goog.require('ol.control.Navigation'); goog.require('ol.control.Zoom'); -goog.require('ol.event.Events'); -goog.require('ol.event.Scroll'); goog.require('ol.handler.Drag'); goog.require('ol.handler.MouseWheel'); goog.require("ol.map"); diff --git a/src/ol/event/Drag.js b/src/ol/event/Drag.js deleted file mode 100644 index af1eee8fe3..0000000000 --- a/src/ol/event/Drag.js +++ /dev/null @@ -1,95 +0,0 @@ -goog.provide('ol.event.Drag'); - -goog.require('ol.event'); -goog.require('ol.event.ISequence'); - -goog.require('goog.functions'); -goog.require('goog.fx.Dragger'); -goog.require('goog.fx.DragEvent'); -goog.require('goog.fx.Dragger.EventType'); - - -/** - * Event sequence that provides a 'dragstart', 'drag' and 'dragend' events. - * Event objects of the 'drag' events have 'deltaX' and 'deltaY' values with - * the relative pixel movement since the previous 'drag' or 'dragstart' event. - * - * @constructor - * @param {ol.event.Events} target The Events instance that handles events. - * @implements {ol.event.ISequence} - * @export - */ -ol.event.Drag = function(target) { - var previousX = 0, previousY = 0, - element = target.getElement(), - dragger = new goog.fx.Dragger(element); - - /** - * @private - * @type {goog.fx.Dragger} - */ - this.dragger_ = dragger; - - /** - * @private - * @type {ol.event.Events} - */ - this.target_ = target; - - // We want to swallow the click event that gets fired after dragging. - var newSequence; - function unregisterClickStopper() { - target.unregister('click', goog.functions.FALSE, undefined, true); - } - - // no default for mousemove and touchmove events to avoid page scrolling. - target.register('mousemove', ol.event.preventDefault); - target.register('touchmove', ol.event.preventDefault); - - dragger.defaultAction = function(x, y) {}; - dragger.addEventListener(goog.fx.Dragger.EventType.START, function(evt) { - evt.target = element; - evt.type = 'dragstart'; - previousX = evt.clientX; - previousY = evt.clientY; - newSequence = true; - target.triggerEvent(evt.type, evt); - }); - dragger.addEventListener(goog.fx.Dragger.EventType.DRAG, function(evt) { - evt.target = element; - evt.deltaX = evt.clientX - previousX; - evt.deltaY = evt.clientY - previousY; - previousX = evt.clientX; - previousY = evt.clientY; - if (newSequence) { - // Once we are in the drag sequence, we know that we need to - // get rid of the click event that gets fired when we are done - // dragging. - target.register('click', goog.functions.FALSE, undefined, true); - newSequence = false; - } - target.triggerEvent(evt.type, evt); - }); - dragger.addEventListener(goog.fx.Dragger.EventType.END, function(evt) { - evt.target = element; - evt.type = 'dragend'; - target.triggerEvent(evt.type, evt); - // Unregister the click stopper in the next cycle - window.setTimeout(unregisterClickStopper, 0); - }); - // Don't swallow the click event if our sequence cancels early. - dragger.addEventListener( - goog.fx.Dragger.EventType.EARLY_CANCEL, unregisterClickStopper - ); -}; - -/** @inheritDoc */ -ol.event.Drag.prototype.destroy = function() { - this.target_.unregister('mousemove', ol.event.preventDefault); - this.target_.unregister('touchmove', ol.event.preventDefault); - this.dragger_.dispose(); - goog.object.clear(this); -}; - - -ol.event.addSequenceProvider('drag', ol.event.Drag); \ No newline at end of file diff --git a/src/ol/event/Events.js b/src/ol/event/Events.js deleted file mode 100644 index 3ad7969228..0000000000 --- a/src/ol/event/Events.js +++ /dev/null @@ -1,327 +0,0 @@ -goog.provide('ol.event'); -goog.provide('ol.event.Events'); - -goog.require('goog.object'); -goog.require('goog.events'); -goog.require('goog.events.EventType'); -goog.require('goog.events.EventTarget'); -goog.require('goog.events.KeyCodes'); -goog.require('goog.style'); - -/** - * @enum {Object} - */ -ol.event.SEQUENCE_PROVIDER_MAP = {}; - -/** - * @param {string} name - * @param {Function} Sequence - */ -ol.event.addSequenceProvider = function(name, Sequence) { - ol.event.SEQUENCE_PROVIDER_MAP[name] = Sequence; -}; - -/** - * Determine whether event was caused by a single touch - * - * @param {!Event} evt - * @return {boolean} - */ -ol.event.isSingleTouch = function(evt) { - return !!(evt.touches && evt.touches.length == 1); -}; - -/** - * Determine whether event was caused by a multi touch - * - * @param {!Event} evt - * @return {boolean} - */ -ol.event.isMultiTouch = function(evt) { - return !!(evt.touches && evt.touches.length > 1); -}; - -/** - * Call preventDefault on the provided event. - * - * @param {!Event} evt - */ -ol.event.preventDefault = function(evt) { - evt.preventDefault(); -}; - -/** - * Call stopPropagation on the provided event. - * - * @param {!Event} evt - */ -ol.event.stopPropagation = function(evt) { - evt.stopPropagation(); -}; - - -/** - * Construct an ol.event.Events instance. - * - * @constructor - * @extends {goog.events.EventTarget} - * @param {Object} object The object we are creating this instance for. - * @param {!Element=} opt_element An optional element that we want to - * listen to browser events on. - * @param {boolean=} opt_includeXY Should the 'xy' property automatically be - * created for browser pointer events? In general, this should be false. If - * it is true, then pointer events will automatically generate an 'xy' - * property on the event object that is passed, which represents the - * relative position of the pointer to the {@code element}. Default is - * false. - * @param {Array.=} opt_sequences Event sequences to register with - * this Events instance. - */ -ol.event.Events = function(object, opt_element, opt_includeXY, opt_sequences) { - - goog.base(this); - - /** - * @private - * @type {Object} - * The object that this instance is bound to. - */ - this.object_ = object; - - /** - * @private - * @type {Element} - * The element that this instance listens to mouse events on. - */ - this.element_ = null; - - /** - * @private - * @type {boolean} - */ - this.includeXY_ = goog.isDef(opt_includeXY) ? opt_includeXY : false; - - /** - * @private - * @type {Array.} - */ - this.sequenceProviders_ = goog.isDef(opt_sequences) ? opt_sequences : []; - - /** - * @private - * @type {Array.} - */ - this.sequences_ = []; - - /** - * @private - * @type {Object} - */ - this.listenerCount_ = {}; - - if (goog.isDef(opt_element)) { - this.setElement(opt_element); - } -}; -goog.inherits(ol.event.Events, goog.events.EventTarget); - -/** - * @return {Object} The object that this instance is bound to. - */ -ol.event.Events.prototype.getObject = function() { - return this.object_; -}; - -/** - * @param {boolean} includeXY - */ -ol.event.Events.prototype.setIncludeXY = function(includeXY) { - this.includeXY_ = includeXY; -}; - -/** - * @return {Element} The element that this instance currently - * listens to browser events on. - */ -ol.event.Events.prototype.getElement = function() { - return this.element_; -}; - -/** - * Attach this instance to a DOM element. When called, all browser events fired - * on the provided element will be relayed by this instance. - * - * @param {Element|Node} element A DOM element to attach - * browser events to. If called without this argument, all browser events - * will be detached from the element they are currently attached to. - */ -ol.event.Events.prototype.setElement = function(element) { - var types = goog.events.EventType, t; - if (this.element_) { - for (t in types) { - goog.events.unlisten( - this.element_, types[t], this.handleBrowserEvent, false, this - ); - } - this.destroySequences(); - delete this.element_; - } - this.element_ = /** @type {Element} */ (element) || null; - if (goog.isDefAndNotNull(element)) { - this.createSequences(); - for (t in types) { - goog.events.listen( - element, types[t], this.handleBrowserEvent, false, this - ); - } - } -}; - -ol.event.Events.prototype.createSequences = function() { - for (var i=0, ii=this.sequenceProviders_.length; i=0; --i) { - this.sequences_[i].destroy(); - } - this.sequences_ = []; -}; - -/** - * Register a listener for an event. - * - * When the event is triggered, the 'listener' function will be called, in the - * context of 'scope'. Imagine we were to register an event, specifying an - * ol.Bounds instance as 'scope'. When the event is triggered, the context in - * the listener function will be our Bounds instance. This means that within - * our listener function, we can access the properties and methods of the - * Bounds instance through the 'this' keyword. So our listener could execute - * something like: - * - * var leftStr = "Left: " + this.minX(); - * - * @param {string} type Name of the event to register. - * @param {Function} listener The callback function. - * @param {Object=} opt_scope The object to bind the context to for the - * listener. If no scope is specified, default is this intance's 'object' - * property. - * @param {boolean=} opt_priority Register the listener as priority listener, - * so it gets executed before other listeners? Default is false. - */ -ol.event.Events.prototype.register = function(type, listener, opt_scope, - opt_priority) { - goog.events.listen( - this, type, listener, opt_priority, opt_scope || this.object_ - ); - this.listenerCount_[type] = (this.listenerCount_[type] || 0) + 1; -}; - -/** - * Unregister a listener for an event - * - * @param {string} type Name of the event to unregister - * @param {Function} listener The callback function. - * @param {Object=} opt_scope The object to bind the context to for the - * listener. If no scope is specified, default is the event's default - * scope. - * @param {boolean=} opt_priority Listener was registered as priority listener, - * so it gets executed before other listeners. Default is false. - */ -ol.event.Events.prototype.unregister = function(type, listener, opt_scope, - opt_priority) { - var removed = goog.events.unlisten( - this, type, listener, opt_priority, opt_scope || this.object_ - ); - if (removed) { - this.listenerCount_[type] = (this.listenerCount_[type] || 1) - 1; - } -}; - -/** - * Trigger a specified registered event. - * - * @param {string} type The type of the event to trigger. - * @param {Object=} opt_evt The event object that will be passed to listeners. - * This object will always have a 'type' property with the event type and - * an 'object' property referencing this Events instance. - * - * @return {boolean} The last listener return. If a listener returns false, - * the chain of listeners will stop getting called. Returns undefined if - * called for an event type that has no listeners. - */ -ol.event.Events.prototype.triggerEvent = function(type, opt_evt) { - var returnValue; - if (this.listenerCount_[type] > 0) { - var listeners = goog.events.getListeners(this, type, true) - .concat(goog.events.getListeners(this, type, false)); - if (arguments.length === 1) { - opt_evt = {'type': type}; - } - opt_evt['object'] = this.object_; - for (var i=0, ii=listeners.length; i 0) { - // add clientX & clientY to all events - corresponds to average x, y - var touches = evt.touches; - if (touches && touches[0]) { - var x = 0; - var y = 0; - var num = touches.length; - var touch; - for (var i=0; i - diff --git a/test/spec/ol/Events.test.js b/test/spec/ol/Events.test.js deleted file mode 100644 index 604e131708..0000000000 --- a/test/spec/ol/Events.test.js +++ /dev/null @@ -1,175 +0,0 @@ -describe("ol.event.Events", function() { - - var log = [], - logFn = function(e) {log.push({scope: this, evt: e});}; - - - it("constructs instances", function() { - var events, element = document.createElement("div"); - - events = new ol.event.Events("foo"); - expect(events.getObject()).toBe("foo"); - expect(events.getElement()).toBe(null); - events.destroy(); - - events = new ol.event.Events("foo", element, true); - expect(events.getElement()).toBe(element); - expect(events.includeXY_).toBe(true); - events.destroy(); - }); - - it("destroys properly", function() { - var events = new ol.event.Events("foo"); - events.destroy(); - expect(events.getObject()).toBe(undefined); - }); - - it("relays browser events and knows about pointer position", function() { - var element = document.createElement("div"), - events = new ol.event.Events("foo", element); - - //TODO Figure out a good way to deal with fixtures - element.style.position = "absolute"; - element.style.left = "5px"; - element.style.top = "10px"; - document.body.appendChild(element); - // mock dom element so we can trigger events on it - goog.object.extend(element, new goog.events.EventTarget()); - - log = []; - events.register("click", logFn); - element.dispatchEvent("click"); - expect(log.length).toBe(1); - - // detach from the element - events.setElement(null); - element.dispatchEvent("click"); - expect(log.length).toBe(1); - - // attach to the element again - events.setElement(element); - events.setIncludeXY(true); - element.dispatchEvent({ - type: "click", - touches: [{clientX: 9, clientY: 22}, {clientX: 11, clientY: 18}] - }); - expect(log.length).toBe(2); - expect(log[1].evt.xy.x).toBe(5); - expect(log[1].evt.xy.y).toBe(10); - expect(log[1].evt.clientX).toBe(10); - expect(log[1].evt.clientY).toBe(20); - - events.destroy(); - document.body.removeChild(element); - }); - - it("calls listeners with a scope and an event object", function() { - var scope = {}, evt = {}, events = new ol.event.Events("foo"); - - log = []; - events.register("bar", logFn, scope); - events.triggerEvent("bar", evt); - expect(log[0].scope).toBe(scope); - expect(log[0].evt).toBe(evt); - expect(log[0].evt.object).toBe("foo"); - }); - - it("respects event priority", function() { - var log = [], events = new ol.event.Events("foo"); - - // register a normal listener - events.register("bar", function() {log.push("normal");}); - // register a priority listener - events.register( - "bar", function() {log.push("priority");}, undefined, true); - events.triggerEvent("bar"); - expect(log[0]).toBe("priority"); - expect(log[1]).toBe("normal"); - - events.destroy(); - }); - - it("allows to abort the event chain", function() { - var events = new ol.event.Events("foo"); - - log = []; - // register a listener that aborts the event chain - events.register("bar", function(e) {logFn(e); return false;}); - // register a listener that just does something - events.register("bar", logFn); - events.triggerEvent("bar"); - expect(log.length).toBe(1); - - log = []; - // register a priority listener that just does something - events.register("bar", logFn, undefined, true); - events.triggerEvent("bar"); - expect(log.length).toBe(2); - - events.destroy(); - }); - - it("allows to unregister events", function() { - var events = new ol.event.Events("foo"); - - log = []; - events.register("bar", logFn); - expect(events.listenerCount_["bar"]).toBe(1); - - events.triggerEvent("bar"); - expect(log.length).toBe(1); - - events.unregister("bar", logFn); - events.triggerEvent("bar"); - expect(log.length).toBe(1); - - events.unregister("bar", logFn); - expect(events.listenerCount_["bar"]).toBe(0); - - events.destroy(); - }); - - it("can be extended with sequences implementing ol.event.ISequence", function() { - var sequence; - var Sequence = function(target) { - sequence = this; - this.target = target; - }; - Sequence.prototype.fire = function() { - this.target.triggerEvent("myevent"); - }; - Sequence.prototype.destroy = function() { - this.destroyed = true; - }; - ol.event.addSequenceProvider("myseq", Sequence); - - var element = document.createElement("div"); - events = new ol.event.Events("foo", undefined, false, ["myseq"]); - - expect(sequence).toBeUndefined(); - - log = []; - events.setElement(element); - events.register('myevent', logFn); - sequence.fire(); - - expect(log.length).toBe(1); - expect(log[0].evt.type).toBe("myevent"); - - events.destroy(); - expect(sequence.destroyed).toBe(true); - }); - - it("provides an isSingleTouch() function", function() { - expect(ol.event.isSingleTouch({touches: [{}, {}]})).toBe(false); - expect(ol.event.isSingleTouch({touches: [{}]})).toBe(true); - expect(ol.event.isSingleTouch({})).toBe(false); - }); - - it("provides an isMultiTouch() function", function() { - expect(ol.event.isMultiTouch({touches: [{}, {}]})).toBe(true); - expect(ol.event.isMultiTouch({touches: [{}]})).toBe(false); - expect(ol.event.isMultiTouch({})).toBe(false); - }); - -}); From 357d08df99d7e6dc2562042c82abaec1fc769c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 08:31:38 +0200 Subject: [PATCH 23/54] the drag handler moves the map by default --- src/ol/control/Navigation.js | 4 +- src/ol/handler/Drag.js | 143 +++++++++++++++++++++++------------ 2 files changed, 98 insertions(+), 49 deletions(-) diff --git a/src/ol/control/Navigation.js b/src/ol/control/Navigation.js index 25427736ad..f92527de66 100644 --- a/src/ol/control/Navigation.js +++ b/src/ol/control/Navigation.js @@ -37,7 +37,7 @@ ol.control.Navigation.prototype.activate = function() { // give other, higher-level, controls a chance to stop the // navigation control. var target = this.map_.getParentEventTarget(); - goog.events.listen(target, 'drag', this.moveMap, false, this); + //goog.events.listen(target, 'drag', this.moveMap, false, this); goog.events.listen(target, 'mousewheel', this.zoomMap, false, this); } return active; @@ -48,7 +48,7 @@ ol.control.Navigation.prototype.deactivate = function() { var inactive = goog.base(this, 'deactivate'); if (inactive) { var target = this.map_.getParentEventTarget(); - goog.events.unlisten(target, 'drag', this.moveMap, false, this); + //goog.events.unlisten(target, 'drag', this.moveMap, false, this); goog.events.unlisten(target, 'mousewheel', this.zoomMap, false, this); } return inactive; diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 1e4f0d88c7..233f8eb065 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -7,10 +7,12 @@ goog.provide('ol.handler.Drag'); -goog.require('goog.fx.Dragger'); +goog.require('goog.asserts'); goog.require('goog.events'); +goog.require('goog.events.Event'); goog.require('goog.events.EventType'); goog.require('goog.Disposable'); +goog.require('goog.fx.Dragger'); /** * @constructor @@ -20,59 +22,106 @@ goog.require('goog.Disposable'); */ ol.handler.Drag = function(map, elt) { - var dragger = new goog.fx.Dragger(elt); + /** */ + this.map_ = map; + + /** */ + this.elt_ = elt; + + /** */ + var dragger = this.dragger_ = new goog.fx.Dragger(elt); dragger.defaultAction = function() {}; - this.registerDisposable(dragger); + /** */ + this.prevX_ = 0; - var touchmove = goog.events.EventType.TOUCHMOVE, - mousemove = goog.events.EventType.MOUSEMOVE; - - var prevX = 0, prevY = 0; - - var preventDefault = function(e) { e.preventDefault(); }; - - var handleDragStart = function(e) { - prevX = e.clientX; - prevY = e.clientY; - var newE = { - type: 'dragstart' - }; - goog.events.dispatchEvent(map, newE); - // this to prevent page scrolling - goog.events.listen(elt, [touchmove, mousemove], preventDefault); - }; - - var handleDrag = function(e) { - var newE = { - type: 'drag', - deltaX: e.clientX - prevX, - deltaY: e.clientY - prevY - }; - prevX = e.clientX; - prevY = e.clientY; - goog.events.dispatchEvent(map, newE); - }; - - var handleDragEnd = function(e) { - var newE = { - type: 'dragend' - }; - goog.events.dispatchEvent(map, newE); - goog.events.unlisten(elt, [touchmove, mousemove], preventDefault); - }; - - var handleDragEarlyCancel = function(e) { - goog.events.unlisten(elt, [touchmove, mousemove], preventDefault); - }; + /** */ + this.prevY_ = 0; goog.events.listen(dragger, goog.fx.Dragger.EventType.START, - handleDragStart, false, this); + this.handleDragStart, false, this); goog.events.listen(dragger, goog.fx.Dragger.EventType.DRAG, - handleDrag, false, this); + this.handleDrag, false, this); goog.events.listen(dragger, goog.fx.Dragger.EventType.END, - handleDragEnd, false, this); + this.handleDragEnd, false, this); goog.events.listen(dragger, goog.fx.Dragger.EventType.EARLY_CANCEL, - handleDragEarlyCancel, false, this); + this.handleDragEarlyCancel, false, this); + }; goog.inherits(ol.handler.Drag, goog.Disposable); + +/** + */ +ol.handler.Drag.prototype.disposeInternal = function() { + goog.base(this, 'disposeInternal'); + goog.dispose(this.dragger_); + goog.events.unlisten(this.elt_, + [goog.events.EventType.TOUCHMOVE, + goog.events.EventType.MOUSEMOVE], + goog.events.Event.preventDefault, false, this); + +}; + +/** + */ +ol.handler.Drag.prototype.handleDragStart = function(e) { + this.dragged_ = false; + this.prevX_ = e.clientX; + this.prevY_ = e.clientY; + var newE = { + type: 'dragstart' + }; + goog.events.dispatchEvent(this.map_, newE); + + // this is to prevent page scrolling + goog.events.listen(this.elt_, + [goog.events.EventType.TOUCHMOVE, + goog.events.EventType.MOUSEMOVE], + goog.events.Event.preventDefault, false, this); + +}; + +/** + */ +ol.handler.Drag.prototype.handleDrag = function(e) { + this.dragged_ = true; + var newE = { + type: 'drag', + deltaX: e.clientX - this.prevX_, + deltaY: e.clientY - this.prevY_ + }; + this.prevX_ = e.clientX; + this.prevY_ = e.clientY; + var rt = goog.events.dispatchEvent(this.map_, newE); + if (rt) { + this.defaultBehavior(newE); + } +}; + +/** + */ +ol.handler.Drag.prototype.handleDragEnd = function(e) { + var newE = { + type: 'dragend' + }; + goog.events.dispatchEvent(this.map_, newE); + goog.events.unlisten(this.elt_, + [goog.events.EventType.TOUCHMOVE, + goog.events.EventType.MOUSEMOVE], + goog.events.Event.preventDefault, false, this); +}; + +/** + */ +ol.handler.Drag.prototype.handleDragEarlyCancel = function(e) { + goog.events.unlisten(this.elt_, + [goog.events.EventType.TOUCHMOVE, + goog.events.EventType.MOUSEMOVE], + goog.events.Event.preventDefault, false, this); +}; + +/** + */ +ol.handler.Drag.prototype.defaultBehavior = function(e) { + this.map_.moveByViewportPx(e.deltaX, e.deltaY); +}; From ae5cdc75b4c7baa47d45e3d7cb30843d5eb791e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:35:50 +0200 Subject: [PATCH 24/54] the mousewheel handler zooms the map by default --- src/ol/handler/MouseWheel.js | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 6a551db20c..50d293e33a 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -1,8 +1,10 @@ /** - * @fileoverview Map Mouse Wheel Handler. + * @fileoverview Mouse Wheel Handler. * * Provides a class for listening to mousewheel events on a DOM element * and re-dispatching to a map instance. + * + * The default behabior is zooming the map. */ goog.provide('ol.handler.MouseWheel'); @@ -34,7 +36,39 @@ ol.handler.MouseWheel = function(map, elt) { goog.events.listen(handler, goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, - handleMouseWheel); + this.handleMouseWheel, false, this); }; goog.inherits(ol.handler.MouseWheel, goog.Disposable); + +/** + * @param {goog.events.MouseWheelEvent} e + */ +ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { + e.position = goog.style.getRelativePosition(e, this.elt_); + e.type = 'mousewheel'; + var rt = goog.events.dispatchEvent(this.map_, e); + if (rt) { + this.defaultBehavior(e); + } +}; + +/** + * @param {goog.events.MouseWheelEvent} e + */ +ol.handler.MouseWheel.prototype.defaultBehavior = function(e) { + var me = this; + if (e.deltaY === 0 || me.zoomBlocked_) { + return; + } + me.zoomBlocked_ = window.setTimeout(function() { + me.zoomBlocked_ = null; + }, 200); + + var map = me.map_, + step = e.deltaY / Math.abs(e.deltaY); + map.setZoom(map.getZoom() - step, e.position); + + // We don't want the page to scroll. + e.preventDefault(); +}; From 38f946d9449c88a7cdfa0c14b266e07e481ebe0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:38:18 +0200 Subject: [PATCH 25/54] remove the navigation control and the event target hierarchy --- src/ol/Map.js | 9 +--- src/ol/control/Navigation.js | 85 ------------------------------------ 2 files changed, 1 insertion(+), 93 deletions(-) delete mode 100644 src/ol/control/Navigation.js diff --git a/src/ol/Map.js b/src/ol/Map.js index 00e324a9b3..b5dcb76676 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -115,13 +115,6 @@ ol.Map = function() { * @type {Element} */ this.container_ = null; - - // Create an EventTarget and set it as the map's parent EventTarget. With - // this we can have two groups of listeners: "map listeners" and "map - // parent listeners". And map listeners can stop event propagation, and - // thereby prevent map parent listeners from receiving events. - this.setParentEventTarget(new goog.events.EventTarget()); - }; goog.inherits(ol.Map, goog.events.EventTarget); @@ -149,7 +142,7 @@ ol.Map.DEFAULT_TILE_SIZE = 256; @const @type {Array.} */ -ol.Map.DEFAULT_CONTROLS = ["attribution", "navigation", "zoom"]; +ol.Map.DEFAULT_CONTROLS = ["attribution", "zoom"]; /** * @return {ol.Loc} Map center in map projection. diff --git a/src/ol/control/Navigation.js b/src/ol/control/Navigation.js deleted file mode 100644 index f92527de66..0000000000 --- a/src/ol/control/Navigation.js +++ /dev/null @@ -1,85 +0,0 @@ -goog.provide('ol.control.Navigation'); - -goog.require('ol.control.Control'); - - -/** - * @constructor - * @extends {ol.control.Control} - * @param {boolean|undefined} opt_autoActivate - */ -ol.control.Navigation = function(opt_autoActivate) { - - goog.base(this, opt_autoActivate); - - /** - * Activate this control when it is added to a map. Default is true. - * - * @type {boolean} autoActivate - */ - this.autoActivate_ = - goog.isDef(opt_autoActivate) ? opt_autoActivate : true; - - /** - * @type {number?} - * @private - */ - this.zoomBlocked_ = null; - -}; -goog.inherits(ol.control.Navigation, ol.control.Control); - -/** @inheritDoc */ -ol.control.Navigation.prototype.activate = function() { - var active = goog.base(this, 'activate'); - if (active) { - // Listen to the map's parent EventTarget here. This is to - // give other, higher-level, controls a chance to stop the - // navigation control. - var target = this.map_.getParentEventTarget(); - //goog.events.listen(target, 'drag', this.moveMap, false, this); - goog.events.listen(target, 'mousewheel', this.zoomMap, false, this); - } - return active; -}; - -/** @inheritDoc */ -ol.control.Navigation.prototype.deactivate = function() { - var inactive = goog.base(this, 'deactivate'); - if (inactive) { - var target = this.map_.getParentEventTarget(); - //goog.events.unlisten(target, 'drag', this.moveMap, false, this); - goog.events.unlisten(target, 'mousewheel', this.zoomMap, false, this); - } - return inactive; -}; - -/** - * @param {{deltaX, deltaY}} evt - */ -ol.control.Navigation.prototype.moveMap = function(evt) { - this.map_.moveByViewportPx(evt.deltaX, evt.deltaY); - return false; -}; - -/** - * @param {goog.events.MouseWheelEvent} evt - */ -ol.control.Navigation.prototype.zoomMap = function(evt) { - var me = this; - if (evt.deltaY === 0 || me.zoomBlocked_) { - return; - } - me.zoomBlocked_ = window.setTimeout(function() { - me.zoomBlocked_ = null; - }, 200); - - var map = me.map_, - step = evt.deltaY / Math.abs(evt.deltaY); - map.setZoom(map.getZoom()-step, evt.position); - // We don't want the page to scroll. - evt.preventDefault(); - return false; -}; - -ol.control.addControl('navigation', ol.control.Navigation); From da11a8c34d69a9bfd10b207cfb0aa047dda29287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:43:42 +0200 Subject: [PATCH 26/54] add ol.ENABLE_DRAG_HANDLER and ol.ENABLE_MOUSEWHEEL_HANDLER @defines, and pass a an object to the handlers for sharing states --- src/ol/Map.js | 24 +++++++++++++++++++----- src/ol/handler/Drag.js | 14 +++++++++----- src/ol/handler/MouseWheel.js | 3 ++- test/spec/ol/handler/Drag.test.js | 2 +- test/spec/ol/handler/MouseWheel.test.js | 2 +- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/ol/Map.js b/src/ol/Map.js index b5dcb76676..dea0e0a8d3 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -13,6 +13,15 @@ goog.require('goog.math'); goog.require('goog.asserts'); goog.require('goog.events.EventTarget'); +/** + * @define {boolean} Whether to enable the drag handler. + */ +ol.ENABLE_DRAG_HANDLER = true; + +/** + * @define {boolean} Whether to enable the mousewheel handler. + */ +ol.ENABLE_MOUSEWHEEL_HANDLER = true; /** * @export @@ -509,14 +518,19 @@ ol.Map.prototype.setViewport = function() { ol.Map.prototype.initHandlers = function() { goog.asserts.assert(!goog.isNull(this.viewport_)); - var dragHandler = new ol.handler.Drag(this, this.viewport_); - this.registerDisposable(dragHandler); + var handler, + states = {}; - var mouseWheelHandler = new ol.handler.MouseWheel(this, this.viewport_); - this.registerDisposable(mouseWheelHandler); + if (ol.ENABLE_DRAG_HANDLER) { + handler = new ol.handler.Drag(this, this.viewport_, states); + this.registerDisposable(handler); + } + if (ol.ENABLE_MOUSEWHEEL_HANDLER) { + handler = new ol.handler.MouseWheel(this, this.viewport_, states); + this.registerDisposable(handler); + } }; - ol.Map.prototype.createRenderer = function() { var Renderer = ol.renderer.MapRenderer.pickRendererType( ol.Map.preferredRenderers); diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 233f8eb065..19a10ada16 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -19,8 +19,9 @@ goog.require('goog.fx.Dragger'); * @extends {goog.Disposable} * @param {ol.Map} map The map instance. * @param {Element} elt The element that will be dragged. + * @param {Object} states An object for the handlers to share states. */ -ol.handler.Drag = function(map, elt) { +ol.handler.Drag = function(map, elt, states) { /** */ this.map_ = map; @@ -28,8 +29,11 @@ ol.handler.Drag = function(map, elt) { /** */ this.elt_ = elt; - /** */ - var dragger = this.dragger_ = new goog.fx.Dragger(elt); + /** + * @type {Object} + */ + this.states_ = states; + dragger.defaultAction = function() {}; /** */ @@ -65,7 +69,7 @@ ol.handler.Drag.prototype.disposeInternal = function() { /** */ ol.handler.Drag.prototype.handleDragStart = function(e) { - this.dragged_ = false; + this.states_.dragged = false; this.prevX_ = e.clientX; this.prevY_ = e.clientY; var newE = { @@ -84,7 +88,7 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { /** */ ol.handler.Drag.prototype.handleDrag = function(e) { - this.dragged_ = true; + this.states_.dragged = true; var newE = { type: 'drag', deltaX: e.clientX - this.prevX_, diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 50d293e33a..41b2726c51 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -18,8 +18,9 @@ goog.require('goog.events.MouseWheelHandler'); * @extends {goog.Disposable} * @param {ol.Map} map The map instance. * @param {Element} elt The element we listen to mousewheel on. + * @param {Object} states An object for the handlers to share states. */ -ol.handler.MouseWheel = function(map, elt) { +ol.handler.MouseWheel = function(map, elt, states) { goog.base(this); var handler = new goog.events.MouseWheelHandler(elt); diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js index 18b5e32117..3b82a92463 100644 --- a/test/spec/ol/handler/Drag.test.js +++ b/test/spec/ol/handler/Drag.test.js @@ -9,7 +9,7 @@ describe('ol.handler.Drag', function() { describe('create a drag handler', function() { it('returns an ol.handler.Drag instance', function() { - var handler = new ol.handler.Drag(map, elt); + var handler = new ol.handler.Drag(map, elt, {}); expect(handler).toBeA(ol.handler.Drag); }); diff --git a/test/spec/ol/handler/MouseWheel.test.js b/test/spec/ol/handler/MouseWheel.test.js index 5135bfbc0f..9baebd9d24 100644 --- a/test/spec/ol/handler/MouseWheel.test.js +++ b/test/spec/ol/handler/MouseWheel.test.js @@ -9,7 +9,7 @@ describe('ol.handler.MouseWheel', function() { describe('create a mouse wheel handler', function() { it('returns an ol.handler.MouseWheel instance', function() { - var handler = new ol.handler.MouseWheel(map, elt); + var handler = new ol.handler.MouseWheel(map, elt, {}); expect(handler).toBeA(ol.handler.MouseWheel); }); From d73410a9b3eeb1391cf535784dac952c49cbb813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:44:33 +0200 Subject: [PATCH 27/54] add a click handler --- src/ol/Map.js | 10 +++++ src/ol/handler/Click.js | 63 ++++++++++++++++++++++++++++++ test/ol.html | 1 + test/spec/ol/handler/Click.test.js | 17 ++++++++ 4 files changed, 91 insertions(+) create mode 100644 src/ol/handler/Click.js create mode 100644 test/spec/ol/handler/Click.test.js diff --git a/src/ol/Map.js b/src/ol/Map.js index dea0e0a8d3..f0dc399523 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -7,6 +7,7 @@ goog.require('ol.control.Control'); goog.require('ol.renderer.MapRenderer'); goog.require('ol.handler.Drag'); goog.require('ol.handler.MouseWheel'); +goog.require('ol.handler.Click'); goog.require('goog.dom'); goog.require('goog.math'); @@ -23,6 +24,11 @@ ol.ENABLE_DRAG_HANDLER = true; */ ol.ENABLE_MOUSEWHEEL_HANDLER = true; +/** + * @define {boolean} Whether to enable the click handler. + */ +ol.ENABLE_CLICK_HANDLER = true; + /** * @export * @constructor @@ -529,6 +535,10 @@ ol.Map.prototype.initHandlers = function() { handler = new ol.handler.MouseWheel(this, this.viewport_, states); this.registerDisposable(handler); } + if (ol.ENABLE_CLICK_HANDLER) { + handler = new ol.handler.Click(this, this.viewport_, states); + this.registerDisposable(handler); + } }; ol.Map.prototype.createRenderer = function() { diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js new file mode 100644 index 0000000000..89ab32fe58 --- /dev/null +++ b/src/ol/handler/Click.js @@ -0,0 +1,63 @@ +/** + * @fileoverview Click Handler. + * + * Provides a class for listening to click events on a DOM element + * and re-dispatching to a map instance. + * + * This handler has no default behaviour. + */ + +goog.provide('ol.handler.Click'); + +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.Disposable'); + + +/** + * @constructor + * @extends {goog.Disposable} + * @param {ol.Map} map The map instance. + * @param {Element} elt The element we listen to mousewheel on. + * @param {Object} states An object for the handlers to share states. + */ +ol.handler.Click = function(map, elt, states) { + goog.base(this); + + /** + * @type {ol.Map} + */ + this.map_ = map; + + /** + * @type {Element} + */ + this.elt_ = elt; + + /** + * @type {Object} + */ + this.states_ = states; + + goog.events.listen(this.elt_, goog.events.EventType.CLICK, + this.handleClick, undefined, this); +}; +goog.inherits(ol.handler.Click, goog.Disposable); + +/** + * @inheritDoc + */ +ol.handler.Click.prototype.disposeInternal = function() { + goog.events.unlisten(this.elt_, goog.events.EventType.CLICK, + this.handleClick, undefined, this); +}; + +/** + * @param {goog.events.BrowserEvent} e + */ +ol.handler.Click.prototype.handleClick = function(e) { + if (!this.states_.dragged) { + goog.events.dispatchEvent(this.map_, e); + } +}; diff --git a/test/ol.html b/test/ol.html index 776efaf0e0..c5bd94291e 100644 --- a/test/ol.html +++ b/test/ol.html @@ -89,6 +89,7 @@ + diff --git a/test/spec/ol/handler/Click.test.js b/test/spec/ol/handler/Click.test.js new file mode 100644 index 0000000000..9b5082c64a --- /dev/null +++ b/test/spec/ol/handler/Click.test.js @@ -0,0 +1,17 @@ +describe('ol.handler.Click', function() { + var map, elt; + + beforeEach(function() { + map = new ol.Map(); + elt = goog.dom.createDom('div'); + }); + + describe('create a drag handler', function() { + + it('returns an ol.handler.Click instance', function() { + var handler = new ol.handler.Click(map, elt, {}); + expect(handler).toBeA(ol.handler.Click); + }); + + }); +}); From be0f73fb1155d334f8ec1ea8b9a1285e8b9894b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:46:25 +0200 Subject: [PATCH 28/54] better doc strings for the drag handler --- src/ol/handler/Drag.js | 44 +++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 19a10ada16..107e78d78c 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -2,7 +2,9 @@ * @fileoverview Drag Handler. * * Provides a class for listening to drag events on a DOM element and - * re-dispatching to a map instance. + * re-dispatching to a map object. + * + * The default behavior is moving the map. */ goog.provide('ol.handler.Drag'); @@ -23,10 +25,14 @@ goog.require('goog.fx.Dragger'); */ ol.handler.Drag = function(map, elt, states) { - /** */ + /** + * @type {ol.Map} + */ this.map_ = map; - /** */ + /** + * @type {Element} + */ this.elt_ = elt; /** @@ -34,12 +40,22 @@ ol.handler.Drag = function(map, elt, states) { */ this.states_ = states; + /** + * @type {goog.fx.Dragger} + */ + this.dragger_ = new goog.fx.Dragger(elt); + + var dragger = this.dragger_; dragger.defaultAction = function() {}; - /** */ + /** + * @type {number} + */ this.prevX_ = 0; - /** */ + /** + * @type {number} + **/ this.prevY_ = 0; goog.events.listen(dragger, goog.fx.Dragger.EventType.START, @@ -55,6 +71,7 @@ ol.handler.Drag = function(map, elt, states) { goog.inherits(ol.handler.Drag, goog.Disposable); /** + * @inheritDoc */ ol.handler.Drag.prototype.disposeInternal = function() { goog.base(this, 'disposeInternal'); @@ -67,6 +84,7 @@ ol.handler.Drag.prototype.disposeInternal = function() { }; /** + * @param {goog.fx.DragEvent} e */ ol.handler.Drag.prototype.handleDragStart = function(e) { this.states_.dragged = false; @@ -86,6 +104,7 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { }; /** + * @param {goog.fx.DragEvent} e */ ol.handler.Drag.prototype.handleDrag = function(e) { this.states_.dragged = true; @@ -103,6 +122,14 @@ ol.handler.Drag.prototype.handleDrag = function(e) { }; /** + * @param {{type, deltaX, deltaY}} e + */ +ol.handler.Drag.prototype.defaultBehavior = function(e) { + this.map_.moveByViewportPx(e.deltaX, e.deltaY); +}; + +/** + * @param {goog.fx.DragEvent} e */ ol.handler.Drag.prototype.handleDragEnd = function(e) { var newE = { @@ -116,6 +143,7 @@ ol.handler.Drag.prototype.handleDragEnd = function(e) { }; /** + * @param {goog.fx.DragEvent} e */ ol.handler.Drag.prototype.handleDragEarlyCancel = function(e) { goog.events.unlisten(this.elt_, @@ -123,9 +151,3 @@ ol.handler.Drag.prototype.handleDragEarlyCancel = function(e) { goog.events.EventType.MOUSEMOVE], goog.events.Event.preventDefault, false, this); }; - -/** - */ -ol.handler.Drag.prototype.defaultBehavior = function(e) { - this.map_.moveByViewportPx(e.deltaX, e.deltaY); -}; From 3936c62e7767b8b6441d121342c24d4749f11898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:46:57 +0200 Subject: [PATCH 29/54] drag handler constructor should call its parent --- src/ol/handler/Drag.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 107e78d78c..ee6dd63285 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -24,6 +24,7 @@ goog.require('goog.fx.Dragger'); * @param {Object} states An object for the handlers to share states. */ ol.handler.Drag = function(map, elt, states) { + goog.base(this); /** * @type {ol.Map} From d73531bf57d83bd972c82b9631c137e88df27c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:47:16 +0200 Subject: [PATCH 30/54] missing goog.require in the mousewheel handler --- src/ol/handler/MouseWheel.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 41b2726c51..bbf2af1b2b 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -9,8 +9,12 @@ goog.provide('ol.handler.MouseWheel'); +goog.require('goog.asserts'); +goog.require('goog.events'); +goog.require('goog.style'); goog.require('goog.Disposable'); goog.require('goog.events.MouseWheelHandler'); +goog.require('goog.events.MouseWheelHandler.EventType'); /** From 62aee1d7ea8810b4580d9cc084763347ee9cd492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:48:48 +0200 Subject: [PATCH 31/54] remove unused function in the mousewheel handler --- src/ol/handler/MouseWheel.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index bbf2af1b2b..1f3ea17bc1 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -33,11 +33,6 @@ ol.handler.MouseWheel = function(map, elt, states) { /** * @param {goog.events.MouseWheelEvent} e */ - var handleMouseWheel = function(e) { - e.position = goog.style.getRelativePosition(e, elt); - e.type = 'mousewheel'; - goog.events.dispatchEvent(map, e); - }; goog.events.listen(handler, goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, From 8194f05ce430c4f73c56cffe65ccd9eb5a145dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:49:13 +0200 Subject: [PATCH 32/54] better doc strings for the mousewheel handler --- src/ol/handler/MouseWheel.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 1f3ea17bc1..8d9e1ea7e1 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -27,12 +27,18 @@ goog.require('goog.events.MouseWheelHandler.EventType'); ol.handler.MouseWheel = function(map, elt, states) { goog.base(this); - var handler = new goog.events.MouseWheelHandler(elt); - this.registerDisposable(handler); + /** + * @type {ol.Map} + */ + this.map_ = map; /** - * @param {goog.events.MouseWheelEvent} e + * @type {Element} */ + this.elt_ = elt; + + var handler = new goog.events.MouseWheelHandler(elt); + this.registerDisposable(handler); goog.events.listen(handler, goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, From c6b8a93394175b0fdbe198d1297883caa94a74d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 17:52:21 +0200 Subject: [PATCH 33/54] add goog.require for ol.handler.Click in ol.js --- src/ol.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol.js b/src/ol.js index 6223dc2f02..1d00e65d67 100644 --- a/src/ol.js +++ b/src/ol.js @@ -7,6 +7,7 @@ goog.require('ol.control.Navigation'); goog.require('ol.control.Zoom'); goog.require('ol.handler.Drag'); goog.require('ol.handler.MouseWheel'); +goog.require('ol.handler.Click'); goog.require("ol.map"); goog.require("ol.loc"); goog.require("ol.feature"); From a6b37ff83dd07e298aeae641b6d9c97227d7e8be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 11 Jul 2012 18:00:40 +0200 Subject: [PATCH 34/54] remove reference to ol.control.Navigation in ol.js --- src/ol.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol.js b/src/ol.js index 1d00e65d67..8c936f0329 100644 --- a/src/ol.js +++ b/src/ol.js @@ -3,7 +3,6 @@ goog.provide("ol"); goog.require('ol.base'); goog.require('ol.bounds'); goog.require('ol.control.Attribution'); -goog.require('ol.control.Navigation'); goog.require('ol.control.Zoom'); goog.require('ol.handler.Drag'); goog.require('ol.handler.MouseWheel'); From d517bdc5cd8bc276f08233bdb0e892427650f6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 12 Jul 2012 07:35:14 +0200 Subject: [PATCH 35/54] use of goog.events.Event.stopPropagation instead of our own function --- src/ol/control/Attribution.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 2bcfedc788..9ec0f391b1 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -3,6 +3,8 @@ goog.provide('ol.control.Attribution'); goog.require('ol.control.Control'); goog.require('goog.dom'); +goog.require('goog.events'); +goog.require('goog.events.Event'); /** @@ -42,7 +44,8 @@ ol.control.Attribution.prototype.setMap = function(map) { var staticOverlay = map.getStaticOverlay(); if (goog.isNull(this.container_)) { this.container_ = goog.dom.createDom('div', this.CLS); - goog.events.listen(this.container_, 'click', this.stopEventPropagation); + goog.events.listen(this.container_, 'click', + goog.events.Event.stopPropagation); } if (!goog.isNull(staticOverlay)) { goog.dom.append(staticOverlay, this.container_); @@ -83,16 +86,10 @@ ol.control.Attribution.prototype.update = function() { }; ol.control.Attribution.prototype.destroy = function() { - goog.events.unlisten(this.container_, 'click', this.stopEventPropagation); + goog.events.unlisten(this.container_, 'click', + goog.events.Event.stopPropagation); goog.dom.removeNode(this.container_); goog.base(this, 'destroy'); }; -/** - * @param {goog.events.BrowserEvent} e - */ -ol.control.Attribution.prototype.stopEventPropagation = function(e) { - e.stopPropagation(); -}; - ol.control.addControl('attribution', ol.control.Attribution); From 8801542744aa69938be2688425eec0cf6c3de16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 12 Jul 2012 08:14:21 +0200 Subject: [PATCH 36/54] add code comments to click and mousewheel handlers --- src/ol/handler/Click.js | 1 + src/ol/handler/MouseWheel.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js index 89ab32fe58..e19df4bb2d 100644 --- a/src/ol/handler/Click.js +++ b/src/ol/handler/Click.js @@ -57,6 +57,7 @@ ol.handler.Click.prototype.disposeInternal = function() { * @param {goog.events.BrowserEvent} e */ ol.handler.Click.prototype.handleClick = function(e) { + // do not emit a map click event after a drag if (!this.states_.dragged) { goog.events.dispatchEvent(this.map_, e); } diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 8d9e1ea7e1..e6af0bccf5 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -76,5 +76,6 @@ ol.handler.MouseWheel.prototype.defaultBehavior = function(e) { map.setZoom(map.getZoom() - step, e.position); // We don't want the page to scroll. + // (MouseWheelEvent is a BrowserEvent) e.preventDefault(); }; From d4106f166d196ba5ee6bb2ba93cd2767e6c0d7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 12 Jul 2012 08:17:23 +0200 Subject: [PATCH 37/54] remove reference to ol.control.Navigation from ol.export.js --- src/ol.export.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol.export.js b/src/ol.export.js index 48f5786f8f..f243f1386d 100644 --- a/src/ol.export.js +++ b/src/ol.export.js @@ -130,4 +130,3 @@ goog.exportProperty(ol.renderer.Composite, 'isSupported', ol.renderer.Composite. goog.exportProperty(ol.renderer.TileLayerRenderer, 'isSupported', ol.renderer.TileLayerRenderer.isSupported); goog.exportProperty(ol.renderer.TileLayerRenderer, 'canRender', ol.renderer.TileLayerRenderer.canRender); goog.exportProperty(ol.renderer.TileLayerRenderer, 'getType', ol.renderer.TileLayerRenderer.getType); -ol.control.addControl('navigation', ol.control.Navigation); From dea307e53a4be919432c6cfa52dcd7712dfbbe5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 12 Jul 2012 08:18:22 +0200 Subject: [PATCH 38/54] typed objects for map events --- src/ol/handler/Click.js | 6 +++++- src/ol/handler/Drag.js | 25 ++++++++++++------------- src/ol/handler/MouseWheel.js | 9 ++++++--- src/ol/mapevent.js | 36 ++++++++++++++++++++++++++++++++++++ src/ol/mapeventtype.js | 17 +++++++++++++++++ 5 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 src/ol/mapevent.js create mode 100644 src/ol/mapeventtype.js diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js index e19df4bb2d..b4d82ae0a7 100644 --- a/src/ol/handler/Click.js +++ b/src/ol/handler/Click.js @@ -9,6 +9,9 @@ goog.provide('ol.handler.Click'); +goog.require('ol.MapEvent'); +goog.require('ol.MapEventType'); + goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.events.EventType'); @@ -59,6 +62,7 @@ ol.handler.Click.prototype.disposeInternal = function() { ol.handler.Click.prototype.handleClick = function(e) { // do not emit a map click event after a drag if (!this.states_.dragged) { - goog.events.dispatchEvent(this.map_, e); + var newE = new ol.MapEvent(ol.MapEventType.CLICK, e); + goog.events.dispatchEvent(this.map_, newE); } }; diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index ee6dd63285..97b97bb9eb 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -9,6 +9,9 @@ goog.provide('ol.handler.Drag'); +goog.require('ol.MapEvent'); +goog.require('ol.MapEventType'); + goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.events.Event'); @@ -91,9 +94,7 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { this.states_.dragged = false; this.prevX_ = e.clientX; this.prevY_ = e.clientY; - var newE = { - type: 'dragstart' - }; + var newE = new ol.MapEvent(ol.MapEventType.DRAGSTART, e); goog.events.dispatchEvent(this.map_, newE); // this is to prevent page scrolling @@ -109,11 +110,9 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { */ ol.handler.Drag.prototype.handleDrag = function(e) { this.states_.dragged = true; - var newE = { - type: 'drag', - deltaX: e.clientX - this.prevX_, - deltaY: e.clientY - this.prevY_ - }; + var newE = new ol.MapEvent(ol.MapEventType.DRAG, e); + newE.deltaX = e.clientX - this.prevX_; + newE.deltaY = e.clientY - this.prevY_; this.prevX_ = e.clientX; this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); @@ -123,19 +122,19 @@ ol.handler.Drag.prototype.handleDrag = function(e) { }; /** - * @param {{type, deltaX, deltaY}} e + * @param {ol.MapEvent} e */ ol.handler.Drag.prototype.defaultBehavior = function(e) { - this.map_.moveByViewportPx(e.deltaX, e.deltaY); + var deltaX = /** @type {number} */ e.deltaX; + var deltaY = /** @type {number} */ e.deltaY; + this.map_.moveByViewportPx(deltaX, deltaY); }; /** * @param {goog.fx.DragEvent} e */ ol.handler.Drag.prototype.handleDragEnd = function(e) { - var newE = { - type: 'dragend' - }; + var newE = new ol.MapEvent(ol.MapEventType.DRAGEND, e); goog.events.dispatchEvent(this.map_, newE); goog.events.unlisten(this.elt_, [goog.events.EventType.TOUCHMOVE, diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index e6af0bccf5..479fd099db 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -9,6 +9,9 @@ goog.provide('ol.handler.MouseWheel'); +goog.require('ol.MapEvent'); +goog.require('ol.MapEventType'); + goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.style'); @@ -51,8 +54,7 @@ goog.inherits(ol.handler.MouseWheel, goog.Disposable); * @param {goog.events.MouseWheelEvent} e */ ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { - e.position = goog.style.getRelativePosition(e, this.elt_); - e.type = 'mousewheel'; + var newE = new ol.MapEvent(ol.MapEventType.MOUSEWHEEL, e); var rt = goog.events.dispatchEvent(this.map_, e); if (rt) { this.defaultBehavior(e); @@ -73,7 +75,8 @@ ol.handler.MouseWheel.prototype.defaultBehavior = function(e) { var map = me.map_, step = e.deltaY / Math.abs(e.deltaY); - map.setZoom(map.getZoom() - step, e.position); + map.setZoom(map.getZoom() - step, + goog.style.getRelativePosition(e, this.elt_)); // We don't want the page to scroll. // (MouseWheelEvent is a BrowserEvent) diff --git a/src/ol/mapevent.js b/src/ol/mapevent.js new file mode 100644 index 0000000000..aa2279ab11 --- /dev/null +++ b/src/ol/mapevent.js @@ -0,0 +1,36 @@ +goog.provide('ol.MapEvent'); + +goog.require('goog.events.Event'); + +/** + * @constructor + * @extends {goog.events.Event} + * @param {string} type Event type. + * @param {goog.events.Event} evt The wrapped event. + */ +ol.MapEvent = function(type, evt) { + goog.base(this, type); + + /** + * X displacement relative to previous drag. + * + * @type {number|undefined} + */ + this.deltaX = undefined; + + /** + * Y displacement relative to previous drag. + * + * @type {number|undefined} + */ + this.deltaY = undefined; + + /** + * The browser event or closure event (e.g. goog.fx.DragEvent} wrapped + * by this event. + * + * @type {goog.events.Event} + */ + this.event_ = evt; +}; +goog.inherits(ol.MapEvent, goog.events.Event); diff --git a/src/ol/mapeventtype.js b/src/ol/mapeventtype.js new file mode 100644 index 0000000000..6c39093c2d --- /dev/null +++ b/src/ol/mapeventtype.js @@ -0,0 +1,17 @@ +goog.provide('ol.MapEventType'); + +/** + * @enum {string} + */ +ol.MapEventType = { + // drag handler + DRAGSTART: 'dragstart', + DRAG: 'drag', + DRAGEND: 'dragend', + + // mousewheel handler + MOUSEWHEEL: 'mousewheel', + + // click handler + CLICK: 'click' +}; From 8206f11372e4999ba545fc95349ed147585e14ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 12 Jul 2012 08:20:42 +0200 Subject: [PATCH 39/54] be more explicit when calling goog.events.listen and unlisten --- src/ol/control/Attribution.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 9ec0f391b1..b681293e04 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -57,7 +57,7 @@ ol.control.Attribution.prototype.setMap = function(map) { ol.control.Attribution.prototype.activate = function() { var active = goog.base(this, 'activate'); if (active) { - goog.events.listen(this.map_, 'layeradd', this.update, undefined, this); + goog.events.listen(this.map_, 'layeradd', this.update, false, this); this.update(); } return active; @@ -67,7 +67,7 @@ ol.control.Attribution.prototype.activate = function() { ol.control.Attribution.prototype.deactivate = function() { var inactive = goog.base(this, 'deactivate'); if (inactive) { - goog.events.unlisten(this.map_, 'layeradd', this.update, undefined, this); + goog.events.unlisten(this.map_, 'layeradd', this.update, false, this); } return inactive; }; From 1ad915b428e6c764ccecd729139391dddd364364 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 12 Jul 2012 13:43:47 +0200 Subject: [PATCH 40/54] Shuffling resources; better variable names; better type declarations. --- src/ol/{mapevent.js => events/MapEvent.js} | 28 +++++++++++++--- src/ol/handler/Click.js | 17 +++++----- src/ol/handler/Drag.js | 39 +++++++++++----------- src/ol/handler/MouseWheel.js | 19 ++++++----- src/ol/handler/handler.js | 13 ++++++++ src/ol/mapeventtype.js | 17 ---------- 6 files changed, 75 insertions(+), 58 deletions(-) rename src/ol/{mapevent.js => events/MapEvent.js} (50%) create mode 100644 src/ol/handler/handler.js delete mode 100644 src/ol/mapeventtype.js diff --git a/src/ol/mapevent.js b/src/ol/events/MapEvent.js similarity index 50% rename from src/ol/mapevent.js rename to src/ol/events/MapEvent.js index aa2279ab11..33cda51ca7 100644 --- a/src/ol/mapevent.js +++ b/src/ol/events/MapEvent.js @@ -1,25 +1,43 @@ -goog.provide('ol.MapEvent'); +goog.provide('ol.events.MapEvent'); +goog.provide('ol.events.MapEventType'); goog.require('goog.events.Event'); + +/** + * @enum {string} + */ +ol.events.MapEventType = { + // drag handler + DRAGSTART: 'dragstart', + DRAG: 'drag', + DRAGEND: 'dragend', + + // mousewheel handler + MOUSEWHEEL: 'mousewheel', + + // click handler + CLICK: 'click' +}; + /** * @constructor * @extends {goog.events.Event} * @param {string} type Event type. * @param {goog.events.Event} evt The wrapped event. */ -ol.MapEvent = function(type, evt) { +ol.events.MapEvent = function(type, evt) { goog.base(this, type); /** - * X displacement relative to previous drag. + * X displacement relative to the previous drag event, if any. * * @type {number|undefined} */ this.deltaX = undefined; /** - * Y displacement relative to previous drag. + * Y displacement relative to the previous drag event, if any. * * @type {number|undefined} */ @@ -33,4 +51,4 @@ ol.MapEvent = function(type, evt) { */ this.event_ = evt; }; -goog.inherits(ol.MapEvent, goog.events.Event); +goog.inherits(ol.events.MapEvent, goog.events.Event); diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js index b4d82ae0a7..272c6c359d 100644 --- a/src/ol/handler/Click.js +++ b/src/ol/handler/Click.js @@ -9,8 +9,9 @@ goog.provide('ol.handler.Click'); -goog.require('ol.MapEvent'); -goog.require('ol.MapEventType'); +goog.require('ol.handler.states'); +goog.require('ol.events.MapEvent'); +goog.require('ol.events.MapEventType'); goog.require('goog.asserts'); goog.require('goog.events'); @@ -22,10 +23,10 @@ goog.require('goog.Disposable'); * @constructor * @extends {goog.Disposable} * @param {ol.Map} map The map instance. - * @param {Element} elt The element we listen to mousewheel on. + * @param {Element} element The element we listen for click on. * @param {Object} states An object for the handlers to share states. */ -ol.handler.Click = function(map, elt, states) { +ol.handler.Click = function(map, element, states) { goog.base(this); /** @@ -36,14 +37,14 @@ ol.handler.Click = function(map, elt, states) { /** * @type {Element} */ - this.elt_ = elt; + this.element_ = element; /** * @type {Object} */ this.states_ = states; - goog.events.listen(this.elt_, goog.events.EventType.CLICK, + goog.events.listen(this.element_, goog.events.EventType.CLICK, this.handleClick, undefined, this); }; goog.inherits(ol.handler.Click, goog.Disposable); @@ -52,7 +53,7 @@ goog.inherits(ol.handler.Click, goog.Disposable); * @inheritDoc */ ol.handler.Click.prototype.disposeInternal = function() { - goog.events.unlisten(this.elt_, goog.events.EventType.CLICK, + goog.events.unlisten(this.element_, goog.events.EventType.CLICK, this.handleClick, undefined, this); }; @@ -62,7 +63,7 @@ ol.handler.Click.prototype.disposeInternal = function() { ol.handler.Click.prototype.handleClick = function(e) { // do not emit a map click event after a drag if (!this.states_.dragged) { - var newE = new ol.MapEvent(ol.MapEventType.CLICK, e); + var newE = new ol.events.MapEvent(ol.events.MapEventType.CLICK, e); goog.events.dispatchEvent(this.map_, newE); } }; diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 97b97bb9eb..d934020600 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -9,8 +9,9 @@ goog.provide('ol.handler.Drag'); -goog.require('ol.MapEvent'); -goog.require('ol.MapEventType'); +goog.require('ol.handler.states'); +goog.require('ol.events.MapEvent'); +goog.require('ol.events.MapEventType'); goog.require('goog.asserts'); goog.require('goog.events'); @@ -23,10 +24,10 @@ goog.require('goog.fx.Dragger'); * @constructor * @extends {goog.Disposable} * @param {ol.Map} map The map instance. - * @param {Element} elt The element that will be dragged. + * @param {Element} element The element that will be dragged. * @param {Object} states An object for the handlers to share states. */ -ol.handler.Drag = function(map, elt, states) { +ol.handler.Drag = function(map, element, states) { goog.base(this); /** @@ -37,7 +38,7 @@ ol.handler.Drag = function(map, elt, states) { /** * @type {Element} */ - this.elt_ = elt; + this.element_ = element; /** * @type {Object} @@ -47,7 +48,7 @@ ol.handler.Drag = function(map, elt, states) { /** * @type {goog.fx.Dragger} */ - this.dragger_ = new goog.fx.Dragger(elt); + this.dragger_ = new goog.fx.Dragger(element); var dragger = this.dragger_; dragger.defaultAction = function() {}; @@ -80,7 +81,7 @@ goog.inherits(ol.handler.Drag, goog.Disposable); ol.handler.Drag.prototype.disposeInternal = function() { goog.base(this, 'disposeInternal'); goog.dispose(this.dragger_); - goog.events.unlisten(this.elt_, + goog.events.unlisten(this.element_, [goog.events.EventType.TOUCHMOVE, goog.events.EventType.MOUSEMOVE], goog.events.Event.preventDefault, false, this); @@ -94,11 +95,11 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { this.states_.dragged = false; this.prevX_ = e.clientX; this.prevY_ = e.clientY; - var newE = new ol.MapEvent(ol.MapEventType.DRAGSTART, e); + var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAGSTART, e); goog.events.dispatchEvent(this.map_, newE); // this is to prevent page scrolling - goog.events.listen(this.elt_, + goog.events.listen(this.element_, [goog.events.EventType.TOUCHMOVE, goog.events.EventType.MOUSEMOVE], goog.events.Event.preventDefault, false, this); @@ -110,9 +111,9 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { */ ol.handler.Drag.prototype.handleDrag = function(e) { this.states_.dragged = true; - var newE = new ol.MapEvent(ol.MapEventType.DRAG, e); - newE.deltaX = e.clientX - this.prevX_; - newE.deltaY = e.clientY - this.prevY_; + var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAG, e); + newE.delementaX = e.clientX - this.prevX_; + newE.delementaY = e.clientY - this.prevY_; this.prevX_ = e.clientX; this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); @@ -122,21 +123,21 @@ ol.handler.Drag.prototype.handleDrag = function(e) { }; /** - * @param {ol.MapEvent} e + * @param {ol.events.MapEvent} e */ ol.handler.Drag.prototype.defaultBehavior = function(e) { - var deltaX = /** @type {number} */ e.deltaX; - var deltaY = /** @type {number} */ e.deltaY; - this.map_.moveByViewportPx(deltaX, deltaY); + var delementaX = /** @type {number} */ e.delementaX; + var delementaY = /** @type {number} */ e.delementaY; + this.map_.moveByViewportPx(delementaX, delementaY); }; /** * @param {goog.fx.DragEvent} e */ ol.handler.Drag.prototype.handleDragEnd = function(e) { - var newE = new ol.MapEvent(ol.MapEventType.DRAGEND, e); + var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAGEND, e); goog.events.dispatchEvent(this.map_, newE); - goog.events.unlisten(this.elt_, + goog.events.unlisten(this.element_, [goog.events.EventType.TOUCHMOVE, goog.events.EventType.MOUSEMOVE], goog.events.Event.preventDefault, false, this); @@ -146,7 +147,7 @@ ol.handler.Drag.prototype.handleDragEnd = function(e) { * @param {goog.fx.DragEvent} e */ ol.handler.Drag.prototype.handleDragEarlyCancel = function(e) { - goog.events.unlisten(this.elt_, + goog.events.unlisten(this.element_, [goog.events.EventType.TOUCHMOVE, goog.events.EventType.MOUSEMOVE], goog.events.Event.preventDefault, false, this); diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 479fd099db..3625ce0051 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -9,8 +9,9 @@ goog.provide('ol.handler.MouseWheel'); -goog.require('ol.MapEvent'); -goog.require('ol.MapEventType'); +goog.require('ol.handler.states'); +goog.require('ol.events.MapEvent'); +goog.require('ol.events.MapEventType'); goog.require('goog.asserts'); goog.require('goog.events'); @@ -24,10 +25,10 @@ goog.require('goog.events.MouseWheelHandler.EventType'); * @constructor * @extends {goog.Disposable} * @param {ol.Map} map The map instance. - * @param {Element} elt The element we listen to mousewheel on. + * @param {Element} element The element we listen to mousewheel on. * @param {Object} states An object for the handlers to share states. */ -ol.handler.MouseWheel = function(map, elt, states) { +ol.handler.MouseWheel = function(map, element, states) { goog.base(this); /** @@ -38,9 +39,9 @@ ol.handler.MouseWheel = function(map, elt, states) { /** * @type {Element} */ - this.elt_ = elt; + this.element_ = element; - var handler = new goog.events.MouseWheelHandler(elt); + var handler = new goog.events.MouseWheelHandler(element); this.registerDisposable(handler); goog.events.listen(handler, @@ -54,8 +55,8 @@ goog.inherits(ol.handler.MouseWheel, goog.Disposable); * @param {goog.events.MouseWheelEvent} e */ ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { - var newE = new ol.MapEvent(ol.MapEventType.MOUSEWHEEL, e); - var rt = goog.events.dispatchEvent(this.map_, e); + var newE = new ol.events.MapEvent(ol.events.MapEventType.MOUSEWHEEL, e); + var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { this.defaultBehavior(e); } @@ -76,7 +77,7 @@ ol.handler.MouseWheel.prototype.defaultBehavior = function(e) { var map = me.map_, step = e.deltaY / Math.abs(e.deltaY); map.setZoom(map.getZoom() - step, - goog.style.getRelativePosition(e, this.elt_)); + goog.style.getRelativePosition(e, this.element_)); // We don't want the page to scroll. // (MouseWheelEvent is a BrowserEvent) diff --git a/src/ol/handler/handler.js b/src/ol/handler/handler.js new file mode 100644 index 0000000000..0360fbf0d5 --- /dev/null +++ b/src/ol/handler/handler.js @@ -0,0 +1,13 @@ +goog.provide('ol.handler.states'); + +/** + * Type definition for shared states between handlers. The following states + * are defined: + * + * * dragged {boolean} - Set by the Drag handler when we are dragging. Read by + * the click handler to determine if a click is a real click or the result + * of a mouseup/touchend at the end of a drag sequence. + * + * @typedef {{dragged: boolean}} + */ +ol.handler.states; \ No newline at end of file diff --git a/src/ol/mapeventtype.js b/src/ol/mapeventtype.js deleted file mode 100644 index 6c39093c2d..0000000000 --- a/src/ol/mapeventtype.js +++ /dev/null @@ -1,17 +0,0 @@ -goog.provide('ol.MapEventType'); - -/** - * @enum {string} - */ -ol.MapEventType = { - // drag handler - DRAGSTART: 'dragstart', - DRAG: 'drag', - DRAGEND: 'dragend', - - // mousewheel handler - MOUSEWHEEL: 'mousewheel', - - // click handler - CLICK: 'click' -}; From f672303f0a549d58c8246bb4986085078995fdc8 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 12 Jul 2012 15:21:15 +0200 Subject: [PATCH 41/54] New MapHandler base class; better API docs --- src/ol/Map.js | 2 +- src/ol/handler/Click.js | 30 +++++--------------- src/ol/handler/Drag.js | 40 ++++++++------------------ src/ol/handler/MapHandler.js | 54 ++++++++++++++++++++++++++++++++++++ src/ol/handler/MouseWheel.js | 33 ++++++++-------------- src/ol/handler/handler.js | 13 --------- 6 files changed, 85 insertions(+), 87 deletions(-) create mode 100644 src/ol/handler/MapHandler.js delete mode 100644 src/ol/handler/handler.js diff --git a/src/ol/Map.js b/src/ol/Map.js index f0dc399523..382c71890f 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -525,7 +525,7 @@ ol.Map.prototype.initHandlers = function() { goog.asserts.assert(!goog.isNull(this.viewport_)); var handler, - states = {}; + states = /** @type {ol.handler.states} */ ({}); if (ol.ENABLE_DRAG_HANDLER) { handler = new ol.handler.Drag(this, this.viewport_, states); diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js index 272c6c359d..4fb3626fcb 100644 --- a/src/ol/handler/Click.js +++ b/src/ol/handler/Click.js @@ -2,52 +2,36 @@ * @fileoverview Click Handler. * * Provides a class for listening to click events on a DOM element - * and re-dispatching to a map instance. + * and dispatching click events to a map instance. * * This handler has no default behaviour. */ goog.provide('ol.handler.Click'); -goog.require('ol.handler.states'); +goog.require('ol.handler.MapHandler'); goog.require('ol.events.MapEvent'); goog.require('ol.events.MapEventType'); -goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.events.EventType'); -goog.require('goog.Disposable'); /** * @constructor - * @extends {goog.Disposable} + * @extends {ol.handler.MapHandler} * @param {ol.Map} map The map instance. * @param {Element} element The element we listen for click on. - * @param {Object} states An object for the handlers to share states. + * @param {ol.handler.states} states An object for the handlers to share + * states. */ ol.handler.Click = function(map, element, states) { - goog.base(this); - - /** - * @type {ol.Map} - */ - this.map_ = map; - - /** - * @type {Element} - */ - this.element_ = element; - - /** - * @type {Object} - */ - this.states_ = states; + goog.base(this, map, element, states); goog.events.listen(this.element_, goog.events.EventType.CLICK, this.handleClick, undefined, this); }; -goog.inherits(ol.handler.Click, goog.Disposable); +goog.inherits(ol.handler.Click, ol.handler.MapHandler); /** * @inheritDoc diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index d934020600..be682bc4fb 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -1,49 +1,33 @@ /** * @fileoverview Drag Handler. * - * Provides a class for listening to drag events on a DOM element and - * re-dispatching to a map object. + * Provides a class for listening to drag sequences on a DOM element and + * dispatching dragstart, drag and dragend events to a map object. * - * The default behavior is moving the map. + * The default behavior for the drag event is moving the map. */ goog.provide('ol.handler.Drag'); -goog.require('ol.handler.states'); +goog.require('ol.handler.MapHandler'); goog.require('ol.events.MapEvent'); goog.require('ol.events.MapEventType'); -goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.events.Event'); goog.require('goog.events.EventType'); -goog.require('goog.Disposable'); goog.require('goog.fx.Dragger'); /** * @constructor - * @extends {goog.Disposable} + * @extends {ol.handler.MapHandler} * @param {ol.Map} map The map instance. - * @param {Element} element The element that will be dragged. - * @param {Object} states An object for the handlers to share states. + * @param {Element} element The element we listen for click on. + * @param {ol.handler.states} states An object for the handlers to share + * states. */ ol.handler.Drag = function(map, element, states) { - goog.base(this); - - /** - * @type {ol.Map} - */ - this.map_ = map; - - /** - * @type {Element} - */ - this.element_ = element; - - /** - * @type {Object} - */ - this.states_ = states; + goog.base(this, map, element, states); /** * @type {goog.fx.Dragger} @@ -73,7 +57,7 @@ ol.handler.Drag = function(map, element, states) { this.handleDragEarlyCancel, false, this); }; -goog.inherits(ol.handler.Drag, goog.Disposable); +goog.inherits(ol.handler.Drag, ol.handler.MapHandler); /** * @inheritDoc @@ -118,14 +102,14 @@ ol.handler.Drag.prototype.handleDrag = function(e) { this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - this.defaultBehavior(newE); + this.defaultDrag(newE); } }; /** * @param {ol.events.MapEvent} e */ -ol.handler.Drag.prototype.defaultBehavior = function(e) { +ol.handler.Drag.prototype.defaultDrag = function(e) { var delementaX = /** @type {number} */ e.delementaX; var delementaY = /** @type {number} */ e.delementaY; this.map_.moveByViewportPx(delementaX, delementaY); diff --git a/src/ol/handler/MapHandler.js b/src/ol/handler/MapHandler.js new file mode 100644 index 0000000000..8b99594873 --- /dev/null +++ b/src/ol/handler/MapHandler.js @@ -0,0 +1,54 @@ +/** + * @fileoverview Map Handler. + * + * Type definitions and base class for map event handlers that share states, + * listen for events on a map related dom element (usually the map's viewport), + * dispatch events to an ol.Map instance, and optionally perform default + * actions on an ol.Map instance. + */ + +goog.provide('ol.handler.states'); +goog.provide('ol.handler.MapHandler'); + +goog.require('goog.Disposable'); + +/** + * Type definition for shared states between handlers. The following states + * are defined: + * + * * dragged (boolean) - Set by the Drag handler when we are dragging. Read by + * the click handler to determine if a click is a real click or the result + * of a mouseup/touchend at the end of a drag sequence. + * + * @typedef {{dragged: boolean}} + */ +ol.handler.states; + +/** + * @constructor + * @extends {goog.Disposable} + * @param {ol.Map} map The map instance. + * @param {Element} element The element we listen for browser events on. + * @param {ol.handler.states} states An object for the handlers to share + * states. + */ +ol.handler.MapHandler = function(map, element, states) { + goog.base(this); + + /** + * @type {ol.Map} + */ + this.map_ = map; + + /** + * @type {Element} + */ + this.element_ = element; + + /** + * @type {ol.handler.states} + */ + this.states_ = states; + +}; +goog.inherits(ol.handler.MapHandler, goog.Disposable); \ No newline at end of file diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 3625ce0051..53dca0672a 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -2,44 +2,33 @@ * @fileoverview Mouse Wheel Handler. * * Provides a class for listening to mousewheel events on a DOM element - * and re-dispatching to a map instance. + * and dispatching mousewheel events to a map instance. * - * The default behabior is zooming the map. + * The default behavior for the mousewheel event is zooming the map. */ goog.provide('ol.handler.MouseWheel'); -goog.require('ol.handler.states'); +goog.require('ol.handler.MapHandler'); goog.require('ol.events.MapEvent'); goog.require('ol.events.MapEventType'); -goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.style'); -goog.require('goog.Disposable'); goog.require('goog.events.MouseWheelHandler'); goog.require('goog.events.MouseWheelHandler.EventType'); /** * @constructor - * @extends {goog.Disposable} + * @extends {ol.handler.MapHandler} * @param {ol.Map} map The map instance. - * @param {Element} element The element we listen to mousewheel on. - * @param {Object} states An object for the handlers to share states. + * @param {Element} element The element we listen for click on. + * @param {ol.handler.states} states An object for the handlers to share + * states. */ ol.handler.MouseWheel = function(map, element, states) { - goog.base(this); - - /** - * @type {ol.Map} - */ - this.map_ = map; - - /** - * @type {Element} - */ - this.element_ = element; + goog.base(this, map, element, states); var handler = new goog.events.MouseWheelHandler(element); this.registerDisposable(handler); @@ -49,7 +38,7 @@ ol.handler.MouseWheel = function(map, element, states) { this.handleMouseWheel, false, this); }; -goog.inherits(ol.handler.MouseWheel, goog.Disposable); +goog.inherits(ol.handler.MouseWheel, ol.handler.MapHandler); /** * @param {goog.events.MouseWheelEvent} e @@ -58,14 +47,14 @@ ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { var newE = new ol.events.MapEvent(ol.events.MapEventType.MOUSEWHEEL, e); var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - this.defaultBehavior(e); + this.defaultMouseWheel(e); } }; /** * @param {goog.events.MouseWheelEvent} e */ -ol.handler.MouseWheel.prototype.defaultBehavior = function(e) { +ol.handler.MouseWheel.prototype.defaultMouseWheel = function(e) { var me = this; if (e.deltaY === 0 || me.zoomBlocked_) { return; diff --git a/src/ol/handler/handler.js b/src/ol/handler/handler.js deleted file mode 100644 index 0360fbf0d5..0000000000 --- a/src/ol/handler/handler.js +++ /dev/null @@ -1,13 +0,0 @@ -goog.provide('ol.handler.states'); - -/** - * Type definition for shared states between handlers. The following states - * are defined: - * - * * dragged {boolean} - Set by the Drag handler when we are dragging. Read by - * the click handler to determine if a click is a real click or the result - * of a mouseup/touchend at the end of a drag sequence. - * - * @typedef {{dragged: boolean}} - */ -ol.handler.states; \ No newline at end of file From 42c4c9d86968bd29cefaf224234d3893be4fca83 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 12 Jul 2012 20:44:32 +0200 Subject: [PATCH 42/54] No need to pass the element to the constructor. If MapHandler subclasses could live without a map, it would make sense to have a constructor with a target and an element. But because the target is always the map, and the handler need to know about the map for performing default behavior, we always assume the map's viewport as element. --- src/ol/Map.js | 6 +++--- src/ol/handler/Click.js | 5 ++--- src/ol/handler/Drag.js | 7 +++---- src/ol/handler/MapHandler.js | 8 +++++--- src/ol/handler/MouseWheel.js | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/ol/Map.js b/src/ol/Map.js index 382c71890f..cadf228e04 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -528,15 +528,15 @@ ol.Map.prototype.initHandlers = function() { states = /** @type {ol.handler.states} */ ({}); if (ol.ENABLE_DRAG_HANDLER) { - handler = new ol.handler.Drag(this, this.viewport_, states); + handler = new ol.handler.Drag(this, states); this.registerDisposable(handler); } if (ol.ENABLE_MOUSEWHEEL_HANDLER) { - handler = new ol.handler.MouseWheel(this, this.viewport_, states); + handler = new ol.handler.MouseWheel(this, states); this.registerDisposable(handler); } if (ol.ENABLE_CLICK_HANDLER) { - handler = new ol.handler.Click(this, this.viewport_, states); + handler = new ol.handler.Click(this, states); this.registerDisposable(handler); } }; diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js index 4fb3626fcb..991175ec2d 100644 --- a/src/ol/handler/Click.js +++ b/src/ol/handler/Click.js @@ -21,12 +21,11 @@ goog.require('goog.events.EventType'); * @constructor * @extends {ol.handler.MapHandler} * @param {ol.Map} map The map instance. - * @param {Element} element The element we listen for click on. * @param {ol.handler.states} states An object for the handlers to share * states. */ -ol.handler.Click = function(map, element, states) { - goog.base(this, map, element, states); +ol.handler.Click = function(map, states) { + goog.base(this, map, states); goog.events.listen(this.element_, goog.events.EventType.CLICK, this.handleClick, undefined, this); diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index be682bc4fb..ecd97a992f 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -22,17 +22,16 @@ goog.require('goog.fx.Dragger'); * @constructor * @extends {ol.handler.MapHandler} * @param {ol.Map} map The map instance. - * @param {Element} element The element we listen for click on. * @param {ol.handler.states} states An object for the handlers to share * states. */ -ol.handler.Drag = function(map, element, states) { - goog.base(this, map, element, states); +ol.handler.Drag = function(map, states) { + goog.base(this, map, states); /** * @type {goog.fx.Dragger} */ - this.dragger_ = new goog.fx.Dragger(element); + this.dragger_ = new goog.fx.Dragger(this.element_); var dragger = this.dragger_; dragger.defaultAction = function() {}; diff --git a/src/ol/handler/MapHandler.js b/src/ol/handler/MapHandler.js index 8b99594873..188fd03288 100644 --- a/src/ol/handler/MapHandler.js +++ b/src/ol/handler/MapHandler.js @@ -28,25 +28,27 @@ ol.handler.states; * @constructor * @extends {goog.Disposable} * @param {ol.Map} map The map instance. - * @param {Element} element The element we listen for browser events on. * @param {ol.handler.states} states An object for the handlers to share * states. */ -ol.handler.MapHandler = function(map, element, states) { +ol.handler.MapHandler = function(map, states) { goog.base(this); /** * @type {ol.Map} + * @protected */ this.map_ = map; /** * @type {Element} + * @protected */ - this.element_ = element; + this.element_ = map.getViewport(); /** * @type {ol.handler.states} + * @protected */ this.states_ = states; diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 53dca0672a..48b483294c 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -13,6 +13,7 @@ goog.require('ol.handler.MapHandler'); goog.require('ol.events.MapEvent'); goog.require('ol.events.MapEventType'); +goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.style'); goog.require('goog.events.MouseWheelHandler'); @@ -23,14 +24,13 @@ goog.require('goog.events.MouseWheelHandler.EventType'); * @constructor * @extends {ol.handler.MapHandler} * @param {ol.Map} map The map instance. - * @param {Element} element The element we listen for click on. * @param {ol.handler.states} states An object for the handlers to share * states. */ -ol.handler.MouseWheel = function(map, element, states) { - goog.base(this, map, element, states); +ol.handler.MouseWheel = function(map, states) { + goog.base(this, map, states); - var handler = new goog.events.MouseWheelHandler(element); + var handler = new goog.events.MouseWheelHandler(this.element_); this.registerDisposable(handler); goog.events.listen(handler, From 3cc069186c7b5aeb73103c83c94ba511143d34c7 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 12 Jul 2012 20:51:47 +0200 Subject: [PATCH 43/54] Allow for using a different set of default behaviors. The default behavior of dragging and wheel zooming feels specific to 2D maps. So I think it makes sense to introduce a special type of controls (ol.control.DefaultControl) that implement default behaviors. This change also re-introduces the Navigatin control, which is a container for the default behaviors that were previously defined in the map handlers. Maybe this control needs to be renamed to Navigatin2D in the future, and there could be a different Navigation control for 3D maps. --- src/ol.js | 1 + src/ol/Map.js | 24 ++++++++++++-- src/ol/control/Control.js | 3 +- src/ol/control/DefaultControl.js | 50 +++++++++++++++++++++++++++++ src/ol/control/Navigation.js | 54 ++++++++++++++++++++++++++++++++ src/ol/handler/Drag.js | 18 ++++------- src/ol/handler/MapHandler.js | 2 +- src/ol/handler/MouseWheel.js | 29 +++-------------- 8 files changed, 141 insertions(+), 40 deletions(-) create mode 100644 src/ol/control/DefaultControl.js create mode 100644 src/ol/control/Navigation.js diff --git a/src/ol.js b/src/ol.js index 8c936f0329..2ff8dfea9a 100644 --- a/src/ol.js +++ b/src/ol.js @@ -2,6 +2,7 @@ goog.provide("ol"); goog.require('ol.base'); goog.require('ol.bounds'); +goog.require('ol.control.Navigation'); goog.require('ol.control.Attribution'); goog.require('ol.control.Zoom'); goog.require('ol.handler.Drag'); diff --git a/src/ol/Map.js b/src/ol/Map.js index cadf228e04..b4dd0d3c8b 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -88,6 +88,12 @@ ol.Map = function() { * @type {Array} */ this.controls_ = null; + + /** + * @private + * @type {ol.control.DefaultControl} + */ + this.defaultControl_ = null; /** * @private @@ -157,7 +163,7 @@ ol.Map.DEFAULT_TILE_SIZE = 256; @const @type {Array.} */ -ol.Map.DEFAULT_CONTROLS = ["attribution", "zoom"]; +ol.Map.CONTROLS = ["navigation", "attribution", "zoom"]; /** * @return {ol.Loc} Map center in map projection. @@ -443,6 +449,20 @@ ol.Map.prototype.addLayers = function(layers) { }; +/** + * @returns {ol.control.DefaultControl} + */ +ol.Map.prototype.getDefaultControl = function() { + return this.defaultControl_; +}; + +/** + * @param {ol.control.DefaultControl} control + */ +ol.Map.prototype.setDefaultControl = function(control) { + this.defaultControl_ = control; +}; + /** * @param {Array.|undefined} opt_controls */ @@ -483,7 +503,7 @@ ol.Map.prototype.setContainer = function(container) { this.createRenderer(); //TODO Controls could be set earlier, but we need to deal with content that // controls place on overlays. - this.setControls(ol.Map.DEFAULT_CONTROLS); + this.setControls(ol.Map.CONTROLS); // conditionally render this.conditionallyRender(); }; diff --git a/src/ol/control/Control.js b/src/ol/control/Control.js index eaa1c693d6..b6d1264ac9 100644 --- a/src/ol/control/Control.js +++ b/src/ol/control/Control.js @@ -31,7 +31,7 @@ ol.control.Control = function(opt_autoActivate) { /** * @type {boolean} active - * @private + * @protected */ this.active_ = false; @@ -42,6 +42,7 @@ ol.control.Control = function(opt_autoActivate) { */ this.autoActivate_ = goog.isDef(opt_autoActivate) ? opt_autoActivate : false; + }; /** diff --git a/src/ol/control/DefaultControl.js b/src/ol/control/DefaultControl.js new file mode 100644 index 0000000000..683171017d --- /dev/null +++ b/src/ol/control/DefaultControl.js @@ -0,0 +1,50 @@ +goog.provide('ol.control.DefaultControl'); + +goog.require('ol.control.Control'); + +/** + * @constructor + * @extends {ol.control.Control} + * @param {boolean|undefined} opt_autoActivate + */ +ol.control.DefaultControl = function(opt_autoActivate) { + goog.base(this, opt_autoActivate); + + /** + * Activate this control when it is added to a map. Default is true. + * + * @type {boolean} autoActivate + */ + this.autoActivate_ = + goog.isDef(opt_autoActivate) ? opt_autoActivate : true; + +}; +goog.inherits(ol.control.DefaultControl, ol.control.Control); + +/** @inheritDoc */ +ol.control.DefaultControl.prototype.activate = function() { + var active = goog.base(this, 'activate'); + if (active) { + this.map_.setDefaultControl(this); + } + return active; +}; + +/** @inheritDoc */ +ol.control.DefaultControl.prototype.deactivate = function() { + var inactive = goog.base(this, 'deactivate'); + if (inactive) { + this.map_.setDefaultControl(null); + } + return inactive; +}; + +/** + * @param {ol.events.MapEvent} e + */ +ol.control.DefaultControl.prototype.defaultDrag = function(e) {}; + +/** + * @param {ol.events.MapEvent} e + */ +ol.control.DefaultControl.prototype.defaultMouseWheel = function(e) {}; diff --git a/src/ol/control/Navigation.js b/src/ol/control/Navigation.js new file mode 100644 index 0000000000..9255b412aa --- /dev/null +++ b/src/ol/control/Navigation.js @@ -0,0 +1,54 @@ +goog.provide('ol.control.Navigation'); + +goog.require('ol.control.DefaultControl'); +goog.require('ol.Map'); + +/** + * @constructor + * @extends {ol.control.DefaultControl} + * @param {boolean|undefined} opt_autoActivate + */ +ol.control.Navigation = function(opt_autoActivate) { + goog.base(this, opt_autoActivate); +}; +goog.inherits(ol.control.Navigation, ol.control.DefaultControl); + + +/** + * @inheritDoc + */ +ol.control.Navigation.prototype.defaultDrag = function(e) { + if (ol.ENABLE_DRAG_HANDLER) { + var deltaX = /** @type {number} */ e.deltaX; + var deltaY = /** @type {number} */ e.deltaY; + this.map_.moveByViewportPx(deltaX, deltaY); + } +}; + +/** + * @inheritDoc + */ +ol.control.Navigation.prototype.defaultMouseWheel = function(e) { + if (ol.ENABLE_MOUSEWHEEL_HANDLER) { + var me = this, + originalE = e.originalEvent; + if (originalE.deltaY === 0 || me.zoomBlocked_) { + return; + } + me.zoomBlocked_ = window.setTimeout(function() { + me.zoomBlocked_ = null; + }, 200); + + var map = me.map_, + step = originalE.deltaY / Math.abs(originalE.deltaY), + position = goog.style.getRelativePosition(originalE, + map.getViewport()); + map.setZoom(map.getZoom() - step, position); + + // We don't want the page to scroll. + // (MouseWheelEvent is a originalEvent) + e.preventDefault(); + } +}; + +ol.control.addControl('navigation', ol.control.Navigation); diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index ecd97a992f..0b04294823 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -95,25 +95,19 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { ol.handler.Drag.prototype.handleDrag = function(e) { this.states_.dragged = true; var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAG, e); - newE.delementaX = e.clientX - this.prevX_; - newE.delementaY = e.clientY - this.prevY_; + newE.deltaX = e.clientX - this.prevX_; + newE.deltaY = e.clientY - this.prevY_; this.prevX_ = e.clientX; this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - this.defaultDrag(newE); + var defaultControl = this.map_.getDefaultControl(); + if (defaultControl) { + defaultControl.defaultDrag(newE); + } } }; -/** - * @param {ol.events.MapEvent} e - */ -ol.handler.Drag.prototype.defaultDrag = function(e) { - var delementaX = /** @type {number} */ e.delementaX; - var delementaY = /** @type {number} */ e.delementaY; - this.map_.moveByViewportPx(delementaX, delementaY); -}; - /** * @param {goog.fx.DragEvent} e */ diff --git a/src/ol/handler/MapHandler.js b/src/ol/handler/MapHandler.js index 188fd03288..243380cc5f 100644 --- a/src/ol/handler/MapHandler.js +++ b/src/ol/handler/MapHandler.js @@ -4,7 +4,7 @@ * Type definitions and base class for map event handlers that share states, * listen for events on a map related dom element (usually the map's viewport), * dispatch events to an ol.Map instance, and optionally perform default - * actions on an ol.Map instance. + * actions on the map's default control. */ goog.provide('ol.handler.states'); diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 48b483294c..042fd7423e 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -47,28 +47,9 @@ ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { var newE = new ol.events.MapEvent(ol.events.MapEventType.MOUSEWHEEL, e); var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - this.defaultMouseWheel(e); + var defaultControl = this.map_.getDefaultControl(); + if (defaultControl) { + defaultControl.defaultMouseWheel(newE); + } } -}; - -/** - * @param {goog.events.MouseWheelEvent} e - */ -ol.handler.MouseWheel.prototype.defaultMouseWheel = function(e) { - var me = this; - if (e.deltaY === 0 || me.zoomBlocked_) { - return; - } - me.zoomBlocked_ = window.setTimeout(function() { - me.zoomBlocked_ = null; - }, 200); - - var map = me.map_, - step = e.deltaY / Math.abs(e.deltaY); - map.setZoom(map.getZoom() - step, - goog.style.getRelativePosition(e, this.element_)); - - // We don't want the page to scroll. - // (MouseWheelEvent is a BrowserEvent) - e.preventDefault(); -}; +}; \ No newline at end of file From 8183164298fd40f96f9a2cab7dc3eb7f719b30d7 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 12 Jul 2012 23:47:16 +0200 Subject: [PATCH 44/54] The underlying event will be needed frequently. But there will also be events that don't have an underlying event, so we make it optional. --- src/ol/events/MapEvent.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ol/events/MapEvent.js b/src/ol/events/MapEvent.js index 33cda51ca7..4428d62761 100644 --- a/src/ol/events/MapEvent.js +++ b/src/ol/events/MapEvent.js @@ -24,9 +24,9 @@ ol.events.MapEventType = { * @constructor * @extends {goog.events.Event} * @param {string} type Event type. - * @param {goog.events.Event} evt The wrapped event. + * @param {goog.events.Event=} opt_evt The underlying event. */ -ol.events.MapEvent = function(type, evt) { +ol.events.MapEvent = function(type, opt_evt) { goog.base(this, type); /** @@ -42,13 +42,12 @@ ol.events.MapEvent = function(type, evt) { * @type {number|undefined} */ this.deltaY = undefined; - + /** - * The browser event or closure event (e.g. goog.fx.DragEvent} wrapped - * by this event. + * The underlying event. * * @type {goog.events.Event} */ - this.event_ = evt; + this.originalEvent = goog.isDef(opt_evt) ? opt_evt : null; }; goog.inherits(ol.events.MapEvent, goog.events.Event); From ba986e536d755f6224f25715feefd54435b5e139 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 12 Jul 2012 23:47:37 +0200 Subject: [PATCH 45/54] We decided to be explicit about bubble/capture. --- src/ol/handler/Click.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js index 991175ec2d..8bcb4e79a8 100644 --- a/src/ol/handler/Click.js +++ b/src/ol/handler/Click.js @@ -28,7 +28,7 @@ ol.handler.Click = function(map, states) { goog.base(this, map, states); goog.events.listen(this.element_, goog.events.EventType.CLICK, - this.handleClick, undefined, this); + this.handleClick, false, this); }; goog.inherits(ol.handler.Click, ol.handler.MapHandler); @@ -37,7 +37,7 @@ goog.inherits(ol.handler.Click, ol.handler.MapHandler); */ ol.handler.Click.prototype.disposeInternal = function() { goog.events.unlisten(this.element_, goog.events.EventType.CLICK, - this.handleClick, undefined, this); + this.handleClick, false, this); }; /** From f4532f1548ab589a69bfa2a00bf27398a72b8664 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Thu, 12 Jul 2012 23:48:13 +0200 Subject: [PATCH 46/54] Completing tests for map handlers. --- test/spec/ol/handler/Click.test.js | 40 ++++++++++++++-- test/spec/ol/handler/Drag.test.js | 62 +++++++++++++++++++++++-- test/spec/ol/handler/MouseWheel.test.js | 32 ++++++++++++- 3 files changed, 124 insertions(+), 10 deletions(-) diff --git a/test/spec/ol/handler/Click.test.js b/test/spec/ol/handler/Click.test.js index 9b5082c64a..325b0cf24b 100644 --- a/test/spec/ol/handler/Click.test.js +++ b/test/spec/ol/handler/Click.test.js @@ -1,17 +1,47 @@ describe('ol.handler.Click', function() { - var map, elt; + var map, elt, listener; beforeEach(function() { map = new ol.Map(); - elt = goog.dom.createDom('div'); + elt = new goog.events.EventTarget(); + map.viewport_ = elt; + listener = {fn: function() {}}; + spyOn(listener, 'fn'); }); - describe('create a drag handler', function() { + describe('creating a drag handler', function() { it('returns an ol.handler.Click instance', function() { - var handler = new ol.handler.Click(map, elt, {}); + var handler = new ol.handler.Click(map, {}); expect(handler).toBeA(ol.handler.Click); }); - + + }); + + describe('dispatching events', function() { + + it('dispatches a click event which is an ol.events.MapEvent', function() { + new ol.handler.Click(map, {}); + goog.events.listen(map, 'click', listener.fn); + + goog.events.fireListeners(elt, 'click', false, 'foo'); + var evt = listener.fn.calls[0].args[0]; + expect(evt).toBeA(ol.events.MapEvent); + expect(evt.originalEvent).toBe('foo'); + }); + + it('ignores click events when the dragged state is set', function() { + var states = {}; + new ol.handler.Click(map, states); + goog.events.listen(map, 'click', listener.fn); + + goog.events.fireListeners(elt, 'click', false); + expect(listener.fn.calls.length).toBe(1); + + states.dragged = true; + goog.events.fireListeners(elt, 'click', false); + expect(listener.fn.calls.length).toBe(1); + }); + }); }); diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js index 3b82a92463..379ea75801 100644 --- a/test/spec/ol/handler/Drag.test.js +++ b/test/spec/ol/handler/Drag.test.js @@ -3,15 +3,71 @@ describe('ol.handler.Drag', function() { beforeEach(function() { map = new ol.Map(); - elt = goog.dom.createDom('div'); + elt = new goog.events.EventTarget(); + map.viewport_ = elt; + listener = {fn: function() {}}; + spyOn(listener, 'fn'); }); - describe('create a drag handler', function() { + describe('creating a drag handler', function() { it('returns an ol.handler.Drag instance', function() { - var handler = new ol.handler.Drag(map, elt, {}); + var handler = new ol.handler.Drag(map, {}); expect(handler).toBeA(ol.handler.Drag); }); }); + + describe('dispatching events', function() { + + it('dragstart, drag and dragend events', function() { + var handler = new ol.handler.Drag(map, {}); + goog.events.listen(map, 'dragstart', listener.fn); + goog.events.listen(map, 'drag', listener.fn); + goog.events.listen(map, 'dragend', listener.fn); + + handler.dragger_.dispatchEvent({type: 'start'}); + handler.dragger_.dispatchEvent({type: 'drag'}); + handler.dragger_.dispatchEvent({type: 'end'}); + + expect(listener.fn.calls[0].args[0].type).toBe('dragstart'); + expect(listener.fn.calls[1].args[0].type).toBe('drag'); + expect(listener.fn.calls[2].args[0].type).toBe('dragend'); + }); + + it('sets the dragged state during a drag sequence', function() { + var states = {}; + var handler = new ol.handler.Drag(map, states); + + handler.dragger_.dispatchEvent({type: 'drag'}); + expect(states.dragged).toBe(true); + + handler.dragger_.dispatchEvent({type: 'start'}); + expect(states.dragged).toBe(false); + }); + + it('sets deltaX and deltaY on the ol.event.MapEvent', function() { + var handler = new ol.handler.Drag(map, {}); + goog.events.listen(map, 'drag', listener.fn); + + handler.dragger_.dispatchEvent({type: 'start', clientX: 2, clientY: 4}); + handler.dragger_.dispatchEvent({type: 'drag', clientX: 1, clientY: 2}); + handler.dragger_.dispatchEvent({type: 'drag', clientX: 2, clientY: 4}); + + expect(listener.fn.calls[0].args[0].deltaX).toBe(-1); + expect(listener.fn.calls[0].args[0].deltaY).toBe(-2); + expect(listener.fn.calls[1].args[0].deltaX).toBe(1); + expect(listener.fn.calls[1].args[0].deltaY).toBe(2); + }); + + it('calls the default action on the default control', function() { + var control = new ol.control.DefaultControl(); + spyOn(control, 'defaultDrag'); + map.setDefaultControl(control); + var handler = new ol.handler.Drag(map, {}); + + handler.dragger_.dispatchEvent({type: 'drag'}); + expect(control.defaultDrag).toHaveBeenCalled(); + }); + }); }); diff --git a/test/spec/ol/handler/MouseWheel.test.js b/test/spec/ol/handler/MouseWheel.test.js index 9baebd9d24..cd029c9401 100644 --- a/test/spec/ol/handler/MouseWheel.test.js +++ b/test/spec/ol/handler/MouseWheel.test.js @@ -3,15 +3,43 @@ describe('ol.handler.MouseWheel', function() { beforeEach(function() { map = new ol.Map(); - elt = goog.dom.createDom('div'); + elt = new goog.events.EventTarget(); + map.viewport_ = elt; + listener = {fn: function() {}}; + spyOn(listener, 'fn'); }); describe('create a mouse wheel handler', function() { it('returns an ol.handler.MouseWheel instance', function() { - var handler = new ol.handler.MouseWheel(map, elt, {}); + var handler = new ol.handler.MouseWheel(map, {}); expect(handler).toBeA(ol.handler.MouseWheel); }); }); + + describe('dispatching events', function() { + + it('dispatches a mousewheel event', function() { + var handler = new ol.handler.MouseWheel(map, {}); + goog.events.listen(map, 'mousewheel', listener.fn); + + var evt = new goog.events.MouseWheelEvent(1, 'foo', 0, 1); + handler.handleMouseWheel(evt); + + expect(listener.fn.calls[0].args[0].type).toBe('mousewheel'); + expect(listener.fn.calls[0].args[0].originalEvent).toBe(evt); + }); + + it('calls the default action on the default control', function() { + var control = new ol.control.DefaultControl(); + spyOn(control, 'defaultMouseWheel'); + map.setDefaultControl(control); + var handler = new ol.handler.MouseWheel(map, {}); + + handler.handleMouseWheel(new goog.events.MouseWheelEvent(1, 'foo', 0, 1)); + expect(control.defaultMouseWheel).toHaveBeenCalled(); + }); + + }); }); From c2a30f4ac47f764ac0bb7b9351b1422ff6d1d25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 08:57:40 +0200 Subject: [PATCH 47/54] Replace the navigation control by two controls, namely DragPan and MouseWheelZoom. DragPan is the map default drag control. MouseWheelZoom is the map default mouse wheel control. --- src/ol.js | 3 +- src/ol/Map.js | 42 ++++++++++++---- src/ol/control/DefaultControl.js | 50 ------------------- src/ol/control/DragPan.js | 41 +++++++++++++++ .../{Navigation.js => MouseWheelZoom.js} | 36 ++++++------- src/ol/handler/Drag.js | 8 ++- src/ol/handler/MouseWheel.js | 10 ++-- test/spec/ol/handler/Drag.test.js | 7 ++- test/spec/ol/handler/MouseWheel.test.js | 7 ++- 9 files changed, 108 insertions(+), 96 deletions(-) delete mode 100644 src/ol/control/DefaultControl.js create mode 100644 src/ol/control/DragPan.js rename src/ol/control/{Navigation.js => MouseWheelZoom.js} (53%) diff --git a/src/ol.js b/src/ol.js index 2ff8dfea9a..3970586ace 100644 --- a/src/ol.js +++ b/src/ol.js @@ -2,7 +2,8 @@ goog.provide("ol"); goog.require('ol.base'); goog.require('ol.bounds'); -goog.require('ol.control.Navigation'); +goog.require('ol.control.DragPan'); +goog.require('ol.control.MouseWheelZoom'); goog.require('ol.control.Attribution'); goog.require('ol.control.Zoom'); goog.require('ol.handler.Drag'); diff --git a/src/ol/Map.js b/src/ol/Map.js index b4dd0d3c8b..fdcc4bbf46 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -91,9 +91,15 @@ ol.Map = function() { /** * @private - * @type {ol.control.DefaultControl} + * @type {ol.control.Control} */ - this.defaultControl_ = null; + this.defaultDragControl_ = null; + + /** + * @private + * @type {ol.control.Control} + */ + this.defaultMouseWheelControl_ = null; /** * @private @@ -163,7 +169,7 @@ ol.Map.DEFAULT_TILE_SIZE = 256; @const @type {Array.} */ -ol.Map.CONTROLS = ["navigation", "attribution", "zoom"]; +ol.Map.CONTROLS = ["dragpan", "mousewheelzoom", "attribution", "zoom"]; /** * @return {ol.Loc} Map center in map projection. @@ -450,17 +456,35 @@ ol.Map.prototype.addLayers = function(layers) { /** - * @returns {ol.control.DefaultControl} + * @param {ol.control.Control} control */ -ol.Map.prototype.getDefaultControl = function() { - return this.defaultControl_; +ol.Map.prototype.setDefaultDragControl = function(control) { + this.defaultDragControl_ = control; }; /** - * @param {ol.control.DefaultControl} control + * @param {ol.events.MapEvent} e */ -ol.Map.prototype.setDefaultControl = function(control) { - this.defaultControl_ = control; +ol.Map.prototype.handleDragEvent = function(e) { + if (!goog.isNull(this.defaultDragControl_)) { + this.defaultDragControl_.handleEvent(e); + } +}; + +/** + * @param {ol.control.Control} control + */ +ol.Map.prototype.setDefaultMouseWheelControl = function(control) { + this.defaultMouseWheelControl_ = control; +}; + +/** + * @param {ol.events.MapEvent} e + */ +ol.Map.prototype.handleMouseWheelEvent = function(e) { + if (!goog.isNull(this.defaultMouseWheelControl_)) { + this.defaultMouseWheelControl_.handleEvent(e); + } }; /** diff --git a/src/ol/control/DefaultControl.js b/src/ol/control/DefaultControl.js deleted file mode 100644 index 683171017d..0000000000 --- a/src/ol/control/DefaultControl.js +++ /dev/null @@ -1,50 +0,0 @@ -goog.provide('ol.control.DefaultControl'); - -goog.require('ol.control.Control'); - -/** - * @constructor - * @extends {ol.control.Control} - * @param {boolean|undefined} opt_autoActivate - */ -ol.control.DefaultControl = function(opt_autoActivate) { - goog.base(this, opt_autoActivate); - - /** - * Activate this control when it is added to a map. Default is true. - * - * @type {boolean} autoActivate - */ - this.autoActivate_ = - goog.isDef(opt_autoActivate) ? opt_autoActivate : true; - -}; -goog.inherits(ol.control.DefaultControl, ol.control.Control); - -/** @inheritDoc */ -ol.control.DefaultControl.prototype.activate = function() { - var active = goog.base(this, 'activate'); - if (active) { - this.map_.setDefaultControl(this); - } - return active; -}; - -/** @inheritDoc */ -ol.control.DefaultControl.prototype.deactivate = function() { - var inactive = goog.base(this, 'deactivate'); - if (inactive) { - this.map_.setDefaultControl(null); - } - return inactive; -}; - -/** - * @param {ol.events.MapEvent} e - */ -ol.control.DefaultControl.prototype.defaultDrag = function(e) {}; - -/** - * @param {ol.events.MapEvent} e - */ -ol.control.DefaultControl.prototype.defaultMouseWheel = function(e) {}; diff --git a/src/ol/control/DragPan.js b/src/ol/control/DragPan.js new file mode 100644 index 0000000000..b30f16e293 --- /dev/null +++ b/src/ol/control/DragPan.js @@ -0,0 +1,41 @@ +/** + * @fileoverview Drag Pan Control. + * + * This control registers itself in the map as the default drag control. + */ + +goog.provide('ol.control.DragPan'); + +goog.require('ol.control.Control'); + +/** + * @constructor + * @extends {ol.control.Control} + * @param {boolean|undefined} opt_autoActivate + */ +ol.control.DragPan = function(opt_autoActivate) { + goog.base(this, opt_autoActivate); +}; +goog.inherits(ol.control.DragPan, ol.control.Control); + +/** + * @param {ol.Map} map + */ +ol.control.DragPan.prototype.setMap = function(map) { + goog.base(this, 'setMap', map); + this.map_.setDefaultDragControl(this); +}; + +/** + * @param {ol.events.MapEvent} e + */ +ol.control.DragPan.prototype.handleEvent = function(e) { + // FIXME do we want to test ENABLE_DRAG_HANDLER here? + if (ol.ENABLE_DRAG_HANDLER) { + var deltaX = /** @type {number} */ e.deltaX; + var deltaY = /** @type {number} */ e.deltaY; + this.map_.moveByViewportPx(deltaX, deltaY); + } +}; + +ol.control.addControl('dragpan', ol.control.DragPan); diff --git a/src/ol/control/Navigation.js b/src/ol/control/MouseWheelZoom.js similarity index 53% rename from src/ol/control/Navigation.js rename to src/ol/control/MouseWheelZoom.js index 9255b412aa..e3d001ed48 100644 --- a/src/ol/control/Navigation.js +++ b/src/ol/control/MouseWheelZoom.js @@ -1,34 +1,36 @@ -goog.provide('ol.control.Navigation'); +/** + * @fileoverview Mouse Wheel Zoom Control. + * + * This control registers itself in the map as the default mouse wheel control. + */ -goog.require('ol.control.DefaultControl'); -goog.require('ol.Map'); +goog.provide('ol.control.MouseWheelZoom'); + +goog.require('ol.control.Control'); /** * @constructor - * @extends {ol.control.DefaultControl} + * @extends {ol.control.Control} * @param {boolean|undefined} opt_autoActivate */ -ol.control.Navigation = function(opt_autoActivate) { +ol.control.MouseWheelZoom = function(opt_autoActivate) { goog.base(this, opt_autoActivate); }; -goog.inherits(ol.control.Navigation, ol.control.DefaultControl); - +goog.inherits(ol.control.MouseWheelZoom, ol.control.Control); /** - * @inheritDoc + * @param {ol.Map} map */ -ol.control.Navigation.prototype.defaultDrag = function(e) { - if (ol.ENABLE_DRAG_HANDLER) { - var deltaX = /** @type {number} */ e.deltaX; - var deltaY = /** @type {number} */ e.deltaY; - this.map_.moveByViewportPx(deltaX, deltaY); - } +ol.control.MouseWheelZoom.prototype.setMap = function(map) { + goog.base(this, 'setMap', map); + this.map_.setDefaultMouseWheelControl(this); }; /** - * @inheritDoc + * @param {ol.events.MapEvent} e */ -ol.control.Navigation.prototype.defaultMouseWheel = function(e) { +ol.control.MouseWheelZoom.prototype.handleEvent = function(e) { + // FIXME do we want to test ENABLE_DRAG_HANDLER here? if (ol.ENABLE_MOUSEWHEEL_HANDLER) { var me = this, originalE = e.originalEvent; @@ -51,4 +53,4 @@ ol.control.Navigation.prototype.defaultMouseWheel = function(e) { } }; -ol.control.addControl('navigation', ol.control.Navigation); +ol.control.addControl('mousewheelzoom', ol.control.MouseWheelZoom); diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 0b04294823..14e76ad9fa 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -4,7 +4,8 @@ * Provides a class for listening to drag sequences on a DOM element and * dispatching dragstart, drag and dragend events to a map object. * - * The default behavior for the drag event is moving the map. + * Calls handleDragEvent on the map if default is not prevented by + * listeners. */ goog.provide('ol.handler.Drag'); @@ -101,10 +102,7 @@ ol.handler.Drag.prototype.handleDrag = function(e) { this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - var defaultControl = this.map_.getDefaultControl(); - if (defaultControl) { - defaultControl.defaultDrag(newE); - } + this.map_.handleDragEvent(newE); } }; diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 042fd7423e..8bb39681a3 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -4,7 +4,8 @@ * Provides a class for listening to mousewheel events on a DOM element * and dispatching mousewheel events to a map instance. * - * The default behavior for the mousewheel event is zooming the map. + * Calls handleMouseWheelEvent on the map if default is not prevented by + * listeners. */ goog.provide('ol.handler.MouseWheel'); @@ -47,9 +48,6 @@ ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { var newE = new ol.events.MapEvent(ol.events.MapEventType.MOUSEWHEEL, e); var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - var defaultControl = this.map_.getDefaultControl(); - if (defaultControl) { - defaultControl.defaultMouseWheel(newE); - } + this.map_.handleMouseWheelEvent(newE); } -}; \ No newline at end of file +}; diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js index 379ea75801..f88bbfc413 100644 --- a/test/spec/ol/handler/Drag.test.js +++ b/test/spec/ol/handler/Drag.test.js @@ -61,13 +61,12 @@ describe('ol.handler.Drag', function() { }); it('calls the default action on the default control', function() { - var control = new ol.control.DefaultControl(); - spyOn(control, 'defaultDrag'); - map.setDefaultControl(control); + var control = {handleEvent: jasmine.createSpy()}; + map.setDefaultDragControl(control); var handler = new ol.handler.Drag(map, {}); handler.dragger_.dispatchEvent({type: 'drag'}); - expect(control.defaultDrag).toHaveBeenCalled(); + expect(control.handleEvent).toHaveBeenCalled(); }); }); }); diff --git a/test/spec/ol/handler/MouseWheel.test.js b/test/spec/ol/handler/MouseWheel.test.js index cd029c9401..735161c241 100644 --- a/test/spec/ol/handler/MouseWheel.test.js +++ b/test/spec/ol/handler/MouseWheel.test.js @@ -32,13 +32,12 @@ describe('ol.handler.MouseWheel', function() { }); it('calls the default action on the default control', function() { - var control = new ol.control.DefaultControl(); - spyOn(control, 'defaultMouseWheel'); - map.setDefaultControl(control); + var control = {handleEvent: jasmine.createSpy()}; + map.setDefaultMouseWheelControl(control); var handler = new ol.handler.MouseWheel(map, {}); handler.handleMouseWheel(new goog.events.MouseWheelEvent(1, 'foo', 0, 1)); - expect(control.defaultMouseWheel).toHaveBeenCalled(); + expect(control.handleEvent).toHaveBeenCalled(); }); }); From dd5182c55c436177b1d004758ddff2b2fa8efe7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 15:37:21 +0200 Subject: [PATCH 48/54] remove trailing spaces in tests --- test/spec/ol/handler/Click.test.js | 16 ++++++++-------- test/spec/ol/handler/Drag.test.js | 18 +++++++++--------- test/spec/ol/handler/MouseWheel.test.js | 14 +++++++------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/test/spec/ol/handler/Click.test.js b/test/spec/ol/handler/Click.test.js index 325b0cf24b..c559f1f777 100644 --- a/test/spec/ol/handler/Click.test.js +++ b/test/spec/ol/handler/Click.test.js @@ -15,33 +15,33 @@ describe('ol.handler.Click', function() { var handler = new ol.handler.Click(map, {}); expect(handler).toBeA(ol.handler.Click); }); - + }); - + describe('dispatching events', function() { - + it('dispatches a click event which is an ol.events.MapEvent', function() { new ol.handler.Click(map, {}); goog.events.listen(map, 'click', listener.fn); - + goog.events.fireListeners(elt, 'click', false, 'foo'); var evt = listener.fn.calls[0].args[0]; expect(evt).toBeA(ol.events.MapEvent); expect(evt.originalEvent).toBe('foo'); }); - + it('ignores click events when the dragged state is set', function() { var states = {}; new ol.handler.Click(map, states); goog.events.listen(map, 'click', listener.fn); - + goog.events.fireListeners(elt, 'click', false); expect(listener.fn.calls.length).toBe(1); - + states.dragged = true; goog.events.fireListeners(elt, 'click', false); expect(listener.fn.calls.length).toBe(1); }); - + }); }); diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js index f88bbfc413..d025832ee2 100644 --- a/test/spec/ol/handler/Drag.test.js +++ b/test/spec/ol/handler/Drag.test.js @@ -17,35 +17,35 @@ describe('ol.handler.Drag', function() { }); }); - + describe('dispatching events', function() { - + it('dragstart, drag and dragend events', function() { var handler = new ol.handler.Drag(map, {}); goog.events.listen(map, 'dragstart', listener.fn); goog.events.listen(map, 'drag', listener.fn); goog.events.listen(map, 'dragend', listener.fn); - + handler.dragger_.dispatchEvent({type: 'start'}); handler.dragger_.dispatchEvent({type: 'drag'}); handler.dragger_.dispatchEvent({type: 'end'}); - + expect(listener.fn.calls[0].args[0].type).toBe('dragstart'); expect(listener.fn.calls[1].args[0].type).toBe('drag'); expect(listener.fn.calls[2].args[0].type).toBe('dragend'); }); - + it('sets the dragged state during a drag sequence', function() { var states = {}; var handler = new ol.handler.Drag(map, states); - + handler.dragger_.dispatchEvent({type: 'drag'}); expect(states.dragged).toBe(true); - + handler.dragger_.dispatchEvent({type: 'start'}); expect(states.dragged).toBe(false); }); - + it('sets deltaX and deltaY on the ol.event.MapEvent', function() { var handler = new ol.handler.Drag(map, {}); goog.events.listen(map, 'drag', listener.fn); @@ -64,7 +64,7 @@ describe('ol.handler.Drag', function() { var control = {handleEvent: jasmine.createSpy()}; map.setDefaultDragControl(control); var handler = new ol.handler.Drag(map, {}); - + handler.dragger_.dispatchEvent({type: 'drag'}); expect(control.handleEvent).toHaveBeenCalled(); }); diff --git a/test/spec/ol/handler/MouseWheel.test.js b/test/spec/ol/handler/MouseWheel.test.js index 735161c241..717124f7a9 100644 --- a/test/spec/ol/handler/MouseWheel.test.js +++ b/test/spec/ol/handler/MouseWheel.test.js @@ -17,28 +17,28 @@ describe('ol.handler.MouseWheel', function() { }); }); - + describe('dispatching events', function() { - + it('dispatches a mousewheel event', function() { var handler = new ol.handler.MouseWheel(map, {}); goog.events.listen(map, 'mousewheel', listener.fn); - + var evt = new goog.events.MouseWheelEvent(1, 'foo', 0, 1); handler.handleMouseWheel(evt); - + expect(listener.fn.calls[0].args[0].type).toBe('mousewheel'); expect(listener.fn.calls[0].args[0].originalEvent).toBe(evt); }); - + it('calls the default action on the default control', function() { var control = {handleEvent: jasmine.createSpy()}; map.setDefaultMouseWheelControl(control); var handler = new ol.handler.MouseWheel(map, {}); - + handler.handleMouseWheel(new goog.events.MouseWheelEvent(1, 'foo', 0, 1)); expect(control.handleEvent).toHaveBeenCalled(); }); - + }); }); From f34aa031099aa24edf5b8d899624df880a890a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 15:37:39 +0200 Subject: [PATCH 49/54] Revert "Replace the navigation control by two controls, namely DragPan and MouseWheelZoom. DragPan is the map default drag control. MouseWheelZoom is the map default mouse wheel control." This reverts commit c2a30f4ac47f764ac0bb7b9351b1422ff6d1d25b. --- src/ol.js | 3 +- src/ol/Map.js | 42 ++++------------ src/ol/control/DefaultControl.js | 50 +++++++++++++++++++ src/ol/control/DragPan.js | 41 --------------- .../{MouseWheelZoom.js => Navigation.js} | 36 +++++++------ src/ol/handler/Drag.js | 8 +-- src/ol/handler/MouseWheel.js | 10 ++-- test/spec/ol/handler/Drag.test.js | 7 +-- test/spec/ol/handler/MouseWheel.test.js | 7 +-- 9 files changed, 96 insertions(+), 108 deletions(-) create mode 100644 src/ol/control/DefaultControl.js delete mode 100644 src/ol/control/DragPan.js rename src/ol/control/{MouseWheelZoom.js => Navigation.js} (53%) diff --git a/src/ol.js b/src/ol.js index 3970586ace..2ff8dfea9a 100644 --- a/src/ol.js +++ b/src/ol.js @@ -2,8 +2,7 @@ goog.provide("ol"); goog.require('ol.base'); goog.require('ol.bounds'); -goog.require('ol.control.DragPan'); -goog.require('ol.control.MouseWheelZoom'); +goog.require('ol.control.Navigation'); goog.require('ol.control.Attribution'); goog.require('ol.control.Zoom'); goog.require('ol.handler.Drag'); diff --git a/src/ol/Map.js b/src/ol/Map.js index fdcc4bbf46..b4dd0d3c8b 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -91,15 +91,9 @@ ol.Map = function() { /** * @private - * @type {ol.control.Control} + * @type {ol.control.DefaultControl} */ - this.defaultDragControl_ = null; - - /** - * @private - * @type {ol.control.Control} - */ - this.defaultMouseWheelControl_ = null; + this.defaultControl_ = null; /** * @private @@ -169,7 +163,7 @@ ol.Map.DEFAULT_TILE_SIZE = 256; @const @type {Array.} */ -ol.Map.CONTROLS = ["dragpan", "mousewheelzoom", "attribution", "zoom"]; +ol.Map.CONTROLS = ["navigation", "attribution", "zoom"]; /** * @return {ol.Loc} Map center in map projection. @@ -456,35 +450,17 @@ ol.Map.prototype.addLayers = function(layers) { /** - * @param {ol.control.Control} control + * @returns {ol.control.DefaultControl} */ -ol.Map.prototype.setDefaultDragControl = function(control) { - this.defaultDragControl_ = control; +ol.Map.prototype.getDefaultControl = function() { + return this.defaultControl_; }; /** - * @param {ol.events.MapEvent} e + * @param {ol.control.DefaultControl} control */ -ol.Map.prototype.handleDragEvent = function(e) { - if (!goog.isNull(this.defaultDragControl_)) { - this.defaultDragControl_.handleEvent(e); - } -}; - -/** - * @param {ol.control.Control} control - */ -ol.Map.prototype.setDefaultMouseWheelControl = function(control) { - this.defaultMouseWheelControl_ = control; -}; - -/** - * @param {ol.events.MapEvent} e - */ -ol.Map.prototype.handleMouseWheelEvent = function(e) { - if (!goog.isNull(this.defaultMouseWheelControl_)) { - this.defaultMouseWheelControl_.handleEvent(e); - } +ol.Map.prototype.setDefaultControl = function(control) { + this.defaultControl_ = control; }; /** diff --git a/src/ol/control/DefaultControl.js b/src/ol/control/DefaultControl.js new file mode 100644 index 0000000000..683171017d --- /dev/null +++ b/src/ol/control/DefaultControl.js @@ -0,0 +1,50 @@ +goog.provide('ol.control.DefaultControl'); + +goog.require('ol.control.Control'); + +/** + * @constructor + * @extends {ol.control.Control} + * @param {boolean|undefined} opt_autoActivate + */ +ol.control.DefaultControl = function(opt_autoActivate) { + goog.base(this, opt_autoActivate); + + /** + * Activate this control when it is added to a map. Default is true. + * + * @type {boolean} autoActivate + */ + this.autoActivate_ = + goog.isDef(opt_autoActivate) ? opt_autoActivate : true; + +}; +goog.inherits(ol.control.DefaultControl, ol.control.Control); + +/** @inheritDoc */ +ol.control.DefaultControl.prototype.activate = function() { + var active = goog.base(this, 'activate'); + if (active) { + this.map_.setDefaultControl(this); + } + return active; +}; + +/** @inheritDoc */ +ol.control.DefaultControl.prototype.deactivate = function() { + var inactive = goog.base(this, 'deactivate'); + if (inactive) { + this.map_.setDefaultControl(null); + } + return inactive; +}; + +/** + * @param {ol.events.MapEvent} e + */ +ol.control.DefaultControl.prototype.defaultDrag = function(e) {}; + +/** + * @param {ol.events.MapEvent} e + */ +ol.control.DefaultControl.prototype.defaultMouseWheel = function(e) {}; diff --git a/src/ol/control/DragPan.js b/src/ol/control/DragPan.js deleted file mode 100644 index b30f16e293..0000000000 --- a/src/ol/control/DragPan.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @fileoverview Drag Pan Control. - * - * This control registers itself in the map as the default drag control. - */ - -goog.provide('ol.control.DragPan'); - -goog.require('ol.control.Control'); - -/** - * @constructor - * @extends {ol.control.Control} - * @param {boolean|undefined} opt_autoActivate - */ -ol.control.DragPan = function(opt_autoActivate) { - goog.base(this, opt_autoActivate); -}; -goog.inherits(ol.control.DragPan, ol.control.Control); - -/** - * @param {ol.Map} map - */ -ol.control.DragPan.prototype.setMap = function(map) { - goog.base(this, 'setMap', map); - this.map_.setDefaultDragControl(this); -}; - -/** - * @param {ol.events.MapEvent} e - */ -ol.control.DragPan.prototype.handleEvent = function(e) { - // FIXME do we want to test ENABLE_DRAG_HANDLER here? - if (ol.ENABLE_DRAG_HANDLER) { - var deltaX = /** @type {number} */ e.deltaX; - var deltaY = /** @type {number} */ e.deltaY; - this.map_.moveByViewportPx(deltaX, deltaY); - } -}; - -ol.control.addControl('dragpan', ol.control.DragPan); diff --git a/src/ol/control/MouseWheelZoom.js b/src/ol/control/Navigation.js similarity index 53% rename from src/ol/control/MouseWheelZoom.js rename to src/ol/control/Navigation.js index e3d001ed48..9255b412aa 100644 --- a/src/ol/control/MouseWheelZoom.js +++ b/src/ol/control/Navigation.js @@ -1,36 +1,34 @@ -/** - * @fileoverview Mouse Wheel Zoom Control. - * - * This control registers itself in the map as the default mouse wheel control. - */ +goog.provide('ol.control.Navigation'); -goog.provide('ol.control.MouseWheelZoom'); - -goog.require('ol.control.Control'); +goog.require('ol.control.DefaultControl'); +goog.require('ol.Map'); /** * @constructor - * @extends {ol.control.Control} + * @extends {ol.control.DefaultControl} * @param {boolean|undefined} opt_autoActivate */ -ol.control.MouseWheelZoom = function(opt_autoActivate) { +ol.control.Navigation = function(opt_autoActivate) { goog.base(this, opt_autoActivate); }; -goog.inherits(ol.control.MouseWheelZoom, ol.control.Control); +goog.inherits(ol.control.Navigation, ol.control.DefaultControl); + /** - * @param {ol.Map} map + * @inheritDoc */ -ol.control.MouseWheelZoom.prototype.setMap = function(map) { - goog.base(this, 'setMap', map); - this.map_.setDefaultMouseWheelControl(this); +ol.control.Navigation.prototype.defaultDrag = function(e) { + if (ol.ENABLE_DRAG_HANDLER) { + var deltaX = /** @type {number} */ e.deltaX; + var deltaY = /** @type {number} */ e.deltaY; + this.map_.moveByViewportPx(deltaX, deltaY); + } }; /** - * @param {ol.events.MapEvent} e + * @inheritDoc */ -ol.control.MouseWheelZoom.prototype.handleEvent = function(e) { - // FIXME do we want to test ENABLE_DRAG_HANDLER here? +ol.control.Navigation.prototype.defaultMouseWheel = function(e) { if (ol.ENABLE_MOUSEWHEEL_HANDLER) { var me = this, originalE = e.originalEvent; @@ -53,4 +51,4 @@ ol.control.MouseWheelZoom.prototype.handleEvent = function(e) { } }; -ol.control.addControl('mousewheelzoom', ol.control.MouseWheelZoom); +ol.control.addControl('navigation', ol.control.Navigation); diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 14e76ad9fa..0b04294823 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -4,8 +4,7 @@ * Provides a class for listening to drag sequences on a DOM element and * dispatching dragstart, drag and dragend events to a map object. * - * Calls handleDragEvent on the map if default is not prevented by - * listeners. + * The default behavior for the drag event is moving the map. */ goog.provide('ol.handler.Drag'); @@ -102,7 +101,10 @@ ol.handler.Drag.prototype.handleDrag = function(e) { this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - this.map_.handleDragEvent(newE); + var defaultControl = this.map_.getDefaultControl(); + if (defaultControl) { + defaultControl.defaultDrag(newE); + } } }; diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 8bb39681a3..042fd7423e 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -4,8 +4,7 @@ * Provides a class for listening to mousewheel events on a DOM element * and dispatching mousewheel events to a map instance. * - * Calls handleMouseWheelEvent on the map if default is not prevented by - * listeners. + * The default behavior for the mousewheel event is zooming the map. */ goog.provide('ol.handler.MouseWheel'); @@ -48,6 +47,9 @@ ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { var newE = new ol.events.MapEvent(ol.events.MapEventType.MOUSEWHEEL, e); var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - this.map_.handleMouseWheelEvent(newE); + var defaultControl = this.map_.getDefaultControl(); + if (defaultControl) { + defaultControl.defaultMouseWheel(newE); + } } -}; +}; \ No newline at end of file diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js index d025832ee2..8d278343f0 100644 --- a/test/spec/ol/handler/Drag.test.js +++ b/test/spec/ol/handler/Drag.test.js @@ -61,12 +61,13 @@ describe('ol.handler.Drag', function() { }); it('calls the default action on the default control', function() { - var control = {handleEvent: jasmine.createSpy()}; - map.setDefaultDragControl(control); + var control = new ol.control.DefaultControl(); + spyOn(control, 'defaultDrag'); + map.setDefaultControl(control); var handler = new ol.handler.Drag(map, {}); handler.dragger_.dispatchEvent({type: 'drag'}); - expect(control.handleEvent).toHaveBeenCalled(); + expect(control.defaultDrag).toHaveBeenCalled(); }); }); }); diff --git a/test/spec/ol/handler/MouseWheel.test.js b/test/spec/ol/handler/MouseWheel.test.js index 717124f7a9..208ac2889e 100644 --- a/test/spec/ol/handler/MouseWheel.test.js +++ b/test/spec/ol/handler/MouseWheel.test.js @@ -32,12 +32,13 @@ describe('ol.handler.MouseWheel', function() { }); it('calls the default action on the default control', function() { - var control = {handleEvent: jasmine.createSpy()}; - map.setDefaultMouseWheelControl(control); + var control = new ol.control.DefaultControl(); + spyOn(control, 'defaultMouseWheel'); + map.setDefaultControl(control); var handler = new ol.handler.MouseWheel(map, {}); handler.handleMouseWheel(new goog.events.MouseWheelEvent(1, 'foo', 0, 1)); - expect(control.handleEvent).toHaveBeenCalled(); + expect(control.defaultMouseWheel).toHaveBeenCalled(); }); }); From 2b9df6442bd0edd714356d3acebab2971f5c41c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 15:38:06 +0200 Subject: [PATCH 50/54] Revert "Allow for using a different set of default behaviors." This reverts commit 3cc069186c7b5aeb73103c83c94ba511143d34c7. --- src/ol.js | 1 - src/ol/Map.js | 24 ++------------ src/ol/control/Control.js | 3 +- src/ol/control/DefaultControl.js | 50 ----------------------------- src/ol/control/Navigation.js | 54 -------------------------------- src/ol/handler/Drag.js | 18 +++++++---- src/ol/handler/MapHandler.js | 2 +- src/ol/handler/MouseWheel.js | 29 ++++++++++++++--- 8 files changed, 40 insertions(+), 141 deletions(-) delete mode 100644 src/ol/control/DefaultControl.js delete mode 100644 src/ol/control/Navigation.js diff --git a/src/ol.js b/src/ol.js index 2ff8dfea9a..8c936f0329 100644 --- a/src/ol.js +++ b/src/ol.js @@ -2,7 +2,6 @@ goog.provide("ol"); goog.require('ol.base'); goog.require('ol.bounds'); -goog.require('ol.control.Navigation'); goog.require('ol.control.Attribution'); goog.require('ol.control.Zoom'); goog.require('ol.handler.Drag'); diff --git a/src/ol/Map.js b/src/ol/Map.js index b4dd0d3c8b..cadf228e04 100644 --- a/src/ol/Map.js +++ b/src/ol/Map.js @@ -88,12 +88,6 @@ ol.Map = function() { * @type {Array} */ this.controls_ = null; - - /** - * @private - * @type {ol.control.DefaultControl} - */ - this.defaultControl_ = null; /** * @private @@ -163,7 +157,7 @@ ol.Map.DEFAULT_TILE_SIZE = 256; @const @type {Array.} */ -ol.Map.CONTROLS = ["navigation", "attribution", "zoom"]; +ol.Map.DEFAULT_CONTROLS = ["attribution", "zoom"]; /** * @return {ol.Loc} Map center in map projection. @@ -449,20 +443,6 @@ ol.Map.prototype.addLayers = function(layers) { }; -/** - * @returns {ol.control.DefaultControl} - */ -ol.Map.prototype.getDefaultControl = function() { - return this.defaultControl_; -}; - -/** - * @param {ol.control.DefaultControl} control - */ -ol.Map.prototype.setDefaultControl = function(control) { - this.defaultControl_ = control; -}; - /** * @param {Array.|undefined} opt_controls */ @@ -503,7 +483,7 @@ ol.Map.prototype.setContainer = function(container) { this.createRenderer(); //TODO Controls could be set earlier, but we need to deal with content that // controls place on overlays. - this.setControls(ol.Map.CONTROLS); + this.setControls(ol.Map.DEFAULT_CONTROLS); // conditionally render this.conditionallyRender(); }; diff --git a/src/ol/control/Control.js b/src/ol/control/Control.js index b6d1264ac9..eaa1c693d6 100644 --- a/src/ol/control/Control.js +++ b/src/ol/control/Control.js @@ -31,7 +31,7 @@ ol.control.Control = function(opt_autoActivate) { /** * @type {boolean} active - * @protected + * @private */ this.active_ = false; @@ -42,7 +42,6 @@ ol.control.Control = function(opt_autoActivate) { */ this.autoActivate_ = goog.isDef(opt_autoActivate) ? opt_autoActivate : false; - }; /** diff --git a/src/ol/control/DefaultControl.js b/src/ol/control/DefaultControl.js deleted file mode 100644 index 683171017d..0000000000 --- a/src/ol/control/DefaultControl.js +++ /dev/null @@ -1,50 +0,0 @@ -goog.provide('ol.control.DefaultControl'); - -goog.require('ol.control.Control'); - -/** - * @constructor - * @extends {ol.control.Control} - * @param {boolean|undefined} opt_autoActivate - */ -ol.control.DefaultControl = function(opt_autoActivate) { - goog.base(this, opt_autoActivate); - - /** - * Activate this control when it is added to a map. Default is true. - * - * @type {boolean} autoActivate - */ - this.autoActivate_ = - goog.isDef(opt_autoActivate) ? opt_autoActivate : true; - -}; -goog.inherits(ol.control.DefaultControl, ol.control.Control); - -/** @inheritDoc */ -ol.control.DefaultControl.prototype.activate = function() { - var active = goog.base(this, 'activate'); - if (active) { - this.map_.setDefaultControl(this); - } - return active; -}; - -/** @inheritDoc */ -ol.control.DefaultControl.prototype.deactivate = function() { - var inactive = goog.base(this, 'deactivate'); - if (inactive) { - this.map_.setDefaultControl(null); - } - return inactive; -}; - -/** - * @param {ol.events.MapEvent} e - */ -ol.control.DefaultControl.prototype.defaultDrag = function(e) {}; - -/** - * @param {ol.events.MapEvent} e - */ -ol.control.DefaultControl.prototype.defaultMouseWheel = function(e) {}; diff --git a/src/ol/control/Navigation.js b/src/ol/control/Navigation.js deleted file mode 100644 index 9255b412aa..0000000000 --- a/src/ol/control/Navigation.js +++ /dev/null @@ -1,54 +0,0 @@ -goog.provide('ol.control.Navigation'); - -goog.require('ol.control.DefaultControl'); -goog.require('ol.Map'); - -/** - * @constructor - * @extends {ol.control.DefaultControl} - * @param {boolean|undefined} opt_autoActivate - */ -ol.control.Navigation = function(opt_autoActivate) { - goog.base(this, opt_autoActivate); -}; -goog.inherits(ol.control.Navigation, ol.control.DefaultControl); - - -/** - * @inheritDoc - */ -ol.control.Navigation.prototype.defaultDrag = function(e) { - if (ol.ENABLE_DRAG_HANDLER) { - var deltaX = /** @type {number} */ e.deltaX; - var deltaY = /** @type {number} */ e.deltaY; - this.map_.moveByViewportPx(deltaX, deltaY); - } -}; - -/** - * @inheritDoc - */ -ol.control.Navigation.prototype.defaultMouseWheel = function(e) { - if (ol.ENABLE_MOUSEWHEEL_HANDLER) { - var me = this, - originalE = e.originalEvent; - if (originalE.deltaY === 0 || me.zoomBlocked_) { - return; - } - me.zoomBlocked_ = window.setTimeout(function() { - me.zoomBlocked_ = null; - }, 200); - - var map = me.map_, - step = originalE.deltaY / Math.abs(originalE.deltaY), - position = goog.style.getRelativePosition(originalE, - map.getViewport()); - map.setZoom(map.getZoom() - step, position); - - // We don't want the page to scroll. - // (MouseWheelEvent is a originalEvent) - e.preventDefault(); - } -}; - -ol.control.addControl('navigation', ol.control.Navigation); diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index 0b04294823..ecd97a992f 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -95,19 +95,25 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { ol.handler.Drag.prototype.handleDrag = function(e) { this.states_.dragged = true; var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAG, e); - newE.deltaX = e.clientX - this.prevX_; - newE.deltaY = e.clientY - this.prevY_; + newE.delementaX = e.clientX - this.prevX_; + newE.delementaY = e.clientY - this.prevY_; this.prevX_ = e.clientX; this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - var defaultControl = this.map_.getDefaultControl(); - if (defaultControl) { - defaultControl.defaultDrag(newE); - } + this.defaultDrag(newE); } }; +/** + * @param {ol.events.MapEvent} e + */ +ol.handler.Drag.prototype.defaultDrag = function(e) { + var delementaX = /** @type {number} */ e.delementaX; + var delementaY = /** @type {number} */ e.delementaY; + this.map_.moveByViewportPx(delementaX, delementaY); +}; + /** * @param {goog.fx.DragEvent} e */ diff --git a/src/ol/handler/MapHandler.js b/src/ol/handler/MapHandler.js index 243380cc5f..188fd03288 100644 --- a/src/ol/handler/MapHandler.js +++ b/src/ol/handler/MapHandler.js @@ -4,7 +4,7 @@ * Type definitions and base class for map event handlers that share states, * listen for events on a map related dom element (usually the map's viewport), * dispatch events to an ol.Map instance, and optionally perform default - * actions on the map's default control. + * actions on an ol.Map instance. */ goog.provide('ol.handler.states'); diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 042fd7423e..48b483294c 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -47,9 +47,28 @@ ol.handler.MouseWheel.prototype.handleMouseWheel = function(e) { var newE = new ol.events.MapEvent(ol.events.MapEventType.MOUSEWHEEL, e); var rt = goog.events.dispatchEvent(this.map_, newE); if (rt) { - var defaultControl = this.map_.getDefaultControl(); - if (defaultControl) { - defaultControl.defaultMouseWheel(newE); - } + this.defaultMouseWheel(e); } -}; \ No newline at end of file +}; + +/** + * @param {goog.events.MouseWheelEvent} e + */ +ol.handler.MouseWheel.prototype.defaultMouseWheel = function(e) { + var me = this; + if (e.deltaY === 0 || me.zoomBlocked_) { + return; + } + me.zoomBlocked_ = window.setTimeout(function() { + me.zoomBlocked_ = null; + }, 200); + + var map = me.map_, + step = e.deltaY / Math.abs(e.deltaY); + map.setZoom(map.getZoom() - step, + goog.style.getRelativePosition(e, this.element_)); + + // We don't want the page to scroll. + // (MouseWheelEvent is a BrowserEvent) + e.preventDefault(); +}; From 1f62bd8cd672ef251e7ef653fdd62ff47f61245a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 16:19:42 +0200 Subject: [PATCH 51/54] fix typo in drag handler --- src/ol/handler/Drag.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ol/handler/Drag.js b/src/ol/handler/Drag.js index ecd97a992f..fa93580e43 100644 --- a/src/ol/handler/Drag.js +++ b/src/ol/handler/Drag.js @@ -95,8 +95,8 @@ ol.handler.Drag.prototype.handleDragStart = function(e) { ol.handler.Drag.prototype.handleDrag = function(e) { this.states_.dragged = true; var newE = new ol.events.MapEvent(ol.events.MapEventType.DRAG, e); - newE.delementaX = e.clientX - this.prevX_; - newE.delementaY = e.clientY - this.prevY_; + newE.deltaX = e.clientX - this.prevX_; + newE.deltaY = e.clientY - this.prevY_; this.prevX_ = e.clientX; this.prevY_ = e.clientY; var rt = goog.events.dispatchEvent(this.map_, newE); @@ -109,9 +109,9 @@ ol.handler.Drag.prototype.handleDrag = function(e) { * @param {ol.events.MapEvent} e */ ol.handler.Drag.prototype.defaultDrag = function(e) { - var delementaX = /** @type {number} */ e.delementaX; - var delementaY = /** @type {number} */ e.delementaY; - this.map_.moveByViewportPx(delementaX, delementaY); + var deltaX = /** @type {number} */ e.deltaX; + var deltaY = /** @type {number} */ e.deltaY; + this.map_.moveByViewportPx(deltaX, deltaY); }; /** From 6fd5bb86479518a4329b1c46c630658594ef1b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 16:20:07 +0200 Subject: [PATCH 52/54] fix drag handler tests --- test/spec/ol/handler/Drag.test.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js index 8d278343f0..c7ac878b0b 100644 --- a/test/spec/ol/handler/Drag.test.js +++ b/test/spec/ol/handler/Drag.test.js @@ -60,14 +60,12 @@ describe('ol.handler.Drag', function() { expect(listener.fn.calls[1].args[0].deltaY).toBe(2); }); - it('calls the default action on the default control', function() { - var control = new ol.control.DefaultControl(); - spyOn(control, 'defaultDrag'); - map.setDefaultControl(control); + it('calls the default action', function() { var handler = new ol.handler.Drag(map, {}); + spyOn(handler, 'defaultDrag'); handler.dragger_.dispatchEvent({type: 'drag'}); - expect(control.defaultDrag).toHaveBeenCalled(); + expect(handler.defaultDrag).toHaveBeenCalled(); }); }); }); From 226480af901d737bf37b95dec6a410641bf42d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 16:20:23 +0200 Subject: [PATCH 53/54] fix mousewheel handler tests --- src/ol/handler/MouseWheel.js | 7 ++++- test/spec/ol/handler/MouseWheel.test.js | 42 ++++++++++++++----------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/ol/handler/MouseWheel.js b/src/ol/handler/MouseWheel.js index 48b483294c..51f366b542 100644 --- a/src/ol/handler/MouseWheel.js +++ b/src/ol/handler/MouseWheel.js @@ -30,7 +30,12 @@ goog.require('goog.events.MouseWheelHandler.EventType'); ol.handler.MouseWheel = function(map, states) { goog.base(this, map, states); - var handler = new goog.events.MouseWheelHandler(this.element_); + /** + * @type {goog.events.MouseWheelHandler} + */ + this.handler_ = new goog.events.MouseWheelHandler(this.element_); + + var handler = this.handler_; this.registerDisposable(handler); goog.events.listen(handler, diff --git a/test/spec/ol/handler/MouseWheel.test.js b/test/spec/ol/handler/MouseWheel.test.js index 208ac2889e..ccd9e2aa8d 100644 --- a/test/spec/ol/handler/MouseWheel.test.js +++ b/test/spec/ol/handler/MouseWheel.test.js @@ -1,12 +1,10 @@ describe('ol.handler.MouseWheel', function() { - var map, elt; + var map; beforeEach(function() { map = new ol.Map(); - elt = new goog.events.EventTarget(); + var elt = new goog.events.EventTarget(); map.viewport_ = elt; - listener = {fn: function() {}}; - spyOn(listener, 'fn'); }); describe('create a mouse wheel handler', function() { @@ -20,25 +18,31 @@ describe('ol.handler.MouseWheel', function() { describe('dispatching events', function() { - it('dispatches a mousewheel event', function() { - var handler = new ol.handler.MouseWheel(map, {}); - goog.events.listen(map, 'mousewheel', listener.fn); + var handler; - var evt = new goog.events.MouseWheelEvent(1, 'foo', 0, 1); - handler.handleMouseWheel(evt); - - expect(listener.fn.calls[0].args[0].type).toBe('mousewheel'); - expect(listener.fn.calls[0].args[0].originalEvent).toBe(evt); + beforeEach(function() { + handler = new ol.handler.MouseWheel(map, {}); }); - it('calls the default action on the default control', function() { - var control = new ol.control.DefaultControl(); - spyOn(control, 'defaultMouseWheel'); - map.setDefaultControl(control); - var handler = new ol.handler.MouseWheel(map, {}); + it('dispatches a mousewheel event', function() { + var spy = spyOn(goog.events.Event, 'preventDefault').andCallThrough(); + goog.events.listen(map, ol.events.MapEventType.MOUSEWHEEL, spy); - handler.handleMouseWheel(new goog.events.MouseWheelEvent(1, 'foo', 0, 1)); - expect(control.defaultMouseWheel).toHaveBeenCalled(); + var evt = new goog.events.MouseWheelEvent(1, 'foo', 0, 1); + handler.handler_.dispatchEvent(evt); + + expect(spy).toHaveBeenCalled(); + expect(spy.argsForCall[0][0].type).toEqual(ol.events.MapEventType.MOUSEWHEEL); + }); + + it('calls the default action', function() { + var handler = new ol.handler.MouseWheel(map, {}); + spyOn(handler, 'defaultMouseWheel'); + + var evt = new goog.events.MouseWheelEvent(1, 'foo', 0, 1); + handler.handler_.dispatchEvent(evt); + + expect(handler.defaultMouseWheel).toHaveBeenCalled(); }); }); From a365b0aaf355546f80e7e8ab64fab172b3d3c834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 13 Jul 2012 17:44:46 +0200 Subject: [PATCH 54/54] improvements to the drag handler tests --- test/spec/ol/handler/Drag.test.js | 72 +++++++++++++++++-------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/test/spec/ol/handler/Drag.test.js b/test/spec/ol/handler/Drag.test.js index c7ac878b0b..6a0fbcddc7 100644 --- a/test/spec/ol/handler/Drag.test.js +++ b/test/spec/ol/handler/Drag.test.js @@ -1,12 +1,10 @@ describe('ol.handler.Drag', function() { - var map, elt; + var map; beforeEach(function() { map = new ol.Map(); - elt = new goog.events.EventTarget(); + var elt = new goog.events.EventTarget(); map.viewport_ = elt; - listener = {fn: function() {}}; - spyOn(listener, 'fn'); }); describe('creating a drag handler', function() { @@ -19,53 +17,61 @@ describe('ol.handler.Drag', function() { }); describe('dispatching events', function() { + var handler, states; + + beforeEach(function() { + states = {}; + handler = new ol.handler.Drag(map, states); + }); it('dragstart, drag and dragend events', function() { - var handler = new ol.handler.Drag(map, {}); - goog.events.listen(map, 'dragstart', listener.fn); - goog.events.listen(map, 'drag', listener.fn); - goog.events.listen(map, 'dragend', listener.fn); + var spy = spyOn(goog.events.Event, 'preventDefault').andCallThrough(); + goog.events.listen(map, ol.events.MapEventType.DRAGSTART, spy); + goog.events.listen(map, ol.events.MapEventType.DRAG, spy); + goog.events.listen(map, ol.events.MapEventType.DRAGEND, spy); - handler.dragger_.dispatchEvent({type: 'start'}); - handler.dragger_.dispatchEvent({type: 'drag'}); - handler.dragger_.dispatchEvent({type: 'end'}); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.START}); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.DRAG}); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.END}); - expect(listener.fn.calls[0].args[0].type).toBe('dragstart'); - expect(listener.fn.calls[1].args[0].type).toBe('drag'); - expect(listener.fn.calls[2].args[0].type).toBe('dragend'); + expect(spy.callCount).toEqual(3); + expect(spy.argsForCall[0][0].type).toEqual(ol.events.MapEventType.DRAGSTART); + expect(spy.argsForCall[1][0].type).toEqual(ol.events.MapEventType.DRAG); + expect(spy.argsForCall[2][0].type).toEqual(ol.events.MapEventType.DRAGEND); }); it('sets the dragged state during a drag sequence', function() { - var states = {}; - var handler = new ol.handler.Drag(map, states); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.DRAG}); + expect(states.dragged).toBeTruthy(); - handler.dragger_.dispatchEvent({type: 'drag'}); - expect(states.dragged).toBe(true); - - handler.dragger_.dispatchEvent({type: 'start'}); - expect(states.dragged).toBe(false); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.START}); + expect(states.dragged).toBeFalsy(); }); it('sets deltaX and deltaY on the ol.event.MapEvent', function() { - var handler = new ol.handler.Drag(map, {}); - goog.events.listen(map, 'drag', listener.fn); + var spy = spyOn(goog.events.Event, 'preventDefault').andCallThrough(); + goog.events.listen(map, ol.events.MapEventType.DRAG, spy); - handler.dragger_.dispatchEvent({type: 'start', clientX: 2, clientY: 4}); - handler.dragger_.dispatchEvent({type: 'drag', clientX: 1, clientY: 2}); - handler.dragger_.dispatchEvent({type: 'drag', clientX: 2, clientY: 4}); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.START, + clientX: 2, clientY: 4}); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.DRAG, + clientX: 1, clientY: 2}); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.DRAG, + clientX: 2, clientY: 4}); - expect(listener.fn.calls[0].args[0].deltaX).toBe(-1); - expect(listener.fn.calls[0].args[0].deltaY).toBe(-2); - expect(listener.fn.calls[1].args[0].deltaX).toBe(1); - expect(listener.fn.calls[1].args[0].deltaY).toBe(2); + expect(spy.callCount).toEqual(2); + expect(spy.argsForCall[0][0].deltaX).toEqual(-1); + expect(spy.argsForCall[0][0].deltaY).toEqual(-2); + expect(spy.argsForCall[1][0].deltaX).toEqual(1); + expect(spy.argsForCall[1][0].deltaY).toEqual(2); }); it('calls the default action', function() { var handler = new ol.handler.Drag(map, {}); - spyOn(handler, 'defaultDrag'); + var spy spyOn(handler, 'defaultDrag'); - handler.dragger_.dispatchEvent({type: 'drag'}); - expect(handler.defaultDrag).toHaveBeenCalled(); + handler.dragger_.dispatchEvent({type: goog.fx.Dragger.EventType.DRAG}); + expect(spy).toHaveBeenCalled(); }); }); });