private UiContainerNode BuildExtensionNode(UiArchiveExtension key, ConcurrentBag <UiNode> entries) { string separator = Path.AltDirectorySeparatorChar.ToString(); UiContainerNode extensionNode = new UiContainerNode(key.ToString().ToUpper(), UiNodeType.Group); Dictionary <string, UiContainerNode> dirs = new Dictionary <string, UiContainerNode>(entries.Count); foreach (UiNode leaf in entries) { UiNode parent = extensionNode; string[] path = leaf.Name.ToLowerInvariant().Split(Path.AltDirectorySeparatorChar); for (int i = 0; i < path.Length - 1; i++) { UiContainerNode directory; string directoryName = path[i]; string directoryPath = String.Join(separator, path, 0, i + 1); if (!dirs.TryGetValue(directoryPath, out directory)) { directory = new UiContainerNode(directoryName, UiNodeType.Directory) { Parent = parent }; dirs.Add(directoryPath, directory); } parent = directory; } leaf.Parent = parent; leaf.Name = path[path.Length - 1]; } //foreach (IGrouping<UiNode, UiNode> leafs in entries.GroupBy(e => e.Parent)) // ((UiContainerNode)leafs.Key).SetChilds(leafs.ToArray()); UiNode[] childs = null; foreach (IGrouping <UiNode, UiNode> leafs in dirs.Values.Union(entries).GroupBy(e => e.Parent)) { if (leafs.Key == extensionNode) { childs = leafs.ToArray(); continue; } ((UiContainerNode)leafs.Key).SetChilds(leafs.ToArray()); } foreach (UiContainerNode node in dirs.Values) { node.AbsorbSingleChildContainer(); } extensionNode.SetChilds(childs); return(extensionNode); }
private UiContainerNode BuildExtensionNode(UiArchiveExtension key, ConcurrentBag<UiNode> entries) { string separator = Path.AltDirectorySeparatorChar.ToString(); UiContainerNode extensionNode = new UiContainerNode(key.ToString().ToUpper(), UiNodeType.Group); Dictionary<string, UiContainerNode> dirs = new Dictionary<string, UiContainerNode>(entries.Count); foreach (UiNode leaf in entries) { UiNode parent = extensionNode; string[] path = leaf.Name.ToLowerInvariant().Split(Path.AltDirectorySeparatorChar); for (int i = 0; i < path.Length - 1; i++) { UiContainerNode directory; string directoryName = path[i]; string directoryPath = String.Join(separator, path, 0, i + 1); if (!dirs.TryGetValue(directoryPath, out directory)) { directory = new UiContainerNode(directoryName, UiNodeType.Directory) {Parent = parent}; dirs.Add(directoryPath, directory); } parent = directory; } leaf.Parent = parent; leaf.Name = path[path.Length - 1]; } //foreach (IGrouping<UiNode, UiNode> leafs in entries.GroupBy(e => e.Parent)) // ((UiContainerNode)leafs.Key).SetChilds(leafs.ToArray()); UiNode[] childs = null; foreach (IGrouping<UiNode, UiNode> leafs in dirs.Values.Union(entries).GroupBy(e => e.Parent)) { if (leafs.Key == extensionNode) { childs = leafs.ToArray(); continue; } ((UiContainerNode)leafs.Key).SetChilds(leafs.ToArray()); } foreach (UiContainerNode node in dirs.Values) node.AbsorbSingleChildContainer(); extensionNode.SetChilds(childs); return extensionNode; }
protected override UiNode[] ExpandChilds() { switch (_extension) { case UiArchiveExtension.Grs: case UiArchiveExtension.Xgr: case UiArchiveExtension.Xwb: case UiArchiveExtension.Xfv: return(ExpandWpdChilds()); case UiArchiveExtension.Trb: return(ExpandTrbChilds()); default: throw new NotImplementedException(_extension.ToString()); } }