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
+12 -2
View File
@@ -42,6 +42,13 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
*/ */
onUnselect: function() {}, 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 * Property: layer
* {<OpenLayers.Layer.Vector>} * {<OpenLayers.Layer.Vector>}
@@ -75,13 +82,16 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
*/ */
initialize: function(layer, options) { initialize: function(layer, options) {
OpenLayers.Control.prototype.initialize.apply(this, [options]); OpenLayers.Control.prototype.initialize.apply(this, [options]);
this.layer = layer;
this.callbacks = OpenLayers.Util.extend({ this.callbacks = OpenLayers.Util.extend({
click: this.clickFeature, click: this.clickFeature,
over: this.overFeature, over: this.overFeature,
out: this.outFeature out: this.outFeature
}, this.callbacks); }, this.callbacks);
this.layer = layer; var handlerOptions = {geometryTypes: this.geometryTypes};
this.handler = new OpenLayers.Handler.Feature(this, layer, this.callbacks); this.handler = new OpenLayers.Handler.Feature(this, layer,
this.callbacks,
handlerOptions);
}, },
/** /**
+34 -13
View File
@@ -13,6 +13,14 @@
*/ */
OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { 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 * Property: layerIndex
* {Int} * {Int}
@@ -117,28 +125,41 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
*/ */
select: function(type, evt) { select: function(type, evt) {
var feature = this.layer.getFeatureFromEvent(evt); var feature = this.layer.getFeatureFromEvent(evt);
var selected = false;
if(feature) { if(feature) {
// three cases: if(this.geometryTypes == null ||
// over a new, out of the last and over a new, or still on the last (OpenLayers.Util.indexOf(this.geometryTypes,
if(!this.feature) { feature.geometry.CLASS_NAME) > -1)) {
// over a new feature // three cases:
this.callback('over', [feature]); // over a new, out of the last and over a new, or still on the last
} else if(this.feature != feature) { if(!this.feature) {
// out of the last and over a new // over a new feature
this.callback('out', [this.feature]); this.callback('over', [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 { } else {
if(this.feature) { if(this.feature) {
// out of the last // out of the last
this.callback('out', [this.feature]); this.callback('out', [this.feature]);
this.feature = null; this.feature = null;
} }
return false; selected = false;
} }
return selected;
}, },
/** /**
+22
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) { function test_Handler_Feature_callbacks(t) {
t.plan(75); t.plan(75);