diff --git a/lib/OpenLayers/Control.js b/lib/OpenLayers/Control.js index 62d13d5e0b..86daa99778 100644 --- a/lib/OpenLayers/Control.js +++ b/lib/OpenLayers/Control.js @@ -104,6 +104,15 @@ OpenLayers.Control = OpenLayers.Class({ */ handler: null, + /** + * APIProperty: eventListeners + * {Object} If set as an option at construction, the eventListeners + * object will be registered with . Object + * structure must be a listeners object as shown in the example for + * the events.on method. + */ + eventListeners: null, + /** * Property: events * {} Events instance for triggering control specific @@ -155,6 +164,9 @@ OpenLayers.Control = OpenLayers.Class({ OpenLayers.Util.extend(this, options); this.events = new OpenLayers.Events(this, null, this.EVENT_TYPES); + if(this.eventListeners instanceof Object) { + this.events.on(this.eventListeners); + } this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"); }, @@ -230,7 +242,7 @@ OpenLayers.Control = OpenLayers.Class({ if (px != null) { this.position = px.clone(); } - this.moveTo(this.position); + this.moveTo(this.position); return this.div; }, diff --git a/lib/OpenLayers/Events.js b/lib/OpenLayers/Events.js index 5633891a6b..0a6349dfef 100644 --- a/lib/OpenLayers/Events.js +++ b/lib/OpenLayers/Events.js @@ -651,6 +651,9 @@ OpenLayers.Events = OpenLayers.Class({ } evt.object = this.object; evt.element = this.element; + if(!evt.type) { + evt.type = type; + } // execute all callbacks registered for specified type // get a clone of the listeners array to diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index dd64b2c0ba..2ba22a467d 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -138,6 +138,15 @@ OpenLayers.Layer = OpenLayers.Class({ */ options: null, + /** + * APIProperty: eventListeners + * {Object} If set as an option at construction, the eventListeners + * object will be registered with . Object + * structure must be a listeners object as shown in the example for + * the events.on method. + */ + eventListeners: null, + /** * APIProperty: gutter * {Integer} Determines the width (in pixels) of the gutter around image @@ -272,6 +281,10 @@ OpenLayers.Layer = OpenLayers.Class({ this.events = new OpenLayers.Events(this, this.div, this.EVENT_TYPES); + if(this.eventListeners instanceof Object) { + this.events.on(this.eventListeners); + } + } if (this.wrapDateLine) { diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index ef56d9e58a..fe7f7944fb 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -336,6 +336,15 @@ OpenLayers.Map = OpenLayers.Class({ */ panTween: null, + /** + * APIProperty: eventListeners + * {Object} If set as an option at construction, the eventListeners + * object will be registered with . Object + * structure must be a listeners object as shown in the example for + * the events.on method. + */ + eventListeners: null, + /** * Property: panMethod * {Function} The Easing function to be used for tweening. Default is @@ -408,6 +417,9 @@ OpenLayers.Map = OpenLayers.Class({ this.EVENT_TYPES, this.fallThrough); this.updateSize(); + if(this.eventListeners instanceof Object) { + this.events.on(this.eventListeners); + } // update the map size and location before the map moves this.events.register("movestart", this, this.updateSize); diff --git a/tests/test_Control.html b/tests/test_Control.html index 4a2e254b9e..72814511ab 100644 --- a/tests/test_Control.html +++ b/tests/test_Control.html @@ -29,6 +29,31 @@ t.eq( control.title, titleText, "control.title set correctly" ); } + function test_eventListeners(t) { + t.plan(1); + + var method = OpenLayers.Events.prototype.on; + // test that events.on is called at control construction + var options = { + eventListeners: {foo: "bar"} + }; + OpenLayers.Events.prototype.on = function(obj) { + t.eq(obj, options.eventListeners, "events.on called with eventListeners"); + } + var control = new OpenLayers.Control(options); + OpenLayers.Events.prototype.on = method; + control.destroy(); + + // if events.on is called again, this will fail due to an extra test + // test control without eventListeners + OpenLayers.Events.prototype.on = function(obj) { + t.fail("events.on called without eventListeners"); + } + var control2 = new OpenLayers.Control(); + OpenLayers.Events.prototype.on = method; + control2.destroy(); + } + function test_Control_destroy(t) { t.plan(3); diff --git a/tests/test_Layer.html b/tests/test_Layer.html index 55467280e4..be24b75862 100644 --- a/tests/test_Layer.html +++ b/tests/test_Layer.html @@ -119,6 +119,31 @@ t.eq(layer.numZoomLevels, numZoomLevels, "numZoomLevels set correctly"); } + function test_eventListeners(t) { + t.plan(1); + + var method = OpenLayers.Events.prototype.on; + // test that events.on is called at layer construction + var options = { + eventListeners: {foo: "bar"} + }; + OpenLayers.Events.prototype.on = function(obj) { + t.eq(obj, options.eventListeners, "events.on called with eventListeners"); + } + var layer = new OpenLayers.Layer("test", options); + OpenLayers.Events.prototype.on = method; + layer.destroy(); + + // if events.on is called again, this will fail due to an extra test + // test layer without eventListeners + OpenLayers.Events.prototype.on = function(obj) { + t.fail("events.on called without eventListeners"); + } + var layer2 = new OpenLayers.Layer("test"); + OpenLayers.Events.prototype.on = method; + layer2.destroy(); + } + function test_Layer_initResolutions(t) { t.plan(12); var map = new OpenLayers.Map("map"); diff --git a/tests/test_Map.html b/tests/test_Map.html index 135c4b19d7..6202eea883 100644 --- a/tests/test_Map.html +++ b/tests/test_Map.html @@ -84,6 +84,32 @@ t.eq( map.maxResolution, 3.14159, "map.maxResolution set correctly via options hashtable" ); t.eq( map.theme, 'foo', "map theme set correctly." ); } + + function test_eventListeners(t) { + t.plan(1); + + var method = OpenLayers.Events.prototype.on; + // test that events.on is called at map construction + var options = { + eventListeners: {foo: "bar"}, + controls: [] + }; + OpenLayers.Events.prototype.on = function(obj) { + t.eq(obj, options.eventListeners, "events.on called with eventListeners"); + } + var map = new OpenLayers.Map('map', options); + OpenLayers.Events.prototype.on = method; + map.destroy(); + + // if events.on is called again, this will fail due to an extra test + // test map without eventListeners + OpenLayers.Events.prototype.on = function(obj) { + t.fail("events.on called without eventListeners"); + } + var map2 = new OpenLayers.Map("map", {controls: []}); + OpenLayers.Events.prototype.on = method; + map2.destroy(); + } function test_05_Map_center(t) { t.plan(4);