From 4a9460b314efe7c6d6f83ea93d98ee85b309a9b1 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Sat, 22 Jan 2011 12:04:40 +0000 Subject: [PATCH] give layer an "added" and "removed" event. p=mpriour,me r=me (closes #2983) git-svn-id: http://svn.openlayers.org/trunk/openlayers@11052 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Layer.js | 8 +++++++- lib/OpenLayers/Layer/Bing.js | 31 ------------------------------- lib/OpenLayers/Map.js | 2 ++ tests/Layer.html | 29 +++++++++++++++++++++++++---- tests/Map.html | 9 +++++---- 5 files changed, 39 insertions(+), 40 deletions(-) diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index ac23a31761..63f2beeef7 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -81,9 +81,15 @@ OpenLayers.Layer = OpenLayers.Class({ * moveend - Triggered when layer is done moving, object passed as * argument has a zoomChanged boolean property which tells that the * zoom has changed. + * added - Triggered after the layer is added to a map. Listeners will + * receive an object with a *map* property referencing the map and a + * *layer* property referencing the layer. + * removed - Triggered after the layer is removed from the map. Listeners + * will receive an object with a *map* property referencing the map and + * a *layer* property referencing the layer. */ EVENT_TYPES: ["loadstart", "loadend", "loadcancel", "visibilitychanged", - "move", "moveend"], + "move", "moveend", "added", "removed"], /** * Constant: RESOLUTION_PROPERTIES diff --git a/lib/OpenLayers/Layer/Bing.js b/lib/OpenLayers/Layer/Bing.js index 1f9f1dde9a..f3d83ca821 100644 --- a/lib/OpenLayers/Layer/Bing.js +++ b/lib/OpenLayers/Layer/Bing.js @@ -50,28 +50,6 @@ OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, { */ metadataParams: null, - /** - * Constant: EVENT_TYPES - * {Array(String)} Supported application event types. Register a listener - * for a particular event with the following syntax: - * (code) - * layer.events.register(type, obj, listener); - * (end) - * - * Listeners will be called with a reference to an event object. The - * properties of this event depends on exactly what happened. - * - * All event objects have at least the following properties: - * object - {Object} A reference to layer.events.object. - * element - {DOMElement} A reference to layer.events.element. - * - * Supported map event types (in addition to those from ): - * added - Triggered after the layer is added to a map. Listeners - * will receive an object with a *map* property referencing the - * map and a *layer* property referencing the layer. - */ - EVENT_TYPES: ["added"], - /** * Constructor: OpenLayers.Layer.Bing * Create a new Bing layer. @@ -98,12 +76,6 @@ OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, { * Any other documented layer properties can be provided in the config object. */ initialize: function(options) { - // concatenate events specific to vector with those from the base - this.EVENT_TYPES = - OpenLayers.Layer.Bing.prototype.EVENT_TYPES.concat( - OpenLayers.Layer.prototype.EVENT_TYPES - ); - options = OpenLayers.Util.applyDefaults({ zoomOffset: 1, maxResolution: 78271.51695, @@ -245,9 +217,6 @@ OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, { this.updateAttribution(); } this.map.events.register("moveend", this, this.updateAttribution); - // TODO: move this event to Layer - // http://trac.osgeo.org/openlayers/ticket/2983 - this.events.triggerEvent("added", {map: this.map, layer: this}); }, /** diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index 0b6a4ec1e4..d4563e4614 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -943,6 +943,7 @@ OpenLayers.Map = OpenLayers.Class({ } this.events.triggerEvent("addlayer", {layer: layer}); + layer.events.triggerEvent("added", {map: this, layer: layer}); layer.afterAdd(); }, @@ -1017,6 +1018,7 @@ OpenLayers.Map = OpenLayers.Class({ this.resetLayersZIndex(); this.events.triggerEvent("removelayer", {layer: layer}); + layer.events.triggerEvent("removed", {map: this, layer: layer}) }, /** diff --git a/tests/Layer.html b/tests/Layer.html index 9938ac7e2b..3b8ca415bf 100644 --- a/tests/Layer.html +++ b/tests/Layer.html @@ -751,16 +751,27 @@ function test_afterAdd(t) { - t.plan(1); + t.plan(4); + var log = []; var map = new OpenLayers.Map("map"); - var layer = new OpenLayers.Layer(null, {isBaseLayer: true}); + var layer = new OpenLayers.Layer(null, { + isBaseLayer: true, + eventListeners: { + "added": function(evt) { + log.push(evt); + } + } + }); var hasBase = false; layer.afterAdd = function() { hasBase = !!(layer.map && layer.map.baseLayer); } map.addLayer(layer); t.eq(hasBase, true, "when afterAdd is called, map has a base layer"); + t.eq(log.length, 1, "added event triggered"); + t.eq(log[0].map.id, map.id, "added listener argument with correct map"); + t.eq(log[0].layer.id, layer.id, "added listener argument with correct layer"); } @@ -806,11 +817,18 @@ function test_Layer_destroy (t) { - t.plan( 5 ); + t.plan( 8 ); + var log = []; var map = new OpenLayers.Map('map'); - layer = new OpenLayers.Layer('Test Layer'); + layer = new OpenLayers.Layer('Test Layer', { + eventListeners: { + "removed": function(evt) { + log.push(evt); + } + } + }); map.addLayer(layer); @@ -822,6 +840,9 @@ t.eq( layer.options, null, "layer.options is null after destroy" ); t.eq(map.layers.length, 0, "layer removed from map"); + t.eq(log.length, 1, "removed event triggered"); + t.eq(log[0].map.id, map.id, "removed listener argument with correct map"); + t.eq(log[0].layer.id, layer.id, "removed listener argument with correct layer"); map.destroy(); diff --git a/tests/Map.html b/tests/Map.html index e2a2dddc8a..8d37fc67ad 100644 --- a/tests/Map.html +++ b/tests/Map.html @@ -699,11 +699,12 @@ function test_Map_removeLayer(t) { t.plan(1); var f = function() {}; + var events = {triggerEvent: f}; var layers = [ - {name: "fee", removeMap: f}, - {name: "fi", removeMap: f}, - {name: "fo", removeMap: f}, - {name: "fum", removeMap: f} + {name: "fee", removeMap: f, events: events}, + {name: "fi", removeMap: f, events: events}, + {name: "fo", removeMap: f, events: events}, + {name: "fum", removeMap: f, events: events} ]; var map = { layers: layers,