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 |