From f7d1665a24061b21772f9eb1eec29902f9156805 Mon Sep 17 00:00:00 2001 From: euzuro Date: Mon, 27 Aug 2007 15:54:57 +0000 Subject: [PATCH] add removeLayer() function to Layers... implement it for EventPane so that it removes the extra 'pane' div when the layer is removed. (Closes #887) git-svn-id: http://svn.openlayers.org/trunk/openlayers@4053 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Layer.js | 16 ++++++++++++++++ lib/OpenLayers/Layer/EventPane.js | 16 ++++++++++++++++ lib/OpenLayers/Map.js | 3 ++- tests/Layer/test_EventPane.html | 14 ++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 46724c7e34..02456beb6e 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -418,6 +418,22 @@ OpenLayers.Layer = OpenLayers.Class({ } }, + /** + * APIMethod: removeMap + * Just as setMap() allows each layer the possibility to take a + * personalized action on being added to the map, removeMap() allows + * each layer to take a personalized action on being removed from it. + * For now, this will be mostly unused, except for the EventPane layer, + * which needs this hook so that it can remove the special invisible + * pane. + * + * Parameters: + * map - {} + */ + removeMap: function(map) { + //to be overridden by subclasses + }, + /** * APIMethod: getImageSize * diff --git a/lib/OpenLayers/Layer/EventPane.js b/lib/OpenLayers/Layer/EventPane.js index 9af099ce47..9530c2ee71 100644 --- a/lib/OpenLayers/Layer/EventPane.js +++ b/lib/OpenLayers/Layer/EventPane.js @@ -104,6 +104,22 @@ OpenLayers.Layer.EventPane = OpenLayers.Class(OpenLayers.Layer, { this.loadWarningMessage(); } }, + + /** + * APIMethod: removeMap + * On being removed from the map, we'll like to remove the invisible 'pane' + * div that we added to it on creation. + * + * Parameters: + * map - {} + */ + removeMap: function(map) { + if (this.pane && this.pane.parentNode) { + this.pane.parentNode.removeChild(this.pane); + this.pane = null; + } + OpenLayers.Layer.prototype.removeMap.apply(this, arguments); + }, /** * Method: loadWarningMessage diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index 6ec47407f4..45c6cf5ed3 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -566,8 +566,9 @@ OpenLayers.Map = OpenLayers.Class({ } else { this.layerContainerDiv.removeChild(layer.div); } - layer.map = null; OpenLayers.Util.removeItem(this.layers, layer); + layer.removeMap(this); + layer.map = null; // if we removed the base layer, need to set a new one if (setNewBaseLayer && (this.baseLayer == layer)) { diff --git a/tests/Layer/test_EventPane.html b/tests/Layer/test_EventPane.html index 2be4cedf67..cdf7535001 100644 --- a/tests/Layer/test_EventPane.html +++ b/tests/Layer/test_EventPane.html @@ -105,6 +105,20 @@ layer.setVisibility(true); t.eq(layer.visibility, true, "layer pane is now visible"); } + + + function test_Layer_EventPane_removeLayer(t) { + t.plan(1); + var map = new OpenLayers.Map('map'); + + layer = new OpenLayers.Layer.EventPane('Test Layer'); + layer.loadMapObject = function() { }; + layer.getWarningHTML = function() { this.warning = true; return ""; }; + map.addLayer(layer); + map.removeLayer(layer); + t.eq(layer.pane, null, "Layer.pane is null after being removed."); + } + // -->