140 lines
4.5 KiB
C#
140 lines
4.5 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="EventHandlerList.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.ComponentModel {
|
|
using System;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Security.Permissions;
|
|
|
|
/// <devdoc>
|
|
/// <para>Provides a simple list of delegates. This class cannot be inherited.</para>
|
|
/// </devdoc>
|
|
[HostProtection(SharedState = true)]
|
|
public sealed class EventHandlerList : IDisposable {
|
|
|
|
ListEntry head;
|
|
Component parent;
|
|
|
|
/// <devdoc>
|
|
/// Creates a new event handler list.
|
|
/// </devdoc>
|
|
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
|
|
public EventHandlerList()
|
|
{
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// Creates a new event handler list. The parent component is used to check the component's
|
|
/// CanRaiseEvents property.
|
|
/// </devdoc>
|
|
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
|
|
internal EventHandlerList(Component parent)
|
|
{
|
|
this.parent = parent;
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets or sets the delegate for the specified key.</para>
|
|
/// </devdoc>
|
|
public Delegate this[object key] {
|
|
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
|
|
get {
|
|
ListEntry e = null;
|
|
if (parent == null || parent.CanRaiseEventsInternal)
|
|
{
|
|
e = Find(key);
|
|
}
|
|
if (e != null) {
|
|
return e.handler;
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
set {
|
|
ListEntry e = Find(key);
|
|
if (e != null) {
|
|
e.handler = value;
|
|
}
|
|
else {
|
|
head = new ListEntry(key, value, head);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>[To be supplied.]</para>
|
|
/// </devdoc>
|
|
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
|
|
public void AddHandler(object key, Delegate value) {
|
|
ListEntry e = Find(key);
|
|
if (e != null) {
|
|
e.handler = Delegate.Combine(e.handler, value);
|
|
}
|
|
else {
|
|
head = new ListEntry(key, value, head);
|
|
}
|
|
}
|
|
|
|
/// <devdoc> allows you to add a list of events to this list </devdoc>
|
|
public void AddHandlers(EventHandlerList listToAddFrom) {
|
|
|
|
ListEntry currentListEntry = listToAddFrom.head;
|
|
while (currentListEntry != null) {
|
|
AddHandler(currentListEntry.key, currentListEntry.handler);
|
|
currentListEntry = currentListEntry.next;
|
|
}
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>[To be supplied.]</para>
|
|
/// </devdoc>
|
|
public void Dispose() {
|
|
head = null;
|
|
}
|
|
|
|
private ListEntry Find(object key) {
|
|
ListEntry found = head;
|
|
while (found != null) {
|
|
if (found.key == key) {
|
|
break;
|
|
}
|
|
found = found.next;
|
|
}
|
|
return found;
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>[To be supplied.]</para>
|
|
/// </devdoc>
|
|
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
|
|
public void RemoveHandler(object key, Delegate value) {
|
|
ListEntry e = Find(key);
|
|
if (e != null) {
|
|
e.handler = Delegate.Remove(e.handler, value);
|
|
}
|
|
// else... no error for removal of non-existant delegate
|
|
//
|
|
}
|
|
|
|
private sealed class ListEntry {
|
|
internal ListEntry next;
|
|
internal object key;
|
|
internal Delegate handler;
|
|
|
|
public ListEntry(object key, Delegate handler, ListEntry next) {
|
|
this.next = next;
|
|
this.key = key;
|
|
this.handler = handler;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|