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