diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js index ac9ab2ee3f..c711cfc899 100644 --- a/lib/OpenLayers/Control/SelectFeature.js +++ b/lib/OpenLayers/Control/SelectFeature.js @@ -42,6 +42,13 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { */ onUnselect: function() {}, + /** + * APIProperty: geometryTypes + * {Array(String)} To restrict selecting to a limited set of geometry types, + * send a list of strings corresponding to the geometry class names. + */ + geometryTypes: null, + /** * Property: layer * {} @@ -75,13 +82,16 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, { */ initialize: function(layer, options) { OpenLayers.Control.prototype.initialize.apply(this, [options]); + this.layer = layer; this.callbacks = OpenLayers.Util.extend({ click: this.clickFeature, over: this.overFeature, out: this.outFeature }, this.callbacks); - this.layer = layer; - this.handler = new OpenLayers.Handler.Feature(this, layer, this.callbacks); + var handlerOptions = {geometryTypes: this.geometryTypes}; + this.handler = new OpenLayers.Handler.Feature(this, layer, + this.callbacks, + handlerOptions); }, /** diff --git a/lib/OpenLayers/Handler/Feature.js b/lib/OpenLayers/Handler/Feature.js index fc1a9a1990..ed952e7e57 100644 --- a/lib/OpenLayers/Handler/Feature.js +++ b/lib/OpenLayers/Handler/Feature.js @@ -12,6 +12,14 @@ * (corresponding to the equivalent mouse events). */ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { + + /** + * To restrict dragging to a limited set of geometry types, send a list + * of strings corresponding to the geometry class names. + * + * @type Array(String) + */ + geometryTypes: null, /** * Property: layerIndex @@ -115,30 +123,43 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { * Returns: * {Boolean} A feature was selected */ - select: function(type, evt) { + select: function(type, evt) { var feature = this.layer.getFeatureFromEvent(evt); + var selected = false; if(feature) { - // three cases: - // over a new, out of the last and over a new, or still on the last - if(!this.feature) { - // over a new feature - this.callback('over', [feature]); - } else if(this.feature != feature) { - // out of the last and over a new - this.callback('out', [this.feature]); - this.callback('over', [feature]); + if(this.geometryTypes == null || + (OpenLayers.Util.indexOf(this.geometryTypes, + feature.geometry.CLASS_NAME) > -1)) { + // three cases: + // over a new, out of the last and over a new, or still on the last + if(!this.feature) { + // over a new feature + this.callback('over', [feature]); + } else if(this.feature != feature) { + // out of the last and over a new + this.callback('out', [this.feature]); + this.callback('over', [feature]); + } + this.feature = feature; + this.callback(type, [feature]); + selected = true; + } else { + if(this.feature && (this.feature != feature)) { + // out of the last and over a new + this.callback('out', [this.feature]); + this.feature = null; + } + selected = false; } - this.feature = feature; - this.callback(type, [feature]); - return true; } else { if(this.feature) { // out of the last this.callback('out', [this.feature]); this.feature = null; } - return false; + selected = false; } + return selected; }, /** diff --git a/tests/Handler/test_Feature.html b/tests/Handler/test_Feature.html index 56295094a9..07c2b1c021 100644 --- a/tests/Handler/test_Feature.html +++ b/tests/Handler/test_Feature.html @@ -98,6 +98,28 @@ } + function test_Handler_feature_geometrytype_limit(t) { + t.plan(2); + var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0)); + var map = new OpenLayers.Map('map'); + var control = new OpenLayers.Control(); + map.addControl(control); + var layer = new OpenLayers.Layer(); + layer.getFeatureFromEvent = function(evt) { return feature }; + map.addLayer(layer); + var handler = new OpenLayers.Handler.Feature(control, layer, {}, {'geometryTypes':['OpenLayers.Geometry.Point']}); + handler.activate(); + handler.callback = function(type,featurelist) { + t.eq(featurelist[0].id, feature.id, "Correct feature called back on"); + } + handler.select("foo", {}); + handler.feature = null; + handler.callback = function(type,featurelist) { + t.fail("Shouldn't have called back on " + featurelist[0].geometry); + } + feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(0,0)); + handler.select("foo", {}); + } function test_Handler_Feature_callbacks(t) { t.plan(75);