X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.ComponentModel%2FEventHandlerList.cs;h=7dabcb3e2c3abf3a84a19eae4abd5031ecc412b5;hb=48d09aa40cba4b63e7282ed0f0492d6ff952779f;hp=a1d316b1685e982a6fa628707a02631be6519a6d;hpb=5bbfa8860b090e465a3aa45edeb9c94481ef1a22;p=mono.git diff --git a/mcs/class/System/System.ComponentModel/EventHandlerList.cs b/mcs/class/System/System.ComponentModel/EventHandlerList.cs index a1d316b1685..7dabcb3e2c3 100644 --- a/mcs/class/System/System.ComponentModel/EventHandlerList.cs +++ b/mcs/class/System/System.ComponentModel/EventHandlerList.cs @@ -42,18 +42,15 @@ namespace System.ComponentModel { // Longer description // public sealed class EventHandlerList : IDisposable { - Hashtable table; - public EventHandlerList () { + head = null; } public Delegate this [object key] { get { - if (table == null) - return null; - - return table [key] as Delegate; + ListNode entry = FindEntry (key); + return entry == null ? null : entry.value; } set { @@ -63,28 +60,64 @@ namespace System.ComponentModel { public void AddHandler (object key, Delegate value) { - if (table == null) - table = new Hashtable (); + ListNode entry = FindEntry (key); + if (entry == null) { + head = new ListNode (key, value, head); + return; + } + entry.value = Delegate.Combine (entry.value, value); + } - Delegate prev = table [key] as Delegate; - prev = Delegate.Combine (prev, value); - table [key] = prev; +#if NET_2_0 + public void AddHandlers (EventHandlerList listToAddFrom) + { + if (listToAddFrom == null) { + return; + } + + for (ListNode entry = listToAddFrom.head; entry != null; entry = entry.next) { + AddHandler (entry.key, entry.value); + } } +#endif public void RemoveHandler (object key, Delegate value) { - if (table == null) + ListNode entry = FindEntry (key); + if (entry == null) return; - Delegate prev = table [key] as Delegate; - prev = Delegate.Remove (prev, value); - table [key] = prev; + entry.value = Delegate.Remove (entry.value, value); } public void Dispose () { - table = null; + head = null; } + private ListNode FindEntry (object key) + { + for (ListNode entry = head; entry != null; entry = entry.next) + if (key == entry.key) + return entry; + return null; + } + + [Serializable] + private class ListNode + { + public object key; + public Delegate value; + public ListNode next; + public ListNode (object key, Delegate value, ListNode next) + { + this.key = key; + this.value = value; + this.next = next; + } + } + + private ListNode head; + } }