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

commits at geoext.org commits at geoext.org
Sun Jul 26 23:32:34 CEST 2009


Author: ahocevar
Date: 2009-07-26 23:32:34 +0200 (Sun, 26 Jul 2009)
New Revision: 1288

Added:
   core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js
   core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html
Modified:
   core/trunk/geoext/examples/tree.js
   core/trunk/geoext/lib/GeoExt.js
   core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js
   core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js
   core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js
   core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html
   core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html
   core/trunk/geoext/tests/list-tests.html
Log:
Created a LayerLoader to popuplate LayerContainers; enhanced DD support 
to drag/drop layers from one container to another. Thanks Eric for the 
great collaboration on this. r=elemoine (closes #122) 


Modified: core/trunk/geoext/examples/tree.js
===================================================================
--- core/trunk/geoext/examples/tree.js	2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/examples/tree.js	2009-07-26 21:32:34 UTC (rev 1288)
@@ -16,8 +16,8 @@
         nodeType: "gx_overlaylayercontainer",
         // render the nodes inside this container with a radio button,
         // and assign them the group "foo"
-        defaults: {
-            radioGroup: "foo"
+        loader: {
+            baseAttrs: {radioGroup: "foo"}
         }
     }, {
         nodeType: "gx_layer",
@@ -136,7 +136,7 @@
         collapseMode: "mini",
         autoScroll: true,
         loader: new Ext.tree.TreeLoader({
-            clearOnLoad: true
+            applyLoader: false
         }),
         root: {
             nodeType: "async",

Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js	2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/BaseLayerContainer.js	2009-07-26 21:32:34 UTC (rev 1288)
@@ -39,43 +39,24 @@
      *  Private constructor override.
      */
     constructor: function(config) {
-        config.text = config.text || "Base Layer";
-        config.defaults = Ext.apply({
-            iconCls: 'gx-tree-baselayer-icon',
-            checkedGroup: 'baselayer'
-        }, config.defaults);
-        GeoExt.tree.BaseLayerContainer.superclass.constructor.apply(this, arguments);
-    },
+        config = Ext.applyIf(config || {}, {
+            text: "Base Layer",
+            loader: {}
+        });
+        config.loader = Ext.applyIf(config.loader, {
+            baseAttrs: Ext.applyIf(config.loader.baseAttrs || {}, {
+                iconCls: 'gx-tree-baselayer-icon',
+                checkedGroup: 'baselayer'
+            }),
+            filter: function(record) {
+                var layer = record.get("layer");
+                return layer.displayInLayerSwitcher === true &&
+                    layer.isBaseLayer === true;
+            }
+        });
 
-    /** private: method[addLayerNode]
-     *  :param layerRecord: ``Ext.data.Record`` The layer record containing the
-     *      layer to be added.
-     *  :param index: ``Number`` Optional index for the new layer.  Default is 0.
-     *  
-     *  Adds a child node representing a base layer of the map
-     */
-    addLayerNode: function(layerRecord, index) {
-        var layer = layerRecord.get("layer");
-        if (layer.isBaseLayer == true) {
-            GeoExt.tree.BaseLayerContainer.superclass.addLayerNode.apply(
-                this, arguments
-            );
-        }
-    },
-    
-    /** private: method[removeLayerNode]
-     *  :param layerRecord: ``Ext.data.Record`` the layer record to remove the
-     *      node for
-     *
-     *  Removes a child node representing a base layer of the map.
-     */
-    removeLayerNode: function(layerRecord) {
-        var layer = layerRecord.get("layer");
-        if (layer.isBaseLayer == true) {
-            GeoExt.tree.BaseLayerContainer.superclass.removeLayerNode.apply(
-                this, arguments
-            );
-    	}
+        GeoExt.tree.BaseLayerContainer.superclass.constructor.call(this,
+            config);
     }
 });
 

Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js	2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerContainer.js	2009-07-26 21:32:34 UTC (rev 1288)
@@ -7,14 +7,14 @@
  */
 
 /**
- * @include GeoExt/widgets/tree/LayerNode.js
+ * @include GeoExt/widgets/tree/LayerLoader.js
  */
 Ext.namespace("GeoExt.tree");
 
 /** api: (define)
  *  module = GeoExt.tree
  *  class = LayerContainer
- *  base_link = `Ext.tree.TreeNode <http://extjs.com/deploy/dev/docs/?class=Ext.tree.TreeNode>`_
+ *  base_link = `Ext.tree.AsyncTreeNode <http://extjs.com/deploy/dev/docs/?class=Ext.tree.AsyncTreeNode>`_
  */
 
 /** api: constructor
@@ -24,208 +24,76 @@
  *      OpenLayers map. Only layers that have displayInLayerSwitcher set to true
  *      will be included. The childrens' iconCls defaults to
  *      "gx-tree-layer-icon".
+ *      
+ *      Note: if this conatiner is loaded by an ``Ext.tree.TreeLoader``, the
+ *      ``applyLoader`` config option of that loader needs to be set to
+ *      "false". Also note that the list of available uiProviders will be
+ *      taken from the ownerTree if this container's loader is configured
+ *      without one.
  * 
  *      To use this node type in ``TreePanel`` config, set nodeType to
  *      "gx_layercontainer".
  */
-GeoExt.tree.LayerContainer = Ext.extend(Ext.tree.TreeNode, {
+GeoExt.tree.LayerContainer = Ext.extend(Ext.tree.AsyncTreeNode, {
     
-    /** api: config[layerStore]
-     *  :class:`GeoExt.data.LayerStore`
-     *  The layer store containing layers to be displayed in the container.
+    /** api: config[loader]
+     *  :class:`GeoExt.tree.LayerLoader` or ``Object`` The loader to use with
+     *  this container. If an ``Object`` is provided, a
+     *  :class:`GeoExt.tree.LayerLoader`, configured with the the properties
+     *  from the provided object, will be created. 
      */
-    layerStore: null,
     
-    /** api: config[defaults]
-     *  ``Object``
-     *  A configuration object passed to all nodes that this container creates.
+    /** api: config[layerStore]
+     *  :class:`GeoExt.data.LayerStore` The layer store containing layers to be
+     *  displayed in the container. If loader is not provided or provided as
+     *  ``Object``, this property will be set as the store option of the
+     *  loader. Otherwise it will be ignored.
      */
-    defaults: null,
-
+    
     /** private: method[constructor]
      *  Private constructor override.
      */
     constructor: function(config) {
-        this.layerStore = config.layerStore;
-        this.defaults = config.defaults;
-        GeoExt.tree.LayerContainer.superclass.constructor.apply(this, arguments);
+        config = Ext.applyIf(config || {}, {
+            text: "Layers"
+        });
+        this.loader = config.loader instanceof GeoExt.tree.LayerLoader ?
+            config.loader :
+            new GeoExt.tree.LayerLoader(Ext.applyIf(config.loader, {
+                store: config.layerStore
+            }));
+        
+        GeoExt.tree.LayerContainer.superclass.constructor.call(this, config);
     },
-
-    /** private: method[render]
-     *  :param bulkRender: ``Boolean``
-     */
-    render: function(bulkRender) {
-        if (!this.rendered) {
-            if(!this.layerStore) {
-                this.layerStore = GeoExt.MapPanel.guess().layers;
-            }
-            this.layerStore.each(function(record) {
-                this.addLayerNode(record);
-            }, this);
-            this.layerStore.on({
-                "add": this.onStoreAdd,
-                "remove": this.onStoreRemove,
-                scope: this
-            });
-        }
-        GeoExt.tree.LayerContainer.superclass.render.call(this, bulkRender);
-    },
     
-    /** private: method[onStoreAdd]
-     *  :param store: ``Ext.data.Store``
-     *  :param records: ``Array(Ext.data.Record)``
-     *  :param index: ``Number``
-     *  
-     *  Listener for the store's add event.
-     */
-    onStoreAdd: function(store, records, index) {
-        if(!this._reordering) {
-            var nodeIndex = this.recordIndexToNodeIndex(index+records.length-1);
-            for(var i=0; i<records.length; ++i) {
-                this.addLayerNode(records[i], nodeIndex);
-            }
-        }
-    },
-    
-    /** private: method[onStoreRemove]
-     *  :param store: ``Ext.data.Store``
-     *  :param record: ``Ext.data.Record``
-     *  :param index: ``Number``
-     *  
-     *  Listener for the store's remove event.
-     */
-    onStoreRemove: function(store, record, index) {
-        if(!this._reordering) {
-            this.removeLayerNode(record);
-        }
-    },
-
     /** private: method[recordIndexToNodeIndex]
      *  :param index: ``Number`` The record index in the layer store.
      *  :return: ``Number`` The appropriate child node index for the record.
      */
     recordIndexToNodeIndex: function(index) {
-        var store = this.layerStore;
+        var store = this.loader.store;
         var count = store.getCount();
         var nodeCount = this.childNodes.length;
         var nodeIndex = -1;
         for(var i=count-1; i>=0; --i) {
-            if(store.getAt(i).get("layer").displayInLayerSwitcher) {
+            if(this.loader.filter(store.getAt(i)) === true) {
                 ++nodeIndex;
                 if(index === i || nodeIndex > nodeCount-1) {
                     break;
                 }
             }
-        };
+        }
         return nodeIndex;
     },
     
-    /** private: method[nodeIndexToRecordIndex]
-     *  :param index: ``Number`` The child node index.
-     *  :return: ``Number`` The appropriate record index for the node.
-     *  
-     *  Convert a child node index to a record index.
-     */
-    nodeIndexToRecordIndex: function(index) {
-        var store = this.layerStore;
-        var count = store.getCount();
-        var nodeIndex = -1;
-        for(var i=count-1; i>=0; --i) {
-            if(store.getAt(i).get("layer").displayInLayerSwitcher) {
-                ++nodeIndex;
-                if(index === nodeIndex) {
-                    break;
-                }
-            }
-        }
-        return i;
-    },
-    
-    /** private: method[addLayerNode]
-     *  :param layerRecord: ``Ext.data.Record`` The layer record containing the
-     *      layer to be added.
-     *  :param index: ``Number`` Optional index for the new layer.  Default is 0.
-     *  
-     *  Adds a child node representing a layer of the map
-     */
-    addLayerNode: function(layerRecord, index) {
-        index = index || 0;
-        var layer = layerRecord.get("layer");
-        if (layer.displayInLayerSwitcher === true) {
-            var Node = (this.defaults && this.defaults.nodeType) ?
-                Ext.tree.TreePanel.nodeTypes[this.defaults.nodeType] :
-                GeoExt.tree.LayerNode;
-            var node = new Node(Ext.apply({
-                iconCls: 'gx-tree-layer-icon',
-                layer: layer,
-                layerStore: this.layerStore
-            }, this.defaults));
-            var sibling = this.item(index);
-            if(sibling) {
-                this.insertBefore(node, sibling);
-            } else {
-                this.appendChild(node);
-            }
-            node.on("move", this.onChildMove, this);
-        }
-    },
-    
-    /** private: method[removeLayerNode]
-     *  :param layerRecord: ``Ext.data.Record`` The layer record containing the
-     *      layer to be removed.
-     * 
-     *  Removes a child node representing a layer of the map
-     */
-    removeLayerNode: function(layerRecord) {
-        var layer = layerRecord.get("layer");
-        if (layer.displayInLayerSwitcher == true) {
-            var node = this.findChildBy(function(node) {
-                return node.layer == layer;
-            });
-            if(node) {
-                node.un("move", this.onChildMove, this);
-                node.remove();
-            }
-    	}
-    },
-    
-    /** private: method[onChildMove]
-     *  :param tree: ``Ext.data.Tree``
-     *  :param node: ``Ext.tree.TreeNode``
-     *  :param oldParent: ``Ext.tree.TreeNode``
-     *  :param newParent: ``Ext.tree.TreeNode``
-     *  :param index: ``Number``
-     *  
-     *  Listener for child node "move" events.  This updates the order of
-     *  records in the store based on new node order if the node has not
-     *  changed parents.
-     */
-    onChildMove: function(tree, node, oldParent, newParent, index) {
-        if(oldParent === newParent) {
-            var newRecordIndex = this.nodeIndexToRecordIndex(index);
-            var oldRecordIndex = this.layerStore.findBy(function(record) {
-                return record.get("layer") === node.layer;
-            });
-            // remove the record and re-insert it at the correct index
-            var record = this.layerStore.getAt(oldRecordIndex);
-            this._reordering = true;
-            this.layerStore.remove(record);
-            this.layerStore.insert(newRecordIndex, [record]);
-            delete this._reordering;
-        }
-    },
-
     /** private: method[destroy]
      */
     destroy: function() {
-        if(this.layerStore) {
-            this.layerStore.un("add", this.onStoreAdd, this);
-            this.layerStore.un("remove", this.onStoreRemove, this);
-        }
+        delete this.layerStore;
         GeoExt.tree.LayerContainer.superclass.destroy.apply(this, arguments);
     }
 });
-
+    
 /**
  * NodeType: gx_layercontainer
  */

Added: core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js	                        (rev 0)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/LayerLoader.js	2009-07-26 21:32:34 UTC (rev 1288)
@@ -0,0 +1,317 @@
+/**
+ * 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.
+ */
+
+/**
+ * @include GeoExt/widgets/tree/LayerNode.js
+ */
+Ext.namespace("GeoExt.tree");
+
+/** api: (define)
+ *  module = GeoExt.tree
+ *  class = LayerLoader
+ *  base_link = `Ext.util.Observable <http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable>`_
+ */
+
+/** api: constructor
+ *  .. class:: LayerLoader
+ * 
+ *      A loader that will load all layers of a :class:`GeoExt.data.LayerStore`
+ *      By default, only layers that have displayInLayerSwitcher set to true
+ *      will be included. The childrens' iconCls defaults to
+ *      "gx-tree-layer-icon".
+ */
+GeoExt.tree.LayerLoader = 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 wer 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.LayerLoader, Ext.util.Observable, {
+
+    /** api: config[store]
+     *  :class:`GeoExt.data.LayerStore`
+     *  The layer store containing layers to be added by this loader.
+     */
+    store: null,
+    
+    /** api: config[filter]
+     *  ``Function``
+     *  A function, called in the scope of this loader, with a layer record
+     *  as argument. Is expected to return true for layers to be loaded, false
+     *  otherwise. By default, the filter checks for displayInLayerSwitcher:
+     *  
+     *  .. code-block:: javascript
+     *  
+     *      filter: function(record) {
+     *          return record.get("layer").displayInLayerSwitcher == true
+     *      }
+     */
+    filter: function(record) {
+        return record.get("layer").displayInLayerSwitcher == true;
+    },
+    
+    /** api: config[uiProviders]
+     *  ``Object``
+     *  An optional object containing properties which specify custom
+     *  GeoExt.tree.LayerNodeUI implementations. If the optional uiProvider
+     *  attribute for child nodes is a string rather than a reference to a
+     *  TreeNodeUI implementation, then that string value is used as a
+     *  property name in the uiProviders object. If not provided, the
+     *  uiProviders object will be taken from the ownerTree.
+     */
+    uiProviders: null,
+    
+    /** 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)) {
+            this.removeStoreHandlers();
+            while (node.firstChild) {
+                node.removeChild(node.firstChild);
+            }
+            
+            if(!this.uiProviders) {
+                this.uiProviders = node.getOwnerTree().getLoader().uiProviders;
+            }
+    
+            if(!this.store) {
+                this.store = GeoExt.MapPanel.guess().layers;
+            }
+            this.store.each(function(record) {
+                this.addLayerNode(node, record);
+            }, this);
+            this.addStoreHandlers(node);
+    
+            if(typeof callback == "function"){
+                callback();
+            }
+            
+            this.fireEvent("load", this, node);
+        }
+    },
+    
+    /** private: method[onStoreAdd]
+     *  :param store: ``Ext.data.Store``
+     *  :param records: ``Array(Ext.data.Record)``
+     *  :param index: ``Number``
+     *  :param node: ``Ext.tree.TreeNode``
+     *  
+     *  Listener for the store's add event.
+     */
+    onStoreAdd: function(store, records, index, node) {
+        if(!this._reordering) {
+            var nodeIndex = node.recordIndexToNodeIndex(index+records.length-1);
+            for(var i=0; i<records.length; ++i) {
+                this.addLayerNode(node, records[i], nodeIndex);
+            }
+        }
+    },
+    
+    /** private: method[onStoreRemove]
+     *  :param store: ``Ext.data.Store``
+     *  :param record: ``Ext.data.Record``
+     *  :param index: ``Number``
+     *  :param node: ``Ext.tree.TreeNode``
+     *  
+     *  Listener for the store's remove event.
+     */
+    onStoreRemove: function(store, record, index, node) {
+        if(!this._reordering) {
+            this.removeLayerNode(node, record);
+        }
+    },
+
+    /** private: method[addLayerNode]
+     *  :param node: ``Ext.tree.TreeNode`` The node that the layer node will
+     *      be added to as child.
+     *  :param layerRecord: ``Ext.data.Record`` The layer record containing the
+     *      layer to be added.
+     *  :param index: ``Number`` Optional index for the new layer.  Default is 0.
+     *  
+     *  Adds a child node representing a layer of the map
+     */
+    addLayerNode: function(node, layerRecord, index) {
+        index = index || 0;
+        if (this.filter(layerRecord) === true) {
+            var child = this.createNode({
+                nodeType: 'gx_layer',
+                layer: layerRecord.get("layer"),
+                layerStore: this.store
+            });
+            var sibling = node.item(index);
+            if(sibling) {
+                node.insertBefore(child, sibling);
+            } else {
+                node.appendChild(child);
+            }
+            child.on("move", this.onChildMove, this);
+        }
+    },
+
+    /** private: method[removeLayerNode]
+     *  :param node: ``Ext.tree.TreeNode`` The node that the layer node will
+     *      be removed from as child.
+     *  :param layerRecord: ``Ext.data.Record`` The layer record containing the
+     *      layer to be removed.
+     * 
+     *  Removes a child node representing a layer of the map
+     */
+    removeLayerNode: function(node, layerRecord) {
+        if (this.filter(layerRecord) === true) {
+            var child = node.findChildBy(function(node) {
+                return node.layer == layerRecord.get("layer");
+            });
+            if(child) {
+                child.un("move", this.onChildMove, this);
+                child.remove();
+                node.reload();
+            }
+    	}
+    },
+    
+    /** private: method[onChildMove]
+     *  :param tree: ``Ext.data.Tree``
+     *  :param node: ``Ext.tree.TreeNode``
+     *  :param oldParent: ``Ext.tree.TreeNode``
+     *  :param newParent: ``Ext.tree.TreeNode``
+     *  :param index: ``Number``
+     *  
+     *  Listener for child node "move" events.  This updates the order of
+     *  records in the store based on new node order if the node has not
+     *  changed parents.
+     */
+    onChildMove: function(tree, node, oldParent, newParent, index) {
+        this._reordering = true;
+        var oldRecordIndex = this.store.findBy(function(record) {
+            return record.get("layer") === node.layer;
+        });
+        // remove the record and re-insert it at the correct index
+        var record = this.store.getAt(oldRecordIndex);
+
+        if(newParent instanceof GeoExt.tree.LayerContainer && 
+                                    this.store === newParent.loader.store) {
+            newParent.loader._reordering = true;
+            this.store.remove(record);
+            var newRecordIndex;
+            if(newParent.childNodes.length > 1) {
+                // find index by neighboring node in the same container
+                var searchIndex = (index === 0) ? index + 1 : index - 1;
+                newRecordIndex = this.store.findBy(function(r) {
+                    return newParent.childNodes[searchIndex].layer === r.get("layer");
+                });
+                index === 0 && newRecordIndex++;
+            } else if(oldParent.parentNode === newParent.parentNode){
+                // find index by last node of a container above
+                var prev = newParent;
+                do {
+                    prev = prev.previousSibling;
+                } while (prev && !(prev instanceof GeoExt.tree.LayerContainer && prev.lastChild));
+                if(prev) {
+                    newRecordIndex = this.store.findBy(function(r) {
+                        return prev.lastChild.layer === r.get("layer");
+                    });
+                } else {
+                    // find indext by first node of a container below
+                    var next = newParent;
+                    do {
+                        next = next.nextSibling;
+                    } while (next && !(next instanceof GeoExt.tree.LayerContainer && next.firstChild));
+                    if(next) {
+                        newRecordIndex = this.store.findBy(function(r) {
+                            return next.firstChild.layer === r.get("layer");
+                        });
+                    }
+                    newRecordIndex++;
+                }
+            }
+            if(newRecordIndex !== undefined) {
+                this.store.insert(newRecordIndex, [record]);
+                window.setTimeout(function() {
+                    newParent.reload();
+                    oldParent.reload();
+                });
+            } else {
+                this.store.insert(oldRecordIndex, [record]);
+            }
+            delete newParent.loader._reordering;
+        }
+        delete this._reordering;
+    },
+    
+    /** private: method[addStoreHandlers]
+     *  :param node: :class:`GeoExt.tree.LayerNode`
+     */
+    addStoreHandlers: function(node) {
+        if(!this._storeHandlers) {
+            this._storeHandlers = {
+                "add": this.onStoreAdd.createDelegate(this, [node], true),
+                "remove": this.onStoreRemove.createDelegate(this, [node], true)
+            };
+            for(evt in this._storeHandlers) {
+                this.store.on(evt, this._storeHandlers[evt], this);
+            }
+        }
+    },
+    
+    /** private: method[removeStoreHandlers]
+     */
+    removeStoreHandlers: function() {
+        if(this._storeHandlers) {
+            for(evt in this._storeHandlers) {
+                this.store.un(evt, this._storeHandlers[evt], this);
+            }
+            delete this._storeHandlers;
+        }
+    },
+
+    /** 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_layer";
+
+        return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);
+    },
+
+    /** private: method[destroy]
+     */
+    destroy: function() {
+        this.removeStoreHandlers();
+    }
+});
\ No newline at end of file


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

Modified: core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js	2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt/widgets/tree/OverlayLayerContainer.js	2009-07-26 21:32:34 UTC (rev 1288)
@@ -36,40 +36,19 @@
      *  Private constructor override.
      */
     constructor: function(config) {
-        config.text = config.text || "Overlays";
-        GeoExt.tree.OverlayLayerContainer.superclass.constructor.apply(this,
-            arguments);
-    },
-
-    /** private: method[addLayerNode]
-     *  :param layerRecord: ``Ext.data.Record`` The layer record containing the
-     *      layer to be added.
-     *  :param index: ``Number`` Optional index for the new layer.  Default is 0.
-     *  
-     *  Adds a child node representing a overlay layer of the map.
-     */
-    addLayerNode: function(layerRecord, index) {
-        var layer = layerRecord.get("layer");
-        if (layer.isBaseLayer == false) {
-            GeoExt.tree.OverlayLayerContainer.superclass.addLayerNode.apply(
-                this, arguments
-            );
-        }
-    },
-    
-    /** private: method[removeLayerNode]
-     *  :param layerRecord: ``Ext.data.Record`` the layer record to remove the
-     *      node for
-     *      
-     * Removes a child node representing an overlay layer of the map.
-     */
-    removeLayerNode: function(layerRecord) {
-        var layer = layerRecord.get("layer");
-        if (layer.isBaseLayer == false) {
-            GeoExt.tree.OverlayLayerContainer.superclass.removeLayerNode.apply(
-                this, arguments
-            );
-    	}
+        config = Ext.applyIf(config || {}, {
+            text: "Overlays"
+        });
+        config.loader = Ext.applyIf(config.loader || {}, {
+            filter: function(record){
+                var layer = record.get("layer");
+                return layer.displayInLayerSwitcher === true &&
+                layer.isBaseLayer === false;
+            }
+        });
+        
+        GeoExt.tree.OverlayLayerContainer.superclass.constructor.call(this,
+            config);
     }
 });
 

Modified: core/trunk/geoext/lib/GeoExt.js
===================================================================
--- core/trunk/geoext/lib/GeoExt.js	2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/lib/GeoExt.js	2009-07-26 21:32:34 UTC (rev 1288)
@@ -87,6 +87,7 @@
             "GeoExt/widgets/tips/LayerOpacitySliderTip.js",
             "GeoExt/widgets/tips/ZoomSliderTip.js",
             "GeoExt/widgets/tree/LayerNode.js",
+            "GeoExt/widgets/tree/LayerLoader.js",
             "GeoExt/widgets/tree/LayerContainer.js",
             "GeoExt/widgets/tree/BaseLayerContainer.js",
             "GeoExt/widgets/tree/OverlayLayerContainer.js",

Modified: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html	2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/BaseLayerContainer.html	2009-07-26 21:32:34 UTC (rev 1288)
@@ -25,7 +25,8 @@
             });
             
             var node = new GeoExt.tree.BaseLayerContainer({
-                layerStore: store
+                layerStore: store,
+                expanded: true
             });
             
             var panel = new Ext.tree.TreePanel({

Modified: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html	2009-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerContainer.html	2009-07-26 21:32:34 UTC (rev 1288)
@@ -12,15 +12,17 @@
             t.plan(2);
             
             var store = new GeoExt.data.LayerStore();
-            var defaults = {};
+            var defaults = {foo: "bar"};
             
             var node = new GeoExt.tree.LayerContainer({
                 layerStore: store,
-                defaults: defaults
+                loader: {
+                    baseAttrs: defaults
+                }
             });
             
-            t.ok(node.layerStore === store, "layerStore set");
-            t.ok(node.defaults === defaults, "defaults set");
+            t.ok(node.loader.store === store, "layerStore set");
+            t.eq(node.loader.baseAttrs.foo, "bar", "baseAttrs set");
             
             node.destroy();
             
@@ -42,7 +44,8 @@
             });
             
             var node = new GeoExt.tree.LayerContainer({
-                layerStore: store
+                layerStore: store,
+                expanded: true
             });
             
             var panel = new Ext.tree.TreePanel({
@@ -73,7 +76,8 @@
             });
             
             var root = new GeoExt.tree.LayerContainer({
-                layerStore: store
+                layerStore: store,
+                expanded: true
             });
             
             var panel = new Ext.tree.TreePanel({
@@ -122,6 +126,96 @@
             
         }
         
+        function test_group_move(t) {
+            t.plan(8);
+            
+            var map = new OpenLayers.Map({
+                div: "map",
+                allOverlays: true
+            });
+            
+            map.addLayers([
+                new OpenLayers.Layer("a"),
+                new OpenLayers.Layer("b"),
+                new OpenLayers.Layer("c", {displayInLayerSwitcher: false}),
+                new OpenLayers.Layer("d", {displayInLayerSwitcher: false})
+            ]);
+
+            var store = new GeoExt.data.LayerStore({
+                map: map
+            });
+
+            var root = new Ext.tree.TreeNode({
+                expanded: true
+            });
+            
+            var panel = new Ext.tree.TreePanel({
+                renderTo: document.body,
+                root: root,
+                listeners: {
+                    beforemovenode: function(tree, node, oldParent, newParent, index){
+                        // change the group when moving to a new container
+                        if (oldParent !== newParent) {
+                            var index = store.findBy(function(r){
+                                return r.get("layer") === node.layer;
+                            });
+                            var layer = store.getAt(index).get("layer");
+                            layer.displayInLayerSwitcher = !layer.displayInLayerSwitcher;
+                        }
+                    },
+                    scope: this
+                }
+            });
+
+            var container1 = new GeoExt.tree.LayerContainer({
+                loader: {
+                    store: store,
+                    filter: function(record) {
+                        return !record.get("layer").displayInLayerSwitcher
+                    }
+                },
+                expanded: true
+            });
+            root.appendChild(container1);
+            var container2 = new GeoExt.tree.LayerContainer({
+                loader: {
+                    store: store,
+                    filter: function(record) {
+                        return record.get("layer").displayInLayerSwitcher
+                    }
+                },
+                expanded: true
+            });
+            root.appendChild(container2);
+            
+            // testing if layers get grouped by filter properly
+            t.eq(container1.childNodes[0].text, "d", "d is 1st node on container1");
+            t.eq(container1.childNodes[1].text, "c", "c is 2nd node on container1");
+            t.eq(container2.childNodes[0].text, "b", "b is 1st node on container2");
+            t.eq(container2.childNodes[1].text, "a", "a is 2nd node on container2");
+            
+            // testing if indices are determined correctly from previous node in container
+            container2.appendChild(container1.childNodes[0]);
+            t.eq(map.getLayerIndex(container2.childNodes[2].layer), 0, "[c, b, a, d] d moved to the bottom");
+            
+            // testing if indices are determined correctly from next layer in container
+            container2.insertBefore(container1.childNodes[0], container2.childNodes[1]);
+            t.eq(map.getLayerIndex(container2.childNodes[0].layer), 3, "[b, a, d, c] c is now the 4th layer on the map");
+            
+            // testing if indices are determined correctly from container below
+            container1.appendChild(container2.childNodes[0]);
+            t.eq(map.getLayerIndex(container1.childNodes[0].layer), 3, "[b, a, d, c] c is still the 4th layer on the map");
+
+            for(var i=0; i<3; ++i) {
+                container1.appendChild(container2.childNodes[0]);
+            }
+            
+            // testing if indices are determined correctly from container above
+            container2.appendChild(container1.childNodes[0]);
+            t.eq(map.getLayerIndex(container2.childNodes[0].layer), 0, "[a,d,c,b] b moved to the bottom");
+            
+        }
+        
         </script>
     </head>
     <body>

Added: core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html	                        (rev 0)
+++ core/trunk/geoext/tests/lib/GeoExt/widgets/tree/LayerLoader.html	2009-07-26 21:32:34 UTC (rev 1288)
@@ -0,0 +1,76 @@
+<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 test_constructor(t) {
+            
+            t.plan(2);
+            
+            var loader = new GeoExt.tree.LayerLoader({
+                store: "foo",
+                filter: "bar"
+            });
+            
+            t.eq(loader.store, "foo", "store set");
+            t.eq(loader.filter, "bar", "filter set");
+        }
+        
+        function test_load(t) {
+            
+            t.plan(3);
+            
+            var args;
+            
+            var loader = new GeoExt.tree.LayerLoader({
+                store: new GeoExt.data.LayerStore(),
+                listeners: {
+                    "beforeload": function(loader, node) {
+                        return node.attributes.load;
+                    },
+                    "load": function(loader, node) {
+                        args = {
+                            loader: loader,
+                            node: node
+                        };
+                    }
+                }
+            });
+            
+            var node = new Ext.tree.AsyncTreeNode({
+                loader: loader,
+                load: false,
+                expanded: true
+            });
+            var tree = new Ext.tree.TreePanel({root: node});
+            tree.render("tree");
+            t.ok(!args, "loading aborted by beforeload event");
+            
+            tree.destroy();
+            node.destroy();
+            
+            node = new Ext.tree.AsyncTreeNode({
+                loader: loader,
+                load: true,
+                expanded: true
+            });
+            tree = new Ext.tree.TreePanel({root: node});
+            tree.render("tree");
+            t.ok(args.loader == loader, "loader passed correctly to 'load' handler");
+            t.ok(args.node == node, "node passed correctly to 'node' handler");
+            
+            tree.destroy();
+            node.destroy();
+            loader.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/LayerLoader.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-07-24 21:51:55 UTC (rev 1287)
+++ core/trunk/geoext/tests/list-tests.html	2009-07-26 21:32:34 UTC (rev 1288)
@@ -20,6 +20,7 @@
   <li>lib/GeoExt/widgets/form/FormPanel.html</li>
   <li>lib/GeoExt/widgets/tree/BaseLayerContainer.html</li>
   <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/LegendImage.html</li>
   <li>lib/GeoExt/widgets/LegendPanel.html</li>



More information about the Commits mailing list