06211f320a23c721c6e8d2a26806d9682d01d5a2
[mono.git] / mcs / class / System / System.ComponentModel / EventHandlerList.cs
1 //
2 // System.ComponentModel.EventHandlerList.cs
3 //
4 // Author:
5 //   Miguel de Icaza (miguel@ximian.com)
6 //   Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 //
8 // (C) Ximian, Inc.  http://www.ximian.com
9 //
10
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 using System;
33 using System.Collections;
34
35 namespace System.ComponentModel {
36
37         // <summary>
38         //   List of Event delegates.
39         // </summary>
40         //
41         // <remarks>
42         //   Longer description
43         // </remarks>
44         public sealed class EventHandlerList : IDisposable {
45                 Hashtable table;
46                 
47                 public EventHandlerList ()
48                 {
49                         head = null;
50                 }
51
52                 public Delegate this [object key] {
53                         get {
54                                 ListNode entry = FindEntry (key);
55                                 return entry == null ? null : entry.value;
56                         }
57
58                         set {
59                                 AddHandler (key, value);
60                         }
61                 }
62
63                 public void AddHandler (object key, Delegate value)
64                 {
65                         ListNode entry = FindEntry (key);
66                         if (entry == null) {
67                                 head = new ListNode (key, value, head);
68                                 return;
69                         }
70                         entry.value = Delegate.Combine (entry.value, value);
71                 }
72
73                 public void RemoveHandler (object key, Delegate value)
74                 {
75                         ListNode entry = FindEntry (key);
76                         if (entry == null)
77                                 return;
78
79                         entry.value = Delegate.Remove (entry.value, value);
80                 }
81
82                 public void Dispose ()
83                 {
84                         head = null;
85                 }
86                 private ListNode FindEntry (object key)
87                 {
88                         if (key == null)
89                                 throw new ArgumentNullException ("key", "Attempted lookup for a null key.");
90
91                         for (ListNode entry = head; entry != null; entry = entry.next)
92                                 if (key == entry.key)
93                                         return entry;
94                         return null;
95                 }
96
97                 [Serializable]
98                 private class ListNode
99                 {
100                         public object key;
101                         public Delegate value;
102                         public ListNode next;
103                         public ListNode (object key, Delegate value, ListNode next)
104                         {
105                                 this.key = key;
106                                 this.value = value;
107                                 this.next = next;
108                         }
109                 }
110
111                 private ListNode head;
112
113         }
114         
115 }