Files
openlayers/tests/Handler/test_Feature.html
Éric Lemoine cf87ffc26c Add properties stopClick, stopDown, and stopUp to the feature handler. If
stopClick is true, clicks handled by the feature handler don't propagate to
other click listeners; otherwise handled clicks do propagate. The same kind of
rule applies to stopDown and stopUp. These properties default to true. Thanks
to Attila Csipa for expressing the need for this feature and cooking up the
first patch. r=tschaub. (closes #1266)


git-svn-id: http://svn.openlayers.org/trunk/openlayers@5976 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
2008-02-03 17:35:39 +00:00

289 lines
11 KiB
HTML

<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_Handler_Feature_constructor(t) {
t.plan(4);
var control = new OpenLayers.Control();
control.id = Math.random();
var layer = "boo";
var callbacks = {foo: "bar"};
var options = {bar: "foo"};
var oldInit = OpenLayers.Handler.prototype.initialize;
OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
t.eq(con.id, control.id,
"constructor calls parent with the correct control");
t.eq(call, callbacks,
"constructor calls parent with the correct callbacks");
t.eq(opt, options,
"constructor calls parent with the correct options");
}
var handler = new OpenLayers.Handler.Feature(control, layer,
callbacks, options);
t.eq(handler.layer, "boo",
"layer property properly set");
OpenLayers.Handler.prototype.initialize = oldInit;
}
function test_Handler_Feature_activate(t) {
t.plan(4);
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);
handler.active = true;
var activated = handler.activate();
t.ok(!activated,
"activate returns false if the handler was already active");
handler.active = false;
var zIndex = layer.div.style.zIndex;
activated = handler.activate();
t.ok(activated,
"activate returns true if the handler was not already active");
t.eq(handler.layerIndex, zIndex,
"layerIndex property properly set");
t.eq(parseInt(layer.div.style.zIndex),
map.Z_INDEX_BASE['Popup'] - 1,
"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_geometrytype_limit(t) {
t.plan(1);
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.handle({type: "click"});
handler.feature = null;
handler.lastFeature = 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.handle("click", {});
}
function test_Handler_Feature_callbacks(t) {
t.plan(9);
var map = new OpenLayers.Map('map', {controls: []});
var control = new OpenLayers.Control();
map.addControl(control);
var layer = new OpenLayers.Layer();
map.addLayer(layer);
var callbacks = {};
var newFeature, lastFeature;
var evtPx = {xy: new OpenLayers.Pixel(Math.random(), Math.random())};
// define a callback factory function
function getCallback(evt, feature) {
return function(f) {
t.ok(f == feature, evt + " callback called with proper feature");
};
}
// override the layer's getFeatureFromEvent func so that it always
// returns newFeature
layer.getFeatureFromEvent = function(evt) { return newFeature; };
var handler = new OpenLayers.Handler.Feature(control, layer, callbacks);
handler.activate();
// test click in new feature
// only 'click' callback should be called
handler.feature = null;
lastFeature = null;
newFeature = new OpenLayers.Feature.Vector();
callbacks['click'] = getCallback('click', newFeature);
callbacks['clickout'] = getCallback('clickout', lastFeature);
evtPx.type = "click";
map.events.triggerEvent('click', evtPx);
// test click in new feature and out of last feature
// both 'click' and 'clickout' callbacks should be called
lastFeature = newFeature;
newFeature = new OpenLayers.Feature.Vector();
callbacks['click'] = getCallback('click', newFeature);
callbacks['clickout'] = getCallback('clickout', lastFeature);
evtPx.type = "click";
map.events.triggerEvent('click', evtPx);
// test click out of last feature
// only 'clickout' callback should be called
lastFeature = newFeature;
newFeature = null;
callbacks['click'] = getCallback('click', newFeature);
callbacks['clickout'] = getCallback('clickout', lastFeature);
evtPx.type = "click";
map.events.triggerEvent('click', evtPx);
// test over a new feature
// only 'over' callback should be called
handler.feature = null;
lastFeature = null;
newFeature = new OpenLayers.Feature.Vector();
callbacks['over'] = getCallback('over', newFeature);
callbacks['out'] = getCallback('out', lastFeature);
evtPx.type = "mousemove";
map.events.triggerEvent('mousemove', evtPx);
// test over a new feature and out of last feature
// both 'over' and 'out' callbacks should be called
lastFeature = newFeature;
newFeature = new OpenLayers.Feature.Vector();
callbacks['over'] = getCallback('over', newFeature);
callbacks['out'] = getCallback('out', lastFeature);
evtPx.type = "mousemove";
map.events.triggerEvent('mousemove', evtPx);
// test out of last feature
// only 'out' callback should be called
lastFeature = newFeature;
newFeature = null;
callbacks['over'] = getCallback('over', newFeature);
callbacks['out'] = getCallback('out', lastFeature);
evtPx.type = "mousemove";
map.events.triggerEvent('mousemove', evtPx);
// test dblclick on a feature
// 'dblclick' callback should be called
handler.feature = null;
lastFeature = null;
newFeature = new OpenLayers.Feature.Vector();
callbacks['dblclick'] = getCallback('dblclick', newFeature);
evtPx.type = "dblclick";
map.events.triggerEvent('dblclick', evtPx);
}
function test_Handler_Feature_deactivate(t) {
t.plan(3);
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);
handler.active = false;
var deactivated = handler.deactivate();
t.ok(!deactivated,
"deactivate returns false if the handler was not already active");
handler.active = true;
handler.layerIndex = Math.floor(Math.random() * 10);
deactivated = handler.deactivate();
t.ok(deactivated,
"deactivate returns true if the handler was active already");
t.eq(parseInt(layer.div.style.zIndex),
handler.layerIndex,
"deactivate sets the layer z-index back");
}
function test_Handler_Feature_stopHandled(t) {
t.plan(3);
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);
handler.activate();
handler.handle = function(evt) { return /* handled */ true; };
var evtPx = {xy: new OpenLayers.Pixel(Math.random(), Math.random())};
map.events.register("click", map, function(e) {
t.ok(!handler.stopClick, "clicks propagate with stopClick set to false" );
});
map.events.register("mousedown", map, function(e) {
t.ok(!handler.stopDown, "mousedown propagate with stopDown set to false" );
});
map.events.register("mouseup", map, function(e) {
t.ok(!handler.stopUp, "mouseup propagate with stopUp set to false" );
});
// 0 test
map.events.triggerEvent('click', evtPx);
// 0 test
map.events.triggerEvent('mousedown', evtPx);
// 0 test
map.events.triggerEvent('mousedown', evtPx);
// 1 test
handler.stopClick = false;
map.events.triggerEvent('click', evtPx);
// 1 test
handler.stopDown = false;
map.events.triggerEvent('mousedown', evtPx);
// 1 test
handler.stopUp = false;
map.events.triggerEvent('mouseup', evtPx);
// 3 tests total
}
</script>
</head>
<body>
<div id="map" style="width: 300px; height: 150px;"/>
</body>
</html>