using System;
using System.Collections.Generic;
using System.Linq;
using SharpMap.Api.Layers;
using SharpMap.Layers;
namespace DeltaShell.Plugins.SharpMapGis.Gui.Forms
{
public static class GeneratedMapLayerInfoUpgradeExtension
{
///
/// Upgrades old parent settings of GeneratedMapLayerInfo (level and parentName) to new parent path
///
/// List of GeneratedMapLayerInfo's to upgrade
/// Generated map layer to extract the paths from
public static void UpgradeToParentPaths(this IList generatedMapLayerInfoList, ILayer generatedLayer)
{
if (!generatedMapLayerInfoList.Any(mi => mi.ParentPath.StartsWith("*")))
{
return;
}
SetParentPath(generatedLayer, 0, "", "", generatedMapLayerInfoList.GroupBy(mi => GetLevel(mi.ParentPath)).ToDictionary(g => g.Key, g => g.ToList()));
}
private static int GetLevel(string parentPath)
{
return Convert.ToInt32(GetLevelAndParentName(parentPath)[0]);
}
private static string GetParentName(string parentPath)
{
return GetLevelAndParentName(parentPath)[1];
}
private static string[] GetLevelAndParentName(string parentPath)
{
if (!parentPath.StartsWith("*"))
{
return new[]
{
"-1",
parentPath
};
}
return parentPath.TrimStart('*').Split(';');
}
private static void SetParentPath(ILayer layer, int level, string path, string parentName, IDictionary> mapInfosByLevel)
{
List layerInfoList;
mapInfosByLevel.TryGetValue(level, out layerInfoList);
if (layerInfoList != null)
{
var layerInfo = layerInfoList.FirstOrDefault(l => l.Name == layer.Name && GetParentName(l.ParentPath) == parentName);
if (layerInfo != null)
{
layerInfo.ParentPath = path;
}
}
var groupLayer = layer as GroupLayer;
if (groupLayer == null)
{
return;
}
var parentPath = String.Format("{0}\\{1}", path, groupLayer.Name);
var subLayers = groupLayer.Layers.ToList();
foreach (var subLayer in subLayers)
{
SetParentPath(subLayer, level + 1, parentPath, groupLayer.Name, mapInfosByLevel);
}
}
}
}