X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.ComponentModel%2FEventHandlerList.cs;h=7dabcb3e2c3abf3a84a19eae4abd5031ecc412b5;hb=48d09aa40cba4b63e7282ed0f0492d6ff952779f;hp=dba45525db582c40e0e82ee2fdc8e99718706982;hpb=cc63806f23d224ad6ea46485edd831afee937a3c;p=mono.git diff --git a/mcs/class/System/System.ComponentModel/EventHandlerList.cs b/mcs/class/System/System.ComponentModel/EventHandlerList.cs index dba45525db5..7dabcb3e2c3 100644 --- a/mcs/class/System/System.ComponentModel/EventHandlerList.cs +++ b/mcs/class/System/System.ComponentModel/EventHandlerList.cs @@ -3,10 +3,32 @@ // // 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; @@ -20,45 +42,82 @@ 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 (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; + } }