Просмотр исходного кода

* System.dll.sources: Added
System.ComponentModel/ReflectionEventDescriptor.cs,
System.ComponentModel/ReflectionPropertyDescriptor.cs.

svn path=/trunk/mcs/; revision=25474

Lluis Sanchez 22 лет назад
Родитель
Сommit
650c8f9a5b

+ 6 - 0
mcs/class/System/ChangeLog

@@ -1,3 +1,9 @@
+2004-04-14  Lluis Sanchez Gual <[email protected]>
+
+	* System.dll.sources: Added 
+		System.ComponentModel/ReflectionEventDescriptor.cs,
+		System.ComponentModel/ReflectionPropertyDescriptor.cs.
+
 2004-03-17  Ivan Hamilton <[email protected]>
 
 	* System.dll.sources: Added System/System.ComponentModel.Design

+ 93 - 0
mcs/class/System/System.ComponentModel/ReflectionEventDescriptor.cs

@@ -0,0 +1,93 @@
+//
+// System.ComponentModel.EventDescriptor.cs
+//
+// Authors:
+//  Lluis Sanchez Gual ([email protected])
+//
+// (C) Novell, Inc. 2004
+//
+
+using System;
+using System.Runtime.InteropServices;
+using System.Collections;
+using System.Reflection;
+
+namespace System.ComponentModel
+{
+	internal class ReflectionEventDescriptor: EventDescriptor
+	{
+		Hashtable handlers;
+		Type _eventType;
+		Type _componentType;
+		EventInfo _eventInfo;
+		
+		public ReflectionEventDescriptor (EventInfo eventInfo) : base (eventInfo.Name, (Attribute[]) eventInfo.GetCustomAttributes (true))
+		{
+			_eventInfo = eventInfo;
+			_componentType = eventInfo.DeclaringType;
+			_eventType = eventInfo.EventHandlerType;
+		}
+
+		public ReflectionEventDescriptor (Type componentType, EventDescriptor oldEventDescriptor, Attribute[] attrs) : base (oldEventDescriptor, attrs)
+		{
+			_componentType = componentType;
+			_eventType = oldEventDescriptor.EventType;
+		}
+
+		public ReflectionEventDescriptor (Type componentType, string name, Type type, Attribute[] attrs) : base (name, attrs)
+		{
+			_componentType = componentType;
+			_eventType = type;
+		}
+		
+		EventInfo GetEventInfo ()
+		{
+			if (_eventInfo == null) {
+				_eventInfo = _componentType.GetEvent (Name);
+				if (_eventInfo == null)
+					throw new ArgumentException ("Accessor methods for the " + Name + " event are missing");
+			}
+			return _eventInfo;
+		}
+
+		public override void AddEventHandler (object component, System.Delegate value)
+		{
+			if (handlers == null)
+				handlers = new Hashtable ();
+			
+			ArrayList delegates = (ArrayList) handlers [component];
+			if (delegates == null) {
+				delegates = new ArrayList ();
+				handlers [component] = delegates;
+			}
+			
+			if (!delegates.Contains (value))
+				delegates.Add (value);
+		}
+
+		public override void RemoveEventHandler (object component, System.Delegate value)
+		{
+			if (handlers == null) return;
+			
+			ArrayList delegates = (ArrayList) handlers [component];
+			if (delegates == null) return;
+			
+			delegates.Remove (value);
+		}
+
+		public override System.Type ComponentType
+		{ 
+			get { return _componentType; }
+		}
+
+		public override System.Type EventType
+		{ 
+			get { return _eventType; }
+		}
+
+		public override bool IsMulticast 
+		{
+			get { return GetEventInfo().IsMulticast; }
+		}
+	}
+}

+ 179 - 0
mcs/class/System/System.ComponentModel/ReflectionPropertyDescriptor.cs

@@ -0,0 +1,179 @@
+//
+// System.ComponentModel.PropertyDescriptor.cs
+//
+// Author:
+//  Lluis Sanchez Gual ([email protected])
+//
+// (C) Novell, Inc.  
+//
+
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.ComponentModel.Design;
+
+namespace System.ComponentModel
+{
+	internal class ReflectionPropertyDescriptor : PropertyDescriptor
+	{
+		PropertyInfo _member;
+		Type _type;
+		Type _componentType;
+		
+		public ReflectionPropertyDescriptor (Type componentType, PropertyDescriptor oldPropertyDescriptor, Attribute [] attributes)
+		: base (oldPropertyDescriptor, attributes)
+		{
+			_type = oldPropertyDescriptor.PropertyType;
+			_componentType = componentType;
+		}
+							 
+		public ReflectionPropertyDescriptor (Type componentType, string name, Type type, Attribute [] attributes)
+		: base (name, attributes)
+		{
+			_type = type;
+			_componentType = componentType;
+		}
+							 
+		public ReflectionPropertyDescriptor (PropertyInfo info)
+		: base (info.Name, (Attribute[])info.GetCustomAttributes (true))
+		{
+			_member = info;
+			_componentType = _member.DeclaringType;
+		}
+		
+		PropertyInfo GetEventInfo ()
+		{
+			if (_member == null) {
+				_member = _componentType.GetProperty (Name);
+				if (_member == null)
+					throw new ArgumentException ("Accessor methods for the " + Name + " property are missing");
+			}
+			return _member;
+		}		
+
+		public override Type ComponentType 
+		{ 
+			get { return _componentType; }
+		}
+
+		public override bool IsReadOnly 
+		{
+			get
+			{
+				return !_member.CanWrite;
+			}
+		}
+
+		public override Type PropertyType 
+		{
+			get
+			{
+				return _member.PropertyType;
+			}
+		}
+		
+		public override object GetValue (object component)
+		{
+			return _member.GetValue (component, null);
+		}
+		
+		DesignerTransaction CreateTransaction (object obj)
+		{
+			Component com = obj as Component;
+			if (com == null) return null;
+			
+			IDesignerHost dh = (IDesignerHost) com.Site.GetService (typeof(IDesignerHost));
+			DesignerTransaction tran = dh.CreateTransaction ();
+			IComponentChangeService ccs = (IComponentChangeService) com.Site.GetService (typeof(IComponentChangeService));
+			ccs.OnComponentChanging (com, this);
+			return tran;
+		}
+		
+		void EndTransaction (object obj, DesignerTransaction tran, object oldValue, object newValue, bool commit)
+		{
+			if (tran == null) return;
+			
+			if (commit) {
+				Component com = obj as Component;
+				IComponentChangeService ccs = (IComponentChangeService) com.Site.GetService (typeof(IComponentChangeService));
+				ccs.OnComponentChanged (com, this, oldValue, newValue);
+				tran.Commit ();
+			}
+			else
+				tran.Cancel ();
+		}
+		
+		public override void SetValue (object component, object value)
+		{
+			DesignerTransaction tran = CreateTransaction (component);
+			object old = GetValue (component);
+			
+			try
+			{
+				_member.SetValue (component, value, null);
+				EndTransaction (component, tran, old, value, true);
+			}
+			catch
+			{
+				EndTransaction (component, tran, old, value, false);
+				throw;
+			}
+		}
+
+		public override void ResetValue (object component)
+		{
+			DefaultValueAttribute attrib = ((DefaultValueAttribute) Attributes[typeof (DefaultValueAttribute)]);
+			if (attrib != null) {
+				SetValue (component, attrib.Value); 
+			}
+			
+			DesignerTransaction tran = CreateTransaction (component);
+			object old = GetValue (component);
+			
+			try
+			{
+				MethodInfo mi = component.GetType().GetMethod ("Reset" + Name, Type.EmptyTypes);
+				if (mi != null) mi.Invoke (component, null);
+				EndTransaction (component, tran, old, GetValue (component), true);
+			}
+			catch
+			{
+				EndTransaction (component, tran, old, GetValue (component), false);
+				throw;
+			}
+		}
+
+		public override bool CanResetValue (object component)
+		{
+			DefaultValueAttribute attrib = ((DefaultValueAttribute) Attributes[typeof (DefaultValueAttribute)]);
+			if (attrib != null) {
+				object current = GetValue (component);
+				if ((attrib.Value == null || current == null) && attrib.Value != current) return true;
+				return !attrib.Value.Equals (current);
+			}
+			else {
+				MethodInfo mi = component.GetType().GetMethod ("ShouldPersist" + Name, Type.EmptyTypes);
+				if (mi != null) return (bool) mi.Invoke (component, null);
+				mi = component.GetType().GetMethod ("Reset" + Name, Type.EmptyTypes);
+				return (mi != null);
+			}
+		}
+
+		public override bool ShouldSerializeValue (object component)
+		{
+			DefaultValueAttribute attrib = ((DefaultValueAttribute) Attributes[typeof (DefaultValueAttribute)]);
+			if (attrib != null) {
+				object current = GetValue (component);
+				if ((attrib.Value == null || current == null) && attrib.Value != current) return true;
+				return !attrib.Value.Equals (current);
+			}
+			else {
+				MethodInfo mi = component.GetType().GetMethod ("ShouldSerialize" + Name, Type.EmptyTypes);
+				if (mi != null) return (bool) mi.Invoke (component, null);
+				return true;
+			}
+		}
+	}
+}
+

+ 2 - 0
mcs/class/System/System.dll.sources

@@ -241,6 +241,8 @@ System.ComponentModel/ParenthesizePropertyNameAttribute.cs
 System.ComponentModel/PropertyTabAttribute.cs
 System.ComponentModel/ProvidePropertyAttribute.cs
 System.ComponentModel/ReferenceConverter.cs
+System.ComponentModel/ReflectionEventDescriptor.cs
+System.ComponentModel/ReflectionPropertyDescriptor.cs
 System.ComponentModel/SByteConverter.cs
 System.ComponentModel/SingleConverter.cs
 System.ComponentModel/TimeSpanConverter.cs