OpenLayers OpenLayers

Changeset 4243

Show
Ignore:
Timestamp:
09/12/07 11:05:18 (1 year ago)
Author:
crschmidt
Message:

With review from elem and additional tests, add filter by geometry type
to select feature control, with tests. (Closes #951)

Files:

Legend:

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

    r4241 r4243  
    4444 
    4545    /** 
     46     * APIProperty: geometryTypes 
     47     * {Array(String)} To restrict selecting to a limited set of geometry types, 
     48     *     send a list of strings corresponding to the geometry class names. 
     49     */ 
     50    geometryTypes: null, 
     51 
     52    /** 
    4653     * Property: layer 
    4754     * {<OpenLayers.Layer.Vector>} 
     
    7683    initialize: function(layer, options) { 
    7784        OpenLayers.Control.prototype.initialize.apply(this, [options]); 
     85        this.layer = layer; 
    7886        this.callbacks = OpenLayers.Util.extend({ 
    7987                                                  click: this.clickFeature, 
     
    8189                                                  out: this.outFeature 
    8290                                                }, this.callbacks); 
    83         this.layer = layer; 
    84         this.handler = new OpenLayers.Handler.Feature(this, layer, this.callbacks); 
     91        var handlerOptions = {geometryTypes: this.geometryTypes}; 
     92        this.handler = new OpenLayers.Handler.Feature(this, layer, 
     93                                                      this.callbacks, 
     94                                                      handlerOptions); 
    8595    }, 
    8696 
  • trunk/openlayers/lib/OpenLayers/Handler/Feature.js

    r4241 r4243  
    1313 */ 
    1414OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { 
     15 
     16    /** 
     17     * To restrict dragging to a limited set of geometry types, send a list 
     18     * of strings corresponding to the geometry class names. 
     19     *  
     20     * @type Array(String) 
     21     */ 
     22    geometryTypes: null, 
    1523     
    1624    /** 
     
    116124     * {Boolean} A feature was selected 
    117125     */ 
    118     select: function(type, evt) {     
     126    select: function(type, evt) { 
    119127        var feature = this.layer.getFeatureFromEvent(evt); 
     128        var selected = false; 
    120129        if(feature) { 
    121             // three cases: 
    122             // over a new, out of the last and over a new, or still on the last 
    123             if(!this.feature) { 
    124                 // over a new feature 
    125                 this.callback('over', [feature]); 
    126             } else if(this.feature != feature) { 
    127                 // out of the last and over a new 
    128                 this.callback('out', [this.feature]); 
    129                 this.callback('over', [feature]); 
     130            if(this.geometryTypes == null || 
     131               (OpenLayers.Util.indexOf(this.geometryTypes, 
     132                                        feature.geometry.CLASS_NAME) > -1)) { 
     133                // three cases: 
     134                // over a new, out of the last and over a new, or still on the last 
     135                if(!this.feature) { 
     136                    // over a new feature 
     137                    this.callback('over', [feature]); 
     138                } else if(this.feature != feature) { 
     139                    // out of the last and over a new 
     140                    this.callback('out', [this.feature]); 
     141                    this.callback('over', [feature]); 
     142                } 
     143                this.feature = feature; 
     144                this.callback(type, [feature]); 
     145                selected = true; 
     146            } else { 
     147                if(this.feature && (this.feature != feature)) { 
     148                    // out of the last and over a new 
     149                    this.callback('out', [this.feature]); 
     150                    this.feature = null; 
     151                } 
     152                selected = false; 
    130153            } 
    131             this.feature = feature; 
    132             this.callback(type, [feature]); 
    133             return true; 
    134154        } else { 
    135155            if(this.feature) { 
     
    138158                this.feature = null; 
    139159            } 
    140             return false; 
     160            selected = false; 
    141161        } 
     162        return selected; 
    142163    }, 
    143164 
  • trunk/openlayers/tests/Handler/test_Feature.html

    r4241 r4243  
    9999    } 
    100100  
     101    function test_Handler_feature_geometrytype_limit(t) { 
     102        t.plan(2); 
     103        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0)); 
     104        var map = new OpenLayers.Map('map'); 
     105        var control = new OpenLayers.Control(); 
     106        map.addControl(control); 
     107        var layer = new OpenLayers.Layer(); 
     108        layer.getFeatureFromEvent = function(evt) { return feature }; 
     109        map.addLayer(layer); 
     110        var handler = new OpenLayers.Handler.Feature(control, layer, {}, {'geometryTypes':['OpenLayers.Geometry.Point']}); 
     111        handler.activate(); 
     112        handler.callback = function(type,featurelist) { 
     113            t.eq(featurelist[0].id, feature.id, "Correct feature called back on"); 
     114        } 
     115        handler.select("foo", {});  
     116        handler.feature = null; 
     117        handler.callback = function(type,featurelist) { 
     118            t.fail("Shouldn't have called back on " + featurelist[0].geometry); 
     119        }     
     120        feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(0,0)); 
     121        handler.select("foo", {});  
     122    } 
    101123    function test_Handler_Feature_callbacks(t) { 
    102124        t.plan(75);