2008-02-16 Ivan N. Zlatev <contact@i-nz.net>
[mono.git] / mcs / class / System / System.ComponentModel / EventHandlerList.cs
index a1d316b1685e982a6fa628707a02631be6519a6d..7dabcb3e2c3abf3a84a19eae4abd5031ecc412b5 100644 (file)
@@ -42,18 +42,15 @@ namespace System.ComponentModel {
        //   Longer description
        // </remarks>
        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;
+
        }
        
 }