示例#1
0
        /// <summary>
        /// Creates a new mutator from the specified XML element.
        /// </summary>
        private static UvmlMutator CreateMutatorForXmlElement(UltravioletContext uv,
                                                              XElement parent, XElement element, Type templatedParentType, Type templatedObjectType, CultureInfo cultureInfo)
        {
            var name  = element.Name.LocalName;
            var value = default(UvmlNode);

            var target     = default(Object);
            var targetType = default(Type);
            var targetKind = default(UvmlMutatorTarget);

            var elementChildren = element.Elements().ToList();

            if (elementChildren.Any() || element.IsEmpty)
            {
                targetKind = GetMutatorTarget(uv,
                                              element.Name.LocalName, null, templatedObjectType, out target, out targetType);

                var itemType = default(Type);
                if (UvmlCollectionItemMutatorBase.IsSupportedCollectionType(targetType, out itemType))
                {
                    var items = elementChildren.Select(x => CreateTemplateFromXml(uv, x, templatedParentType, itemType, cultureInfo)).ToList();
                    return(CreateMutatorForCollection(uv, targetKind, target, items));
                }
                else
                {
                    if (elementChildren.Count() > 1)
                    {
                        throw new UvmlException(PresentationStrings.InvalidChildElements.Format(name));
                    }

                    value = CreateTemplateFromXml(uv, elementChildren.Single(), templatedParentType, targetType, cultureInfo);
                }
            }
            else
            {
                targetKind = GetMutatorTarget(uv,
                                              element.Name.LocalName, element.Value, templatedObjectType, out target, out targetType);

                value = new UvmlLiteral(element.Value, targetType, cultureInfo);
            }

            return(CreateMutatorForTarget(targetKind, templatedParentType, templatedObjectType, target, value));
        }
示例#2
0
        /// <summary>
        /// Creates a new mutator from the specified collection of XML child elements.
        /// </summary>
        private static UvmlMutator CreateMutatorForXmlChildren(UltravioletContext uv,
                                                               XElement parent, IEnumerable <XElement> children, Type templatedParentType, Type templatedObjectType, CultureInfo cultureInfo)
        {
            var itemType = default(Type);

            // Does the object have a default property?
            var defaultPropertyAttr = GetDefaultPropertyAttribute(templatedObjectType);

            if (defaultPropertyAttr != null)
            {
                var target     = default(Object);
                var targetType = default(Type);
                var targetKind = GetMutatorTarget(uv,
                                                  defaultPropertyAttr.Name, null, templatedObjectType, out target, out targetType);

                // Is the default property a supported collection?
                if (UvmlCollectionItemMutatorBase.IsSupportedCollectionType(targetType, out itemType))
                {
                    var items = children.Select(x => CreateTemplateFromXml(uv, x, templatedParentType, itemType, cultureInfo));
                    return(CreateMutatorForCollection(uv, targetKind, target, items));
                }
                else
                {
                    if (children.Count() > 1)
                    {
                        throw new UvmlException(PresentationStrings.InvalidChildElements.Format(parent.Name.LocalName));
                    }

                    var value = CreateTemplateFromXml(uv, children.Single(), templatedParentType, targetType, cultureInfo);
                    return(CreateMutatorForTarget(targetKind, templatedParentType, templatedObjectType, target, value));
                }
            }

            // Is the object itself a supported collection?
            if (UvmlCollectionItemMutatorBase.IsSupportedCollectionType(templatedObjectType, out itemType))
            {
                var items = children.Select(x => CreateTemplateFromXml(uv, x, templatedParentType, itemType, cultureInfo));
                return(new UvmlCollectionItemMutator(items));
            }

            throw new UvmlException(PresentationStrings.InvalidChildElements.Format(parent.Name.LocalName));
        }
示例#3
0
        /// <summary>
        /// Creates a new mutator from the specified XML element.
        /// </summary>
        private static UvmlMutator CreateMutatorForXmlElement(UltravioletContext uv,
                                                              XElement parent, XElement element, Type templatedParentType, Type templatedObjectType, CultureInfo cultureInfo)
        {
            var name  = element.Name.LocalName;
            var value = default(UvmlNode);

            var target     = default(Object);
            var targetType = default(Type);
            var targetKind = default(UvmlMutatorTarget);

            var elementChildren = element.Elements().ToList();

            if (elementChildren.Any() || element.IsEmpty)
            {
                targetKind = GetMutatorTarget(uv,
                                              element.Name.LocalName, null, templatedObjectType, out target, out targetType);

                if (typeof(FrameworkTemplate).IsAssignableFrom(targetType))
                {
                    if (elementChildren.Count() > 1)
                    {
                        throw new UvmlException(PresentationStrings.InvalidChildElements.Format(name));
                    }

                    var frameworkTemplateElement = elementChildren.Single();
                    var frameworkTemplateType    = default(Type);
                    if (!uv.GetUI().GetPresentationFoundation().GetKnownType(frameworkTemplateElement.Name.LocalName, out frameworkTemplateType))
                    {
                        throw new UvmlException(PresentationStrings.UnrecognizedType.Format(frameworkTemplateElement.Name.LocalName));
                    }

                    if (!targetType.IsAssignableFrom(frameworkTemplateType))
                    {
                        throw new UvmlException(PresentationStrings.IncompatibleType.Format(targetType.Name, frameworkTemplateType.Name));
                    }

                    var frameworkTemplateChildren = frameworkTemplateElement.Elements().ToList();
                    if (frameworkTemplateChildren.Count() > 1)
                    {
                        throw new UvmlException(PresentationStrings.InvalidChildElements.Format(frameworkTemplateElement.Name));
                    }

                    var frameworkTemplateContent = frameworkTemplateChildren.SingleOrDefault();
                    value = CreateFrameworkTemplateUvmlNode(uv, frameworkTemplateType, frameworkTemplateContent, cultureInfo);
                }
                else
                {
                    var itemType = default(Type);
                    if (UvmlCollectionItemMutatorBase.IsSupportedCollectionType(targetType, out itemType))
                    {
                        var items = elementChildren.Select(x => CreateTemplateFromXml(uv, x, templatedParentType, itemType, cultureInfo)).ToList();
                        return(CreateMutatorForCollection(uv, targetKind, target, items));
                    }
                    else
                    {
                        if (elementChildren.Count() > 1)
                        {
                            throw new UvmlException(PresentationStrings.InvalidChildElements.Format(name));
                        }

                        value = CreateTemplateFromXml(uv, elementChildren.Single(), templatedParentType, targetType, cultureInfo);
                    }
                }
            }
            else
            {
                targetKind = GetMutatorTarget(uv,
                                              element.Name.LocalName, element.Value, templatedObjectType, out target, out targetType);

                value = new UvmlLiteral(element.Value, targetType, cultureInfo);
            }

            return(CreateMutatorForTarget(targetKind, templatedParentType, templatedObjectType, target, value));
        }