OpenLayers OpenLayers

Ticket #1628: 1628-r7864.B0.patch

File 1628-r7864.B0.patch, 9.0 kB (added by ahocevar, 4 months ago)
  • tests/Handler/Feature.html

    old new  
    3030    } 
    3131 
    3232    function test_Handler_Feature_activate(t) { 
    33         t.plan(4); 
     33        t.plan(3); 
    3434        var map = new OpenLayers.Map('map'); 
    3535        var control = new OpenLayers.Control(); 
    3636        map.addControl(control); 
     
    4747        activated = handler.activate(); 
    4848        t.ok(activated, 
    4949             "activate returns true if the handler was not already active"); 
    50         t.eq(handler.layerIndex, zIndex, 
    51              "layerIndex property properly set"); 
    5250        t.eq(parseInt(layer.div.style.zIndex), 
    5351             map.Z_INDEX_BASE['Popup'] - 1, 
    5452             "layer z-index properly adjusted"); 
     
    227225        map.addControl(control); 
    228226        var layer = new OpenLayers.Layer(); 
    229227        map.addLayer(layer); 
     228        var layerIndex = parseInt(layer.div.style.zIndex); 
     229         
    230230        var handler = new OpenLayers.Handler.Feature(control, layer); 
    231231        handler.active = false; 
    232232        var deactivated = handler.deactivate(); 
     
    234234             "deactivate returns false if the handler was not already active"); 
    235235         
    236236        handler.active = true; 
    237         handler.layerIndex = Math.floor(Math.random() * 10); 
    238237 
    239238        deactivated = handler.deactivate(); 
    240239        t.ok(deactivated, 
    241240             "deactivate returns true if the handler was active already"); 
    242241        t.eq(parseInt(layer.div.style.zIndex), 
    243              handler.layerIndex, 
     242             layerIndex, 
    244243             "deactivate sets the layer z-index back"); 
    245244    } 
    246245 
  • tests/manual/vector-layer-zindex.html

    old new  
     1<html xmlns="http://www.w3.org/1999/xhtml"> 
     2  <head> 
     3    <title>Vector Layer ZIndex Test</title> 
     4    <style type="text/css"> 
     5        body { 
     6            font-size: 0.8em; 
     7        } 
     8        p { 
     9            padding-top: 1em; 
     10        } 
     11        #map { 
     12            margin: 1em; 
     13            width: 512px; 
     14            height: 512px; 
     15        } 
     16    </style> 
     17 
     18    <script src="../../lib/OpenLayers.js"></script> 
     19    <script type="text/javascript"> 
     20        var map, layerA, layerB, layerV, selectControl; 
     21 
     22        function init() { 
     23            map = new OpenLayers.Map('map'); 
     24            var wmsLayer = new OpenLayers.Layer.WMS( 
     25                "OpenLayers WMS",  
     26                "http://labs.metacarta.com/wms/vmap0", 
     27                {layers: 'basic'} 
     28            ); 
     29 
     30            layerV = new OpenLayers.Layer.Vector('v'); 
     31            var feature = new OpenLayers.Feature.Vector( 
     32                new OpenLayers.Geometry.Polygon([ 
     33                    new OpenLayers.Geometry.LinearRing([ 
     34                        new OpenLayers.Geometry.Point(-110, 60), 
     35                        new OpenLayers.Geometry.Point(-110, 30), 
     36                        new OpenLayers.Geometry.Point(-80, 30), 
     37                        new OpenLayers.Geometry.Point(-110, 60) 
     38                    ]) 
     39                ]) 
     40            ); 
     41            layerV.addFeatures([feature]); 
     42            selectControl = new OpenLayers.Control.SelectFeature(layerV); 
     43 
     44            layerA = new OpenLayers.Layer('a', {'isBaseLayer': false}); 
     45            layerB = new OpenLayers.Layer.WMS( 
     46                'b', 'http://www2.dmsolutions.ca/cgi-bin/mswms_gmap', { 
     47                    'layers': [ 
     48                        'bathymetry', 'land_fn', 'park', 'drain_fn', 'drainage', 
     49                        'prov_bound', 'fedlimit', 'rail', 'road', 'popplace' 
     50                    ], 
     51                    'transparent': 'true', 
     52                    'format': 'image/png' 
     53                }, { 
     54                    'reproject': false 
     55            }); 
     56 
     57            map.addLayers([wmsLayer, layerV, layerA, layerB]); 
     58            map.addControl(selectControl); 
     59            map.addControl(new OpenLayers.Control.MousePosition()); 
     60            selectControl.activate(); 
     61 
     62            map.setCenter(new OpenLayers.LonLat(-90, 20), 2); 
     63        } 
     64 
     65        function removeLayerA() { 
     66            if (OpenLayers.Util.indexOf(map.layers, layerA) > -1) { 
     67                map.removeLayer(layerA); 
     68            } 
     69        } 
     70         
     71        function toggleSelectControl() { 
     72            if (selectControl.active) { 
     73                selectControl.deactivate(); 
     74                alert("SelectFeature control deactivated.\nVector layer should be covered by other layers now."); 
     75            } else { 
     76                selectControl.activate(); 
     77                alert("SelectFeature control activated.\nVector layer should be on top now."); 
     78            } 
     79        } 
     80    </script> 
     81  </head> 
     82  <body onload="init()"> 
     83    <h1 id="title">Vector Layer ZIndex Test</h1> 
     84    <div id="map"></div> 
     85    <p> 
     86 
     87    The map includes one base layer (vmap0) and three overlays, namely a vector 
     88    layer, a fake layer with no images, and a dmsolutions layer. The overlays are 
     89    added to the map in this order: the vector layer, the fake layer, and the 
     90    dmsolutions layer. The map also includes a select feature control, which 
     91    when activated bumped the vector layer z-index to some high value. This 
     92    makes feature selection work, even though other overlays were added after 
     93    the vector layer. 
     94        
     95    </p> 
     96    <p> 
     97 
     98    If the fake layer is removed from the map (first link below), the vector layer's 
     99    z-index must not be reset, so the vector layer must not go under the 
     100    dmsolutions layer and feature selection must continue to function as 
     101    expected. 
     102        
     103    </p> 
     104    <p> 
     105 
     106    If the SelectFeature control is deactivated or activated (second link below), the 
     107    vector layer should change it's position in the layer stack: on top if activated, 
     108    covered by other layers if deactivated. 
     109 
     110    </p> 
     111 
     112    <p> 
     113      <a href="javascript:removeLayerA()">Remove the fake layer</a> 
     114      <br/><a href="javascript:toggleSelectControl()">Toggle the SelectFeature control's active status</a> 
     115    </p> 
     116  </body> 
     117</html> 
  • lib/OpenLayers/Handler/Feature.js

    old new  
    101101    stopUp: true, 
    102102 
    103103    /** 
    104      * Property: layerIndex 
    105      * {Int} 
    106      */ 
    107     layerIndex: null, 
    108      
    109     /** 
    110104     * Constructor: OpenLayers.Handler.Feature 
    111105     * 
    112106     * Parameters: 
     
    300294    activate: function() { 
    301295        var activated = false; 
    302296        if(OpenLayers.Handler.prototype.activate.apply(this, arguments)) { 
    303             this.layerIndex = this.layer.div.style.zIndex; 
    304             this.layer.div.style.zIndex = this.map.Z_INDEX_BASE['Popup'] - 1; 
     297            this.moveLayerToTop(); 
     298            this.map.events.on({ 
     299                "removelayer": this.moveLayerToTop, 
     300                "changelayer": this.moveLayerBack, 
     301                scope: this 
     302            }); 
    305303            activated = true; 
    306304        } 
    307305        return activated; 
    308306    }, 
    309307     
    310308    /** 
    311      * Method: activate  
    312      * Turn of the handler.  Returns false if the handler was already active. 
     309     * Method: deactivate  
     310     * Turn off the handler.  Returns false if the handler was already active. 
    313311     * 
    314312     * Returns:  
    315313     * {Boolean} 
     
    317315    deactivate: function() { 
    318316        var deactivated = false; 
    319317        if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) { 
    320             if (this.layer && this.layer.div) { 
    321                 this.layer.div.style.zIndex = this.layerIndex; 
    322             } 
     318            this.moveLayerBack(); 
    323319            this.feature = null; 
    324320            this.lastFeature = null; 
    325321            this.down = null; 
    326322            this.up = null; 
     323            this.map.events.un({ 
     324                "removelayer": this.moveLayerToTop, 
     325                "changelayer": this.moveLayerBack, 
     326                scope: this 
     327            }); 
    327328            deactivated = true; 
    328329        } 
    329330        return deactivated; 
    330331    }, 
     332     
     333    /** 
     334     * Method: moveLayerToTop 
     335     * Moves the layer for this handler to the top, so mouse events can reach 
     336     * it. 
     337     */ 
     338    moveLayerToTop: function() { 
     339        this.layer.setZIndex(this.map.Z_INDEX_BASE['Popup'] - 1); 
     340    }, 
     341     
     342    /** 
     343     * Method: moveLayerBack 
     344     * Moves the layer back to the position determined by the map's layers 
     345     * array. 
     346     * @param {Object} evt 
     347     */ 
     348    moveLayerBack: function(evt) { 
     349        if (!evt || evt.property == "order") { 
     350            var index = OpenLayers.Util.indexOf(this.map.layers, this.layer); 
     351            this.map.setLayerZIndex(this.layer, index); 
     352        } 
     353    }, 
    331354 
    332355    CLASS_NAME: "OpenLayers.Handler.Feature" 
    333356});