Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.ComponentModel.TypeTypeConverter.cs

 
using System;
using System.ComponentModel;
using System.Globalization;
using System.ComponentModel.Design;

namespace BLToolkit.ComponentModel
{
    /// <summary>
    /// Converts the value of an object into a <see cref="System.Type"/>.
    /// </summary>
    public class TypeTypeConverter: TypeConverter
    {
        // Human readable text for 'nothing selected'.
        //
        private const string NoType = "(none)";

        /// <summary>
        /// Returns whether this converter can convert an object of the given type to
        /// a <see cref="System.Type"/>, using the specified context.
        /// </summary>
        /// <param name="context">An <see cref="System.ComponentModel.ITypeDescriptorContext"/>
        /// that provides a format context. </param>
        /// <param name="sourceType">A <see cref="System.Type"/> that represents the type
        /// you want to convert from. </param>
        /// <returns>
        /// <see langword="true"/> if this converter can perform the conversion;
        /// otherwise, <see langword="false"/>.
        /// </returns>
        public override bool CanConvertFrom(
            ITypeDescriptorContext context,
            Type                   sourceType)
        {
            return sourceType == typeof(string) ||
                base.CanConvertFrom(context, sourceType);
        }

        /// <summary>
        /// Converts the given object to the corresponding <see cref="System.Type"/>,
        /// using the specified context and culture information.
        /// </summary>
        /// <param name="culture">The <see cref="System.Globalization.CultureInfo"/> to
        /// use as the current culture. </param>
        /// <param name="context">An 
        /// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides a
        /// format context. </param>
        /// <param name="value">The <see cref="System.Object"/> to convert. </param>
        /// <returns>
        /// An <see cref="System.Object"/> that represents the converted value.
        /// </returns>
        /// <exception cref="System.NotSupportedException">The conversion cannot be
        /// performed. </exception>
        public override object ConvertFrom(
            ITypeDescriptorContext context,
            CultureInfo            culture,
            object                 value)
        {
            if (value == null)
                return null;

            if (!(value is string))
                return base.ConvertFrom(context, culture, value);

            string str = (string)value;

            if (str.Length == 0 || str == NoType)
                return null;

            // Try VisualStudio own service first.
            //
            ITypeResolutionService typeResolver =
                (ITypeResolutionService)context.GetService(typeof(ITypeResolutionService));

            if (typeResolver != null)
            {
                Type type = typeResolver.GetType(str);

                if (type != null)
                    return type;
            }

            return Type.GetType(str);
        }

        /// <summary>
        /// Returns whether this converter can convert the object to the specified type,
        /// using the specified context.
        /// </summary>
        /// <param name="context">An 
        /// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides
        /// a format context. </param>
        /// <param name="destinationType">A <see cref="System.Type"/> that represents
        /// the type you want to convert to. </param>
        /// <returns>
        /// <see langword="true"/> if this converter can perform the conversion;
        /// otherwise, <see langword="false"/>.
        /// </returns>
        public override bool CanConvertTo(
            ITypeDescriptorContext context,
            Type                   destinationType)
        {
            return destinationType == typeof(string) ||
                base.CanConvertTo(context, destinationType);
        }

        /// <summary>
        /// Converts the given value object to the specified type, using the specified
        /// context and culture information.
        /// </summary>
        /// <param name="culture">A <see cref="System.Globalization.CultureInfo"/>.
        /// If null is passed, the current culture is assumed. </param>
        /// <param name="context">An 
        /// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides
        /// a format context. </param>
        /// <param name="destinationType">The <see cref="System.Type"/> to convert
        /// the value parameter to. </param>
        /// <param name="value">The <see cref="System.Object"/> to convert. </param>
        /// <returns>
        /// An <see cref="System.Object"/> that represents the converted value.
        /// </returns>
        /// <exception cref="System.NotSupportedException">The conversion cannot be
        /// performed. </exception>
        /// <exception cref="System.ArgumentNullException">
        /// The <paramref name="destinationType"/> parameter is null. </exception>
        public override object ConvertTo(
            ITypeDescriptorContext context,
            CultureInfo            culture,
            object                 value,
            Type                   destinationType)
        {
            if (destinationType != typeof(string))
                return base.ConvertTo(context, culture, value, destinationType);

            if (value == null || value.ToString().Length == 0)
                return NoType;

            return value.ToString();
        }
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net