[Commits] r2210 - in core/trunk/geoext: examples lib lib/GeoExt/widgets/tree tests tests/lib/GeoExt/widgets/tree

commits at geoext.org commits at geoext.org
Wed May 26 07:37:39 CEST 2010


Author: bartvde
Date: 2010-05-26 07:37:39 +0200 (Wed, 26 May 2010)
New Revision: 2210

Added:
   core/trunk/geoext/examples/wms-tree.html
   core/trunk/geoext/examples/wms-tree.js
   core/trunk/geoext/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.js
   core/trunk/geoext/tests/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.html
Modified:
   core/trunk/geoext/lib/GeoExt.js
   core/trunk/geoext/tests/list-tests.html
Log:
create a tree loader for WMS GetCapabilities, r=ahocevar (closes #272)

Added: core/trunk/geoext/examples/wms-tree.html
===================================================================
--- core/trunk/geoext/examples/wms-tree.html	                        (rev 0)
+++ core/trunk/geoext/examples/wms-tree.html	2010-05-26 05:37:39 UTC (rev 2210)
@@ -0,0 +1,27 @@
+<html>
+    <head>
+        <title>WMSCapabilitiesLoader Example</title>
+
+        <script type="text/javascript" src="http://extjs.cachefly.net/ext-2.2.1/adapter/ext/ext-base.js"></script>
+        <script type="text/javascript" src="http://extjs.cachefly.net/ext-2.2.1/ext-all.js"></script>
+        <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-2.2.1/resources/css/ext-all.css" />
+        <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-2.2.1/examples/shared/examples.css" />
+
+        <script src="http://www.openlayers.org/api/2.9/OpenLayers.js"></script>
+        <script type="text/javascript" src="../lib/GeoExt.js"></script>
+        
+        <script type="text/javascript" src="wms-tree.js"></script>
+        
+    </head>
+    <body>
+        <h1>Tree using a GeoExt.tree.WMSCapabilitiesLoader</h1>
+       <div id="desc"> 
+            <p>This example shows how to use GeoExt.tree.WMSCapabilitiesLoader to populate a tree
+            with the hierarchical structure of a WMS GetCapabilities response. The example
+            also shows how to customize the loader's <tt>createNode</tt> method to add a checkbox
+            with a <tt>checkchange</tt> listener that adds and removes layers to and from the map.
+            </p>
+            <p>See <a href="wms-tree.js">wms-tree.js</a> for the source code.</p>
+        </div>
+    </body>
+</html>

Added: core/trunk/geoext/examples/wms-tree.js
===================================================================
--- core/trunk/geoext/examples/wms-tree.js	                        (rev 0)
+++ core/trunk/geoext/examples/wms-tree.js	2010-05-26 05:37:39 UTC (rev 2210)
@@ -0,0 +1,68 @@
+var tree, mapPanel;
+
+Ext.onReady(function() {
+
+    var root = new Ext.tree.AsyncTreeNode({
+        text: 'GeoServer Demo WMS',
+        loader: new GeoExt.tree.WMSCapabilitiesLoader({
+            url: 'data/wmscap.xml',
+            layerOptions: {buffer: 0, singleTile: true, ratio: 1},
+            layerParams: {'TRANSPARENT': 'TRUE'},
+            // customize the createNode method to add a checkbox to nodes
+            createNode: function(attr) {
+                attr.checked = attr.leaf ? false : undefined;
+                return GeoExt.tree.WMSCapabilitiesLoader.prototype.createNode.apply(this, [attr]);
+            }
+        })
+    });
+
+    tree = new Ext.tree.TreePanel({
+        root: root,
+        region: 'west',
+        width: 250,
+        listeners: {
+            // Add layers to the map when ckecked, remove when unchecked.
+            // Note that this does not take care of maintaining the layer
+            // order on the map.
+            'checkchange': function(node, checked) { 
+                if (checked === true) {
+                    mapPanel.map.addLayer(node.attributes.layer); 
+                } else {
+                    mapPanel.map.removeLayer(node.attributes.layer);
+                }
+            }
+        }
+    });
+
+    mapPanel = new GeoExt.MapPanel({
+        zoom: 2,
+        layers: [
+            new OpenLayers.Layer.WMS("Global Imagery",
+                "http://maps.opengeo.org/geowebcache/service/wms", 
+                {layers: "bluemarble"},
+                {buffer: 0}
+            )
+        ],
+        region: 'center'
+    });
+
+    new Ext.Viewport({
+        layout: "fit",
+        hideBorders: true,
+        items: {
+            layout: "border",
+            deferredRender: false,
+            items: [mapPanel, tree, {
+                contentEl: "desc",
+                region: "east",
+                bodyStyle: {"padding": "5px"},
+                collapsible: true,
+                collapseMode: "mini",
+                split: true,
+                width: 200,
+                title: "Description"
+            }]
+        }
+    });
+
+});

Added: core/trunk/geoext/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.js	                        (rev 0)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.js	2010-05-26 05:37:39 UTC (rev 2210)
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2008-2010 The Open Source Geospatial Foundation
+ *
+ * Published under the BSD license.
+ * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
+ * of the license.
+ */
+
+Ext.namespace("GeoExt.tree");
+
+/** api: (define)
+ *  module = GeoExt.tree
+ *  class = WMSCapabilitiesLoader
+ *  base_link = `Ext.tree.TreeLoader <http://www.extjs.com/deploy/dev/docs/?class=Ext.tree.TreeLoader>`_
+ */
+
+/** api: constructor
+ *  .. class:: WMSCapabilitiesLoader
+ *
+ *      A loader that will load all layers of a Web Map Service (WMS).
+ */
+GeoExt.tree.WMSCapabilitiesLoader = function(config) {
+    Ext.apply(this, config);
+    GeoExt.tree.WMSCapabilitiesLoader.superclass.constructor.call(this);
+};
+
+Ext.extend(GeoExt.tree.WMSCapabilitiesLoader, Ext.tree.TreeLoader, {
+
+    /** api: config[url]
+     *  ``String``
+     *  The online resource of the Web Map Service.
+     */
+    url: null,
+
+    /** api: config[layerOptions]
+     *  ``Object``
+     *  Optional options to set on the WMS layers which will be created by
+     *  this loader.
+     */
+    layerOptions: null,
+
+    /** api: config[layerParams]
+     *  ``Object``
+     *  Optional parameters to set on the WMS layers which will be created by
+     *  this loader.
+     */
+    layerParams: null,
+
+    /** private: property[requestMethod]
+     *  ``String`` WMS GetCapabilities request needs to be done using HTTP GET
+     */
+    requestMethod: 'GET',
+
+    /** private: method[getParams]
+     *  Private getParams override.
+     */
+    getParams: function(node) {
+        return {'service': 'WMS', 'request': 'GetCapabilities'};
+    },
+
+    /** private: method[processResponse]
+     *  :param response: ``Object`` The XHR object
+     *  :param node: ``Ext.tree.TreeNode``
+     *  :param callback: ``Function``
+     *  :param scope: ``Object``
+     *
+     *  Private processResponse override.
+     */
+    processResponse : function(response, node, callback, scope){
+        var capabilities = new OpenLayers.Format.WMSCapabilities().read(
+            response.responseXML || response.responseText);
+        this.processLayer(capabilities.capability,
+            capabilities.capability.request.getmap.href, node);
+        if (typeof callback == "function") {
+            callback.apply(scope || node, [node]);
+        }
+    },
+
+    /** private: method[createWMSLayer]
+     *  :param layer: ``Object`` The layer object from the WMS GetCapabilities
+     *  parser
+     *  :param url: ``String`` The online resource of the WMS
+     *  :return: ``OpenLayers.Layer.WMS`` or ``null`` The WMS layer created or
+     *  null.
+     *
+     *  Create a WMS layer which will be attached as an attribute to the
+     *  node.
+     */
+    createWMSLayer: function(layer, url) {
+        if (layer.name) {
+            return new OpenLayers.Layer.WMS( layer.title, url,
+                OpenLayers.Util.extend({formats: layer.formats[0], 
+                    layers: layer.name}, this.layerParams),
+                OpenLayers.Util.extend({minScale: layer.minScale,
+                    queryable: layer.queryable, maxScale: layer.maxScale,
+                    metadata: layer
+                }, this.layerOptions));
+        } else {
+            return null;
+        }
+    },
+
+    /** private: method[processLayer]
+     *  :param layer: ``Object`` The layer object from the WMS GetCapabilities
+     *  parser
+     *  :param url: ``String`` The online resource of the WMS
+     *  :param node: ``Ext.tree.TreeNode``
+     *
+     *  Recursive function to create the tree nodes for the layer structure
+     *  of a WMS GetCapabilities response.
+     */
+    processLayer: function(layer, url, node) {
+        Ext.each(layer.nestedLayers, function(el) {
+            var n = this.createNode({text: el.title || el.name, 
+                // use nodeType 'node' so no AsyncTreeNodes are created
+                nodeType: 'node',
+                layer: this.createWMSLayer(el, url),
+                leaf: (el.nestedLayers.length === 0)});
+            if(n){
+                node.appendChild(n);
+            }
+            if (el.nestedLayers) {
+                this.processLayer(el, url, n);
+            }
+        }, this);
+    }
+
+});

Modified: core/trunk/geoext/lib/GeoExt.js
===================================================================
--- core/trunk/geoext/lib/GeoExt.js	2010-05-25 15:46:16 UTC (rev 2209)
+++ core/trunk/geoext/lib/GeoExt.js	2010-05-26 05:37:39 UTC (rev 2210)
@@ -100,6 +100,7 @@
             "GeoExt/widgets/tree/OverlayLayerContainer.js",
             "GeoExt/widgets/tree/LayerParamNode.js",
             "GeoExt/widgets/tree/LayerParamLoader.js",
+            "GeoExt/widgets/tree/WMSCapabilitiesLoader.js",
             "GeoExt/widgets/LayerOpacitySlider.js",
             "GeoExt/widgets/LayerLegend.js",
             "GeoExt/widgets/LegendImage.js",

Added: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.html	                        (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.html	2010-05-26 05:37:39 UTC (rev 2210)
@@ -0,0 +1,54 @@
+<html>
+    <head>
+        <script src="../../../../../../openlayers/lib/OpenLayers.js"></script>
+        <script src="../../../../../../ext/adapter/ext/ext-base.js"></script>
+        <script src="../../../../../../ext/ext-all-debug.js"></script>
+        <script src="../../../../../lib/GeoExt.js"></script>
+        <script src="../../data/WMSCapabilitiesReader.js"></script>
+    
+        <script>
+        
+        function test_constructor(t) {
+            
+            t.plan(3);
+            
+            var loader = new GeoExt.tree.WMSCapabilitiesLoader({
+                url: "http://foo/wms?",
+                layerOptions: {singleTile: true},
+                layerParams: {transparent: 'TRUE'}
+            });
+            
+            t.eq(loader.url, "http://foo/wms?", "url set correctly");
+            t.eq(loader.layerOptions.singleTile, true, "layerOptions set correctly");
+            t.eq(loader.layerParams.transparent, 'TRUE', "layerParams set correctly");
+        }
+        
+        function test_load(t) {
+            
+            t.plan(5);
+
+            var loader = new GeoExt.tree.WMSCapabilitiesLoader({
+                layerOptions: {singleTile: true},
+                layerParams: {transparent: 'TRUE'}
+            });
+
+            var root = new Ext.tree.AsyncTreeNode({
+                text: 'GeoServer Demo WMS'
+            });
+
+            loader.processResponse({responseXML: doc}, root, function() {
+                t.eq(root.childNodes[0].text, "GeoServer Web Map Service", "Title of root layer set as text");
+                t.eq(root.childNodes[0].attributes.layer, undefined, "A layer without a <Name> does not get a layer attribute");
+                t.ok(root.childNodes[0].childNodes[0].attributes.layer instanceof OpenLayers.Layer.WMS, "WMS layer created");
+                t.eq(root.childNodes[0].childNodes[0].attributes.layer.options.singleTile, true, "singleTile correctly set");
+                t.eq(root.childNodes[0].childNodes[0].attributes.layer.params.TRANSPARENT, "TRUE", "transparent parameter correctly set");
+            });
+
+        }
+        
+        </script>
+    </head>
+    <body>
+        <div id="tree" style="width: 100px; height: 100px;"></div>
+    </body>
+</html>

Modified: core/trunk/geoext/tests/list-tests.html
===================================================================
--- core/trunk/geoext/tests/list-tests.html	2010-05-25 15:46:16 UTC (rev 2209)
+++ core/trunk/geoext/tests/list-tests.html	2010-05-26 05:37:39 UTC (rev 2210)
@@ -37,6 +37,7 @@
   <li>lib/GeoExt/widgets/tree/RadioButtonMixin.html</li>
   <li>lib/GeoExt/widgets/tree/LayerParamLoader.html</li>
   <li>lib/GeoExt/widgets/tree/LayerParamNode.html</li>
+  <li>lib/GeoExt/widgets/tree/WMSCapabilitiesLoader.html</li>
   <li>lib/GeoExt/widgets/LegendImage.html</li>
   <li>lib/GeoExt/widgets/LegendPanel.html</li>
   <li>lib/GeoExt/widgets/LayerLegend.html</li>



More information about the Commits mailing list