[OpenLayers-Commits] r4241 - in trunk/openlayers: lib/OpenLayers/Control lib/OpenLayers/Handler tests/Handler

commits at openlayers.org commits at openlayers.org
Wed Sep 12 10:25:35 EDT 2007


Author: elemoine
Date: 2007-09-12 10:25:34 -0400 (Wed, 12 Sep 2007)
New Revision: 4241

Modified:
   trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js
   trunk/openlayers/lib/OpenLayers/Handler/Feature.js
   trunk/openlayers/tests/Handler/test_Feature.html
Log:
select features on "click" as opposed to on "mousedown" (closes #891)
thanks to all for the review and to crschmidt for updating the patch


Modified: trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js	2007-09-12 14:00:29 UTC (rev 4240)
+++ trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js	2007-09-12 14:25:34 UTC (rev 4241)
@@ -76,7 +76,7 @@
     initialize: function(layer, options) {
         OpenLayers.Control.prototype.initialize.apply(this, [options]);
         this.callbacks = OpenLayers.Util.extend({
-                                                  down: this.downFeature,
+                                                  click: this.clickFeature,
                                                   over: this.overFeature,
                                                   out: this.outFeature
                                                 }, this.callbacks);
@@ -85,13 +85,13 @@
     },
 
     /**
-     * Method: downFeature
-     * Called when the feature handler detects a mouse-down on a feature
+     * Method: clickFeature
+     * Called when the feature handler detects a click on a feature
      *
      * Parameters:
      * feature - {<OpenLayers.Vector.Feature>} 
      */
-    downFeature: function(feature) {
+    clickFeature: function(feature) {
         if(this.hover) {
             return;
         }

Modified: trunk/openlayers/lib/OpenLayers/Handler/Feature.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Handler/Feature.js	2007-09-12 14:00:29 UTC (rev 4240)
+++ trunk/openlayers/lib/OpenLayers/Handler/Feature.js	2007-09-12 14:25:34 UTC (rev 4241)
@@ -8,8 +8,8 @@
  * 
  * Class: OpenLayers.Handler.Feature 
  * Handler to respond to mouse events related to a drawn feature.
- * Callbacks will be called for over, move, out, up, and down (corresponding
- * to the equivalent mouse events).
+ * Callbacks will be called for over, move, out, up, down, and click
+ * (corresponding to the equivalent mouse events).
  */
 OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
     
@@ -42,6 +42,18 @@
     },
 
     /**
+     * Method: click
+     * Handle click.  Call the "click" callback if down on a feature.
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    click: function(evt) {
+        var selected = this.select('click', evt);
+        return !selected;  // stop event propagation if selected
+    },
+
+    /**
      * Method: mousedown
      * Handle mouse down.  Call the "down" callback if down on a feature.
      * 

Modified: trunk/openlayers/tests/Handler/test_Feature.html
===================================================================
--- trunk/openlayers/tests/Handler/test_Feature.html	2007-09-12 14:00:29 UTC (rev 4240)
+++ trunk/openlayers/tests/Handler/test_Feature.html	2007-09-12 14:25:34 UTC (rev 4241)
@@ -54,6 +54,149 @@
              "layer z-index properly adjusted");
         
     }
+    function test_Handler_Feature_events(t) {
+        t.plan(25);
+        
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+        var handler = new OpenLayers.Handler.Feature(control, layer);
+ 
+        // list below events that should be handled (events) and those
+        // that should not be handled (nonevents) by the handler
+        var events = ["mousedown", "mouseup", "mousemove", "click", "dblclick"];
+        var nonevents = ["mouseout", "resize", "focus", "blur"];
+        map.events.registerPriority = function(type, obj, func) {
+            var output = func();
+            // Don't listen for setEvent handlers (#902)
+            if (typeof output == "string") {
+                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1,
+                     "registered method is not one of the events " +
+                     "that should not be handled");
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(func(), type,
+                     "activate calls registerPriority with the correct method:"+type);
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.Feature",
+                     "activate calls registerPriority with the handler");
+            }     
+        }
+        
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+ 
+        var activated = handler.activate();
+ 
+    }
+ 
+    function test_Handler_Feature_callbacks(t) {
+        t.plan(75);
+        
+        var map = new OpenLayers.Map('map', {controls: []});
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+        
+        var evtsToTest = [
+            {
+                shortName: "down",
+                longName: "mousedown"
+            },
+            {
+                shortName: "move",
+                longName: "mousemove"
+            },
+            {
+                shortName: "up",
+                longName: "mouseup"
+            },
+            {
+                shortName: "click",
+                longName: "click"
+            },
+            {
+                shortName: "dblclick",
+                longName: "dblclick"
+            }
+       ];
+ 
+        var numEvents = {};
+        var callbacks = {};
+ 
+        var newFeature;
+        var oldFeature;
+ 
+        function getCallback(evt, feature) {
+            return function(f) {
+                t.ok(f == feature, "callback called with proper feature");
+                numEvents[evt]++;
+            };
+        }
+ 
+        layer.getFeatureFromEvent = function(evt) { return newFeature; };
+ 
+        var handler = new OpenLayers.Handler.Feature(control, layer, callbacks);
+        handler.activate();
+ 
+        for (var i = 0; i < evtsToTest.length; i++) {
+            evt = evtsToTest[i];
+ 
+            var evtShortName = evt.shortName;
+            var evtLongName = evt.longName;
+ 
+            var evtPx = {xy: new OpenLayers.Pixel(Math.random(), Math.random())};
+ 
+            handler.feature = null;
+ 
+            numEvents[evtShortName] = 0;
+            numEvents["over"] = 0;
+            numEvents["out"] = 0;
+            oldFeature = null;
+            newFeature = new OpenLayers.Feature.Vector();
+            callbacks[evtShortName] = getCallback(evtShortName, newFeature);
+            callbacks["over"] = getCallback("over", newFeature);
+            callbacks["out"] = getCallback("out", oldFeature);
+            map.events.triggerEvent(evtLongName, evtPx);
+            t.ok(numEvents[evtShortName] == 1, evtShortName + " triggered click callback");
+            t.ok(numEvents["over"] == 1, evtShortName + " triggered over callbacks");
+            t.ok(numEvents["out"] == 0, evtShortName + " did not trigger out callback");
+ 
+            numEvents[evtShortName] = 0;
+            numEvents["over"] = 0;
+            numEvents["out"] = 0;
+            oldFeature = newFeature;
+            newFeature = new OpenLayers.Feature.Vector();
+            callbacks[evtShortName] = getCallback(evtShortName, newFeature);
+            callbacks["over"] = getCallback("over", newFeature);
+            callbacks["out"] = getCallback("out", oldFeature);
+            map.events.triggerEvent(evtLongName, evtPx);
+            t.ok(numEvents[evtShortName] == 1, evtShortName + " triggered click callback");
+            t.ok(numEvents["over"] == 1, evtShortName + " triggered over callbacks");
+            t.ok(numEvents["out"] == 1, evtShortName + " triggered out callback");
+ 
+            numEvents[evtShortName] = 0;
+            numEvents["over"] = 0;
+            numEvents["out"] = 0;
+            oldFeature =  newFeature;
+            callbacks[evtShortName] = getCallback(evtShortName, newFeature);
+            callbacks["over"] = getCallback("over", newFeature);
+            callbacks["out"] = getCallback("out", oldFeature);
+            map.events.triggerEvent(evtLongName, evtPx);
+            t.ok(numEvents[evtShortName] == 1, evtShortName + " triggered click callback");
+            t.ok(numEvents["over"] == 0, evtShortName + " did not trigger over callbacks");
+            t.ok(numEvents["out"] == 0, evtShortName + " did not trigger out callback");
+        }
+    }
 
     function test_Handler_Feature_deactivate(t) {
         t.plan(3);



More information about the Commits mailing list