From d82108c2d7e22ed233aa9efbd2ef11a500b9c447 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 26 Mar 2007 03:33:17 +0000 Subject: [PATCH] refactoring SelectFeature.js a bit - adding onSelect and onUnselect properties that control users can set to respond to feature selections git-svn-id: http://svn.openlayers.org/trunk/openlayers@2895 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Control/SelectFeature.js | 79 +++++++++++++++---------- 1 file changed, 49 insertions(+), 30 deletions(-) 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.