select features on "click" as opposed to on "mousedown" (closes #891)

thanks to all for the review and to crschmidt for updating the patch


git-svn-id: http://svn.openlayers.org/trunk/openlayers@4241 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Éric Lemoine
2007-09-12 14:25:34 +00:00
parent 446759fd65
commit 6f16455b1c
3 changed files with 161 additions and 6 deletions

View File

@@ -76,7 +76,7 @@ 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.callbacks = OpenLayers.Util.extend({ this.callbacks = OpenLayers.Util.extend({
down: this.downFeature, click: this.clickFeature,
over: this.overFeature, over: this.overFeature,
out: this.outFeature out: this.outFeature
}, this.callbacks); }, this.callbacks);
@@ -85,13 +85,13 @@ OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
}, },
/** /**
* Method: downFeature * Method: clickFeature
* Called when the feature handler detects a mouse-down on a feature * Called when the feature handler detects a click on a feature
* *
* Parameters: * Parameters:
* feature - {<OpenLayers.Vector.Feature>} * feature - {<OpenLayers.Vector.Feature>}
*/ */
downFeature: function(feature) { clickFeature: function(feature) {
if(this.hover) { if(this.hover) {
return; return;
} }

View File

@@ -8,8 +8,8 @@
* *
* Class: OpenLayers.Handler.Feature * Class: OpenLayers.Handler.Feature
* Handler to respond to mouse events related to a drawn feature. * Handler to respond to mouse events related to a drawn feature.
* Callbacks will be called for over, move, out, up, and down (corresponding * Callbacks will be called for over, move, out, up, down, and click
* to the equivalent mouse events). * (corresponding to the equivalent mouse events).
*/ */
OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
@@ -41,6 +41,18 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
this.layer = layer; this.layer = layer;
}, },
/**
* 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 * Method: mousedown
* Handle mouse down. Call the "down" callback if down on a feature. * Handle mouse down. Call the "down" callback if down on a feature.

View File

@@ -54,6 +54,149 @@
"layer z-index properly adjusted"); "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) { function test_Handler_Feature_deactivate(t) {
t.plan(3); t.plan(3);