[OpenLayers-Commits] r4243 - in trunk/openlayers: lib/OpenLayers/Control lib/OpenLayers/Handler tests/Handler
commits at openlayers.org
commits at openlayers.org
Wed Sep 12 11:05:19 EDT 2007
Author: crschmidt
Date: 2007-09-12 11:05:18 -0400 (Wed, 12 Sep 2007)
New Revision: 4243
Modified:
trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js
trunk/openlayers/lib/OpenLayers/Handler/Feature.js
trunk/openlayers/tests/Handler/test_Feature.html
Log:
With review from elem and additional tests, add filter by geometry type
to select feature control, with tests. (Closes #951)
Modified: trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js 2007-09-12 14:41:34 UTC (rev 4242)
+++ trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js 2007-09-12 15:05:18 UTC (rev 4243)
@@ -43,6 +43,13 @@
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 @@
*/
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);
},
/**
Modified: trunk/openlayers/lib/OpenLayers/Handler/Feature.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Handler/Feature.js 2007-09-12 14:41:34 UTC (rev 4242)
+++ trunk/openlayers/lib/OpenLayers/Handler/Feature.js 2007-09-12 15:05:18 UTC (rev 4243)
@@ -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 @@
* 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;
},
/**
Modified: trunk/openlayers/tests/Handler/test_Feature.html
===================================================================
--- trunk/openlayers/tests/Handler/test_Feature.html 2007-09-12 14:41:34 UTC (rev 4242)
+++ trunk/openlayers/tests/Handler/test_Feature.html 2007-09-12 15:05:18 UTC (rev 4243)
@@ -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);
More information about the Commits
mailing list