/*************************************************************************************
DocX – DocX is the community edition of Xceed Words for .NET
Copyright (C) 2009-2016 Xceed Software Inc.
This program is provided to you under the terms of the Microsoft Public
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
For more features and fast professional support,
pick up Xceed Words for .NET at https://xceed.com/xceed-words-for-net/
***********************************************************************************/
using System;
using System.Linq;
using System.Reflection;
using System.Xml.Linq;
namespace Xceed.Words.NET
{
internal static class XElementHelpers
{
///
/// Get value from XElement and convert it to enum
///
/// Enum type
internal static T GetValueToEnum( XElement element )
{
if( element == null )
throw new ArgumentNullException( "element" );
var value = element.Attribute( XName.Get( "val" ) ).Value;
foreach( T e in Enum.GetValues( typeof( T ) ) )
{
var fi = typeof( T ).GetField( e.ToString() );
if( fi.GetCustomAttributes( typeof( XmlNameAttribute ), false ).Count() == 0 )
throw new Exception( String.Format( "Attribute 'XmlNameAttribute' is not assigned to {0} fields!", typeof( T ).Name ) );
var a = ( XmlNameAttribute )fi.GetCustomAttributes( typeof( XmlNameAttribute ), false ).First();
if( a.XmlName == value )
return e;
}
throw new ArgumentException( "Invalid element value!" );
}
///
/// Convert value to xml string and set it into XElement
///
/// Enum type
internal static void SetValueFromEnum( XElement element, T value )
{
if( element == null )
throw new ArgumentNullException( "element" );
element.Attribute( XName.Get( "val" ) ).Value = GetXmlNameFromEnum( value );
}
///
/// Return xml string for this value
///
/// Enum type
internal static String GetXmlNameFromEnum( T value )
{
if( value == null )
throw new ArgumentNullException( "value" );
var fi = typeof( T ).GetField( value.ToString() );
if( fi.GetCustomAttributes( typeof( XmlNameAttribute ), false ).Count() == 0 )
throw new Exception( String.Format( "Attribute 'XmlNameAttribute' is not assigned to {0} fields!", typeof( T ).Name ) );
var a = ( XmlNameAttribute )fi.GetCustomAttributes( typeof( XmlNameAttribute ), false ).First();
return a.XmlName;
}
}
///
/// This attribute applied to enum's fields for definition their's real xml names in DocX file.
///
///
/// public enum MyEnum
/// {
/// [XmlName("one")] // This means, that xml element has 'val="one"'
/// ValueOne,
/// [XmlName("two")] // This means, that xml element has 'val="two"'
/// ValueTwo
/// }
///
[AttributeUsage( AttributeTargets.Field, Inherited = false, AllowMultiple = false )]
internal sealed class XmlNameAttribute : Attribute
{
///
/// Real xml name
///
public String XmlName
{
get; private set;
}
public XmlNameAttribute( String xmlName )
{
XmlName = xmlName;
}
}
}