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); + }); + + }); +});