diff --git a/lib/OpenLayers/Control/ModifyFeature.js b/lib/OpenLayers/Control/ModifyFeature.js index b710fa9a26..5be518cc35 100644 --- a/lib/OpenLayers/Control/ModifyFeature.js +++ b/lib/OpenLayers/Control/ModifyFeature.js @@ -273,8 +273,8 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { var deactivated = false; // the return from the controls is unimportant in this case if(OpenLayers.Control.prototype.deactivate.apply(this, arguments)) { - this.layer.removeFeatures(this.vertices); - this.layer.removeFeatures(this.virtualVertices); + this.layer.removeFeatures(this.vertices, {silent: true}); + this.layer.removeFeatures(this.virtualVertices, {silent: true}); this.vertices = []; this.dragControl.deactivate(); if(this.feature && this.feature.geometry) { @@ -314,16 +314,16 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { * unselected feature. */ unselectFeature: function(object) { - this.layer.removeFeatures(this.vertices); + this.layer.removeFeatures(this.vertices, {silent: true}); this.vertices = []; - this.layer.destroyFeatures(this.virtualVertices); + this.layer.destroyFeatures(this.virtualVertices, {silent: true}); this.virtualVertices = []; if(this.dragHandle) { - this.layer.destroyFeatures([this.dragHandle]); + this.layer.destroyFeatures([this.dragHandle], {silent: true}); delete this.dragHandle; } if(this.radiusHandle) { - this.layer.destroyFeatures([this.radiusHandle]); + this.layer.destroyFeatures([this.radiusHandle], {silent: true}); delete this.radiusHandle; } this.feature = null; @@ -413,17 +413,17 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { this.vertices.push(vertex); } else if(vertex == this.dragHandle) { // dragging a drag handle - this.layer.removeFeatures(this.vertices); + this.layer.removeFeatures(this.vertices, {silent: true}); this.vertices = []; if(this.radiusHandle) { - this.layer.destroyFeatures([this.radiusHandle]); + this.layer.destroyFeatures([this.radiusHandle], {silent: true}); this.radiusHandle = null; } } // dragging a radius handle - no special treatment // dragging a real vertex - no special treatment if(this.virtualVertices.length > 0) { - this.layer.destroyFeatures(this.virtualVertices); + this.layer.destroyFeatures(this.virtualVertices, {silent: true}); this.virtualVertices = []; } this.layer.drawFeature(this.feature, this.selectControl.renderIntent); @@ -463,19 +463,19 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { this.dragControl.outFeature(this.dragControl.feature); } if(this.vertices.length > 0) { - this.layer.removeFeatures(this.vertices); + this.layer.removeFeatures(this.vertices, {silent: true}); this.vertices = []; } if(this.virtualVertices.length > 0) { - this.layer.removeFeatures(this.virtualVertices); + this.layer.removeFeatures(this.virtualVertices, {silent: true}); this.virtualVertices = []; } if(this.dragHandle) { - this.layer.destroyFeatures([this.dragHandle]); + this.layer.destroyFeatures([this.dragHandle], {silent: true}); this.dragHandle = null; } if(this.radiusHandle) { - this.layer.destroyFeatures([this.radiusHandle]); + this.layer.destroyFeatures([this.radiusHandle], {silent: true}); this.radiusHandle = null; } if(this.feature && diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js index df6406715c..d12db0eeb8 100644 --- a/lib/OpenLayers/Layer/Vector.js +++ b/lib/OpenLayers/Layer/Vector.js @@ -401,6 +401,8 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { } this.features = OpenLayers.Util.removeItem(this.features, feature); + // feature has no layer at this point + feature.layer = null; if (feature.geometry) { this.renderer.eraseGeometry(feature.geometry); @@ -432,21 +434,17 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, { * features - {Array()} An optional array of * features to destroy. If not supplied, all features on the layer * will be destroyed. + * options - {Object} */ - destroyFeatures: function(features) { - var all = (features == undefined); + destroyFeatures: function(features, options) { + var all = (features == undefined); // evaluates to true if + // features is null if(all) { features = this.features; - this.selectedFeatures = []; } - this.eraseFeatures(features); - var feature; - for(var i=features.length-1; i>=0; i--) { - feature = features[i]; - if(!all) { - OpenLayers.Util.removeItem(this.selectedFeatures, feature); - } - feature.destroy(); + this.removeFeatures(features, options); + for (var i = 0; i < features.length; i++) { + features[i].destroy(); } }, diff --git a/tests/Control/ModifyFeature.html b/tests/Control/ModifyFeature.html index 16ec938a84..2912aeaf9c 100644 --- a/tests/Control/ModifyFeature.html +++ b/tests/Control/ModifyFeature.html @@ -213,6 +213,11 @@ control.selectFeature({feature: fakeFeature}); control.destroy(); + + // layer.destroy() will call removeFeatures with an empty array, make + // removeFeatures reference an empty function to prevent the above + // test to fail + layer.removeFeatures = function(features) {}; layer.destroy(); } @@ -323,6 +328,11 @@ control.dragComplete(); control.destroy(); + + // layer.destroy() will call removeFeatures with an empty array, make + // removeFeatures reference an empty function to prevent the above + // test to fail + layer.removeFeatures = function(verts) {}; layer.destroy(); }