/// <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)); }
/// <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)); }
/// <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)); }