public override void RecursivelyResolve(Dictionary <string, DataDefinition> local, Dictionary <string, DataDefinition> global, Dictionary <string, Dictionary <string, DataDefinition> > referenceableDefinitions)
        {
            if (isResolving)
            {
                return;
            }
            isResolving = true;

            if (Extends != null)
            {
                StructDefinition def = null;
                if (local.ContainsKey(Extends))
                {
                    def = local[Extends] as StructDefinition;
                }

                if (def == null && global.ContainsKey(Extends))
                {
                    def = global[Extends] as StructDefinition;
                }

                if (def == null)
                {
                    throw new Exception("The definition '" + Extends + "' this extends could not be found!");
                }

                Extends = null;
                if (def.Extends != null)
                {
                    def.RecursivelyResolve(referenceableDefinitions[def.SrcFile], global, referenceableDefinitions);
                }

                var newChildren = def.Children.ToList();

                for (int i = 0; i < newChildren.Count; i++)
                {
                    var name = newChildren[i].Name.ToLower();

                    // find index of name in our children
                    var existing = Children.FirstOrDefault(e => e.Name.ToLower() == name);
                    if (existing != null)
                    {
                        var ourIndex = Children.IndexOf(existing);
                        Children.Remove(existing);
                        newChildren[i] = existing;

                        if (ExtendsAfter == null)
                        {
                            // Add all the children in the window to the new children at this index
                            var ni = ourIndex;
                            for (; ni < Children.Count; ni++)
                            {
                                if (newChildren.Any(e => Children[ni].Name.ToLower() == e.Name.ToLower()))
                                {
                                    break;
                                }

                                var child = Children[ni--];
                                Children.Remove(child);
                                newChildren.Insert(++i, child);
                            }
                        }
                    }
                }

                if (ExtendsAfter == null)
                {
                    // Add the rest
                    foreach (var child in Children)
                    {
                        newChildren.Add(child);
                    }
                }
                else
                {
                    var afterEl = newChildren.FirstOrDefault(e => e.Name.ToLower() == ExtendsAfter);
                    var index   = newChildren.Count;

                    if (afterEl != null)
                    {
                        index = newChildren.IndexOf(afterEl) + 1;
                    }

                    foreach (var child in Children)
                    {
                        newChildren.Insert(index++, child);
                    }
                }

                foreach (var att in def.Attributes)
                {
                    Attributes.Add(att);
                }

                Children = newChildren;
            }

            foreach (var child in Children)
            {
                child.RecursivelyResolve(local, global, referenceableDefinitions);
            }
        }
示例#2
0
        public static DataDefinition LoadDefinition(XElement element, string forceLoadAs = null)
        {
            if (element.Name.ToString() == "Const")
            {
                var constDef = new ConstDefinition();
                constDef.Parse(element);
                return(constDef);
            }

            var name = element.Attribute(MetaNS + "RefKey")?.Value.ToString().ToUpper();

            if (name == null)
            {
                name = element.Attribute("RefKey")?.Value.ToString().ToUpper();
            }
            if (name == null)
            {
                name = element.Name.ToString().ToUpper();
            }

            if (name.EndsWith("DEF"))
            {
                name = name.Substring(0, name.Length - "DEF".Length);
            }

            if (forceLoadAs != null)
            {
                name = forceLoadAs.ToUpper();
            }

            DataDefinition definition = null;

            if (name == "STRING")
            {
                definition = new StringDefinition();
            }
            else if (name == "MULTILINESTRING")
            {
                definition = new MultilineStringDefinition();
            }
            else if (name == "STRUCT")
            {
                definition = new StructDefinition();
            }
            else if (name == "REFERENCE")
            {
                definition = new ReferenceDefinition();
            }
            else if (name == "COLLECTION")
            {
                definition = new CollectionDefinition();
            }
            else if (name == "NUMBER")
            {
                definition = new NumberDefinition();
            }
            else if (name == "BOOLEAN")
            {
                definition = new BooleanDefinition();
            }
            else if (name == "COLOUR")
            {
                definition = new ColourDefinition();
            }
            else if (name == "ENUM")
            {
                definition = new EnumDefinition();
            }
            else if (name == "FLAGS")
            {
                definition = new FlagsDefinition();
            }
            else if (name == "FILE")
            {
                definition = new FileDefinition();
            }
            else if (name == "TREE")
            {
                definition = new TreeDefinition();
            }
            else if (name == "VECTOR")
            {
                definition = new VectorDefinition();
            }
            else if (name == "TIMELINE")
            {
                definition = new TimelineDefinition();
            }
            else if (name == "GRAPHSTRUCT")
            {
                definition = new GraphStructDefinition();
            }
            else if (name == "GRAPHCOLLECTION")
            {
                definition = new GraphCollectionDefinition();
            }
            else if (name == "GRAPHREFERENCE")
            {
                definition = new GraphReferenceDefinition();
            }
            else if (name == "KEYFRAME")
            {
                definition = new KeyframeDefinition();
            }
            else if (name == "COMMENT")
            {
                definition = new CommentDefinition();
            }
            else if (name == "SKELETALANIMATION")
            {
                definition = new SkeletalAnimationDefinition();
            }
            else
            {
                throw new Exception("Unknown definition type " + name + "!");
            }

            definition.Name = element.Attribute("Name")?.Value?.ToString();
            if (string.IsNullOrWhiteSpace(definition.Name))
            {
                definition.Name = definition.GetType().ToString().Replace("Definition", "");
            }

            definition.ToolTip = element.Attribute("ToolTip")?.Value?.ToString();

            var col = element.Attribute("TextColour")?.Value?.ToString();

            if (col != null)
            {
                if (Colours.ContainsKey(col))
                {
                    col = Colours[col];
                }
                definition.TextColour = col;
            }

            var attEl = element.Element("Attributes");

            if (attEl != null)
            {
                foreach (var att in attEl.Elements())
                {
                    var attDef = LoadDefinition(att);
                    if (attDef is PrimitiveDataDefinition)
                    {
                        definition.Attributes.Add(attDef as PrimitiveDataDefinition);
                    }
                    else
                    {
                        throw new Exception("Cannot put a non-primitive into attributes!");
                    }
                }
            }

            definition.IsGlobal      = definition.TryParseBool(element, "IsGlobal");
            definition.VisibleIf     = element.Attribute("VisibleIf")?.Value?.ToString();
            definition.SkipIfDefault = definition.TryParseBool(element, "SkipIfDefault", true);

            definition.Parse(element);

            return(definition);
        }