//
// Author:
// Miguel de Icaza (miguel@ximian.com)
+// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) Ximian, Inc. http://www.ximian.com
//
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
using System;
using System.Collections;
// 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 (Delegate) table [key];
+ ListNode entry = FindEntry (key);
+ return entry == null ? null : entry.value;
}
set {
- if (table == null)
- table = new Hashtable ();
-
- table.Add (key, value);
+ AddHandler (key, value);
}
}
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);
+ }
+
+#if NET_2_0
+ public void AddHandlers (EventHandlerList listToAddFrom)
+ {
+ if (listToAddFrom == null) {
+ return;
+ }
- table.Add (key, value);
+ for (ListNode entry = listToAddFrom.head; entry != null; entry = entry.next) {
+ AddHandler (entry.key, entry.value);
+ }
}
+#endif
public void RemoveHandler (object key, Delegate value)
{
- table.Remove (key);
+ ListNode entry = FindEntry (key);
+ if (entry == null)
+ return;
+
+ 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;
+
}
}