diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js index 1c130cd0b9..0674ec48c0 100644 --- a/lib/OpenLayers/Layer/Vector.js +++ b/lib/OpenLayers/Layer/Vector.js @@ -45,6 +45,15 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { * - *featuresadded* Triggered after features are added. The event * object passed to listeners will have a *features* property with a * reference to an array of added features. + * - *beforefeatureremoved* Triggered before a feature is removed. Listeners + * will receive an object with a *feature* property referencing the + * feature to be removed. + * - *featureremoved* Triggerd after a feature is removed. The event + * object passed to listeners will have a *feature* property with a + * reference to the removed feature. + * - *featuresremoved* Triggered after features are removed. The event + * object passed to listeners will have a *features* property with a + * reference to an array of removed features. * - *featureselected* Triggered after a feature is selected. Listeners * will receive an object with a *feature* property referencing the * selected feature. @@ -61,8 +70,9 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { * Listeners will receive an object with a *feature* property referencing * the modified feature. */ - EVENT_TYPES: ["beforefeatureadded", "featureadded", - "featuresadded", "featureselected", "featureunselected", + EVENT_TYPES: ["beforefeatureadded", "featureadded", "featuresadded", + "beforefeatureremoved", "featureremoved", "featuresremoved", + "featureselected", "featureunselected", "beforefeaturemodified", "featuremodified", "afterfeaturemodified"], /** @@ -366,14 +376,27 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { * * Parameters: * features - {Array()} + * options - {Object} */ - removeFeatures: function(features) { + removeFeatures: function(features, options) { if (!(features instanceof Array)) { features = [features]; } + if (features.length <= 0) { + return; + } + + var notify = !options || !options.silent; for (var i = features.length - 1; i >= 0; i--) { var feature = features[i]; + + if (notify) { + this.events.triggerEvent("beforefeatureremoved", { + feature: feature + }); + } + this.features = OpenLayers.Util.removeItem(this.features, feature); if (feature.geometry) { @@ -385,6 +408,16 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { if (OpenLayers.Util.indexOf(this.selectedFeatures, feature) != -1){ OpenLayers.Util.removeItem(this.selectedFeatures, feature); } + + if (notify) { + this.events.triggerEvent("featureremoved", { + feature: feature + }); + } + } + + if (notify) { + this.events.triggerEvent("featuresremoved", {features: features}); } }, diff --git a/tests/Layer/Vector.html b/tests/Layer/Vector.html index aa8bba8e80..8164638449 100644 --- a/tests/Layer/Vector.html +++ b/tests/Layer/Vector.html @@ -67,7 +67,7 @@ } function test_Layer_Vector_removeFeatures(t) { - t.plan(3); + t.plan(6); var layer = new OpenLayers.Layer.Vector(name); @@ -75,7 +75,7 @@ var pointFeature1 = new OpenLayers.Feature.Vector(layer, point1); var point2 = new OpenLayers.Geometry.Point(-111.14, 45.78); var pointFeature2 = new OpenLayers.Feature.Vector(layer, point2); - + layer.addFeatures([pointFeature1, pointFeature2]); var features = layer.removeFeatures([pointFeature1]); @@ -88,7 +88,36 @@ t.ok(layer.features.length == 0, "OpenLayers.Layer.Vector.removeFeatures(layer.features) removes all feature from the features array"); - } + + // 3 tests + layer.events.register('beforefeatureremoved', null, function(obj) { + t.ok(pointFeature1 == obj.feature, + "OpenLayers.Layer.Vector.removeFeatures triggers beforefeatureremoved with correct feature passed to callback"); + }); + layer.events.register('featureremoved', null, function(obj) { + t.ok(pointFeature1 == obj.feature, + "OpenLayers.Layer.Vector.removeFeatures triggers featureremoved with correct feature passed to callback"); + }); + layer.events.register('featuresremoved', null, function(obj) { + t.ok(pointFeature1 == obj.features[0], + "OpenLayers.Layer.Vector.removeFeatures triggers featuresremoved with correct features passed to callback"); + }); + layer.addFeatures([pointFeature1]); + layer.removeFeatures([pointFeature1]); + + // 0 test + layer.events.register('beforefeatureremoved', null, function(obj) { + t.fail("OpenLayers.Layer.Vector.removeFeatures triggers beforefeatureremoved while it must not"); + }); + layer.events.register('featureremoved', null, function(obj) { + t.fail("OpenLayers.Layer.Vector.removeFeatures triggers featureremoved while it must not"); + }); + layer.events.register('featuresremoved', null, function(obj) { + t.fail("OpenLayers.Layer.Vector.removeFeatures triggers featuresremoved while it must not"); + }); + layer.addFeatures([pointFeature1]); + layer.removeFeatures([pointFeature1], {silent: true}); + } function test_Layer_Vector_drawFeature(t) { t.plan(4);