2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System / System.ComponentModel / TypeConverter.cs
index 491dc6bd656b72939f98151be77d4347f99dfd64..1abb70f4182221bb582dd2ddfac7133de4789a94 100755 (executable)
 //
-// System.ComponentModel.TypeConverter
+// System.ComponentModel.TypeConverter.cs
 //
 // Authors:
-//     Gonzalo Paniagua Javier (gonzalo@ximian.com)
+//   Gonzalo Paniagua Javier (gonzalo@ximian.com)
+//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
 //
-// (C) 2002 Ximian, Inc (http://www.ximian.com)
+// (C) 2002/2003 Ximian, Inc (http://www.ximian.com)
+// (C) 2003 Andreas Nahr
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
 using System;
 using System.Collections;
 using System.Globalization;
+using System.Runtime.InteropServices;
 
-namespace System.ComponentModel {
-
-public class TypeConverter
+namespace System.ComponentModel
 {
-       public TypeConverter ()
-       {
-       }
-
-       public bool CanConvertFrom (Type sourceType)
-       {
-               return CanConvertFrom (null, sourceType);
-       }
-       
-       [MonoTODO]
-       public virtual bool CanConvertFrom (ITypeDescriptorContext context, Type sourceType)
-       {
-               throw new NotImplementedException ();
-       }
-
-       public bool CanConvertTo (Type destinationType)
-       {
-               return CanConvertTo (null, destinationType);
-       }
-       
-       public virtual bool CanConvertTo (ITypeDescriptorContext context, Type destinationType)
-       {
-               return (destinationType == typeof (string));
-       }
-
-       public object ConvertFrom (object o)
-       {
-               return ConvertFrom (null, CultureInfo.CurrentCulture, o);
-       }
-
-       [MonoTODO]
-       public virtual object ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value)
-       {
-               throw new NotImplementedException ();
-       }
-       
-       public virtual object ConvertFromInvariantString (string text)
+       [ComVisible (true)]
+       public class TypeConverter
        {
-               return ConvertFromInvariantString (null, text); 
-       }
-
-       [MonoTODO]
-       public virtual object ConvertFromInvariantString (ITypeDescriptorContext context, string text)
-       {
-               throw new NotImplementedException ();
-       }
-
-       public object ConvertFromString (string s)
-       {
-               return ConvertFrom (s);
-       }
-
-       public object ConvertFromString (ITypeDescriptorContext context, string text)
-       {
-               return ConvertFromString (context, CultureInfo.CurrentCulture, text);
-       }
-
-       [MonoTODO]
-       public object ConvertFromString (ITypeDescriptorContext context, CultureInfo culture, string text)
-       {
-               throw new NotImplementedException ();
-       }
-
-       public object ConvertTo (object value, Type destinationType)
-       {
-               return ConvertTo (null, null, value, destinationType);
-       }
+               public bool CanConvertFrom (Type sourceType)
+               {
+                       return CanConvertFrom (null, sourceType);
+               }
 
-       public virtual object ConvertTo (ITypeDescriptorContext context,
-                                        CultureInfo culture,
-                                        object value,
-                                        Type destinationType)
-       {
-               // context? culture?
-               if (destinationType == null)
-                       throw new ArgumentNullException ("destinationType");
+               public virtual bool CanConvertFrom (ITypeDescriptorContext context, Type sourceType)
+               {
+                       return false;
+               }
 
-               if (destinationType == typeof (string)) {
-                       if (value != null)
-                               return value.ToString();
-                       return String.Empty;
+               public bool CanConvertTo (Type destinationType)
+               {
+                       return CanConvertTo (null, destinationType);
                }
 
-               throw new NotSupportedException ("Conversion not supported");
-       }
+               public virtual bool CanConvertTo (ITypeDescriptorContext context, Type destinationType)
+               {
+                       return (destinationType == typeof (string));
+               }
 
-       public string ConvertToInvariantString (object value)
-       {
-               return ConvertToInvariantString (null, value);
-       }
+               public object ConvertFrom (object o)
+               {
+                       return ConvertFrom (null, CultureInfo.CurrentCulture, o);
+               }
 
-       [MonoTODO]
-       public string ConvertToInvariantString (ITypeDescriptorContext context, object value)
-       {
-               throw new NotImplementedException ();
-       }
+               public virtual object ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value)
+               {
+                       throw new NotSupportedException (this.ToString() + " cannot be created from '" +
+                                                        value.GetType().ToString() + "'");
+               }
 
-       public string ConvertToString (object value)
-       {
-               return (string) ConvertTo (null, CultureInfo.CurrentCulture, value, typeof (string));
-       }
+               public object ConvertFromInvariantString (string text)
+               {
+                       return ConvertFromInvariantString (null, text); 
+               }
 
-       public string ConvertToString (ITypeDescriptorContext context, object value)
-       {
-               return (string) ConvertTo (context, CultureInfo.CurrentCulture, value, typeof (string));
-       }
+               public object ConvertFromInvariantString (ITypeDescriptorContext context, string text)
+               {
+                       return ConvertFromString (context, CultureInfo.InvariantCulture, text);
+               }
 
-       public string ConvertToString (ITypeDescriptorContext context, CultureInfo culture, object value)
-       {
-               return (string) ConvertTo (context, culture, value, typeof (string));
-       }
+               public object ConvertFromString (string text)
+               {
+                       return ConvertFrom (text);
+               }
 
-       [MonoTODO]
-       public object CreateInstance (IDictionary propertyValues)
-       {
-               throw new NotImplementedException ();
-       }
+               public object ConvertFromString (ITypeDescriptorContext context, string text)
+               {
+                       return ConvertFromString (context, CultureInfo.CurrentCulture, text);
+               }
 
-       [MonoTODO]
-       protected Exception GetConvertFromException (object value)
-       {
-               throw new NotImplementedException ();
-       }
+               public object ConvertFromString (ITypeDescriptorContext context, CultureInfo culture, string text)
+               {
+                       return ConvertFrom (context, culture, text);
+               }
 
-       [MonoTODO]
-       protected Exception GetConvertToException (object value, Type destinationType)
-       {
-               throw new NotImplementedException ();
-       }
+               public object ConvertTo (object value, Type destinationType)
+               {
+                       return ConvertTo (null, null, value, destinationType);
+               }
 
-       [MonoTODO]
-       public virtual object CreateInstance (ITypeDescriptorContext context, IDictionary propertyValues)
-       {
-               throw new NotImplementedException ();
-       }
+               public virtual object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value,
+                                                Type destinationType)
+               {
+                       // context? culture?
+                       if (destinationType == null)
+                               throw new ArgumentNullException ("destinationType");
+
+                       if (destinationType == typeof (string)) {
+                               if (value != null)
+                                       return value.ToString();
+                               return String.Empty;
+                       }
 
-       [MonoTODO]
-       public bool GetCreateInstanceSupported ()
-       {
-               throw new NotImplementedException ();
-       }
+                       throw new NotSupportedException ("Conversion not supported");
+               }
 
-       [MonoTODO]
-       public virtual bool GetCreateInstanceSupported (ITypeDescriptorContext context)
-       {
-               throw new NotImplementedException ();
-       }
+               public string ConvertToInvariantString (object value)
+               {
+                       return ConvertToInvariantString (null, value);
+               }
 
-       public PropertyDescriptorCollection GetProperties (object value)
-       {
-               return GetProperties (null, value);
-       }
+               public string ConvertToInvariantString (ITypeDescriptorContext context, object value)
+               {
+                       return (string) ConvertTo (context, CultureInfo.InvariantCulture, value, typeof (string));
+               }
 
-       public PropertyDescriptorCollection GetProperties (ITypeDescriptorContext context, object value)
-       {
-               return GetProperties (context, value, null);
-       }
+               public string ConvertToString (object value)
+               {
+                       return (string) ConvertTo (null, CultureInfo.CurrentCulture, value, typeof (string));
+               }
 
-       public virtual PropertyDescriptorCollection GetProperties (ITypeDescriptorContext context,
-                                                                  object value,
-                                                                  Attribute[] attributes)
-       {
-               return null;
-       }
+               public string ConvertToString (ITypeDescriptorContext context, object value)
+               {
+                       return (string) ConvertTo (context, CultureInfo.CurrentCulture, value, typeof (string));
+               }
 
-       public bool GetPropertiesSupported ()
-       {
-               return GetPropertiesSupported (null);
-       }
+               public string ConvertToString (ITypeDescriptorContext context, CultureInfo culture, object value)
+               {
+                       return (string) ConvertTo (context, culture, value, typeof (string));
+               }
 
-       public virtual bool GetPropertiesSupported (ITypeDescriptorContext context)
-       {
-               return false;
-       }
+               protected Exception GetConvertFromException (object value)
+               {
+                       throw new NotSupportedException (this.ToString() + " cannot convert from '" + 
+                                                       value.GetType().ToString() + "'");
+               }
 
-       public ICollection GetStandardValues ()
-       {
-               return GetStandardValues (null);
-       }
+               protected Exception GetConvertToException (object value, Type destinationType)
+               {
+                       throw new NotSupportedException (this.ToString() + " cannot convert from '" + 
+                                                       value.GetType().ToString() + "' to '" + destinationType.ToString() + "'");
+               }
 
-       public virtual StandardValuesCollection GetStandardValues (ITypeDescriptorContext context)
-       {
-               return null;
-       }
+               public object CreateInstance (IDictionary propertyValues)
+               {
+                       return CreateInstance (null, propertyValues);
+               }
 
-       public bool GetStandardValuesExclusive ()
-       {
-               return GetStandardValuesExclusive (null);
-       }
+               public virtual object CreateInstance (ITypeDescriptorContext context, IDictionary propertyValues)
+               {
+                       return null;
+               }
 
-       public virtual bool GetStandardValuesExclusive (ITypeDescriptorContext context)
-       {
-               return false;
-       }
+               public bool GetCreateInstanceSupported ()
+               {
+                       return GetCreateInstanceSupported (null);
+               }
 
-       public bool GetStandardValuesSupported ()
-       {
-               return GetStandardValuesSupported (null);
-       }
+               public virtual bool GetCreateInstanceSupported (ITypeDescriptorContext context)
+               {
+                       return false;
+               }
 
-       public virtual bool GetStandardValuesSupported (ITypeDescriptorContext context)
-       {
-               return false;
-       }
+               public PropertyDescriptorCollection GetProperties (object value)
+               {
+                       return GetProperties (null, value);
+               }
 
-       public bool IsValid (object value)
-       {
-               return IsValid (null, value);
-       }
+               public PropertyDescriptorCollection GetProperties (ITypeDescriptorContext context, object value)
+               {
+                       return GetProperties (context, value, null);
+               }
 
-       public virtual bool IsValid (ITypeDescriptorContext context, object value)
-       {
-               return true;
-       }
+               public virtual PropertyDescriptorCollection GetProperties (ITypeDescriptorContext context,
+                                                                          object value, Attribute[] attributes)
+               {
+                       return null;
+               }
 
-       public class StandardValuesCollection : ICollection, IEnumerable
-       {
-               private ICollection values;
-               
-               public StandardValuesCollection (ICollection values)
+               public bool GetPropertiesSupported ()
                {
-                       this.values = values;
+                       return GetPropertiesSupported (null);
                }
 
-               public void CopyTo (Array array, int index)
+               public virtual bool GetPropertiesSupported (ITypeDescriptorContext context)
                {
-                       values.CopyTo (array, index);
+                       return false;
                }
 
-               public IEnumerator GetEnumerator ()
+               public ICollection GetStandardValues ()
                {
-                       return values.GetEnumerator ();
+                       return GetStandardValues (null);
                }
 
-               bool ICollection.IsSynchronized
+               public virtual StandardValuesCollection GetStandardValues (ITypeDescriptorContext context)
                {
-                       get { return false; }
+                       return null;
                }
 
-               object ICollection.SyncRoot
+               public bool GetStandardValuesExclusive ()
                {
-                       get { return null; }
+                       return GetStandardValuesExclusive (null);
                }
 
-               int ICollection.Count
+               public virtual bool GetStandardValuesExclusive (ITypeDescriptorContext context)
                {
-                       get { return this.Count; }
+                       return false;
                }
 
-               public int Count
+               public bool GetStandardValuesSupported ()
                {
-                       get { return values.Count; }
+                       return GetStandardValuesSupported (null);
                }
 
-               public object this [int index]
+               public virtual bool GetStandardValuesSupported (ITypeDescriptorContext context)
                {
-                       get { return ((IList) values) [index]; }
+                       return false;
                }
-       }
 
-       protected abstract class SimplePropertyDescriptor : PropertyDescriptor
-       {
-               private Type componentType;
-               private Type propertyType;
-               
-               public SimplePropertyDescriptor (Type componentType,
-                                                string name,
-                                                Type propertyType) :
-                       this (componentType, name, propertyType, new Attribute [0])
+               public bool IsValid (object value)
                {
+                       return IsValid (null, value);
                }
 
-               public SimplePropertyDescriptor (Type componentType,
-                                                string name,
-                                                Type propertyType,
-                                                Attribute [] attributes) : base (name, attributes)
+               public virtual bool IsValid (ITypeDescriptorContext context, object value)
                {
-                       this.componentType = componentType;
-                       this.propertyType = propertyType;
+                       return true;
                }
 
-               public override Type ComponentType
+               protected PropertyDescriptorCollection SortProperties (PropertyDescriptorCollection props, string[] names)
                {
-                       get { return componentType; }
+                       props.Sort (names);
+                       return props; 
                }
 
-               public override Type PropertyType
+               public class StandardValuesCollection : ICollection, IEnumerable
                {
-                       get { return propertyType; }
+                       private ICollection values;
+
+                       public StandardValuesCollection (ICollection values)
+                       {
+                               this.values = values;
+                       }
+
+                       public void CopyTo (Array array, int index)
+                       {
+                               values.CopyTo (array, index);
+                       }
+
+                       public IEnumerator GetEnumerator ()
+                       {
+                               return values.GetEnumerator ();
+                       }
+
+                       bool ICollection.IsSynchronized {
+                               get { return false; }
+                       }
+
+                       object ICollection.SyncRoot {
+                               get { return null; }
+                       }
+
+                       int ICollection.Count {
+                               get { return this.Count; }
+                       }
+
+                       public int Count {
+                               get { return values.Count; }
+                       }
+
+                       public object this [int index] {
+                               get { return ((IList) values) [index]; }
+                       }
                }
 
-               public override bool IsReadOnly
+               protected abstract class SimplePropertyDescriptor : PropertyDescriptor
                {
-                       get {
-                               return Attributes.Contains (ReadOnlyAttribute.Yes);
+                       private Type componentType;
+                       private Type propertyType;
+
+                       public SimplePropertyDescriptor (Type componentType,
+                                                        string name,
+                                                        Type propertyType) :
+                               this (componentType, name, propertyType, null)
+                       {
+                       }
+
+                       public SimplePropertyDescriptor (Type componentType,
+                                                        string name,
+                                                        Type propertyType,
+                                                        Attribute [] attributes) : base (name, attributes)
+                       {
+                               this.componentType = componentType;
+                               this.propertyType = propertyType;
+                       }
+
+                       public override Type ComponentType {
+                               get { return componentType; }
                        }
+
+                       public override Type PropertyType {
+                               get { return propertyType; }
+                       }
+
+                       public override bool IsReadOnly {
+                               get { return Attributes.Contains (ReadOnlyAttribute.Yes); }
+                       }
+
+                       public override bool ShouldSerializeValue (object component)
+                       {
+                                       return false; 
+                       }
+
+                       public override bool CanResetValue (object component)
+                       {
+                               DefaultValueAttribute Attrib = ((DefaultValueAttribute) Attributes[typeof (DefaultValueAttribute)]);
+                               if (Attrib == null) {
+                                       return false; 
+                               }
+                               return (Attrib.Value == GetValue (component)); 
+                       }
+
+                       public override void ResetValue (object component)
+                       {
+                               DefaultValueAttribute Attrib = ((DefaultValueAttribute) Attributes[typeof (DefaultValueAttribute)]);
+                               if (Attrib != null) {
+                                       SetValue (component, Attrib.Value); 
+                               }
+                       } 
                }
        }
 }
-}