[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