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