2 // System.ComponentModel.TypeConverter.cs
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 // Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 // (C) 2002/2003 Ximian, Inc (http://www.ximian.com)
9 // (C) 2003 Andreas Nahr
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Collections;
35 using System.ComponentModel.Design.Serialization;
36 using System.Globalization;
37 using System.Runtime.InteropServices;
39 namespace System.ComponentModel
42 public class TypeConverter
44 public bool CanConvertFrom (Type sourceType)
46 return CanConvertFrom (null, sourceType);
49 public virtual bool CanConvertFrom (ITypeDescriptorContext context, Type sourceType)
51 if (sourceType == typeof (InstanceDescriptor)) {
58 public bool CanConvertTo (Type destinationType)
60 return CanConvertTo (null, destinationType);
63 public virtual bool CanConvertTo (ITypeDescriptorContext context, Type destinationType)
65 return (destinationType == typeof (string));
68 public object ConvertFrom (object o)
70 return ConvertFrom (null, CultureInfo.CurrentCulture, o);
73 public virtual object ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value)
75 if (value is InstanceDescriptor) {
76 return ((InstanceDescriptor) value).Invoke ();
79 throw new NotSupportedException (this.ToString() + " cannot be created from '" +
80 value == null ? "null" : value.GetType().ToString() + "'");
83 public object ConvertFromInvariantString (string text)
85 return ConvertFromInvariantString (null, text);
88 public object ConvertFromInvariantString (ITypeDescriptorContext context, string text)
90 return ConvertFromString (context, CultureInfo.InvariantCulture, text);
93 public object ConvertFromString (string text)
95 return ConvertFrom (text);
98 public object ConvertFromString (ITypeDescriptorContext context, string text)
100 return ConvertFromString (context, CultureInfo.CurrentCulture, text);
103 public object ConvertFromString (ITypeDescriptorContext context, CultureInfo culture, string text)
105 return ConvertFrom (context, culture, text);
108 public object ConvertTo (object value, Type destinationType)
110 return ConvertTo (null, null, value, destinationType);
113 public virtual object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value,
114 Type destinationType)
117 if (destinationType == null)
118 throw new ArgumentNullException ("destinationType");
120 if (destinationType == typeof (string)) {
122 return value.ToString();
126 throw new NotSupportedException ("Conversion not supported");
129 public string ConvertToInvariantString (object value)
131 return ConvertToInvariantString (null, value);
134 public string ConvertToInvariantString (ITypeDescriptorContext context, object value)
136 return (string) ConvertTo (context, CultureInfo.InvariantCulture, value, typeof (string));
139 public string ConvertToString (object value)
141 return (string) ConvertTo (null, CultureInfo.CurrentCulture, value, typeof (string));
144 public string ConvertToString (ITypeDescriptorContext context, object value)
146 return (string) ConvertTo (context, CultureInfo.CurrentCulture, value, typeof (string));
149 public string ConvertToString (ITypeDescriptorContext context, CultureInfo culture, object value)
151 return (string) ConvertTo (context, culture, value, typeof (string));
154 protected Exception GetConvertFromException (object value)
156 throw new NotSupportedException (this.ToString() + " cannot convert from '" +
157 value.GetType().ToString() + "'");
160 protected Exception GetConvertToException (object value, Type destinationType)
162 throw new NotSupportedException (this.ToString() + " cannot convert from '" +
163 value.GetType().ToString() + "' to '" + destinationType.ToString() + "'");
166 public object CreateInstance (IDictionary propertyValues)
168 return CreateInstance (null, propertyValues);
171 public virtual object CreateInstance (ITypeDescriptorContext context, IDictionary propertyValues)
176 public bool GetCreateInstanceSupported ()
178 return GetCreateInstanceSupported (null);
181 public virtual bool GetCreateInstanceSupported (ITypeDescriptorContext context)
186 public PropertyDescriptorCollection GetProperties (object value)
188 return GetProperties (null, value);
191 public PropertyDescriptorCollection GetProperties (ITypeDescriptorContext context, object value)
193 return GetProperties (context, value, new Attribute[1] { BrowsableAttribute.Yes });
196 public virtual PropertyDescriptorCollection GetProperties (ITypeDescriptorContext context,
197 object value, Attribute[] attributes)
202 public bool GetPropertiesSupported ()
204 return GetPropertiesSupported (null);
207 public virtual bool GetPropertiesSupported (ITypeDescriptorContext context)
212 public ICollection GetStandardValues ()
214 return GetStandardValues (null);
217 public virtual StandardValuesCollection GetStandardValues (ITypeDescriptorContext context)
222 public bool GetStandardValuesExclusive ()
224 return GetStandardValuesExclusive (null);
227 public virtual bool GetStandardValuesExclusive (ITypeDescriptorContext context)
232 public bool GetStandardValuesSupported ()
234 return GetStandardValuesSupported (null);
237 public virtual bool GetStandardValuesSupported (ITypeDescriptorContext context)
242 public bool IsValid (object value)
244 return IsValid (null, value);
247 public virtual bool IsValid (ITypeDescriptorContext context, object value)
252 protected PropertyDescriptorCollection SortProperties (PropertyDescriptorCollection props, string[] names)
258 public class StandardValuesCollection : ICollection, IEnumerable
260 private ICollection values;
262 public StandardValuesCollection (ICollection values)
264 this.values = values;
267 public void CopyTo (Array array, int index)
269 values.CopyTo (array, index);
272 public IEnumerator GetEnumerator ()
274 return values.GetEnumerator ();
277 bool ICollection.IsSynchronized {
278 get { return false; }
281 object ICollection.SyncRoot {
285 int ICollection.Count {
286 get { return this.Count; }
290 get { return values.Count; }
293 public object this [int index] {
294 get { return ((IList) values) [index]; }
298 protected abstract class SimplePropertyDescriptor : PropertyDescriptor
300 private Type componentType;
301 private Type propertyType;
303 public SimplePropertyDescriptor (Type componentType,
306 this (componentType, name, propertyType, null)
310 public SimplePropertyDescriptor (Type componentType,
313 Attribute [] attributes) : base (name, attributes)
315 this.componentType = componentType;
316 this.propertyType = propertyType;
319 public override Type ComponentType {
320 get { return componentType; }
323 public override Type PropertyType {
324 get { return propertyType; }
327 public override bool IsReadOnly {
328 get { return Attributes.Contains (ReadOnlyAttribute.Yes); }
331 public override bool ShouldSerializeValue (object component)
336 public override bool CanResetValue (object component)
338 DefaultValueAttribute Attrib = ((DefaultValueAttribute) Attributes[typeof (DefaultValueAttribute)]);
339 if (Attrib == null) {
342 return (Attrib.Value == GetValue (component));
345 public override void ResetValue (object component)
347 DefaultValueAttribute Attrib = ((DefaultValueAttribute) Attributes[typeof (DefaultValueAttribute)]);
348 if (Attrib != null) {
349 SetValue (component, Attrib.Value);