using MarketExplorer.Menu.Models; using System.Collections.Generic; using System.Linq; using System.Xml; using TradeIdeas.TIProData; using TradeIdeas.TIProGUI; using TradeIdeas.XML; namespace MarketExplorer.Menu { public class MarketExplorerMenuTreeGeneratorCommand { public List MenuItemsMap { get; set; } = new List(); private byte[] MenuXml { get; set; } private XmlDocument MenuXmlDoc { get; set; } public MarketExplorerMenuTreeGeneratorCommand(byte[] menuXml) { MenuXml = menuXml; } public List Execute() { MenuXmlDoc = new XmlDocument(); MenuXmlDoc = XmlHelper.Get(MenuXml); // 1. Fist Pass - find all of the sub menu groupings, so generate the "map" MenuItemsMap = GenerateMenuItemsMap(MenuXmlDoc); // 2. GenerateMenuTree var menuTree = new List(); GenerateMenuTree(menuTree, string.Empty, MenuItemsMap); return menuTree; } private void GenerateMenuTree(List tree, string parentId, List allMenu) { foreach (var menu in allMenu.Where(x => x.Name.HasValue() && x.Parent.EqualsIgnoreCase(parentId))) { tree.Add(menu); if (allMenu.Any(x => x.Parent.EqualsIgnoreCase(menu.Name))) { GenerateMenuTree(menu.Children, menu.Name, allMenu); } } } private List GenerateMenuItemsMap(XmlDocument xmlDoc) { var rootMenuXml = xmlDoc.Node(0); if (rootMenuXml == null) return new List(); string type = rootMenuXml.Property("type"); if (type != "windows") { return new List(); } var menuItemsMap = new List(); int count = rootMenuXml.Property("cnt", 0); for (int i = 1; i <= count; i++) { var path = rootMenuXml.Property("NAME" + i); var layout = rootMenuXml.Property("LAYOUT" + i); var name = path; var parentName = string.Empty; var subMenu = rootMenuXml.Property("CATEGORY" + i); var subMenuSplits = subMenu.Split('|'); var subMenuFound = subMenu.HasValue() && subMenuSplits.Length > 0; if (subMenuFound) { var parentExists = subMenuSplits.Length >= 0; if (parentExists) { for (var subMenuSplitIndex = 0; subMenuSplitIndex < subMenuSplits.Length; subMenuSplitIndex++) { var subMenuName = subMenuSplits[subMenuSplitIndex]; parentName = subMenuName; if (!menuItemsMap.Any(x => x.Parent == subMenuName)) { var parentMenuItem = new MenuItem { Name = subMenuName }; if (subMenuSplitIndex > 0) { parentMenuItem.Parent = subMenuSplits[subMenuSplitIndex - 1]; } menuItemsMap.Add(parentMenuItem); } } } } int id = rootMenuXml.Property("ID" + i, 0); var existingMenuItemMap = menuItemsMap.FirstOrDefault(x => x.Name == name); if (existingMenuItemMap != null) { existingMenuItemMap.Id = id; existingMenuItemMap.Name = name; existingMenuItemMap.Parent = parentName; existingMenuItemMap.Layout = layout; } else { menuItemsMap.Add(new MenuItem { Id = id, Name = name, Parent = parentName, Layout = layout }); } } return menuItemsMap; } } }