diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js index 3ea8db341f..1cacf3a20a 100644 --- a/lib/OpenLayers/Control/SelectFeature.js +++ b/lib/OpenLayers/Control/SelectFeature.js @@ -25,6 +25,18 @@ OpenLayers.Control.SelectFeature.prototype = */ hover: false, + /** + * @type {Function} Optional function to be called when a feature is selected. + * The function should expect to be called with a geometry. + */ + onSelect: function() {}, + + /** + * @type {Function} Optional function to be called when a feature is unselected. + * The function should expect to be called with a geometry. + */ + onUnselect: function() {}, + /** * @type {OpenLayers.Layer.Vector} */ @@ -73,40 +85,24 @@ OpenLayers.Control.SelectFeature.prototype = if(geometry.parent) { geometry = geometry.parent; } - // Store feature style for restoration later - if(geometry.feature.originalStyle == null) { - geometry.feature.originalStyle = geometry.feature.style; - } - if (this.multiple) { if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1) { - this.layer.renderer.drawGeometry(geometry, - geometry.feature.originalStyle); - OpenLayers.Util.removeItem(this.layer.selectedFeatures, - geometry.feature); + this.unselect(geometry); } else { - this.layer.selectedFeatures.push(geometry.feature); - this.layer.renderer.drawGeometry(geometry, this.selectStyle); + this.select(geometry); } } else { if(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1) { - this.layer.renderer.drawGeometry(geometry, - geometry.feature.originalStyle); - OpenLayers.Util.removeItem(this.layer.selectedFeatures, - geometry.feature); + this.unselect(geometry); } else { if (this.layer.selectedFeatures) { for (var i = 0; i < this.layer.selectedFeatures.length; i++) { - this.layer.renderer.drawGeometry( - this.layer.selectedFeatures[i].geometry, - this.layer.selectedFeatures[i].originalStyle); + this.unselect(this.layer.selectedFeatures[i].geometry); } - OpenLayers.Util.clearArray(this.layer.selectedFeatures); - } - this.layer.selectedFeatures.push(geometry.feature); - this.layer.renderer.drawGeometry(geometry, this.selectStyle); + } + this.select(geometry); } - } + } }, /** @@ -121,14 +117,8 @@ OpenLayers.Control.SelectFeature.prototype = if(geometry.parent) { geometry = geometry.parent; } - // Store feature style for restoration later - if(geometry.feature.originalStyle == null) { - geometry.feature.originalStyle = geometry.feature.style; - } - if(!(OpenLayers.Util.indexOf(this.layer.selectedFeatures, geometry.feature) > -1)) { - this.layer.selectedFeatures.push(geometry.feature); - this.layer.renderer.drawGeometry(geometry, this.selectStyle); + this.select(geometry); } }, @@ -144,8 +134,37 @@ OpenLayers.Control.SelectFeature.prototype = if(geometry.parent) { geometry = geometry.parent; } + this.unselect(geometry); + }, + + /** + * Add feature to the layer's selectedFeature array, render the feature as + * selected, and call the onSelect function. + * @param {OpenLayers.Geometry} geometry + */ + select: function(geometry) { + // Store feature style for restoration later + if(geometry.feature.originalStyle == null) { + geometry.feature.originalStyle = geometry.feature.style; + } + this.layer.selectedFeatures.push(geometry.feature); + this.layer.renderer.drawGeometry(geometry, this.selectStyle); + this.onSelect(geometry); + }, + + /** + * Remove feature from the layer's selectedFeature array, render the feature as + * normal, and call the onUnselect function. + * @param {OpenLayers.Geometry} geometry + */ + unselect: function(geometry) { + // Store feature style for restoration later + if(geometry.feature.originalStyle == null) { + geometry.feature.originalStyle = geometry.feature.style; + } this.layer.renderer.drawGeometry(geometry, geometry.feature.originalStyle); OpenLayers.Util.removeItem(this.layer.selectedFeatures, geometry.feature); + this.onUnselect(geometry); }, /** Set the map property for the control.