public UiDataTableNode(ArchiveListing listing, UiArchiveExtension extension, ArchiveEntry indices) : base(indices.Name, UiNodeType.DataTable) { _listing = listing; _extension = extension; _indices = indices; }
public UiFileTableNode(ArchiveListing listing, UiArchiveExtension extension, ArchiveEntry indices, ArchiveEntry binary) : base(indices.Name, UiNodeType.FileTable) { _listing = listing; _extension = extension; _indices = indices; _binary = binary; }
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; }
private bool TryAddMoviesListing(ArchiveListing parentListing, ArchiveEntry entry, String entryName) { switch (entryName) { case "movie_items.win32.wdb": case "movie_items_us.win32.wdb": break; default: return(false); } UiArchiveExtension extension = GetArchiveExtension(entry); UiDataTableNode node = new UiDataTableNode(parentListing, extension, entry); ConcurrentBag <UiNode> container = ProvideRootNodeChilds(extension); container.Add(node); return(true); }
private bool SetPairedEntry(ArchiveListing listing, ArchiveEntry entry, string ext, string longName) { Pair <ArchiveEntry, ArchiveEntry> pair = ProvidePair(longName); if (ext == ".win32.imgb") { pair.Item2 = entry; } else { pair.Item1 = entry; } if (!pair.IsAnyEmpty) { UiArchiveExtension extension = GetArchiveExtension(pair.Item1); UiFileTableNode node = new UiFileTableNode(listing, extension, pair.Item1, pair.Item2); ConcurrentBag <UiNode> container = ProvideRootNodeChilds(extension); container.Add(node); } return(true); }
private ConcurrentBag <UiNode> ProvideRootNodeChilds(UiArchiveExtension extension) { return(_nodes.GetOrAdd(extension, e => new ConcurrentBag <UiNode>())); }
private ConcurrentBag<UiNode> ProvideRootNodeChilds(UiArchiveExtension extension) { return _nodes.GetOrAdd(extension, e => new ConcurrentBag<UiNode>()); }