void AddNodes(TreeNodeCollection treeNodeCollection, NesMenuCollection nesMenuCollection, List <NesMenuCollection> usedFolders = null)
        {
            if (usedFolders == null)
            {
                usedFolders = new List <NesMenuCollection>();
            }
            if (usedFolders.Contains(nesMenuCollection))
            {
                return;
            }
            usedFolders.Add(nesMenuCollection);
            var sorted = nesMenuCollection.OrderBy(o => o.Name).OrderBy(o => (o is NesMenuFolder) ? (byte)(o as NesMenuFolder).Position : 2);

            foreach (var nesElement in sorted)
            {
                var newNode = new TreeNode();
                if (nesElement is NesMenuFolder)
                {
                    if (usedFolders.Contains((nesElement as NesMenuFolder).ChildMenuCollection))
                    {
                        nesMenuCollection.Remove(nesElement); // We don't need any "back" folders
                        continue;
                    }
                }
                newNode.SelectedImageIndex = newNode.ImageIndex = getImageIndex(nesElement as INesMenuElement);
                newNode.Text = nesElement.Name;
                newNode.Tag  = nesElement;
                treeNodeCollection.Add(newNode);
                if (nesElement is NesMenuFolder)
                {
                    AddNodes(newNode.Nodes, (nesElement as NesMenuFolder).ChildMenuCollection, usedFolders);
                }
            }
        }
        void XmlToNode(XmlDocument xml, XmlNodeList elements, NesMenuCollection rootMenuCollection, NesMenuCollection nesMenuCollection = null)
        {
            if (nesMenuCollection == null)
            {
                nesMenuCollection = rootMenuCollection;
            }
            foreach (XmlNode element in elements)
            {
                switch (element.Name)
                {
                case "Folder":
                    var folder = new NesMenuFolder(element.Attributes["name"].Value, element.Attributes["icon"].Value);
                    folder.Position = (NesMenuFolder.Priority) byte.Parse(element.Attributes["position"].Value);
                    nesMenuCollection.Add(folder);
                    XmlToNode(xml, element.ChildNodes, rootMenuCollection, folder.ChildMenuCollection);
                    break;

                case "Game":
                case "OriginalGame":
                    var code  = element.Attributes["code"].Value;
                    var games = from n in rootMenuCollection where ((n is NesMiniApplication || n is NesDefaultGame) && (n.Code == code)) select n;
                    if (games.Count() > 0)
                    {
                        var game = games.First();
                        nesMenuCollection.Add(game);
                        rootMenuCollection.Remove(game);
                    }
                    break;
                }
            }
        }