With review from elem and additional tests, add filter by geometry type

to select feature control, with tests. (Closes #951)


git-svn-id: http://svn.openlayers.org/trunk/openlayers@4243 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
crschmidt
2007-09-12 15:05:18 +00:00
parent e1fa24df5c
commit 024779d898
3 changed files with 69 additions and 16 deletions

View File

@@ -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
* {<OpenLayers.Layer.Vector>}
@@ -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);
},
/**

View File

@@ -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;
},
/**

View File

@@ -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);