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:
@@ -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);
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user