Ver código fonte

2002-07-28 Gonzalo Paniagua Javier <[email protected]>

	* DerivedPropertyDescriptor.cs: New file.

	* PropertyDescriptorCollection.cs: almost fully implemented.

	* TypeDescriptor.cs: implemented a couple of GetProperties ().

svn path=/trunk/mcs/; revision=6223
Gonzalo Paniagua Javier 23 anos atrás
pai
commit
a57a294aa8

+ 7 - 0
mcs/class/System/System.ComponentModel/ChangeLog

@@ -1,3 +1,10 @@
+2002-07-28  Gonzalo Paniagua Javier <[email protected]>
+
+	* DerivedPropertyDescriptor.cs: New file. Internal class.
+
+	* PropertyDescriptorCollection.cs: almost fully implemented.
+
+	* TypeDescriptor.cs: implemented a couple of GetProperties ().
 
 Wed Jul 24 13:14:30 CEST 2002 Paolo Molaro <[email protected]>
 

+ 80 - 0
mcs/class/System/System.ComponentModel/DerivedPropertyDescriptor.cs

@@ -0,0 +1,80 @@
+//
+// System.ComponentModel.DerivedPropertyDescriptor
+//
+// Authors:
+//	Gonzalo Paniagua Javier ([email protected])
+//
+// (C) 2002 Ximian, Inc (http://www.ximian.com)
+//
+using System;
+using System.Reflection;
+
+namespace System.ComponentModel
+{
+	class DerivedPropertyDescriptor : PropertyDescriptor
+	{
+		bool readOnly;
+		Type componentType;
+		Type propertyType;
+		PropertyInfo prop;
+
+		protected DerivedPropertyDescriptor (string name, Attribute [] attrs)
+			: base (name, attrs)
+		{
+		}
+
+		public DerivedPropertyDescriptor (string name, Attribute [] attrs, int dummy)
+			: this (name, attrs)
+		{
+		}
+
+		public void SetReadOnly (bool value)
+		{
+			readOnly = value;
+		}
+		
+		public void SetComponentType (Type type)
+		{
+			componentType = type;
+		}
+
+		public void SetPropertyType (Type type)
+		{
+			propertyType = type;
+		}
+
+		public override object GetValue (object component)
+		{
+			if (prop == null)
+				prop = componentType.GetProperty (Name);
+
+			return prop.GetValue (component, null);
+		}
+
+		public override Type ComponentType
+		{
+			get {
+				return componentType;
+			}
+
+		}
+
+		public override bool IsReadOnly
+		{
+			get {
+				return readOnly;
+				
+			}
+
+		}
+
+		public override Type PropertyType
+		{
+			get {
+				return propertyType;
+			}
+
+		}
+	}
+}
+

+ 283 - 238
mcs/class/System/System.ComponentModel/PropertyDescriptorCollection.cs

@@ -1,238 +1,283 @@
-//
-// System.ComponentModel.PropertyDescriptorCollection.cs
-//
-// Author:
-//   Rodrigo Moya ([email protected])
-//
-// (C) Rodrigo Moya, 2002
-//
-
-using System.Collections;
-
-namespace System.ComponentModel
-{
-	/// <summary>
-	/// Represents a collection of PropertyDescriptor objects.
-	/// </summary>
-	public class PropertyDescriptorCollection : IList, ICollection,
-		IEnumerable, IDictionary
-	{
-		[MonoTODO]
-		public PropertyDescriptorCollection (PropertyDescriptor[] properties) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		public int Add (PropertyDescriptor value)
-		{
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		int IList.Add (object value)
-		{
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		void IDictionary.Add (object key, object value)
-		{
-			throw new NotImplementedException ();
-		}
-		
-		[MonoTODO]
-		public void Clear () {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		void IList.Clear () {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		void IDictionary.Clear () {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		public bool Contains (PropertyDescriptor value) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		bool IList.Contains (object value) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		bool IDictionary.Contains (object value) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		public void CopyTo (Array array, int index) {
-			throw new NotImplementedException ();
-		}
-
-		public virtual PropertyDescriptor Find (string name, bool ignoreCase) {
-			throw new NotImplementedException ();
-		}
-
-		public virtual IEnumerator GetEnumerator () {
-			throw new NotImplementedException ();
-		}
-
-		IDictionaryEnumerator IDictionary.GetEnumerator () {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		public int IndexOf (PropertyDescriptor value) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		int IList.IndexOf (object value) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		public void Insert (int index, PropertyDescriptor value) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		void IList.Insert (int index, object value) {
-			throw new NotImplementedException ();
-		}
-
-		public void Remove (PropertyDescriptor value) {
-			throw new NotImplementedException ();
-		}
-
-		void IDictionary.Remove (object value) {
-			throw new NotImplementedException ();
-		}
-
-		void IList.Remove (object value) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		public void RemoveAt (int index) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		void IList.RemoveAt (int index) {
-			throw new NotImplementedException ();
-		}
-
-		public virtual PropertyDescriptorCollection Sort () {
-			throw new NotImplementedException ();
-		}
-
-		public virtual PropertyDescriptorCollection Sort (IComparer ic) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		protected void InternalSort (IComparer ic) {
-			throw new NotImplementedException ();
-		}
-
-		[MonoTODO]
-		protected void InternalSort (string[] order) {
-			throw new NotImplementedException ();
-		}
-		
-		public static readonly PropertyDescriptorCollection Empty;
-
-		public bool IsFixedSize {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();	
-			}
-		}
-
-		public bool IsReadOnly {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();	
-			}
-		}
-
-		public bool IsSynchronized {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();	
-			}
-		}
-
-		public ICollection Keys {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();
-			}
-		}
-
-		public ICollection Values {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();
-			}
-		}
-		
-		public int Count {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();
-			}
-		}
-
-		object ICollection.SyncRoot {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();
-			}
-		}
-		
-		public object this[object key] {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();
-			}
-			[MonoTODO]
-			set {
-				throw new NotImplementedException ();
-			}
-		}
-		
-		[MonoTODO]
-		public virtual PropertyDescriptor this[string s] {
-			get {
-				throw new NotImplementedException ();
-			}
-		}
-
-		object IList.this [int index] {
-			[MonoTODO]
-			get {
-				throw new NotImplementedException ();
-			}
-
-			[MonoTODO]
-			set {
-				throw new NotImplementedException ();
-			}
-		}
-
-		[MonoTODO]
-		public virtual PropertyDescriptor this[int index] {
-			get {
-				throw new NotImplementedException ();
-			}
-		}
-	}
-}
+//
+// System.ComponentModel.PropertyDescriptorCollection.cs
+//
+// Authors:
+// 	Rodrigo Moya ([email protected])
+// 	Gonzalo Paniagua Javier ([email protected])
+//
+// (C) Rodrigo Moya, 2002
+// (c) 2002 Ximian, Inc. (http://www.ximian.com)
+//
+
+using System.Collections;
+
+namespace System.ComponentModel
+{
+	/// <summary>
+	/// Represents a collection of PropertyDescriptor objects.
+	/// </summary>
+	public class PropertyDescriptorCollection : IList, ICollection, IEnumerable, IDictionary
+	{
+		public static readonly PropertyDescriptorCollection Empty =
+						new PropertyDescriptorCollection (null);
+
+		ArrayList properties;
+		bool readOnly;
+
+		public PropertyDescriptorCollection (PropertyDescriptor[] properties)
+		{
+			this.properties = new ArrayList ();
+			if (properties == null)
+				return;
+
+			foreach (PropertyDescriptor p in properties)
+				this.properties.Add (p);
+		}
+
+		public int Add (PropertyDescriptor value)
+		{
+			properties.Add (value);
+			return properties.Count - 1;
+		}
+
+		int IList.Add (object value)
+		{
+			return Add ((PropertyDescriptor) value);
+		}
+
+		void IDictionary.Add (object key, object value)
+		{
+			Add ((PropertyDescriptor) value);
+		}
+		
+		public void Clear ()
+		{
+			properties.Clear ();
+		}
+
+		void IList.Clear ()
+		{
+			Clear ();
+		}
+
+		void IDictionary.Clear ()
+		{
+			Clear ();
+		}
+
+		public bool Contains (PropertyDescriptor value)
+		{
+			return properties.Contains (value);
+		}
+
+		bool IList.Contains (object value)
+		{
+			return Contains ((PropertyDescriptor) value);
+		}
+
+		bool IDictionary.Contains (object value)
+		{
+			return Contains ((PropertyDescriptor) value);
+		}
+
+		public void CopyTo (Array array, int index)
+		{
+			properties.CopyTo (array, index);
+		}
+
+		public virtual PropertyDescriptor Find (string name, bool ignoreCase)
+		{
+			foreach (PropertyDescriptor p in properties) {
+				if (0 == String.Compare (name, p.Name, ignoreCase))
+					return p;
+			}
+			return null;
+		}
+
+		public virtual IEnumerator GetEnumerator ()
+		{
+			return properties.GetEnumerator ();
+		}
+
+		[MonoTODO]
+		IDictionaryEnumerator IDictionary.GetEnumerator ()
+		{
+			throw new NotImplementedException ();
+		}
+
+		public int IndexOf (PropertyDescriptor value)
+		{
+			return properties.IndexOf (value);
+		}
+
+		int IList.IndexOf (object value)
+		{
+			return IndexOf ((PropertyDescriptor) value);
+		}
+
+		[MonoTODO]
+		public void Insert (int index, PropertyDescriptor value)
+		{
+			throw new NotImplementedException ();
+		}
+
+		void IList.Insert (int index, object value)
+		{
+			Insert (index, (PropertyDescriptor) value);
+		}
+
+		public void Remove (PropertyDescriptor value)
+		{
+			properties.Remove (value);
+		}
+
+		void IDictionary.Remove (object value)
+		{
+			Remove ((PropertyDescriptor) value);
+		}
+
+		void IList.Remove (object value)
+		{
+			Remove ((PropertyDescriptor) value);
+		}
+
+		public void RemoveAt (int index)
+		{
+			properties.RemoveAt (index);
+		}
+
+		void IList.RemoveAt (int index)
+		{
+			RemoveAt (index);
+		}
+
+		[MonoTODO]
+		public virtual PropertyDescriptorCollection Sort ()
+		{
+			throw new NotImplementedException ();
+		}
+
+		[MonoTODO]
+		public virtual PropertyDescriptorCollection Sort (IComparer ic)
+		{
+			throw new NotImplementedException ();
+		}
+
+		[MonoTODO]
+		protected void InternalSort (IComparer ic)
+		{
+			throw new NotImplementedException ();
+		}
+
+		[MonoTODO]
+		protected void InternalSort (string [] order)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		bool IDictionary.IsFixedSize
+		{
+			get {
+				return !readOnly;
+			}
+		}
+
+		bool IList.IsFixedSize
+		{
+			get {
+				return !readOnly;
+			}
+		}
+
+		public bool IsReadOnly
+		{
+			get {
+				return readOnly;
+			}
+		}
+
+		public bool IsSynchronized
+		{
+			get {
+				return false;
+			}
+		}
+
+		public int Count
+		{
+			get {
+				return properties.Count;
+			}
+		}
+
+		object ICollection.SyncRoot
+		{
+			get {
+				return null;
+			}
+		}
+		
+		ICollection IDictionary.Keys
+		{
+			get {
+				string [] keys = new string [properties.Count];
+				int i = 0;
+				foreach (PropertyDescriptor p in properties)
+					keys [i++] = p.Name;
+				return keys;
+			}
+		}
+		
+		ICollection IDictionary.Values
+		{
+			get {
+				return (ICollection) properties.Clone ();
+			}
+		}
+		
+		object IDictionary.this [object key]
+		{
+			get {
+				if (!(key is string))
+					return null;
+				return this [(string) key];
+			}
+			set {
+				if (!(key is string) || (value as PropertyDescriptor) == null)
+					throw new ArgumentException ();
+
+				int idx = properties.IndexOf (value);
+				if (idx == -1)
+					Add ((PropertyDescriptor) value);
+				else
+					properties [idx] = value;
+
+			}
+		}
+		public virtual PropertyDescriptor this [string s]
+		{
+			get {
+				return Find (s, false);
+			}
+		}
+
+		object IList.this [int index]
+		{
+			get {
+				return properties [index];
+			}
+
+			set {
+				properties [index] = value;
+			}
+		}
+
+		public virtual PropertyDescriptor this [int index]
+		{
+			get {
+				return (PropertyDescriptor) properties [index];
+			}
+		}
+	}
+}
+

+ 16 - 4
mcs/class/System/System.ComponentModel/TypeDescriptor.cs

@@ -227,10 +227,9 @@ public sealed class TypeDescriptor
 		throw new NotImplementedException ();
 	}
 
-	[MonoTODO]
 	public static PropertyDescriptorCollection GetProperties (object component)
 	{
-		throw new NotImplementedException ();
+		return GetProperties (component, false);
 	}
 
 	[MonoTODO]
@@ -245,10 +244,23 @@ public sealed class TypeDescriptor
 		throw new NotImplementedException ();
 	}
 
-	[MonoTODO]
+	[MonoTODO("noCustomTypeDesc")]
 	public static PropertyDescriptorCollection GetProperties (object component, bool noCustomTypeDesc)
 	{
-		throw new NotImplementedException ();
+		Type type = component.GetType ();
+		PropertyInfo [] props = type.GetProperties ();
+		DerivedPropertyDescriptor [] propsDescriptor = new DerivedPropertyDescriptor [props.Length];
+		int i = 0;
+		foreach (PropertyInfo prop in props) {
+			DerivedPropertyDescriptor propDescriptor = new DerivedPropertyDescriptor (prop.Name,
+												  null, 0);
+			propDescriptor.SetReadOnly (!prop.CanWrite);
+			propDescriptor.SetComponentType (type);
+			propDescriptor.SetPropertyType (prop.PropertyType);
+			propsDescriptor [i++] = propDescriptor;
+		}
+		
+		return new PropertyDescriptorCollection (propsDescriptor);
 	}
 
 	[MonoTODO]