[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