/************************************************************************************* Extended WPF Toolkit Copyright (C) 2007-2013 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, controls, and fast professional support, pick up the Plus Edition at http://xceed.com/wpf_toolkit Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids ***********************************************************************************/ using System; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Globalization; using System.Reflection; namespace Xceed.Wpf.Toolkit.Media.Animation { public class AnimationRateConverter : TypeConverter { public override bool CanConvertFrom( ITypeDescriptorContext td, Type t ) { return ( t == typeof( string ) ) || ( t == typeof( double ) ) || ( t == typeof( int ) ) || ( t == typeof( TimeSpan ) ); } public override bool CanConvertTo( ITypeDescriptorContext context, Type destinationType ) { return ( destinationType == typeof( InstanceDescriptor ) ) || ( destinationType == typeof( string ) ) || ( destinationType == typeof( double ) ) || ( destinationType == typeof( TimeSpan ) ); } public override object ConvertFrom( ITypeDescriptorContext td, CultureInfo cultureInfo, object value ) { Type valueType = value.GetType(); if( value is string ) { string stringValue = value as string; if( ( value as string ).Contains( ":" ) ) { TimeSpan duration = TimeSpan.Zero; duration = ( TimeSpan )TypeDescriptor.GetConverter( duration ).ConvertFrom( td, cultureInfo, value ); return new AnimationRate( duration ); } else { double speed = 0; speed = ( double )TypeDescriptor.GetConverter( speed ).ConvertFrom( td, cultureInfo, value ); return new AnimationRate( speed ); } } else if( valueType == typeof( double ) ) { return ( AnimationRate )( double )value; } else if( valueType == typeof( int ) ) { return ( AnimationRate )( int )value; } else // TimeSpan { return ( AnimationRate )( TimeSpan )value; } } public override object ConvertTo( ITypeDescriptorContext context, CultureInfo cultureInfo, object value, Type destinationType ) { if( destinationType != null && value is AnimationRate ) { AnimationRate rateValue = ( AnimationRate )value; if( destinationType == typeof( InstanceDescriptor ) ) { MemberInfo mi; if( rateValue.HasDuration ) { mi = typeof( AnimationRate ).GetConstructor( new Type[] { typeof( TimeSpan ) } ); return new InstanceDescriptor( mi, new object[] { rateValue.Duration } ); } else if( rateValue.HasSpeed ) { mi = typeof( AnimationRate ).GetConstructor( new Type[] { typeof( double ) } ); return new InstanceDescriptor( mi, new object[] { rateValue.Speed } ); } } else if( destinationType == typeof( string ) ) { return rateValue.ToString(); } else if( destinationType == typeof( double ) ) { return rateValue.HasSpeed ? rateValue.Speed : 0.0d; } else if( destinationType == typeof( TimeSpan ) ) { return rateValue.HasDuration ? rateValue.Duration : TimeSpan.FromSeconds( 0 ); } } return base.ConvertTo( context, cultureInfo, value, destinationType ); } } }