195 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
#if FRAMEWORK20
 | 
						|
using System;
 | 
						|
using System.Text;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Globalization;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    internal class FormatHelper
 | 
						|
    {
 | 
						|
        private static Type stringType;
 | 
						|
        private static Type checkStateType;
 | 
						|
        private static Type booleanType;
 | 
						|
 
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes FormatHelper class.
 | 
						|
        /// </summary>
 | 
						|
        static FormatHelper()
 | 
						|
        {
 | 
						|
            stringType = typeof(string);
 | 
						|
            booleanType = typeof(bool);
 | 
						|
            checkStateType = typeof(CheckState);
 | 
						|
            //parseMethodNotFound = new object();
 | 
						|
            //defaultDataSourceNullValue = DBNull.Value;
 | 
						|
        }
 | 
						|
        internal static object FormatObject(object value, Type targetType, TypeConverter sourceConverter, TypeConverter targetConverter, string formatString, IFormatProvider formatInfo, object formattedNullValue, object dataSourceNullValue)
 | 
						|
        {
 | 
						|
            if (IsNullData(value, dataSourceNullValue))
 | 
						|
            {
 | 
						|
                value = DBNull.Value;
 | 
						|
            }
 | 
						|
            Type type = targetType;
 | 
						|
            targetType = NullableUnwrap(targetType);
 | 
						|
            sourceConverter = NullableUnwrap(sourceConverter);
 | 
						|
            targetConverter = NullableUnwrap(targetConverter);
 | 
						|
            bool flag = targetType != type;
 | 
						|
            object obj2 = FormatObjectInternal(value, targetType, sourceConverter, targetConverter, formatString, formatInfo, formattedNullValue);
 | 
						|
            if ((type.IsValueType && (obj2 == null)) && !flag)
 | 
						|
            {
 | 
						|
                throw new FormatException(GetCantConvertMessage(value, targetType));
 | 
						|
            }
 | 
						|
            return obj2;
 | 
						|
        }
 | 
						|
 | 
						|
        private static string GetCantConvertMessage(object value, Type targetType)
 | 
						|
        {
 | 
						|
            string name = (value == null) ? "Can't convert null value" : "Specified format cannot be converted";
 | 
						|
            return string.Format(CultureInfo.CurrentCulture, name, new object[] { value, targetType.Name });
 | 
						|
        }
 | 
						|
 | 
						|
 
 | 
						|
        private static object FormatObjectInternal(object value, Type targetType, TypeConverter sourceConverter, TypeConverter targetConverter, string formatString, IFormatProvider formatInfo, object formattedNullValue)
 | 
						|
        {
 | 
						|
            if ((value == DBNull.Value) || (value == null))
 | 
						|
            {
 | 
						|
                if (formattedNullValue != null)
 | 
						|
                {
 | 
						|
                    return formattedNullValue;
 | 
						|
                }
 | 
						|
                if (targetType == stringType)
 | 
						|
                {
 | 
						|
                    return string.Empty;
 | 
						|
                }
 | 
						|
                if (targetType == checkStateType)
 | 
						|
                {
 | 
						|
                    return CheckState.Indeterminate;
 | 
						|
                }
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
            if (((targetType == stringType) && (value is IFormattable)) && !string.IsNullOrEmpty(formatString))
 | 
						|
            {
 | 
						|
                return (value as IFormattable).ToString(formatString, formatInfo);
 | 
						|
            }
 | 
						|
            Type type = value.GetType();
 | 
						|
            TypeConverter converter = TypeDescriptor.GetConverter(type);
 | 
						|
            if (((sourceConverter != null) && (sourceConverter != converter)) && sourceConverter.CanConvertTo(targetType))
 | 
						|
            {
 | 
						|
                return sourceConverter.ConvertTo(null, GetFormatterCulture(formatInfo), value, targetType);
 | 
						|
            }
 | 
						|
            TypeConverter converter2 = TypeDescriptor.GetConverter(targetType);
 | 
						|
            if (((targetConverter != null) && (targetConverter != converter2)) && targetConverter.CanConvertFrom(type))
 | 
						|
            {
 | 
						|
                return targetConverter.ConvertFrom(null, GetFormatterCulture(formatInfo), value);
 | 
						|
            }
 | 
						|
            if (targetType == checkStateType)
 | 
						|
            {
 | 
						|
                if (type == booleanType)
 | 
						|
                {
 | 
						|
                    return (((bool)value) ? CheckState.Checked : CheckState.Unchecked);
 | 
						|
                }
 | 
						|
                if (sourceConverter == null)
 | 
						|
                {
 | 
						|
                    sourceConverter = converter;
 | 
						|
                }
 | 
						|
                if ((sourceConverter != null) && sourceConverter.CanConvertTo(booleanType))
 | 
						|
                {
 | 
						|
                    return (((bool)sourceConverter.ConvertTo(null, GetFormatterCulture(formatInfo), value, booleanType)) ? CheckState.Checked : CheckState.Unchecked);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (targetType.IsAssignableFrom(type))
 | 
						|
            {
 | 
						|
                return value;
 | 
						|
            }
 | 
						|
            if (sourceConverter == null)
 | 
						|
            {
 | 
						|
                sourceConverter = converter;
 | 
						|
            }
 | 
						|
            if (targetConverter == null)
 | 
						|
            {
 | 
						|
                targetConverter = converter2;
 | 
						|
            }
 | 
						|
            if ((sourceConverter != null) && sourceConverter.CanConvertTo(targetType))
 | 
						|
            {
 | 
						|
                return sourceConverter.ConvertTo(null, GetFormatterCulture(formatInfo), value, targetType);
 | 
						|
            }
 | 
						|
            if ((targetConverter != null) && targetConverter.CanConvertFrom(type))
 | 
						|
            {
 | 
						|
                return targetConverter.ConvertFrom(null, GetFormatterCulture(formatInfo), value);
 | 
						|
            }
 | 
						|
            if (!(value is IConvertible))
 | 
						|
            {
 | 
						|
                throw new FormatException(GetCantConvertMessage(value, targetType));
 | 
						|
            }
 | 
						|
            return ChangeType(value, targetType, formatInfo);
 | 
						|
        }
 | 
						|
        private static CultureInfo GetFormatterCulture(IFormatProvider formatInfo)
 | 
						|
        {
 | 
						|
            if (formatInfo is CultureInfo)
 | 
						|
            {
 | 
						|
                return (formatInfo as CultureInfo);
 | 
						|
            }
 | 
						|
            return CultureInfo.CurrentCulture;
 | 
						|
        }
 | 
						|
        private static object ChangeType(object value, Type type, IFormatProvider formatInfo)
 | 
						|
        {
 | 
						|
            object obj2;
 | 
						|
            try
 | 
						|
            {
 | 
						|
                if (formatInfo == null)
 | 
						|
                {
 | 
						|
                    formatInfo = CultureInfo.CurrentCulture;
 | 
						|
                }
 | 
						|
                obj2 = Convert.ChangeType(value, type, formatInfo);
 | 
						|
            }
 | 
						|
            catch (InvalidCastException exception)
 | 
						|
            {
 | 
						|
                throw new FormatException(exception.Message, exception);
 | 
						|
            }
 | 
						|
            return obj2;
 | 
						|
        }
 | 
						|
 | 
						|
        private static Type NullableUnwrap(Type type)
 | 
						|
        {
 | 
						|
            if (type == stringType)
 | 
						|
            {
 | 
						|
                return stringType;
 | 
						|
            }
 | 
						|
            return (Nullable.GetUnderlyingType(type) ?? type);
 | 
						|
        }
 | 
						|
 | 
						|
        private static TypeConverter NullableUnwrap(TypeConverter typeConverter)
 | 
						|
        {
 | 
						|
            NullableConverter converter = typeConverter as NullableConverter;
 | 
						|
            if (converter == null)
 | 
						|
            {
 | 
						|
                return typeConverter;
 | 
						|
            }
 | 
						|
            return converter.UnderlyingTypeConverter;
 | 
						|
        }
 | 
						|
 | 
						|
        internal static bool IsNullData(object value, object dataSourceNullValue)
 | 
						|
        {
 | 
						|
            if ((value != null) && (value != DBNull.Value))
 | 
						|
            {
 | 
						|
                return object.Equals(value, NullData(value.GetType(), dataSourceNullValue));
 | 
						|
            }
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        internal static object NullData(Type type, object dataSourceNullValue)
 | 
						|
        {
 | 
						|
            if (!type.IsGenericType || (type.GetGenericTypeDefinition() != typeof(Nullable<>)))
 | 
						|
            {
 | 
						|
                return dataSourceNullValue;
 | 
						|
            }
 | 
						|
            if ((dataSourceNullValue != null) && (dataSourceNullValue != DBNull.Value))
 | 
						|
            {
 | 
						|
                return dataSourceNullValue;
 | 
						|
            }
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
#endif |