示例#1
0
        private ModelTypeWidgetNode(Type modelType, int aggregationCount, Vector2 position, List <Type> previouslyReferencedTypes, bool stopRecursion = false)
        {
            TypeWidget            = new ModelTypeWidget(modelType);
            this.aggregationCount = aggregationCount;
            TypeWidget.Position   = position;
            nodes = new List <ModelTypeWidgetNode>();

            if (stopRecursion)
            {
                return;
            }

            // Make a list with all referenced types including aggregated types of this type
            List <Type> afterReferencedTypes = new List <Type>(previouslyReferencedTypes);

            foreach (AggregatedModelType aggregatedType in TypeWidget.AggregatedTypes)
            {
                if (afterReferencedTypes.Contains(aggregatedType.ModelType))
                {
                    continue;
                }
                afterReferencedTypes.Add(aggregatedType.ModelType);
            }

            // Construct ModelTypeWidgetNodes for each aggregated type
            foreach (AggregatedModelType aggregatedType in TypeWidget.AggregatedTypes)
            {
                bool stop = previouslyReferencedTypes.Contains(aggregatedType.ModelType);
                previouslyReferencedTypes.Add(aggregatedType.ModelType);
                ModelTypeWidgetNode node = new ModelTypeWidgetNode(aggregatedType.ModelType, aggregatedType.AggregationCount, position + new Vector2(marginHor, Height), afterReferencedTypes, stop);
                nodes.Add(node);
            }
        }
示例#2
0
        public ModelStructuresRenderer()
        {
            rootNodes = new List <ModelTypeWidgetNode>();

            // Create a rootNode for all types
            List <Type>            types      = CodeControlEditorHelper.GetAllModelTypes();
            List <TypeAggregation> takenTypes = new List <TypeAggregation>();

            foreach (Type type in types)
            {
                ModelTypeWidgetNode node = new ModelTypeWidgetNode(type);
                rootNodes.Add(node);

                List <TypeAggregation> aggregatedTypes = node.GetAggregatedTypes();
                foreach (TypeAggregation aggregatedType in aggregatedTypes)
                {
                    takenTypes.Add(aggregatedType);
                }
            }

            // Remove rootNodes that are aggregated in other rootNodes
            while (true)
            {
                bool rootNodeRemoved = false;
                for (int i = rootNodes.Count - 1; i >= 0; i--)
                {
                    List <TypeAggregation> takenInTypes = takenTypes.FindAll(x => x.Child == rootNodes[i].TypeWidget.ModelType);
                    foreach (TypeAggregation aggregation in takenInTypes)
                    {
                        // Check if the parent of this rootNode would remain in other rootNodes if this would be removed
                        bool parentWillRemain = rootNodes.Find(x => x.TypeWidget.ModelType == aggregation.Parent) != null;
                        if (!parentWillRemain)
                        {
                            foreach (ModelTypeWidgetNode rootNode in rootNodes)
                            {
                                if (rootNode == rootNodes[i])
                                {
                                    continue;
                                }
                                List <TypeAggregation> aggregatedTypes = rootNode.GetAggregatedTypes();
                                foreach (TypeAggregation aggregatedType in aggregatedTypes)
                                {
                                    if (aggregatedType.Child == aggregation.Parent)
                                    {
                                        parentWillRemain = true;
                                        break;
                                    }
                                }
                                if (parentWillRemain)
                                {
                                    break;
                                }
                            }
                        }

                        if (parentWillRemain)
                        {
                            rootNodes.RemoveAt(i);
                            i = rootNodes.Count - 1;
                            rootNodeRemoved = true;
                            break;
                        }
                    }
                }
                if (!rootNodeRemoved)
                {
                    break;
                }
            }

            // Position rootNodes
            float maxWidth    = 0;
            float totalHeight = 0;

            foreach (ModelTypeWidgetNode rootNode in rootNodes)
            {
                rootNode.SetPosition(new Vector2(ModelTypeWidget.Width * .5f, ModelTypeWidget.Height * .5f + totalHeight));
                maxWidth     = Mathf.Max(maxWidth, rootNode.Width);
                totalHeight += rootNode.Height + marginVert;
            }
            boundingBox = new Rect(0, 0, maxWidth, totalHeight);
        }