New test.
[mono.git] / mcs / class / System / System.ComponentModel / EnumConverter.cs
index 46f43f4175755063c252ed9fdde5d9f4c2db3543..9989ca037e8dc6bf72e4fd21f88978538abe3b80 100644 (file)
@@ -1,13 +1,39 @@
 //
-// System.ComponentModel.EnumConverter
+// System.ComponentModel.EnumConverter.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) 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.Reflection;
+using System.ComponentModel.Design.Serialization;
 
 namespace System.ComponentModel
 {
@@ -21,20 +47,29 @@ namespace System.ComponentModel
                        this.type = type;
                }
 
-               [MonoTODO]
                public override bool CanConvertTo (ITypeDescriptorContext context, Type destinationType)
                {
+                       if (destinationType == typeof (InstanceDescriptor))
+                               return true;
+
                        return base.CanConvertTo (context, destinationType);
                }
 
-               [MonoTODO]
                public override object ConvertTo (ITypeDescriptorContext context,
                                                  CultureInfo culture,
                                                  object value,
                                                  Type destinationType)
                {
                        if (destinationType == typeof (string))
-                               return value.ToString ();
+                               if (value != null)
+                                       return Enum.Format (type, value, "G");
+                                       
+                       if (destinationType == typeof (InstanceDescriptor) && type.IsInstanceOfType (value)) {
+                               FieldInfo f = type.GetField (value.ToString ());
+                               if (f == null) throw new ArgumentException (string.Format ("The value '{0}' is not a valid value for the enum '{1}'", value, type));
+                               return new InstanceDescriptor (f, null);
+                       }
+                       
                        return base.ConvertTo (context, culture, value, destinationType);
                }
 
@@ -53,13 +88,7 @@ namespace System.ComponentModel
                        if (val == null)
                                return base.ConvertFrom(context, culture, value);
 
-                       string [] subValues = val.Split (new char [] {','});
-                                       
-                       long longResult = 0;
-                       foreach (string s in subValues)
-                               longResult |= (long) Enum.Parse (type, s, true);
-
-                       return Enum.ToObject (type, longResult);
+                       return Enum.Parse (type, val, true);
                }
 
                public override bool IsValid (ITypeDescriptorContext context, object value)
@@ -86,6 +115,31 @@ namespace System.ComponentModel
                        }
                        return stdValues;
                }
+
+               protected virtual IComparer Comparer {
+                       get { return new EnumConverter.EnumComparer (); }
+               }
+
+               protected Type EnumType {
+                       get { return type; }
+               }
+
+               protected TypeConverter.StandardValuesCollection Values {
+                       get { return stdValues;  }
+                       set { stdValues = value; }
+               }
+
+               private class EnumComparer : IComparer
+               {
+                       int IComparer.Compare (object compareObject1, object compareObject2) 
+                       {
+                               string CompareString1 = (compareObject1 as string);
+                               string CompareString2 = (compareObject2 as string);
+                               if ((CompareString1 == null) || (CompareString2 == null))
+                                       return Collections.Comparer.Default.Compare (compareObject1, compareObject2);
+                               return CultureInfo.InvariantCulture.CompareInfo.Compare (CompareString1, CompareString2);
+                       }
+               }
        }
 
 }