[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