OpenLayers OpenLayers

Changeset 7616

Show
Ignore:
Timestamp:
07/30/08 18:03:40 (4 months ago)
Author:
tschaub
Message:

Adding a beforefeatureselected event to the vector layer events. If a listener returns false, the feature is not selected. The modify feature control now listens for beforefeatureselected and triggers beforefeaturemodified. If a listener returns false, feature modification never begins. r=elemione,ahocevar (closes #1427)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/examples/modify-feature.html

    r7095 r7616  
    3030            map.addControl(new OpenLayers.Control.MousePosition()); 
    3131             
    32             var modifyOptions = { 
    33                 onModificationStart: function(feature) { 
    34                     OpenLayers.Console.log("start modifying", feature.id); 
    35                 }, 
    36                 onModification: function(feature) { 
    37                     OpenLayers.Console.log("modified", feature.id); 
    38                 }, 
    39                 onModificationEnd: function(feature) { 
    40                     OpenLayers.Console.log("end modifying", feature.id); 
    41                 }, 
    42                 onDelete: function(feature) { 
    43                     OpenLayers.Console.log("delete", feature.id); 
    44                 } 
    45             }; 
     32            function report(event) { 
     33                OpenLayers.Console.log(event.type, event.feature.id); 
     34            } 
     35            vectors.events.on({ 
     36                "beforefeaturemodified": report, 
     37                "featuremodified": report, 
     38                "afterfeaturemodified": report 
     39            }); 
    4640            controls = { 
    4741                point: new OpenLayers.Control.DrawFeature(vectors, 
     
    5448                            OpenLayers.Handler.RegularPolygon, 
    5549                            {handlerOptions: {sides: 5}}), 
    56                 modify: new OpenLayers.Control.ModifyFeature(vectors, 
    57                                                              modifyOptions) 
     50                modify: new OpenLayers.Control.ModifyFeature(vectors) 
    5851            }; 
    5952             
  • trunk/openlayers/lib/OpenLayers/Control/ModifyFeature.js

    r7614 r7616  
    202202        ); 
    203203        this.layer.events.on({ 
     204            "beforefeatureselected": this.beforeSelectFeature, 
    204205            "featureselected": this.selectFeature, 
    205206            "featureunselected": this.unselectFeature, 
     
    240241    destroy: function() { 
    241242        this.layer.events.un({ 
     243            "beforefeatureselected": this.beforeSelectFeature, 
    242244            "featureselected": this.selectFeature, 
    243245            "featureunselected": this.unselectFeature, 
     
    288290        return deactivated; 
    289291    }, 
     292     
     293    /** 
     294     * Method: beforeSelectFeature 
     295     * Called before a feature is selected. 
     296     * 
     297     * Parameters: 
     298     * object - {Object} Object with a feature property referencing the 
     299     *     selected feature. 
     300     */ 
     301    beforeSelectFeature: function(object) { 
     302        return this.layer.events.triggerEvent( 
     303            "beforefeaturemodified", {feature: object.feature} 
     304        ); 
     305    }, 
    290306 
    291307    /** 
     
    302318        this.dragControl.activate(); 
    303319        this.onModificationStart(this.feature); 
    304         this.layer.events.triggerEvent("beforefeaturemodified",  
    305                                        {feature: this.feature}); 
    306320    }, 
    307321 
  • trunk/openlayers/lib/OpenLayers/Control/SelectFeature.js

    r7589 r7616  
    309309     */ 
    310310    select: function(feature) { 
    311         this.layer.selectedFeatures.push(feature); 
    312  
    313         var selectStyle = this.selectStyle || this.renderIntent; 
    314          
    315         this.layer.drawFeature(feature, selectStyle); 
    316         this.layer.events.triggerEvent("featureselected", {feature: feature}); 
    317         this.onSelect(feature); 
     311        var cont = this.layer.events.triggerEvent("beforefeatureselected", { 
     312            feature: feature 
     313        }); 
     314        if(cont !== false) { 
     315            this.layer.selectedFeatures.push(feature); 
     316     
     317            var selectStyle = this.selectStyle || this.renderIntent; 
     318             
     319            this.layer.drawFeature(feature, selectStyle); 
     320            this.layer.events.triggerEvent("featureselected", {feature: feature}); 
     321            this.onSelect(feature); 
     322        } 
    318323    }, 
    319324 
     
    324329     * 
    325330     * Parameters: 
    326      * feature - {<OpenLayers.Feature.Vector>}  
     331     * feature - {<OpenLayers.Feature.Vector>} 
    327332     */ 
    328333    unselect: function(feature) { 
  • trunk/openlayers/lib/OpenLayers/Layer/Vector.js

    r7614 r7616  
    7373    EVENT_TYPES: ["beforefeatureadded", "featureadded", "featuresadded", 
    7474                  "beforefeatureremoved", "featureremoved", "featuresremoved", 
    75                   "featureselected", "featureunselected",  
     75                  "beforefeatureselected", "featureselected", "featureunselected",  
    7676                  "beforefeaturemodified", "featuremodified", "afterfeaturemodified"], 
    7777 
  • trunk/openlayers/tests/Control/ModifyFeature.html

    r7614 r7616  
    165165 
    166166    function test_selectFeature(t) { 
    167         t.plan(15); 
    168         var layer = new OpenLayers.Layer.Vector(); 
     167        t.plan(12); 
     168        var map = new OpenLayers.Map('map'); 
     169        var layer = new OpenLayers.Layer.Vector("Vectors!", {isBaseLayer: true}); 
     170        map.addLayer(layer); 
     171        map.setCenter(new OpenLayers.LonLat(0, 0)); 
    169172        var control = new OpenLayers.Control.ModifyFeature(layer); 
    170173        control.vertices = []; 
    171174        control.virtualVertices = []; 
    172         layer.events.on({"beforefeaturemodified": function(event) { 
    173             t.eq(event.feature, fakeFeature, "beforefeaturemodified triggered"); 
    174         }}); 
     175        var callback = function(obj) { 
     176            t.ok(obj.feature == fakeFeature, "beforefeaturemodified triggered"); 
     177        }; 
     178        layer.events.on({"beforefeaturemodified": callback}); 
    175179        control.dragControl.activate = function() { t.ok(true, "drag Control activated"); } 
    176180        control.onModificationStart = function(feature)  { t.eq(feature.id, fakeFeature.id, "On Modification Start called with correct feature."); }  
    177181         
    178          
    179182        // Start of testing 
    180183         
    181184        control.collectVertices = function() { t.fail("Collect vertices called when geom is a point"); } 
    182         var fakeFeature = {'id':'myFakeFeature','geometry':{'CLASS_NAME':'OpenLayers.Geometry.Point'}}
     185        var fakeFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0, 0))
    183186         
    184187        // Points don't call collectVertices 
     
    196199            t.ok(features == 'a' || features == 'd', "features passed correctly");  
    197200        } 
    198         fakeFeature.geometry.CLASS_NAME='OpenLayers.Geometry.Polygon'; 
     201         
     202        fakeFeature.geometry = new OpenLayers.Geometry.Polygon([ 
     203            new OpenLayers.Geometry.LinearRing([ 
     204                new OpenLayers.Geometry.Point(0, 0), 
     205                new OpenLayers.Geometry.Point(1, 1) 
     206            ]) 
     207        ]); 
    199208         
    200209        // OnSelect calls collectVertices and passes features to layer  
     
    360369 
    361370    function test_onModificationStart(t) { 
    362         t.plan(2); 
     371        t.plan(1); 
    363372        var map = new OpenLayers.Map("map"); 
    364373        var layer = new OpenLayers.Layer.Vector(); 
     
    367376        map.addControl(control); 
    368377        control.activate(); 
    369          
    370         // test that beforefeaturemodified is triggered 
    371         layer.events.on({"beforefeaturemodified": function(event) { 
    372             t.eq(event.feature.id, testFeature.id, 
    373                  "beforefeaturemodified is triggered with correct feature"); 
    374         }}); 
    375378         
    376379        // make sure onModificationStart is called on feature selection 
     
    456459        map.destroy(); 
    457460    } 
     461     
     462    function test_events(t) { 
     463        t.plan(2); 
     464        var map = new OpenLayers.Map("map"); 
     465        var layer = new OpenLayers.Layer.Vector(); 
     466        map.addLayer(layer); 
     467        var control = new OpenLayers.Control.ModifyFeature(layer); 
     468        map.addControl(control); 
     469        control.activate(); 
     470         
     471        // make sure onModificationStart is called on feature selection 
     472        var testFeature = new OpenLayers.Feature.Vector( 
     473            new OpenLayers.Geometry.Point(Math.random(), Math.random()) 
     474        ); 
     475         
     476        // test that beforefeatureselected is triggered 
     477        function handle_beforefeatureselected(event) { 
     478            t.ok(event.feature == testFeature, "beforefeatureselected called with the correct feature"); 
     479        } 
     480        layer.events.on({ 
     481            "beforefeatureselected": handle_beforefeatureselected 
     482        }); 
     483        layer.events.triggerEvent("beforefeatureselected", { 
     484            feature: testFeature 
     485        }); 
     486        layer.events.un({ 
     487            "beforefeatureselected": handle_beforefeatureselected 
     488        }); 
     489         
     490        // test that beforefeatureselected is triggered 
     491        function handle_featureselected(event) { 
     492            t.ok(event.feature == testFeature, "featureselected called with the correct feature"); 
     493        } 
     494        layer.events.on({ 
     495            "featureselected": handle_featureselected 
     496        }); 
     497        layer.events.triggerEvent("featureselected", { 
     498            feature: testFeature 
     499        }); 
     500        layer.events.un({ 
     501            "featureselected": handle_featureselected 
     502        }); 
     503 
     504        map.destroy(); 
     505    } 
     506 
    458507 
    459508