Esempio n. 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));
        }
Esempio n. 2
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));
        }