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

commits at geoext.org commits at geoext.org
Thu Oct 8 15:56:45 CEST 2009


Author: ahocevar
Date: 2009-10-08 15:56:45 +0200 (Thu, 08 Oct 2009)
New Revision: 1391

Added:
   core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js
   core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js
   core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html
   core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html
Modified:
   core/trunk/geoext/examples/tree.js
   core/trunk/geoext/lib/GeoExt.js
   core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js
   core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html
   core/trunk/geoext/tests/list-tests.html
Log:
Created LayerParamNode and LayerParamLoader. r=tschaub (closes #127)


Modified: core/trunk/geoext/examples/tree.js
===================================================================
--- core/trunk/geoext/examples/tree.js	2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/examples/tree.js	2009-10-08 13:56:45 UTC (rev 1391)
@@ -14,6 +14,7 @@
         nodeType: "gx_baselayercontainer"
     }, {
         nodeType: "gx_overlaylayercontainer",
+        expanded: true,
         // render the nodes inside this container with a radio button,
         // and assign them the group "foo"
         loader: {
@@ -21,7 +22,12 @@
         }
     }, {
         nodeType: "gx_layer",
-        layer: "Tasmania Roads"
+        layer: "Tasmania (Group Layer)",
+        isLeaf: false,
+        // create subnodes for the layers in the LAYERS param
+        loader: {
+            param: "LAYERS"
+        }
     }], true);
 
     mapPanel = new GeoExt.MapPanel({
@@ -70,9 +76,19 @@
                     format: "image/gif"
                 }, {
                     isBaseLayer: false,
+                    buffer: 0
+                }),
+            new OpenLayers.Layer.WMS("Tasmania (Group Layer)",
+                "http://demo.opengeo.org/geoserver/wms", {
+                    layers: "topp:tasmania_state_boundaries,topp:tasmania_water_bodies,topp:tasmania_cities,topp:tasmania_roads",
+                    transparent: true,
+                    format: "image/gif"
+                }, {
+                    isBaseLayer: false,
                     buffer: 0,
                     // exclude this layer from layer container nodes
-                    displayInLayerSwitcher: false
+                    displayInLayerSwitcher: false,
+                    visibility: false
                 })
         ]
     });

Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js	2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerNode.js	2009-10-08 13:56:45 UTC (rev 1391)
@@ -192,7 +192,7 @@
  *      To use this node type in a ``TreePanel`` config, set ``nodeType`` to
  *      "gx_layer".
  */
-GeoExt.tree.LayerNode = Ext.extend(Ext.tree.TreeNode, {
+GeoExt.tree.LayerNode = Ext.extend(Ext.tree.AsyncTreeNode, {
     
     /** api: config[layer]
      *  ``OpenLayers.Layer or String``
@@ -218,23 +218,28 @@
      */
     layerStore: null,
     
-    /** api: config[childNodeType]
-     *  ``Ext.tree.Node or String``
-     *  Node class or nodeType of childnodes for this node. A node type provided
-     *  here needs to have an add method, with a scope argument. This method
-     *  will be run by this node in the context of this node, to create child nodes.
+    /** api: config[loader]
+     *  ``Ext.tree.TreeLoader|Object`` If provided, subnodes will be added to
+     *  this LayerNode. Obviously, only loaders that process an
+     *  ``OpenLayers.Layer`` or :class:`GeoExt.data.LayerRecord` (like
+     *  :class:`GeoExt.tree.LayerParamsLoader`) will actually generate child
+     *  nodes here. If provided as ``Object``, a
+     *  :class:`GeoExt.tree.LayerParamLoader` instance will be created, with
+     *  the provided object as configuration.
      */
-    childNodeType: null,
     
     /** private: method[constructor]
      *  Private constructor override.
      */
     constructor: function(config) {
-        config.leaf = config.leaf || !config.children;
+        config.leaf = config.leaf || !(config.children || config.loader);
         
         if(!config.iconCls && !config.children) {
             config.iconCls = "gx-tree-layer-icon";
         }
+        if(config.loader && !(config.loader instanceof Ext.tree.TreeLoader)) {
+            config.loader = new GeoExt.tree.LayerParamLoader(config.loader);
+        }
         
         this.defaultUI = this.defaultUI || GeoExt.tree.LayerNodeUI;
         this.addEvents(
@@ -247,8 +252,7 @@
         
         Ext.apply(this, {
             layer: config.layer,
-            layerStore: config.layerStore,
-            childNodeType: config.childNodeType
+            layerStore: config.layerStore
         });
         GeoExt.tree.LayerNode.superclass.constructor.apply(this, arguments);
     },
@@ -289,10 +293,6 @@
                     this.text = layer.name;
                 }
                 
-                if(this.childNodeType) {
-                    this.addChildNodes();
-                }
-                
                 ui.show();
                 this.addVisibilityEventHandlers();
             } else {
@@ -410,18 +410,6 @@
         }
     },
 
-    /** private: method[addChildNodes]
-     *  Calls the add method of a node type configured as ``childNodeType``
-     *  to add children.
-     */
-    addChildNodes: function() {
-        if(typeof this.childNodeType == "string") {
-            Ext.tree.TreePanel.nodeTypes[this.childNodeType].add(this);
-        } else if(typeof this.childNodeType.add === "function") {
-            this.childNodeType.add(this);
-        }
-    },
-    
     /** private: method[destroy]
      */
     destroy: function() {

Added: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js	                        (rev 0)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js	2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2008-2009 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 = LayerParamLoader
+ *  base_link = `Ext.util.Observable <http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable>`_
+ */
+
+/** api: constructor
+ *  .. class:: LayerParamLoader
+ * 
+ *      A loader that creates children from its node's layer
+ *      (``OpenLayers.Layer.HTTPRequest``) by items in one of the values in
+ *      the layer's params object.
+ */
+GeoExt.tree.LayerParamLoader = function(config) {
+    Ext.apply(this, config);
+    this.addEvents(
+    
+        /** api: events[beforeload]
+         *  Triggered before loading children. Return false to avoid
+         *  loading children.
+         *  
+         *  Listener arguments:
+         *  * loader - :class:`GeoExt.tree.LayerLoader` this loader
+         *  * node - ``Ex.tree.TreeNode`` the node that this loader is
+         *      configured with
+         */
+        "beforeload",
+        
+        /** api: events[load]
+         *  Triggered after children were loaded.
+         *  
+         *  Listener arguments:
+         *  * loader - :class:`GeoExt.tree.LayerLoader` this loader
+         *  * node - ``Ex.tree.TreeNode`` the node that this loader is
+         *      configured with
+         */
+        "load"
+    );
+
+    GeoExt.tree.LayerLoader.superclass.constructor.call(this);
+};
+
+Ext.extend(GeoExt.tree.LayerParamLoader, Ext.util.Observable, {
+    
+    /** api: config[param]
+     *  ``String`` Key for a param (key-value pair in the params object of the
+     *  layer) that this loader uses to create childnodes from its items. The
+     *  value can either be an ``Array`` or a ``String``, delimited by the
+     *  character (or string) provided as ``delimiter`` config option.
+     */
+    
+    /** private: property[param]
+     *  ``String``
+     */
+    param: null,
+    
+    /** api: config[delimiter]
+     *  ``String`` Delimiter of the ``param``'s value's items. Default is
+     *  ``,`` (comma). If the ``param``'s value is an array, this property has
+     *  no effect.
+     */
+    
+    /** private: property[delimiter]
+     *  ``String``
+     */
+    delimiter: ",",
+
+    /** private: method[load]
+     *  :param node: ``Ext.tree.TreeNode`` The node to add children to.
+     *  :param callback: ``Function``
+     */
+    load: function(node, callback) {
+        if(this.fireEvent("beforeload", this, node)) {
+            while (node.firstChild) {
+                node.removeChild(node.firstChild);
+            }
+            
+            var paramValue =
+                (node.layer instanceof OpenLayers.Layer.HTTPRequest) &&
+                node.layer.params[this.param];
+            if(paramValue) {
+                var items = (paramValue instanceof Array) ?
+                    paramValue :
+                    paramValue.split(this.delimiter);
+
+                Ext.each(items, function(item) {
+                    this.addParamNode(item, node);
+                }, this);
+            }
+    
+            if(typeof callback == "function"){
+                callback();
+            }
+            
+            this.fireEvent("load", this, node);
+        }
+    },
+    
+    /** private: method[addParamNode]
+     *  :param paramItem: ``String`` The param item that the child node will
+     *      represent.
+     *  :param node: :class:`GeoExt.tree.LayerNode`` The node that the param
+     *      node will be added to as child.
+     *  
+     *  Adds a child node representing a param value of the layer
+     */
+    addParamNode: function(paramItem, node) {
+        var child = this.createNode({
+            layer: node.layer,
+            param: this.param,
+            item: paramItem,
+            delimiter: this.delimiter
+        });
+        var sibling = node.item(0);
+        if(sibling) {
+            node.insertBefore(child, sibling);
+        } else {
+            node.appendChild(child);
+        }
+    },
+
+    /** private: method[createNode]
+     *  :param attr: ``Object`` attributes for the new node
+     */
+    createNode: function(attr){
+        if(this.baseAttrs){
+            Ext.apply(attr, this.baseAttrs);
+        }
+        if(typeof attr.uiProvider == 'string'){
+           attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);
+        }
+        attr.nodeType = attr.nodeType || "gx_layerparam";
+
+        return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);
+    }
+});
\ No newline at end of file


Property changes on: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamLoader.js
___________________________________________________________________
Name: svn:keywords
   + Id Author Date Revision
Name: svn:eol-style
   + native

Added: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js	                        (rev 0)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js	2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,232 @@
+/**
+ * Copyright (c) 2008-2009 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 = LayerParamNode
+ *  base_link = `Ext.util.Observable <http://extjs.com/deploy/dev/docs/?class=Ext.tree.TreeNode>`_
+ */
+
+/** api: constructor
+ *  .. class:: LayerParamNode
+ * 
+ *  A subclass of ``Ext.tree.TreeNode`` that represents a value of a list of
+ *  values provided as one of an ``OpenLayers.Layer.HTTPRequest``'s params.
+ *  The default iconCls for this node's icon is "gx-tree-layerparam-icon".
+ *  
+ *  To use this node type in a ``TreePanel`` config, set ``nodeType`` to
+ *  "gx_layerparam".
+ */
+GeoExt.tree.LayerParamNode = Ext.extend(Ext.tree.TreeNode, {
+    
+    /** api: config[layer]
+     *  ``OpenLayers.Layer.HTTPRequest|String`` The layer that this node
+     *  represents a subnode of. If provided as string, the string has to
+     *  match the title of one of the records in the ``layerStore``.
+     */
+    
+    /** private: property[layer]
+     *  ``OpenLayers.Layer.HTTPRequest``
+     */
+    layer: null,
+    
+    /** api: config[layerStore]
+     *  :class:`GeoExt.data.LayerStore` Only used if layer is provided as
+     *  string. The store where we can find the layer. If not provided, the
+     *  store of a map panel found by ``GeoExt.MapPanel::guess`` will be used.
+     */
+    
+    /** api: config[param]
+     *  ``String`` Key for a param (key-value pair in the params object of the
+     *  layer) that this node represents an item of. The value can either be an
+     *  ``Array`` or a ``String``, delimited by the character (or string)
+     *  provided as ``delimiter`` config option.
+     */
+    
+    /** private: property[param]
+     *  ``String``
+     */
+    param: null,
+    
+    /** api: config[item]
+     *  ``String`` The param's value's item that this node represents.
+     */
+    
+    /** private: property[item]
+     *  ``String``
+     */
+    item: null,
+    
+    /** api: config[delimiter]
+     *  ``String`` Delimiter of the ``param``'s value's items. Default is
+     *  ``,`` (comma). If the ``param``'s value is an array, this property
+     *  has no effect.
+     */
+    
+    /** private: property[delimiter]
+     *  ``String``
+     */
+    delimiter: null,
+    
+    /** private: property[allItems]
+     *  ``Array`` All items in the param value.
+     */
+    allItems: null,
+    
+    /** private: method[constructor]
+     *  Private constructor override.
+     */
+    constructor: function(attributes) {
+        var config = attributes || {};
+        config.iconCls = config.iconCls || "gx-tree-layerparam-icon";
+        config.text = config.text || config.item;
+        typeof config.layer == "string" ? false :
+            config.layer.getVisibility();
+        
+        this.param = config.param;
+        this.item = config.item;
+        this.delimiter = config.delimiter || ",";
+                
+        GeoExt.tree.LayerParamNode.superclass.constructor.apply(this, arguments);
+    },
+    
+    /** private: method[render]
+     *  Private override.
+     */
+    render: function(bulkRender) {
+        var layer = this.attributes.layer;
+        if(typeof layer == "string") {
+            var store = this.attributes.layerStore || GeoExt.MapPanel.guess().layers;
+            var i = store.findBy(function(o) {
+                return o.get("title") == layer;
+            });
+            layer = store.getAt(i).get("layer");
+        }
+        this.layer = layer;
+        this.allItems = this.getItems();
+        this.attributes.checked = layer.getVisibility();
+
+        this.addVisibilityEventHandlers();
+        GeoExt.tree.LayerParamNode.superclass.render.apply(this, arguments);
+    },
+    
+    /** private: method[getItems]
+     *  :return: ``Array`` the items of this node's layer's param
+     */
+    getItems: function() {
+        var paramValue = this.layer.params[this.param];
+        return paramValue instanceof Array ?
+            paramValue :
+            (paramValue ? paramValue.split(this.delimiter) : []);
+    },
+    
+    /** private: method[createParams]
+     *  :param items: ``Array``
+     *  :return: ``Object`` The params object to pass to mergeNewParams
+     */
+    createParams: function(items) {
+        var params = {};
+        params[this.param] = this.layer.params[this.param] instanceof Array ?
+            items :
+            items.join(this.delimiter);
+        return params;
+    },
+    
+    /** private: method[addVisibilityHandlers]
+     *  Adds handlers that sync the checkbox state with the layer's visibility
+     *  state
+     */
+    addVisibilityEventHandlers: function() {        
+        this.layer.events.on({
+            "visibilitychanged": this.onLayerVisibilityChanged,
+            scope: this
+        }); 
+        this.on({
+            "checkchange": this.onCheckChange,
+            scope: this
+        });
+    },
+    
+    /** private: method[onLayerVisibilityChanged]
+     *  Handler for visibilitychanged events on the layer.
+     */
+    onLayerVisibilityChanged: function() {
+        if(this.getItems().length === 0) {
+            this.layer.mergeNewParams(this.createParams(this.allItems));
+        }
+        var visible = this.layer.getVisibility();
+        if(visible && this.getItems().indexOf(this.item) !== -1) {
+            this.getUI().toggleCheck(true);
+        }
+        if(!visible) {
+            this.layer.mergeNewParams(this.createParams([]));
+            this.getUI().toggleCheck(false);
+        }
+    },
+    
+    /** private: method[onCheckChange]
+     *  :param node: :class:`GeoExt.tree.LayerParamNode``
+     *  :param checked: ``Boolean``
+     *
+     *  Handler for checkchange events.
+     */
+    onCheckChange: function(node, checked) {
+        var layer = this.layer;
+
+        var newItems = [];
+        var curItems = this.getItems();
+        // if the layer is invisible, and a subnode is checked for the first
+        // time, we need to pretend that no subnode param items are set.
+        if(checked === true && layer.getVisibility() === false &&
+                                curItems.length === this.allItems.length) {
+            curItems = [];
+            
+        }
+        Ext.each(this.allItems, function(item) {
+            if((item !== this.item && curItems.indexOf(item) !== -1) ||
+                            (checked === true && item === this.item)) {
+                newItems.push(item);
+            }
+        }, this);
+        
+        var visible = (newItems.length > 0);
+        // if there is something to display, we want to update the params
+        // before the layer is turned on
+        visible && layer.mergeNewParams(this.createParams(newItems));
+        if(visible !== layer.getVisibility()) {
+            layer.setVisibility(visible);
+        }
+        // if there is nothing to display, we want to update the params
+        // when the layer is turned off, so we don't fire illegal requests
+        // (i.e. param value being empty)
+        (!visible) && layer.mergeNewParams(this.createParams([]));
+    },
+    
+    /** private: method[destroy]
+     */
+    destroy: function() {
+        var layer = this.layer;
+        if (layer instanceof OpenLayers.Layer) {
+            layer.events.un({
+                "visibilitychanged": this.onLayerVisibilityChanged,
+                scope: this
+            });
+        }
+        delete this.layer;
+        
+        this.un("checkchange", this.onCheckChange, this);
+
+        GeoExt.tree.LayerNode.superclass.destroy.apply(this, arguments);
+    }
+});
+
+/**
+ * NodeType: gx_layerparam
+ */
+Ext.tree.TreePanel.nodeTypes.gx_layerparam = GeoExt.tree.LayerParamNode;


Property changes on: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerParamNode.js
___________________________________________________________________
Name: svn:keywords
   + Id Author Date Revision
Name: svn:eol-style
   + native

Modified: core/trunk/geoext/lib/GeoExt.js
===================================================================
--- core/trunk/geoext/lib/GeoExt.js	2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/lib/GeoExt.js	2009-10-08 13:56:45 UTC (rev 1391)
@@ -95,6 +95,8 @@
             "GeoExt/widgets/tree/LayerContainer.js",
             "GeoExt/widgets/tree/BaseLayerContainer.js",
             "GeoExt/widgets/tree/OverlayLayerContainer.js",
+            "GeoExt/widgets/tree/LayerParamNode.js",
+            "GeoExt/widgets/tree/LayerParamLoader.js",
             "GeoExt/widgets/LayerOpacitySlider.js",
             "GeoExt/widgets/LegendImage.js",
             "GeoExt/widgets/LegendWMS.js",

Modified: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html	2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerNode.html	2009-10-08 13:56:45 UTC (rev 1391)
@@ -9,16 +9,20 @@
         
         function test_constructor(t) {
             
-            t.plan(1);
+            t.plan(2);
             
             var store = new GeoExt.data.LayerStore();
             
             var node = new GeoExt.tree.LayerNode({
                 layer: "foo",
-                layerStore: store
+                layerStore: store,
+                loader: {
+                    param: "foo"
+                }
             });
             
             t.ok(node.layerStore === store, "layerStore set");
+            t.ok(node.attributes.loader instanceof GeoExt.tree.LayerParamLoader, "LayerParamLoader created from object.");
             
             node.destroy();
             
@@ -26,7 +30,7 @@
         
         function test_render(t) {
             
-            t.plan(9);
+            t.plan(8);
             
             var layer = new OpenLayers.Layer("foo");
             
@@ -38,12 +42,7 @@
             var node = new GeoExt.tree.LayerNode({
                 layer: "foo",
                 radioGroup: "group",
-                checkedGroup: "check",
-                childNodeType: {
-                    add: function() {
-                        t.ok(true, "add function of childNodeType called");
-                    }
-                }
+                checkedGroup: "check"
             });
             
             node.on("radiochange", function() {

Added: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html	                        (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html	2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,75 @@
+<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>
+            
+        function setupTree() {
+            var layer = new OpenLayers.Layer.WMS("Group", "http://localhost/wms", {
+                 "LAYERS": ["layer1", "layer2"]
+            });
+           
+            return new Ext.tree.TreePanel({
+                renderTo: "tree",
+                loader: {
+                    applyLoader: false
+                },
+                root: {
+                    text: "Layers",
+                    expanded: true,
+                    children: [{
+                        nodeType: "gx_layer",
+                        expanded: true,
+                        layer: layer,
+                        loader: {
+                            param: "LAYERS"
+                        }
+                    }]
+                }
+            });
+        }
+        
+        function test_constructor(t) {
+            t.plan(4);
+            
+            var loader = new GeoExt.tree.LayerParamLoader({
+                param: "bar"
+            });
+            
+            t.ok(loader instanceof GeoExt.tree.LayerParamLoader, "instance created.");
+            t.eq(loader.param, "bar", "param set.");
+            t.eq(loader.delimiter, ",", "default delimiter set.");
+            
+            loader = new GeoExt.tree.LayerParamLoader({
+                param: "bar",
+                delimiter: ";"
+            });
+
+            t.eq(loader.delimiter, ";", "custom delimiter set.");
+        }
+        
+        function test_load(t) {
+            t.plan(4);
+
+            var panel = setupTree();
+            var nodes = panel.getRootNode().childNodes[0].childNodes;
+            var layer = nodes[0].layer;
+            
+            t.eq(nodes.length, 2, "2 child nodes created.");
+            t.eq(nodes[0].param, "LAYERS", "param for 1st node set.");
+            t.eq(nodes[0].item, "layer2", "item for 1st node set.");
+            t.eq(nodes[1].item, "layer1", "item for 2nd node set.");
+            
+            panel.destroy();
+            layer.destroy();
+        }
+
+        </script>
+    </head>
+    <body>
+        <div id="tree" style="width: 100px; height: 100px;"></div>
+    </body>
+</html>


Property changes on: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamLoader.html
___________________________________________________________________
Name: svn:keywords
   + Id Author Date Revision
Name: svn:eol-style
   + native

Added: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html	                        (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html	2009-10-08 13:56:45 UTC (rev 1391)
@@ -0,0 +1,171 @@
+<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>
+            
+        function setupTree() {
+            var layer = new OpenLayers.Layer.WMS("Group", "http://localhost/wms", {
+                 "LAYERS": ["layer1", "layer2"],
+                 "CQL_FILTER": "city='Vienna' OR city='Graz'"
+            }, {
+                visibility: false
+            });
+           
+            var store = new GeoExt.data.LayerStore({
+                layers: [layer]
+            });
+
+            return new Ext.tree.TreePanel({
+                renderTo: "tree",
+                loader: new Ext.tree.TreeLoader({
+                    baseAttrs: {
+                        layerStore: store
+                    }
+                }),
+                root: {
+                    text: "Layers",
+                    expanded: true,
+                    children: [{
+                        nodeType: "gx_layerparam",
+                        layer: layer,
+                        param: "LAYERS",
+                        item: "layer1"
+                    }, {
+                        nodeType: "gx_layerparam",
+                        layer: layer,
+                        param: "LAYERS",
+                        item: "layer2",
+                        delimiter: ";"
+                    }, {
+                        nodeType: "gx_layerparam",
+                        // provide this layer as string to see if the layer can
+                        // be configured from the store provided in baseParams
+                        layer: "Group",
+                        param: "CQL_FILTER",
+                        item: "city='Vienna'",
+                        delimiter: " OR "
+                    }]
+                }
+            });
+        }
+        
+        function test_constructor(t) {
+            t.plan(4);
+            
+            var layer = {
+                params: {bar: ["before", "foobar", "after"]},
+                getVisibility: function(){}
+            };
+            
+            var node = new GeoExt.tree.LayerParamNode({
+                layer: layer,
+                param: "bar",
+                item: "foobar"
+            });
+            
+            t.eq(node.param, "bar", "param set.");
+            t.eq(node.item, "foobar", "item set.");
+            t.eq(node.delimiter, ",", "default delimiter set.");
+            
+            node.destroy();
+            
+            node = new GeoExt.tree.LayerParamNode({
+                layer: layer,
+                param: "bar",
+                item: "foobar",
+                delimiter: ";"
+            });
+
+            t.eq(node.delimiter, ";", "custom delimiter set.");
+            
+            node.destroy();
+        }
+        
+        function test_render(t) {
+            t.plan(3);
+            
+            var panel = setupTree();
+            var nodes = panel.getRootNode().childNodes;
+            var layer = nodes[0].layer;
+
+            t.ok(nodes[2].layer instanceof OpenLayers.Layer, "layer set from store.");
+            t.eq(nodes[0].allItems, ["layer1", "layer2"], "allItems with set from array");
+            t.eq(nodes[2].allItems, ["city='Vienna'", "city='Graz'"], "allItems with custom delimiter set");
+            
+            panel.destroy();
+            nodes[2].attributes.layerStore.destroy();
+            layer.destroy();
+        }
+        
+        function test_onLayerVisibilityChanged(t) {
+            t.plan(6);
+
+            var panel = setupTree();
+            var nodes = panel.getRootNode().childNodes;
+            var layer = nodes[0].layer;
+            
+            t.eq(nodes[0].attributes.checked, false, "node for layer1 is unchecked.");
+            t.eq(nodes[1].attributes.checked, false, "node for layer2 is unchecked.");
+            
+            layer.setVisibility(true);
+            t.eq(nodes[0].attributes.checked, true, "node for layer1 is checked.");
+            t.eq(nodes[1].attributes.checked, true, "node for layer2 is checked.");
+            
+            layer.setVisibility(false);
+            t.eq(nodes[0].attributes.checked, false, "node for layer1 is unchecked again.");
+            t.eq(nodes[1].attributes.checked, false, "node for layer2 is unchecked again.");
+            
+            panel.destroy();
+            nodes[2].attributes.layerStore.destroy();
+            layer.destroy();
+        }
+        
+        function test_onCheckChange(t) {
+            t.plan(9);
+            
+            var panel = setupTree();
+            var nodes = panel.getRootNode().childNodes;
+            var layer = nodes[0].layer;
+            
+            layer.setVisibility(false);
+            
+            // now all nodes are unchecked, but the layer has all params set
+            
+            t.eq(nodes[1].attributes.checked, false, "node unchecked because layer is invisible.");
+            
+            nodes[1].getUI().toggleCheck(true);
+            
+            // now the layer has just the param item of nodes[0] set, and is visible
+            
+            t.eq(layer.getVisibility(), true, "layer is visible after checking a subnode.");
+            t.eq(layer.params.LAYERS, ["layer2"], "correct sublayer is set after checking it.");
+            
+            nodes[1].getUI().toggleCheck(false);
+            t.eq(layer.params.LAYERS, [], "layer2 invisible again after unchecking.");
+            t.eq(layer.getVisibility(), false, "layer hidden if no sublayers are visible");
+            
+            nodes[0].getUI().toggleCheck(true);
+            t.eq(layer.params.LAYERS, ["layer1"], "only checked sublayer is visible.");
+            t.eq(layer.getVisibility(), true, "layer set to visible with checked sublayer.");
+
+            // now check if split and join with custom delimiter works
+            nodes[2].getUI().toggleCheck(false);
+            t.eq(layer.params.CQL_FILTER, "city='Graz'", "param with custom delimiter removed.");
+            nodes[2].getUI().toggleCheck(true);
+            t.eq(layer.params.CQL_FILTER, "city='Vienna' OR city='Graz'", "param with custom delimiter re-added.");
+
+            panel.destroy();
+            nodes[2].attributes.layerStore.destroy();
+            layer.destroy();
+        }
+                
+        </script>
+    </head>
+    <body>
+        <div id="tree" style="width: 100px; height: 100px;"></div>
+    </body>
+</html>


Property changes on: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerParamNode.html
___________________________________________________________________
Name: svn:keywords
   + Id Author Date Revision
Name: svn:eol-style
   + native

Modified: core/trunk/geoext/tests/list-tests.html
===================================================================
--- core/trunk/geoext/tests/list-tests.html	2009-10-08 05:26:12 UTC (rev 1390)
+++ core/trunk/geoext/tests/list-tests.html	2009-10-08 13:56:45 UTC (rev 1391)
@@ -24,6 +24,8 @@
   <li>lib/GeoExt/widgets/tree/LayerContainer.html</li>
   <li>lib/GeoExt/widgets/tree/LayerLoader.html</li>
   <li>lib/GeoExt/widgets/tree/LayerNode.html</li>
+  <li>lib/GeoExt/widgets/tree/LayerParamLoader.html</li>
+  <li>lib/GeoExt/widgets/tree/LayerParamNode.html</li>
   <li>lib/GeoExt/widgets/LegendImage.html</li>
   <li>lib/GeoExt/widgets/LegendPanel.html</li>
   <li>lib/GeoExt/widgets/LegendWMS.html</li>



More information about the Commits mailing list