[Commits] r2596 - in sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder: examples lib/GeoExt.ux lib/GeoExt.ux/plugins lib/GeoExt.ux/widgets/tree

commits at geoext.org commits at geoext.org
Fri Feb 4 16:22:52 CET 2011


Author: adube
Date: 2011-02-04 16:22:52 +0100 (Fri, 04 Feb 2011)
New Revision: 2596

Added:
   sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/SingleFile.js
   sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/plugins/
   sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/plugins/LayerTreeBuilderNodeAgent.js
Modified:
   sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.html
   sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.js
   sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/widgets/tree/LayerTreeBuilder.js
Log:
LayerTreeBuilder - new events and plugin to manage async node visibility when layer visibility is changed, SingleFile added

Modified: sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.html
===================================================================
--- sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.html	2011-02-04 10:14:23 UTC (rev 2595)
+++ sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.html	2011-02-04 15:22:52 UTC (rev 2596)
@@ -17,7 +17,8 @@
         <script type="text/javascript" src="../../../../geoext/lib/GeoExt.js"></script>
 
         <link rel="stylesheet" type="text/css" href="../resources/css/LayerTreeBuilder.css" />
-        <script type="text/javascript" src="../lib/GeoExt.ux/widgets/tree/LayerTreeBuilder.js"></script>
+        <script type="text/javascript" src="../lib/GeoExt.ux/SingleFile.js"></script>
+
         <script type="text/javascript" src="../resources/lang/fr.js"></script>
         <script type="text/javascript" src="tree-builder.js"></script>
     </head>

Modified: sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.js
===================================================================
--- sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.js	2011-02-04 10:14:23 UTC (rev 2595)
+++ sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/examples/tree-builder.js	2011-02-04 15:22:52 UTC (rev 2596)
@@ -32,7 +32,7 @@
             singleTile: true,
             group: "GMap/Polygons",
             isBaseLayer: false,
-            visibility: true
+            visibility: false
         }
     ));
 
@@ -99,6 +99,7 @@
         styleMap: new OpenLayers.StyleMap(
             new OpenLayers.Style({}, {rules: rules})
         ),
+        visibility: false,
         group: "Vector"
     });
     vector.addFeatures(features);

Added: sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/SingleFile.js
===================================================================
--- sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/SingleFile.js	                        (rev 0)
+++ sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/SingleFile.js	2011-02-04 15:22:52 UTC (rev 2596)
@@ -0,0 +1,81 @@
+/**
+ * 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.
+ */
+
+/*
+ * The code in this file is based on code taken from OpenLayers.
+ *
+ * Copyright (c) 2006-2007 MetaCarta, Inc., published under the Clear BSD
+ * license.  See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license.
+ */
+ 
+(function() {
+
+    /**
+     * The relative path of this script.
+     */
+    var scriptName = "lib/GeoExt.ux/SingleFile.js";
+
+    /**
+     * Function returning the path of this script.
+     */
+    var getScriptLocation = function() {
+        var scriptLocation = "";
+        // If we load other scripts right before GeoExt using the same
+        // mechanism to add script resources dynamically (e.g. OpenLayers), 
+        // document.getElementsByTagName will not find the GeoExt script tag
+        // in FF2. Using document.documentElement.getElementsByTagName instead
+        // works around this issue.
+        var scripts = document.documentElement.getElementsByTagName('script');
+        for(var i=0, len=scripts.length; i<len; i++) {
+            var src = scripts[i].getAttribute('src');
+            if(src) {
+                var index = src.lastIndexOf(scriptName); 
+                // set path length for src up to a query string
+                var pathLength = src.lastIndexOf('?');
+                if(pathLength < 0) {
+                    pathLength = src.length;
+                }
+                // is it found, at the end of the URL?
+                if((index > -1) && (index + scriptName.length == pathLength)) {
+                    scriptLocation = src.slice(0, pathLength - scriptName.length);
+                    break;
+                }
+            }
+        }
+        return scriptLocation;
+    };
+
+    var jsfiles = new Array(
+        "plugins/LayerTreeBuilderNodeAgent.js",
+        "widgets/tree/LayerTreeBuilder.js"
+    );
+
+    var agent = navigator.userAgent;
+    var docWrite = (agent.match("MSIE") || agent.match("Safari"));
+    if(docWrite) {
+        var allScriptTags = new Array(jsfiles.length);
+    }
+    var host = getScriptLocation() + "lib/GeoExt.ux/";    
+    for (var i=0, len=jsfiles.length; i<len; i++) {
+        if (docWrite) {
+            allScriptTags[i] = "<script src='" + host + jsfiles[i] +
+                               "'></script>"; 
+        } else {
+            var s = document.createElement("script");
+            s.src = host + jsfiles[i];
+            var h = document.getElementsByTagName("head").length ? 
+                       document.getElementsByTagName("head")[0] : 
+                       document.body;
+            h.appendChild(s);
+        }
+    }
+    if (docWrite) {
+        document.write(allScriptTags.join(""));
+    }
+})();

Added: sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/plugins/LayerTreeBuilderNodeAgent.js
===================================================================
--- sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/plugins/LayerTreeBuilderNodeAgent.js	                        (rev 0)
+++ sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/plugins/LayerTreeBuilderNodeAgent.js	2011-02-04 15:22:52 UTC (rev 2596)
@@ -0,0 +1,63 @@
+Ext.namespace("GeoExt.ux.plugins");
+
+GeoExt.ux.plugins.LayerTreeBuilderNodeAgent = Ext.extend(Ext.util.Observable, {
+
+    /** private: property[tree]
+     *  :class:`GeoExt.ux.LayerTreeBuilder`
+     */
+    tree: null,
+
+    /** private: method[init]
+     *  :param tree: :class:`GeoExt.ux.LayerTreeBuilder`
+     */
+    init: function(tree, config) {
+        this.tree = tree;
+        this.tree.on('layermanaged', this.onLayerManaged, this);
+    },
+
+    /** private: method[onLayerManaged]
+     *  :param layer: :class:`OpenLayers.Layer`
+     *
+     *  Called when a "layermanaged" event is fired by the 
+     *  :class:`GeoExt.ux.LayerTreeBuilder` widget.  Registers a
+     *  "visibilitychanged" callback on the layer to manage the node visibility.
+     */
+    onLayerManaged: function(layer) {
+        layer.events.on({"visibilitychanged": function(event) {
+            var layer = event.object;
+            if (layer.visibility) {
+                if (layer.layerContainer) {
+                    layer.layerContainer.ensureVisible();
+                    layer.layerContainer.expand();
+                } else if (layer.options && layer.options.group) {
+                    var groups = layer.options.group.split('/');
+                    this.expandTreeNodesFromGroup(
+                        groups, tree.getRootNode(), layer);
+                }
+            }
+        }, scope: this});
+    },
+
+    /** private: method[expandTreeNodesFromGroup]
+     *  :param groups:     ``Array`` of node names following the depth of the
+     *                               nodes
+     *  :param parentNode: :class:`Ext.tree.TreeNode`
+     *  :param layer:      :class:`OpenLayers.Layer`
+     *
+     *  Called when a "layermanaged" event is fired by the 
+     *  :class:`GeoExt.ux.LayerTreeBuilder` widget.  Registers a
+     *  "visibilitychanged" callback on the layer to manage the node visibility.
+     */
+    expandTreeNodesFromGroup: function(groups, parentNode, layer) {
+        var group = groups.shift();
+        var childNode = parentNode.findChild("text", group);
+        if (childNode) {
+            childNode.expand();
+            if (groups.length > 0) {
+                this.expandTreeNodesFromGroup(groups, childNode, layer);
+            } else {
+                layer.layerContainer = childNode;
+            }
+        }
+    }
+});

Modified: sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/widgets/tree/LayerTreeBuilder.js
===================================================================
--- sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/widgets/tree/LayerTreeBuilder.js	2011-02-04 10:14:23 UTC (rev 2595)
+++ sandbox/mapgears/geoext.ux/ux/LayerTreeBuilder/lib/GeoExt.ux/widgets/tree/LayerTreeBuilder.js	2011-02-04 15:22:52 UTC (rev 2596)
@@ -2,6 +2,13 @@
 
 GeoExt.ux.tree.LayerTreeBuilder = Ext.extend(Ext.tree.TreePanel, {
 
+    /** private: property[CUSTOM_EVENTS]
+     *  ``Array(String)`` Array of custom events used by this widget
+     */
+    CUSTOM_EVENTS: [
+        "layermanaged"
+    ],
+
     /* begin i18n */
     /** api: config[title] ``String`` i18n */
     title: "Layers",
@@ -53,7 +60,7 @@
      */
     layerStore: null,
 
-    plugins: [{ptype: "gx_treenodecomponent"}],
+    plugins: null,
 
     loader: {
         applyLoader: false,
@@ -69,6 +76,13 @@
     },
 
     initComponent: function(){
+        this.addEvents(this.CUSTOM_EVENTS);
+
+        this.plugins = [
+            {ptype: "gx_treenodecomponent"},
+            new GeoExt.ux.plugins.LayerTreeBuilderNodeAgent()
+        ];
+
         GeoExt.ux.tree.LayerTreeBuilder.superclass.initComponent.call(this);
         if(!this.layerStore) {
             this.layerStore = GeoExt.MapPanel.guess().layers;
@@ -131,6 +145,8 @@
                     group, this.getRootNode(), groupString, record
                 );
             }
+
+            this.fireEvent('layermanaged', layer);
         }, this);
     },
 
@@ -411,21 +427,6 @@
 
     onLayerContainerNodeAdded: function(tree, parentNode, childNode) {
         this.validateLayerContainerStatus(parentNode);
-
-        // make sure all LayerNode objects added to a LayerContainer listen to
-        // the layer "visibilitychanged" event.  If visibility is changed by
-        // something else than the tree, ensure that the node and all its
-        // parents are visibles.
-        var onLayerNodeAdded = function(tree, parentNode, childNode) {
-            childNode.layer &&
-            childNode.layer.events.on({"visibilitychanged": function() {
-                if(!this._visibilityChanging) {
-                    this.layer.getVisibility() && this.ensureVisible();
-                }
-            }, scope: childNode});
-        };
-        this.on("insert", onLayerNodeAdded, this);
-        this.on("append", onLayerNodeAdded, this);
     },
 
     validateLayerContainerStatus: function(node) {



More information about the Commits mailing list