OpenLayers OpenLayers

Changeset 4241

Show
Ignore:
Timestamp:
09/12/07 10:25:34 (1 year ago)
Author:
elemoine
Message:

select features on "click" as opposed to on "mousedown" (closes #891)
thanks to all for the review and to crschmidt for updating the patch

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js

    r4232 r4241  
    7777        OpenLayers.Control.prototype.initialize.apply(this, [options]); 
    7878        this.callbacks = OpenLayers.Util.extend({ 
    79                                                   down: this.downFeature, 
     79                                                  click: this.clickFeature, 
    8080                                                  over: this.overFeature, 
    8181                                                  out: this.outFeature 
     
    8686 
    8787    /** 
    88      * Method: downFeature 
    89      * Called when the feature handler detects a mouse-down on a feature 
     88     * Method: clickFeature 
     89     * Called when the feature handler detects a click on a feature 
    9090     * 
    9191     * Parameters: 
    9292     * feature - {<OpenLayers.Vector.Feature>}  
    9393     */ 
    94     downFeature: function(feature) { 
     94    clickFeature: function(feature) { 
    9595        if(this.hover) { 
    9696            return; 
  • trunk/openlayers/lib/OpenLayers/Handler/Feature.js

    r4110 r4241  
    99 * Class: OpenLayers.Handler.Feature  
    1010 * Handler to respond to mouse events related to a drawn feature. 
    11  * Callbacks will be called for over, move, out, up, and down (corresponding 
    12  * to the equivalent mouse events). 
     11 * Callbacks will be called for over, move, out, up, down, and click 
     12 * (corresponding to the equivalent mouse events). 
    1313 */ 
    1414OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { 
     
    4040        OpenLayers.Handler.prototype.initialize.apply(this, [control, callbacks, options]); 
    4141        this.layer = layer; 
     42    }, 
     43 
     44    /** 
     45     * Method: click 
     46     * Handle click.  Call the "click" callback if down on a feature. 
     47     *  
     48     * Parameters: 
     49     * evt - {Event}  
     50     */ 
     51    click: function(evt) { 
     52        var selected = this.select('click', evt); 
     53        return !selected;  // stop event propagation if selected 
    4254    }, 
    4355 
  • trunk/openlayers/tests/Handler/test_Feature.html

    r4148 r4241  
    5555         
    5656    } 
     57    function test_Handler_Feature_events(t) { 
     58        t.plan(25); 
     59         
     60        var map = new OpenLayers.Map('map'); 
     61        var control = new OpenLayers.Control(); 
     62        map.addControl(control); 
     63        var layer = new OpenLayers.Layer(); 
     64        map.addLayer(layer); 
     65        var handler = new OpenLayers.Handler.Feature(control, layer); 
     66  
     67        // list below events that should be handled (events) and those 
     68        // that should not be handled (nonevents) by the handler 
     69        var events = ["mousedown", "mouseup", "mousemove", "click", "dblclick"]; 
     70        var nonevents = ["mouseout", "resize", "focus", "blur"]; 
     71        map.events.registerPriority = function(type, obj, func) { 
     72            var output = func(); 
     73            // Don't listen for setEvent handlers (#902) 
     74            if (typeof output == "string") { 
     75                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1, 
     76                     "registered method is not one of the events " + 
     77                     "that should not be handled"); 
     78                t.ok(OpenLayers.Util.indexOf(events, type) > -1, 
     79                     "activate calls registerPriority with browser event: " + type); 
     80                t.eq(typeof func, "function", 
     81                     "activate calls registerPriority with a function"); 
     82                t.eq(func(), type, 
     83                     "activate calls registerPriority with the correct method:"+type); 
     84                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.Feature", 
     85                     "activate calls registerPriority with the handler"); 
     86            }      
     87        } 
     88         
     89        // set browser event like properties on the handler 
     90        for(var i=0; i<events.length; ++i) { 
     91            setMethod(events[i]); 
     92        } 
     93        function setMethod(key) { 
     94            handler[key] = function() {return key}; 
     95        } 
     96  
     97        var activated = handler.activate(); 
     98  
     99    } 
     100  
     101    function test_Handler_Feature_callbacks(t) { 
     102        t.plan(75); 
     103         
     104        var map = new OpenLayers.Map('map', {controls: []}); 
     105        var control = new OpenLayers.Control(); 
     106        map.addControl(control); 
     107        var layer = new OpenLayers.Layer(); 
     108        map.addLayer(layer); 
     109         
     110        var evtsToTest = [ 
     111            { 
     112                shortName: "down", 
     113                longName: "mousedown" 
     114            }, 
     115            { 
     116                shortName: "move", 
     117                longName: "mousemove" 
     118            }, 
     119            { 
     120                shortName: "up", 
     121                longName: "mouseup" 
     122            }, 
     123            { 
     124                shortName: "click", 
     125                longName: "click" 
     126            }, 
     127            { 
     128                shortName: "dblclick", 
     129                longName: "dblclick" 
     130            } 
     131       ]; 
     132  
     133        var numEvents = {}; 
     134        var callbacks = {}; 
     135  
     136        var newFeature; 
     137        var oldFeature; 
     138  
     139        function getCallback(evt, feature) { 
     140            return function(f) { 
     141                t.ok(f == feature, "callback called with proper feature"); 
     142                numEvents[evt]++; 
     143            }; 
     144        } 
     145  
     146        layer.getFeatureFromEvent = function(evt) { return newFeature; }; 
     147  
     148        var handler = new OpenLayers.Handler.Feature(control, layer, callbacks); 
     149        handler.activate(); 
     150  
     151        for (var i = 0; i < evtsToTest.length; i++) { 
     152            evt = evtsToTest[i]; 
     153  
     154            var evtShortName = evt.shortName; 
     155            var evtLongName = evt.longName; 
     156  
     157            var evtPx = {xy: new OpenLayers.Pixel(Math.random(), Math.random())}; 
     158  
     159            handler.feature = null; 
     160  
     161            numEvents[evtShortName] = 0; 
     162            numEvents["over"] = 0; 
     163            numEvents["out"] = 0; 
     164            oldFeature = null; 
     165            newFeature = new OpenLayers.Feature.Vector(); 
     166            callbacks[evtShortName] = getCallback(evtShortName, newFeature); 
     167            callbacks["over"] = getCallback("over", newFeature); 
     168            callbacks["out"] = getCallback("out", oldFeature); 
     169            map.events.triggerEvent(evtLongName, evtPx); 
     170            t.ok(numEvents[evtShortName] == 1, evtShortName + " triggered click callback"); 
     171            t.ok(numEvents["over"] == 1, evtShortName + " triggered over callbacks"); 
     172            t.ok(numEvents["out"] == 0, evtShortName + " did not trigger out callback"); 
     173  
     174            numEvents[evtShortName] = 0; 
     175            numEvents["over"] = 0; 
     176            numEvents["out"] = 0; 
     177            oldFeature = newFeature; 
     178            newFeature = new OpenLayers.Feature.Vector(); 
     179            callbacks[evtShortName] = getCallback(evtShortName, newFeature); 
     180            callbacks["over"] = getCallback("over", newFeature); 
     181            callbacks["out"] = getCallback("out", oldFeature); 
     182            map.events.triggerEvent(evtLongName, evtPx); 
     183            t.ok(numEvents[evtShortName] == 1, evtShortName + " triggered click callback"); 
     184            t.ok(numEvents["over"] == 1, evtShortName + " triggered over callbacks"); 
     185            t.ok(numEvents["out"] == 1, evtShortName + " triggered out callback"); 
     186  
     187            numEvents[evtShortName] = 0; 
     188            numEvents["over"] = 0; 
     189            numEvents["out"] = 0; 
     190            oldFeature =  newFeature; 
     191            callbacks[evtShortName] = getCallback(evtShortName, newFeature); 
     192            callbacks["over"] = getCallback("over", newFeature); 
     193            callbacks["out"] = getCallback("out", oldFeature); 
     194            map.events.triggerEvent(evtLongName, evtPx); 
     195            t.ok(numEvents[evtShortName] == 1, evtShortName + " triggered click callback"); 
     196            t.ok(numEvents["over"] == 0, evtShortName + " did not trigger over callbacks"); 
     197            t.ok(numEvents["out"] == 0, evtShortName + " did not trigger out callback"); 
     198        } 
     199    } 
    57200 
    58201    function test_Handler_Feature_deactivate(t) {