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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user