using System.Xml;
using vmw.common;
using System.Web.Util;
+using System.Collections.Generic;
namespace System.Web.UI {
"Page_CommitTransaction" };
static readonly object [] EventKeys = {
+ Control.InitEvent,
#if NET_2_0
Page.PreInitEvent,
Page.PreLoadEvent,
commitTransaction
};
+ enum LifeCycleEvent
+ {
+ Init,
+#if NET_2_0
+ PreInit,
+ PreLoad,
+ LoadComplete,
+ PreRenderComplete,
+ SaveStateComplete,
+ InitComplete,
+#endif
+ Load,
+ DataBinding,
+ PreRender,
+ Disposed,
+ Unload,
+ Error,
+ AbortTransaction,
+ CommitTransaction
+ }
+
const BindingFlags bflags = BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance;
sealed class EventMethodMap
{
- public EventMethodMap (object EventKey, MethodInfo Method, bool NoParameters)
+ public EventMethodMap (LifeCycleEvent EventKeyIndex, MethodInfo Method, bool NoParameters)
{
- this.EventKey = EventKey;
+ this.EventKeyIndex = EventKeyIndex;
this.Method = Method;
this.NoParameters = NoParameters;
}
- public readonly object EventKey;
+ public readonly LifeCycleEvent EventKeyIndex;
public readonly MethodInfo Method;
public readonly bool NoParameters;
}
typeof (object),
typeof (EventArgs) };
+ LifeCycleEvent[] _pageEvents = new LifeCycleEvent[] {
+ LifeCycleEvent.PreInit,
+ LifeCycleEvent.PreLoad,
+ LifeCycleEvent.LoadComplete,
+ LifeCycleEvent.PreRenderComplete,
+ LifeCycleEvent.SaveStateComplete,
+ LifeCycleEvent.InitComplete
+ };
+ List<LifeCycleEvent> pageEvents = new List<LifeCycleEvent>(_pageEvents);
+
+ bool isPage = Page.GetType().IsAssignableFrom(GetType());
+
for (int i = 0; i < methodNames.Length; i++) {
+
+ // Don't look for page-only events in non-page controls.
+ if (!isPage && pageEvents.Contains((LifeCycleEvent)i))
+ continue;
+
string methodName = methodNames [i];
MethodInfo method;
bool noParams = false;
if (method.ReturnType != voidType)
continue;
- eventMethodList.Add (new EventMethodMap (EventKeys [i], method, noParams));
+ eventMethodList.Add (new EventMethodMap ((LifeCycleEvent) i, method, noParams));
}
// We copy to not lock
}
foreach (EventMethodMap eventMethod in eventMethodList) {
- if (Events [eventMethod.EventKey] != null)
+ EventHandler handler = eventMethod.NoParameters ?
+ new NoParamsInvoker (this, eventMethod.Method).FakeDelegate :
+ (EventHandler)Delegate.CreateDelegate (typeof (EventHandler), this, eventMethod.Method);
+
+ object eventKey = EventKeys [(int) eventMethod.EventKeyIndex];
+
+ Delegate existing = Events [eventKey];
+ if (existing != null && handler.Equals(existing))
continue;
- if (eventMethod.NoParameters) {
- NoParamsInvoker npi = new NoParamsInvoker (this, eventMethod.Method);
- Events.AddHandler (eventMethod.EventKey, npi.FakeDelegate);
- }
- else {
- Events.AddHandler (eventMethod.EventKey, Delegate.CreateDelegate (typeof (EventHandler), this, eventMethod.Method));
+
+ switch (eventMethod.EventKeyIndex) {
+ case LifeCycleEvent.Init:
+ Init += handler;
+ break;
+#if NET_2_0
+ case LifeCycleEvent.PreInit:
+ ((Page)this).PreInit += handler;
+ break;
+ case LifeCycleEvent.PreLoad:
+ ((Page) this).PreLoad += handler;
+ break;
+ case LifeCycleEvent.LoadComplete:
+ ((Page) this).LoadComplete += handler;
+ break;
+ case LifeCycleEvent.PreRenderComplete:
+ ((Page) this).PreRenderComplete += handler;
+ break;
+ case LifeCycleEvent.SaveStateComplete:
+ ((Page) this).SaveStateComplete += handler;
+ break;
+ case LifeCycleEvent.InitComplete:
+ ((Page) this).InitComplete += handler;
+ break;
+#endif
+ case LifeCycleEvent.Load:
+ Load += handler;
+ break;
+ case LifeCycleEvent.DataBinding:
+ DataBinding += handler;
+ break;
+ case LifeCycleEvent.PreRender:
+ PreRender += handler;
+ break;
+ case LifeCycleEvent.Disposed:
+ Disposed += handler;
+ break;
+ case LifeCycleEvent.Unload:
+ Unload += handler;
+ break;
+ case LifeCycleEvent.Error:
+ Error += handler;
+ break;
+ case LifeCycleEvent.AbortTransaction:
+ AbortTransaction += handler;
+ break;
+ case LifeCycleEvent.CommitTransaction:
+ CommitTransaction += handler;
+ break;
}
}
}