[mapguide-commits] r7943 - trunk/MgDev/Desktop/MapViewer

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Sun Dec 1 08:53:51 PST 2013


Author: jng
Date: 2013-12-01 08:53:51 -0800 (Sun, 01 Dec 2013)
New Revision: 7943

Modified:
   trunk/MgDev/Desktop/MapViewer/MgLegend.cs
   trunk/MgDev/Desktop/MapViewer/MgLegendControlPresenter.cs
Log:
mg-desktop viewer legend fixes:
 - Fix ThemeCompressionLimit property not taking in given value
 - Fix incorrect display of layers with multiple styles and/or composite styles

Modified: trunk/MgDev/Desktop/MapViewer/MgLegend.cs
===================================================================
--- trunk/MgDev/Desktop/MapViewer/MgLegend.cs	2013-11-29 15:20:24 UTC (rev 7942)
+++ trunk/MgDev/Desktop/MapViewer/MgLegend.cs	2013-12-01 16:53:51 UTC (rev 7943)
@@ -344,7 +344,7 @@
             get { return _themeCompressionLimit; }
             set 
             {
-                if (value != _themeCompressionLimit)
+                if (value == _themeCompressionLimit)
                     return;
 
                 _themeCompressionLimit = value;

Modified: trunk/MgDev/Desktop/MapViewer/MgLegendControlPresenter.cs
===================================================================
--- trunk/MgDev/Desktop/MapViewer/MgLegendControlPresenter.cs	2013-11-29 15:20:24 UTC (rev 7942)
+++ trunk/MgDev/Desktop/MapViewer/MgLegendControlPresenter.cs	2013-12-01 16:53:51 UTC (rev 7943)
@@ -85,6 +85,12 @@
             return true;
         }
 
+        class RuleData
+        {
+            public int GeomType;
+            public XmlNodeList RuleNodes;
+        }
+
         private TreeNode CreateLayerNode(MgLayerBase layer)
         {
             var node = new TreeNode();
@@ -113,7 +119,7 @@
                 node.Tag = layerMeta;
                 node.ToolTipText = string.Format(Strings.DrawingLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceId);
             }
-            else
+            else //Vector or Grid layer
             {
                 var ldfId = layer.LayerDefinition;
                 if (_layers.ContainsKey(layer.GetObjectId()))
@@ -130,9 +136,13 @@
 
                 node.Tag = layerMeta;
 
+                const int LAYER_VECTOR = 0;
+                const int LAYER_RASTER = 1;
+                const int LAYER_DWF = 2;
+
                 XmlDocument doc = new XmlDocument();
                 doc.LoadXml(layerMeta.LayerDefinitionContent);
-                int type = 0;
+                int type = LAYER_VECTOR;
                 XmlNodeList scaleRanges = doc.GetElementsByTagName("VectorScaleRange"); //NOXLATE
                 if (scaleRanges.Count == 0)
                 {
@@ -142,16 +152,17 @@
                         scaleRanges = doc.GetElementsByTagName("DrawingLayerDefinition"); //NOXLATE
                         if (scaleRanges.Count == 0)
                             return null;
-                        type = 2;
+                        type = LAYER_DWF;
                     }
                     else
-                        type = 1;
+                        type = LAYER_RASTER;
                 }
 
                 String[] typeStyles = new String[] { "PointTypeStyle", "LineTypeStyle", "AreaTypeStyle", "CompositeTypeStyle" }; //NOXLATE
                 String[] ruleNames = new String[] { "PointRule", "LineRule", "AreaRule", "CompositeRule" }; //NOXLATE
 
                 node.ToolTipText = string.Format(Strings.DefaultLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceId, layer.FeatureClassName);
+                //Do this if not cached already from a previous run
                 if (!layerMeta.HasTheme() || !layerMeta.HasDefaultIcons())
                 {
                     for (int sc = 0; sc < scaleRanges.Count; sc++)
@@ -167,95 +178,165 @@
                         if (maxElt.Count > 0)
                             maxScale = maxElt[0].ChildNodes[0].Value;
 
-                        if (type != 0)
+                        if (type != LAYER_VECTOR)
                             break;
 
-                        for (int geomType = 0; geomType < typeStyles.Length; geomType++)
+                        bool bComposite = false;
+
+                        //Check TS count. Give precedence to composite type styles
+                        List<XmlNode> typeStyleCol = new List<XmlNode>();
+                        XmlNodeList styleNodes = scaleRange.GetElementsByTagName(typeStyles[3]);
+                        List<RuleData> rules = new List<RuleData>();
+                        if (styleNodes.Count > 0)
                         {
-                            ThemeCategory themeCat = new ThemeCategory()
+                            foreach (XmlNode n in styleNodes)
                             {
-                                MinScale = minScale,
-                                MaxScale = maxScale,
-                                GeometryType = geomType
-                            };
-
-                            if (layerMeta.CategoryExists(themeCat))
-                                continue;
-
-                            int catIndex = 0;
-                            XmlNodeList typeStyle = scaleRange.GetElementsByTagName(typeStyles[geomType]);
-                            for (int st = 0; st < typeStyle.Count; st++)
-                            {
                                 // We will check if this typestyle is going to be shown in the legend
-                                XmlNodeList showInLegend = ((XmlElement)typeStyle[st]).GetElementsByTagName("ShowInLegend"); //NOXLATE
+                                XmlNodeList showInLegend = ((XmlElement)n).GetElementsByTagName("ShowInLegend"); //NOXLATE
                                 if (showInLegend.Count > 0)
                                     if (!bool.Parse(showInLegend[0].ChildNodes[0].Value))
                                         continue;   // This typestyle does not need to be shown in the legend
 
-                                XmlNodeList rules = ((XmlElement)typeStyle[st]).GetElementsByTagName(ruleNames[geomType]);
-                                if (rules.Count > 1)
+                                typeStyleCol.Add(n);
+
+                                var ruleData = new RuleData();
+                                ruleData.GeomType = 3;
+                                ruleData.RuleNodes = ((XmlElement)n).GetElementsByTagName(ruleNames[3]);
+                                if (ruleData.RuleNodes.Count > 0)
+                                    rules.Add(ruleData);
+                            }
+
+                            bComposite = true;
+                        }
+                        else
+                        {
+                            for (int t = 0; t < 3; t++)
+                            {
+                                styleNodes = scaleRange.GetElementsByTagName(typeStyles[t]);
+                                foreach (XmlNode n in styleNodes)
                                 {
-                                    layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_theme);
-                                    node.ToolTipText = string.Format(Strings.ThemedLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceId, layer.FeatureClassName, rules.Count);
+                                    // We will check if this typestyle is going to be shown in the legend
+                                    XmlNodeList showInLegend = ((XmlElement)n).GetElementsByTagName("ShowInLegend"); //NOXLATE
+                                    if (showInLegend.Count > 0)
+                                        if (!bool.Parse(showInLegend[0].ChildNodes[0].Value))
+                                            continue;   // This typestyle does not need to be shown in the legend
 
-                                    if (_legend.ThemeCompressionLimit > 0 && rules.Count > _legend.ThemeCompressionLimit)
+                                    typeStyleCol.Add(n);
+
+                                    var ruleData = new RuleData();
+                                    ruleData.GeomType = t;
+                                    ruleData.RuleNodes = ((XmlElement)n).GetElementsByTagName(ruleNames[t]);
+                                    if (ruleData.RuleNodes.Count > 0)
+                                        rules.Add(ruleData);
+                                }
+                            }
+                        }
+
+                        //No type styles. Skip
+                        if (typeStyleCol.Count == 0)
+                            continue;
+
+                        //Determine if this is themed or not
+                        int nTotalRules = 0;
+                        foreach(RuleData r in rules)
+                        {
+                            nTotalRules += r.RuleNodes.Count;
+                        }
+                        bool bThemed = nTotalRules > 1;
+                        if (bThemed)
+                        {
+                            int catIndex = 0;
+                            for (int i = 0; i < rules.Count; i++)
+                            {
+                                RuleData theRule = rules[i];
+                                ThemeCategory themeCat = new ThemeCategory()
+                                {
+                                    MinScale = minScale,
+                                    MaxScale = maxScale,
+                                    GeometryType = theRule.GeomType
+                                };
+
+                                //Non-composite styles must be processed once
+                                if (layerMeta.CategoryExists(themeCat) && theRule.GeomType != 3)
+                                    continue;
+
+                                layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_theme);
+                                node.ToolTipText = string.Format(Strings.ThemedLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceId, layer.FeatureClassName, nTotalRules);
+
+                                if (_legend.ThemeCompressionLimit > 0 && theRule.RuleNodes.Count > _legend.ThemeCompressionLimit)
+                                {
+                                    AddThemeRuleNode(layerMeta, themeCat, node, theRule.GeomType, catIndex, theRule.RuleNodes, 0);
+                                    node.Nodes.Add(CreateCompressedThemeNode(layerMeta, themeCat, theRule.RuleNodes.Count - 2));
+                                    AddThemeRuleNode(layerMeta, themeCat, node, theRule.GeomType, (catIndex + (theRule.RuleNodes.Count - 1)), theRule.RuleNodes, theRule.RuleNodes.Count - 1);
+                                }
+                                else
+                                {
+                                    for (int r = 0; r < theRule.RuleNodes.Count; r++)
                                     {
-                                        AddThemeRuleNode(layerMeta, themeCat, node, geomType, 0, rules, 0);
-                                        node.Nodes.Add(CreateCompressedThemeNode(layerMeta, themeCat, rules.Count - 2));
-                                        AddThemeRuleNode(layerMeta, themeCat, node, geomType, rules.Count - 1, rules, rules.Count - 1);
+                                        AddThemeRuleNode(layerMeta, themeCat, node, theRule.GeomType, (catIndex + r), theRule.RuleNodes, r);
                                     }
-                                    else
-                                    {
-                                        for (int r = 0; r < rules.Count; r++)
-                                        {
-                                            AddThemeRuleNode(layerMeta, themeCat, node, geomType, catIndex++, rules, r);
-                                        }
-                                    }
                                 }
-                                else
+                                //Only bump catIndex if composite, as category indexes for composite styles are handled differently
+                                if (bComposite)
+                                    catIndex += theRule.RuleNodes.Count;
+                            }
+                        }
+                        else
+                        {
+                            Trace.Assert(rules.Count == 1);
+                            Trace.Assert(rules[0].RuleNodes.Count == 1);
+                            RuleData theRule = rules[0];
+
+                            ThemeCategory themeCat = new ThemeCategory()
+                            {
+                                MinScale = minScale,
+                                MaxScale = maxScale,
+                                GeometryType = theRule.GeomType
+                            };
+
+                            if (layerMeta.CategoryExists(themeCat))
+                                continue;
+
+                            if (LayerNodeMetadata.ScaleIsApplicable(_map.ViewScale, themeCat))
+                            {
+                                if (!layerMeta.HasDefaultIconsAt(_map.ViewScale))
                                 {
-                                    if (LayerNodeMetadata.ScaleIsApplicable(_map.ViewScale, themeCat))
+                                    try
                                     {
-                                        if (!layerMeta.HasDefaultIconsAt(_map.ViewScale))
+                                        MgByteReader layerIcon = _provider.GenerateLegendImage(layer.LayerDefinition,
+                                                                                               _map.ViewScale,
+                                                                                               16,
+                                                                                               16,
+                                                                                               "PNG", //NOXLATE
+                                                                                               (theRule.GeomType+1),
+                                                                                               -1);
+                                        legendCallCount++;
+                                        if (layerIcon != null)
                                         {
                                             try
                                             {
-                                                MgByteReader layerIcon = _provider.GenerateLegendImage(layer.LayerDefinition,
-                                                                                                           _map.ViewScale,
-                                                                                                           16,
-                                                                                                           16,
-                                                                                                           "PNG", //NOXLATE
-                                                                                                           -1,
-                                                                                                           -1);
-                                                legendCallCount++;
-                                                if (layerIcon != null)
+                                                byte[] b = new byte[layerIcon.GetLength()];
+                                                layerIcon.Read(b, b.Length);
+                                                using (var ms = new MemoryStream(b))
                                                 {
-                                                    try
-                                                    {
-                                                        byte[] b = new byte[layerIcon.GetLength()];
-                                                        layerIcon.Read(b, b.Length);
-                                                        using (var ms = new MemoryStream(b))
-                                                        {
-                                                            layerMeta.SetDefaultIcon(themeCat, Image.FromStream(ms));
-                                                            node.ToolTipText = string.Format(Strings.DefaultLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceId, layer.FeatureClassName);
-                                                        }
-                                                    }
-                                                    finally
-                                                    {
-                                                        layerIcon.Dispose();
-                                                    }
+                                                    layerMeta.SetDefaultIcon(themeCat, Image.FromStream(ms));
+                                                    node.ToolTipText = string.Format(Strings.DefaultLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceId, layer.FeatureClassName);
                                                 }
-                                                else
-                                                {
-                                                    layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_broken);
-                                                }
                                             }
-                                            catch
+                                            finally
                                             {
-                                                layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_broken);
+                                                layerIcon.Dispose();
                                             }
                                         }
+                                        else
+                                        {
+                                            layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_broken);
+                                        }
                                     }
+                                    catch
+                                    {
+                                        layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_broken);
+                                    }
                                 }
                             }
                         }
@@ -271,9 +352,9 @@
             return node;
         }
 
-        private void AddThemeRuleNode(LayerNodeMetadata layerMeta, ThemeCategory themeCat, TreeNode node, int geomType, int catIndex, XmlNodeList rules, int r)
+        private void AddThemeRuleNode(LayerNodeMetadata layerMeta, ThemeCategory themeCat, TreeNode node, int geomType, int catIndex, XmlNodeList rules, int ruleOffset)
         {
-            XmlElement rule = (XmlElement)rules[r];
+            XmlElement rule = (XmlElement)rules[ruleOffset];
             XmlNodeList label = rule.GetElementsByTagName("LegendLabel"); //NOXLATE
             XmlNodeList filter = rule.GetElementsByTagName("Filter"); //NOXLATE
 



More information about the mapguide-commits mailing list