[mapguide-commits] r7966 - in trunk/Tools/Maestro: Maestro.Editors/MapDefinition Maestro.MapViewer

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Tue Dec 24 02:16:14 PST 2013


Author: jng
Date: 2013-12-24 02:16:13 -0800 (Tue, 24 Dec 2013)
New Revision: 7966

Modified:
   trunk/Tools/Maestro/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs
   trunk/Tools/Maestro/Maestro.MapViewer/LegendPresenter.cs
Log:
This submission includes the following changes:
 - #2388: Port over legend fixes from mg-desktop
 - #2385: Fix add group button never being enabled for a Map Definition that has all layers and no groups

Modified: trunk/Tools/Maestro/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs	2013-12-24 04:09:52 UTC (rev 7965)
+++ trunk/Tools/Maestro/Maestro.Editors/MapDefinition/MapLayersSectionCtrl.cs	2013-12-24 10:16:13 UTC (rev 7966)
@@ -487,7 +487,7 @@
 
         private void OnDynamicLayerItemSelected(LayerItem layer)
         {
-            btnAddGroup.Enabled = false;
+            btnAddGroup.Enabled = true;             //This has to be true otherwise it never gets enabled again if the map has no existing groups
             btnGRPAddLayer.Enabled = false;
             btnGRPRemoveLayer.Enabled = true;
             btnMoveLayerOrGroupUp.Enabled = true;   //TODO: Disable if layer is top of its group

Modified: trunk/Tools/Maestro/Maestro.MapViewer/LegendPresenter.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.MapViewer/LegendPresenter.cs	2013-12-24 04:09:52 UTC (rev 7965)
+++ trunk/Tools/Maestro/Maestro.MapViewer/LegendPresenter.cs	2013-12-24 10:16:13 UTC (rev 7966)
@@ -80,7 +80,7 @@
                     RuntimeMapGroup group = null;
                     if (!string.IsNullOrEmpty(layer.Group))
                         group = _map.Groups[layer.Group];
-                    _layers[layer.ObjectId] = new LayerNodeMetadata(layer, layer.Selectable, (group != null && group.Type == RuntimeMapGroup.kBaseMap));
+                    _layers[layer.ObjectId] = new LayerNodeMetadata(layer, layer.Selectable);
                 }
             }
         }
@@ -113,6 +113,12 @@
             return true;
         }
 
+        class RuleData
+        {
+            public int GeomType;
+            public XmlNodeList RuleNodes;
+        }
+
         private TreeNode CreateLayerNode(RuntimeMapLayer layer)
         {
             var node = new TreeNode();
@@ -138,13 +144,13 @@
                     RuntimeMapGroup group = null;
                     if (!string.IsNullOrEmpty(layer.Group))
                         group = _map.Groups[layer.Group];
-                    layerMeta = new LayerNodeMetadata(layer, bInitiallySelectable, (group != null && group.Type == RuntimeMapGroup.kBaseMap));
+                    layerMeta = new LayerNodeMetadata(layer, bInitiallySelectable);
                     _layers[layer.ObjectId] = layerMeta;
                 }
                 node.Tag = layerMeta;
                 node.ToolTipText = string.Format(Properties.Resources.DrawingLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID);
             }
-            else
+            else //Vector or Grid layer
             {
                 var ldfId = layer.LayerDefinitionID;
                 if (_layers.ContainsKey(layer.ObjectId))
@@ -156,7 +162,7 @@
                     RuntimeMapGroup group = null;
                     if (!string.IsNullOrEmpty(layer.Group))
                         group = _map.Groups[layer.Group];
-                    layerMeta = new LayerNodeMetadata(layer, layer.Selectable, (group != null && group.Type == RuntimeMapGroup.kBaseMap));
+                    layerMeta = new LayerNodeMetadata(layer, layer.Selectable);
                     _layers[layer.ObjectId] = layerMeta;
                 }
                 if (string.IsNullOrEmpty(layerMeta.LayerDefinitionContent))
@@ -164,9 +170,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");
                 if (scaleRanges.Count == 0)
                 {
@@ -176,16 +186,17 @@
                         scaleRanges = doc.GetElementsByTagName("DrawingLayerDefinition");
                         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" };
                 String[] ruleNames = new String[] { "PointRule", "LineRule", "AreaRule", "CompositeRule" };
 
                 node.ToolTipText = string.Format(Properties.Resources.DefaultLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID, layer.QualifiedClassName);
+                //Do this if not cached already from a previous run
                 if (!layerMeta.HasTheme() || !layerMeta.HasDefaultIcons())
                 {
                     for (int sc = 0; sc < scaleRanges.Count; sc++)
@@ -201,79 +212,220 @@
                         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)
                         {
+                            foreach (XmlNode n in styleNodes)
+                            {
+                                // 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
+
+                                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)
+                                {
+                                    // 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
+
+                                    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(Properties.Resources.ThemedLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID, layer.QualifiedClassName, 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, theRule.GeomType, (catIndex + r), theRule.RuleNodes, r);
+                                    }
+                                }
+                                //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 = geomType
+                                GeometryType = theRule.GeomType
                             };
 
                             if (layerMeta.CategoryExists(themeCat))
                                 continue;
 
-                            int catIndex = 0;
-                            XmlNodeList typeStyle = scaleRange.GetElementsByTagName(typeStyles[geomType]);
-                            for (int st = 0; st < typeStyle.Count; st++)
+                            if (LayerNodeMetadata.ScaleIsApplicable(_map.ViewScale, themeCat))
                             {
-                                // We will check if this typestyle is going to be shown in the legend
-                                XmlNodeList showInLegend = ((XmlElement)typeStyle[st]).GetElementsByTagName("ShowInLegend");
-                                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)
+                                if (!layerMeta.HasDefaultIconsAt(_map.ViewScale))
                                 {
-                                    layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_theme);
-                                    node.ToolTipText = string.Format(Properties.Resources.ThemedLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID, layer.QualifiedClassName, rules.Count);
-
-                                    if (_legend.ThemeCompressionLimit > 0 && rules.Count > _legend.ThemeCompressionLimit)
+                                    try
                                     {
-                                        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);
+                                        var img = _map.GetLegendImage(layer.LayerDefinitionID,
+                                                                                _map.ViewScale,
+                                                                                16,
+                                                                                16,
+                                                                                "PNG",
+                                                                                (theRule.GeomType + 1),
+                                                                                -1);
+                                        legendCallCount++;
+                                        layerMeta.SetDefaultIcon(themeCat, img);
+                                        node.ToolTipText = string.Format(Properties.Resources.DefaultLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID, layer.QualifiedClassName);
                                     }
-                                    else
+                                    catch
                                     {
-                                        for (int r = 0; r < rules.Count; r++)
-                                        {
-                                            AddThemeRuleNode(layerMeta, themeCat, node, geomType, catIndex++, rules, r);
-                                        }
+                                        //layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_broken);
                                     }
                                 }
-                                else
-                                {
-                                    if (LayerNodeMetadata.ScaleIsApplicable(_map.ViewScale, themeCat))
-                                    {
-                                        if (!layerMeta.HasDefaultIconsAt(_map.ViewScale))
-                                        {
-                                            try
-                                            {
-                                                var img = _map.GetLegendImage(layer.LayerDefinitionID,
-                                                                                        _map.ViewScale,
-                                                                                        16,
-                                                                                        16,
-                                                                                        "PNG",
-                                                                                        -1,
-                                                                                        -1);
-                                                legendCallCount++;
-                                                layerMeta.SetDefaultIcon(themeCat, img);
-                                                node.ToolTipText = string.Format(Properties.Resources.DefaultLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID, layer.QualifiedClassName);
-                                            }
-                                            catch
-                                            {
-                                                //layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_broken);
-                                            }
-                                        }
-                                    }
-                                }
                             }
                         }
+
+                        //for (int geomType = 0; geomType < typeStyles.Length; geomType++)
+                        //{
+                        //    ThemeCategory themeCat = new ThemeCategory()
+                        //    {
+                        //        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");
+                        //        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)
+                        //        {
+                        //            layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_theme);
+                        //            node.ToolTipText = string.Format(Properties.Resources.ThemedLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID, layer.QualifiedClassName, rules.Count);
+
+                        //            if (_legend.ThemeCompressionLimit > 0 && rules.Count > _legend.ThemeCompressionLimit)
+                        //            {
+                        //                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);
+                        //            }
+                        //            else
+                        //            {
+                        //                for (int r = 0; r < rules.Count; r++)
+                        //                {
+                        //                    AddThemeRuleNode(layerMeta, themeCat, node, geomType, catIndex++, rules, r);
+                        //                }
+                        //            }
+                        //        }
+                        //        else
+                        //        {
+                        //            if (LayerNodeMetadata.ScaleIsApplicable(_map.ViewScale, themeCat))
+                        //            {
+                        //                if (!layerMeta.HasDefaultIconsAt(_map.ViewScale))
+                        //                {
+                        //                    try
+                        //                    {
+                        //                        var img = _map.GetLegendImage(layer.LayerDefinitionID,
+                        //                                                                _map.ViewScale,
+                        //                                                                16,
+                        //                                                                16,
+                        //                                                                "PNG",
+                        //                                                                -1,
+                        //                                                                -1);
+                        //                        legendCallCount++;
+                        //                        layerMeta.SetDefaultIcon(themeCat, img);
+                        //                        node.ToolTipText = string.Format(Properties.Resources.DefaultLayerTooltip, Environment.NewLine, layer.Name, layer.FeatureSourceID, layer.QualifiedClassName);
+                        //                    }
+                        //                    catch
+                        //                    {
+                        //                        //layerMeta.SetDefaultIcon(themeCat, Properties.Resources.lc_broken);
+                        //                    }
+                        //                }
+                        //            }
+                        //        }
+                        //    }
+                        //}
                     }
                 }
                 else //Already cached
@@ -286,9 +438,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");
             XmlNodeList filter = rule.GetElementsByTagName("Filter");
 
@@ -486,7 +638,7 @@
                             RuntimeMapGroup group = null;
                             if (!string.IsNullOrEmpty(lyr.Group))
                                 group = _map.Groups[lyr.Group];
-                            meta = new LayerNodeMetadata(lyr, lyr.Selectable, (group != null && group.Type == RuntimeMapGroup.kBaseMap));
+                            meta = new LayerNodeMetadata(lyr, lyr.Selectable);
                             _layers[objId] = meta;
                             added++;
                         }
@@ -1015,11 +1167,11 @@
             /// </summary>
             /// <param name="layer"></param>
             public LayerNodeMetadata(RuntimeMapLayer layer)
-                : this(layer, layer.Selectable, layer.Type == RuntimeMapLayer.kBaseMap)
+                : this(layer, layer.Selectable)
             {
             }
 
-            internal LayerNodeMetadata(RuntimeMapLayer layer, bool bInitiallySelectable, bool bTiled)
+            internal LayerNodeMetadata(RuntimeMapLayer layer, bool bInitiallySelectable)
             {
                 base.IsGroup = false;
                 this.Layer = layer;
@@ -1027,7 +1179,7 @@
                 this.DrawSelectabilityIcon = (layer != null && bInitiallySelectable);
                 this.WasInitiallySelectable = bInitiallySelectable;
                 this.LayerDefinitionContent = null;
-                this.Checkable = !bTiled;
+                this.Checkable = (layer.Type != RuntimeMapLayer.kBaseMap);
                 _themeNodes = new Dictionary<ThemeCategory, List<LayerThemeNodeMetadata>>();
                 _defaultIcons = new Dictionary<ThemeCategory, Image>();
             }



More information about the mapguide-commits mailing list