Exemplo n.º 1
0
        private static NodeCategory GenerateCategories(List <NodeTypeData> nodeTypeData)
        {
            nodeTypeData = nodeTypeData.ToList(); //Copy that shit because we don't want to break m_categories
            var nodeHeirarchy = new NodeCategory(null, DomainIDs.CategoryNone);

            var duplicates = nodeTypeData.GroupBy(a => a.Guid).Where(g => g.Count() > 1);

            if (duplicates.Any())
            {
                throw new CategoryGenerationException("The following node types have duplicate definitions: " + string.Join(", ", duplicates.Select(g => g.Key).ToArray()));
            }
            List <NodeCategory> nodeTypes = new List <NodeCategory> {
            };

            nodeTypes.Add(nodeHeirarchy);

            //foreach (var data in nodeTypeData.Where(d => d.Parent == DomainIds.CATEGORY_NONE).ToList())
            //{
            //    var newNodeType = new NodeCategory(data.Name, data.Guid);
            //    m_nodes.m_childTypes.Add(newNodeType);
            //    nodeTypes.Add(newNodeType);
            //    nodeTypeData.Remove(data);
            //}

            bool gotOne = true;

            while (nodeTypeData.Any() && gotOne)
            {
                gotOne = false;
                for (int i = 0; i < nodeTypes.Count; i++)
                {
                    var parent = nodeTypes[i];
                    foreach (var data in nodeTypeData.Where(d => d.Parent == parent.Guid).ToList())
                    {
                        var newNodeType = new NodeCategory(data.Name, data.Guid);
                        parent.AddChildType(newNodeType);
                        nodeTypes.Add(newNodeType);
                        gotOne = true;
                        nodeTypeData.Remove(data);
                    }
                }
            }

            if (!gotOne)
            {
                //TODO: How to express this to the user?
                //throw new Exception("The following node types are ancestors of an unknown node type: " + string.Join(", ", nodeTypeData.Select(d => d.Guid).ToArray()));
                //    MessageBox.Show("The following node types are ancestors of an unknown node type: " + string.Join(", ", nodeTypeData.Select(d => d.Guid).ToArray()));
                foreach (var orphan in nodeTypeData)
                {
                    nodeHeirarchy.AddChildType(new NodeCategory(orphan.Name, orphan.Guid));
                }
            }

            return(nodeHeirarchy);
        }