[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