OpenLayers OpenLayers

Changeset 4252

Show
Ignore:
Timestamp:
09/12/07 21:23:06 (1 year ago)
Author:
euzuro
Message:

Add 'loadstart' and 'loadend' events to some of our exciting layers like WFS, GML, GeoRSS, and Text. tests to back it up. (Closes #808)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/lib/OpenLayers/Layer/GML.js

    r4223 r4252  
    8282        // See http://trac.openlayers.org/ticket/404 
    8383        if(this.visibility && !this.loaded){ 
     84            this.events.triggerEvent("loadstart"); 
    8485            this.loadGML(); 
    8586        } 
     
    114115        var gml = this.format ? new this.format() : new OpenLayers.Format.GML(); 
    115116        this.addFeatures(gml.read(doc)); 
     117        this.events.triggerEvent("loadend"); 
    116118    }, 
    117119     
     
    126128    requestFailure: function(request) { 
    127129        alert("Error in loading GML file "+this.url); 
     130        this.events.triggerEvent("loadend"); 
    128131    }, 
    129132 
  • trunk/openlayers/lib/OpenLayers/Layer/GeoRSS.js

    r4226 r4252  
    6868        this.location = location; 
    6969        this.features = []; 
     70        this.events.triggerEvent("loadstart"); 
    7071        OpenLayers.loadURL(location, null, this, this.parseData); 
    7172    }, 
     
    210211            this.addMarker(marker); 
    211212        } 
     213        this.events.triggerEvent("loadend"); 
    212214    }, 
    213215     
  • trunk/openlayers/lib/OpenLayers/Layer/Text.js

    r4225 r4252  
    4848        this.features = new Array(); 
    4949        if (this.location != null) { 
    50             OpenLayers.loadURL(this.location, null, this, this.parseData); 
     50 
     51            var onFail = function(e) { 
     52                this.events.triggerEvent("loadend"); 
     53            }; 
     54 
     55            this.events.triggerEvent("loadstart"); 
     56            OpenLayers.loadURL(this.location, null,  
     57                               this, this.parseData, onFail); 
    5158        } 
    5259    }, 
     
    156163            } 
    157164        } 
     165        this.events.triggerEvent("loadend"); 
    158166    }, 
    159167     
  • trunk/openlayers/lib/OpenLayers/Layer/WFS.js

    r4189 r4252  
    2222     */ 
    2323    isBaseLayer: false, 
     24     
     25    /** 
     26     * Property: tile 
     27     * {<OpenLayers.Tile.WFS>} 
     28     */ 
     29    tile: null,     
    2430     
    2531    /** 
     
    235241                this.tile = new OpenLayers.Tile.WFS(this, pos, tileBounds,  
    236242                                                     url, tileSize); 
     243                this.addTileMonitoringHooks(this.tile); 
    237244                this.tile.draw(); 
    238245            } else { 
     
    244251                }     
    245252                this.tile.destroy(); 
     253                this.removeTileMonitoringHooks(this.tile); 
    246254                 
    247255                this.tile = null; 
     
    251259            }  
    252260        } 
     261    }, 
     262 
     263    /**  
     264     * Method: addTileMonitoringHooks 
     265     * This function takes a tile as input and adds the appropriate hooks to  
     266     *     the tile so that the layer can keep track of the loading tile 
     267     *     (making sure to check that the tile is always the layer's current 
     268     *     tile before taking any action). 
     269     *  
     270     * Parameters:  
     271     * tile - {<OpenLayers.Tile>} 
     272     */ 
     273    addTileMonitoringHooks: function(tile) { 
     274        tile.onLoadStart = function() { 
     275            //if this is the the layer's current tile, then trigger  
     276            // a 'loadstart' 
     277            if (this == this.layer.tile) { 
     278                this.layer.events.triggerEvent("loadstart"); 
     279            } 
     280        }; 
     281        tile.events.register("loadstart", tile, tile.onLoadStart); 
     282       
     283        tile.onLoadEnd = function() { 
     284            //if this is the the layer's current tile, then trigger  
     285            // a 'tileloaded' and 'loadend' 
     286            if (this == this.layer.tile) { 
     287                this.layer.events.triggerEvent("tileloaded"); 
     288                this.layer.events.triggerEvent("loadend"); 
     289            } 
     290        }; 
     291        tile.events.register("loadend", tile, tile.onLoadEnd); 
     292    }, 
     293     
     294    /**  
     295     * Method: removeTileMonitoringHooks 
     296     * This function takes a tile as input and removes the tile hooks  
     297     *     that were added in addTileMonitoringHooks() 
     298     *  
     299     * Parameters:  
     300     * tile - {<OpenLayers.Tile>} 
     301     */ 
     302    removeTileMonitoringHooks: function(tile) { 
     303        tile.events.unregister("loadstart", tile, tile.onLoadStart); 
     304        tile.events.unregister("loadend", tile, tile.onLoadEnd); 
    253305    }, 
    254306 
  • trunk/openlayers/lib/OpenLayers/Tile/WFS.js

    r4227 r4252  
    7676    draw:function() { 
    7777        if (OpenLayers.Tile.prototype.draw.apply(this, arguments)) { 
     78            if (this.isLoading) { 
     79                //if already loading, send 'reload' instead of 'loadstart'. 
     80                this.events.triggerEvent("reload");  
     81            } else { 
     82                this.isLoading = true; 
     83                this.events.triggerEvent("loadstart"); 
     84            } 
    7885            this.loadFeaturesForRegion(this.requestSuccess); 
    7986        } 
     
    122129            } 
    123130        } 
     131        if (this.events) { 
     132            this.events.triggerEvent("loadend");  
     133        } 
    124134    }, 
    125135 
  • trunk/openlayers/tests/Layer/test_GML.html

    r4059 r4252  
    55 
    66    var name = "GML Layer"; 
     7     
     8    var gml = "./owls.xml"; 
     9 
     10    // if this test is running online, different rules apply 
     11    var isMSIE = (navigator.userAgent.indexOf("MSIE") > -1); 
     12    if (isMSIE) { 
     13        gml = "." + gml; 
     14    } 
    715     
    816    function test_01_Layer_GML_constructor(t) { 
     
    1523 
    1624    } 
     25    function test_Layer_GML_events(t) { 
     26        t.plan(3); 
     27 
     28        var layer = new OpenLayers.Layer.GML(name, gml, {isBaseLayer: true}); 
     29        layer.events.register("loadstart", layer, function() {  
     30            t.ok(true, "loadstart called.") 
     31        }); 
     32        layer.events.register("loadend", layer, function() {  
     33            t.ok(true, "loadend called.") 
     34        }); 
     35        var map = new OpenLayers.Map("map"); 
     36        map.addLayer(layer); 
     37        map.zoomToMaxExtent(); 
     38        t.delay_call(1, function() {  
     39            t.ok(true, "waited for 1s");  
     40        }); 
     41 
     42    } 
    1743  </script> 
    1844</head> 
  • trunk/openlayers/tests/Layer/test_GeoRSS.html

    r4226 r4252  
    8181        map.setCenter(new OpenLayers.LonLat(0,0),0); 
    8282        var event = {}; 
    83         t.delay_call( 1, function() {   
     83        t.delay_call( 2, function() {   
    8484          t.ok(layer.markers[0].events, "First marker has an events object"); 
    8585          t.eq(layer.markers[0].events.listeners['click'].length, 1, "Marker events has one object"); 
     
    160160        }); 
    161161    } 
    162      
     162    function test_Layer_GeoRSS_loadend_Event(t) { 
     163        var browserCode = OpenLayers.Util.getBrowserName(); 
     164        if (browserCode == "msie") { 
     165            t.plan(1); 
     166            t.ok(true, "IE fails the GeoRSS test. This could probably be fixed by someone with enough energy to fix it."); 
     167        } else { 
     168            t.plan(2); 
     169            layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt); 
     170            t.delay_call(2, function() {  
     171                layer.events.register('loadend', layer, function() {  
     172                    t.ok(true, "Loadend event fired");  
     173                }); 
     174                layer.parseData({ 
     175                    'responseText': '<xml xmlns="http://example.com"><title> </title></xml>' 
     176                }); 
     177                t.ok(true, "Parsing data didn't fail");  
     178            }); 
     179        }  
     180    } 
     181 
    163182    function test_99_Layer_GeoRSS_destroy (t) { 
    164183        t.plan( 1 );     
  • trunk/openlayers/tests/Layer/test_Text.html

    r4225 r4252  
    119119        }); 
    120120    } 
     121    function test_Layer_Text_loadend_Event(t) { 
     122        t.plan(2); 
     123        layer = new OpenLayers.Layer.Text('Test Layer', {location:datafile}); 
     124        t.delay_call(2, function() {  
     125            layer.events.register('loadend', layer, function() {  
     126                t.ok(true, "Loadend event fired");  
     127            }); 
     128            layer.parseData({ 
     129                'responseText':'' 
     130            }); 
     131            t.ok(true, "Parsing data didn't fail");  
     132        }); 
     133    } 
    121134 
    122135    function test_99_Layer_Text_destroy (t) {