[mapguide-commits] r4369 - sandbox/adsk/2.1/Web/src/viewerfiles

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu Dec 3 17:32:06 EST 2009


Author: brucedechant
Date: 2009-12-03 17:32:06 -0500 (Thu, 03 Dec 2009)
New Revision: 4369

Modified:
   sandbox/adsk/2.1/Web/src/viewerfiles/legend.js
   sandbox/adsk/2.1/Web/src/viewerfiles/legendui.templ
Log:
Fix for trac ticket 1023 - Low performance while generating legend
http://trac.osgeo.org/mapguide/ticket/1023

Notes:
- Change to dynamically generate the legend images as needed instead of requesting them all at once


Modified: sandbox/adsk/2.1/Web/src/viewerfiles/legend.js
===================================================================
--- sandbox/adsk/2.1/Web/src/viewerfiles/legend.js	2009-12-03 22:28:19 UTC (rev 4368)
+++ sandbox/adsk/2.1/Web/src/viewerfiles/legend.js	2009-12-03 22:32:06 UTC (rev 4369)
@@ -41,6 +41,7 @@
     this.lyrtype = 0;
     this.curScale = -1;
     this.isDisplayed = false;
+    this.iconWasRequested = false;
 }
 
 function ScaleRangeItem(min, max, parent)
@@ -52,6 +53,7 @@
     this.parent = parent;
     this.showlongtheme = false;
     this.children = new Array();
+    this.iconWasRequested = false;
 }
 
 function StyleItem(legend, filter, geomtype, catindex)

Modified: sandbox/adsk/2.1/Web/src/viewerfiles/legendui.templ
===================================================================
--- sandbox/adsk/2.1/Web/src/viewerfiles/legendui.templ	2009-12-03 22:28:19 UTC (rev 4368)
+++ sandbox/adsk/2.1/Web/src/viewerfiles/legendui.templ	2009-12-03 22:32:06 UTC (rev 4369)
@@ -227,33 +227,39 @@
     var layerIconImg = "";
     if(hasThemes)
     {
-        for(var j=0; j < styles.length; j++)
-        {
-            var node = styles[j];
-            var iconId = GetIconId(layer) + '_Scl_' + layer.curScale + '_Th_' + j;
-            var iconImg = RequestThemeStyleIconImg(layer, scale, node.catindex, node.geomtype, iconId);
+       if(layer.expanded && !sc.iconWasRequested)
+       {
+            for(var j=0; j < styles.length; j++)
+            {
+                var node = styles[j];
+                var iconId = GetIconId(layer) + '_Scl_' + layer.curScale + '_Th_' + j;
+                var iconImg = RequestThemeStyleIconImg(layer, scale, node.catindex, node.geomtype, iconId);
 
-            code += '<table border=0 cellspacing="0" cellpadding="0"><tr height=17>';
-            //icon
-            code += '<td width=23 id="' + iconId + '">' + iconImg + '</td>';
-            //legend text
-            code += '<td>' + node.legend + '</td>';
-            code += '</tr></table>';
-
-            if(!sc.showlongtheme && styles.length > 10)
-            {
-                if(j == styles.length - 1)
-                    break;
                 code += '<table border=0 cellspacing="0" cellpadding="0"><tr height=17>';
-                code += '<td width=23><img width=16 height=16 src="../stdicons/transparentpixel.gif"></td>';
-                code += '<td>...</td>';
+                //icon
+                code += '<td width=23 id="' + iconId + '">' + iconImg + '</td>';
+                //legend text
+                code += '<td>' + node.legend + '</td>';
                 code += '</tr></table>';
-                j = styles.length - 2;
+
+                if(!sc.showlongtheme && styles.length > 10)
+                {
+                    if(j == styles.length - 1)
+                        break;
+                    code += '<table border=0 cellspacing="0" cellpadding="0"><tr height=17>';
+                    code += '<td width=23><img width=16 height=16 src="../stdicons/transparentpixel.gif"></td>';
+                    code += '<td>...</td>';
+                    code += '</tr></table>';
+                    j = styles.length - 2;
+                }
             }
+            if(styles.length <= 10)
+                sc.showlongtheme = true;
+            layerChildren.innerHTML = code;
+
+            sc.iconWasRequested = true;
         }
-        if(styles.length <= 10)
-            sc.showlongtheme = true;
-        layerChildren.innerHTML = code;
+      
         layerIconImg = iconThemeLayer;
     }
     else
@@ -325,6 +331,7 @@
         Expand(node);
 }
 
+// Expanding a node, the legend for the sub-items of this node will be generated dynamically
 function Expand(node)
 {
     var elt = document.getElementById('ChildrenOf_' + node.objectId);
@@ -332,6 +339,10 @@
     {
         node.expanded = true;
         elt.style.display = "block";
+        RefreshNodesState(node.children);
+        iconsToLoad.reverse();
+        LoadNextIcon();
+        
         if(node.type == 0 || HasLayerThemes(node))
             ShowExpandedState(node);
     }
@@ -688,10 +699,18 @@
     return layer.children[layer.curScale].children.length > 1;
 }
 
-// set the active scale ranges in layers, according to current scale, and set the display state for layers and groups
-// update the layer styles if necessary
+// set the display state for themes, layers and groups and update the layer styles if necessary
 function UpdateScaleRanges(nodes)
 {
+    RefreshNodesState(nodes);
+}
+
+// there are three possible reasons to refresh the nodes' state:
+// the first one is updating scale ranges to refresh the legend images
+// the second one is expanding a group to build the legend images of layers in that group.
+// the third one is expanding a layer node to build the legend images of themes in that layer.
+function RefreshNodesState(nodes)
+{
     for(var i=0; i < nodes.length; i++)
     {
         var node = nodes[i];
@@ -700,7 +719,7 @@
             var count = node.children != null? node.children.length: 0;
             node.hasVisibleLayers = false;
             if(count > 0) {
-                UpdateScaleRanges(node.children);
+                RefreshNodesState(node.children);
                 for(var j=0; j < node.children.length; j++)
                 {
                     child = node.children[j];
@@ -737,13 +756,69 @@
                     break;
                 }
             }
-            if(node.displayInLegend && rangeIndex != node.curScale && node.curScale != -1)
-                SetLayerStyles(node);
+
+            if(node.displayInLegend && node.curScale != -1)
+            {
+                // scale changed
+                if(rangeIndex != node.curScale)
+                {
+                    // the layer's theme will be changed on demand
+                    node.children[node.curScale].iconWasRequested = false;
+                    
+                    // the layer's legend image will be changed immediately 
+                    if(!HasCollapsedParent(node))
+                    {
+                        SetLayerStyles(node);
+                        node.iconWasRequested = true;
+                    }
+                    // the layer's legend image will be changed on demand
+                    else
+                    {
+                        
+                        node.iconWasRequested = false;
+                    }
+                }
+                // parent group expanded
+                else if(!node.iconWasRequested  && !HasCollapsedParent(node))
+                {
+                    SetLayerStyles(node);
+                    node.iconWasRequested = true;
+                }
+            }
+
             node.isDisplayed = node.displayInLegend && node.curScale != -1;
         }
+        else if(node.type == 2)
+        {
+            // parent layer expanded
+            if(node.parent.children[node.parent.curScale]=== node && !node.iconWasRequested)
+            {
+                SetLayerStyles(node.parent);
+            }
+        }
     }
 }
 
+// To check if any parent node of current node is collapsed.
+function HasCollapsedParent(node)
+{
+    if(node.parent != null)
+    {
+        if(node.parent.expanded == true)
+        {
+            return HasCollapsedParent(node.parent)
+        }
+        else
+        {
+            return true;
+        }
+    }
+    else
+    {
+        return false;
+    }
+}
+
 function FindNode(nodes, objectId)
 {
     for(var i=0; i < nodes.length; i++)



More information about the mapguide-commits mailing list