X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mcs%2Fclass%2FSystem.Web%2FSystem.Web.UI%2FTemplateControl.cs;h=fc3aea5ea08bfe4bab7002e43c516af18227ca57;hb=f552c8ef490399b56409675767ae71968644ca09;hp=2a878d03d459e02a3c0d4c8229e4c9a7887fc9f3;hpb=b3976280add44f88ddcb5a2cf67cae5ced5eb9ba;p=mono.git diff --git a/mcs/class/System.Web/System.Web.UI/TemplateControl.cs b/mcs/class/System.Web/System.Web.UI/TemplateControl.cs old mode 100755 new mode 100644 index 2a878d03d45..fc3aea5ea08 --- a/mcs/class/System.Web/System.Web.UI/TemplateControl.cs +++ b/mcs/class/System.Web/System.Web.UI/TemplateControl.cs @@ -1,35 +1,89 @@ // // System.Web.UI.TemplateControl.cs // -// Duncan Mak (duncan@ximian.com) +// Authors: +// Duncan Mak (duncan@ximian.com) +// Gonzalo Paniagua Javier (gonzalo@ximian.com) +// Andreas Nahr (ClassDevelopment@A-SoftTech.com) // -// (C) Ximian, Inc. +// (C) 2002 Ximian, Inc. (http://www.ximian.com) +// Copyright (C) 2005 Novell, Inc (http://www.novell.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; +using System.ComponentModel; +using System.Reflection; +using System.Security.Permissions; +using System.Web.Compilation; +using System.Web.Util; namespace System.Web.UI { - public abstract class TemplateControl : Control, INamingContainer - { + // CAS + [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] + [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] +#if NET_2_0 + public abstract class TemplateControl : Control, INamingContainer, IFilterResolutionService { +#else + public abstract class TemplateControl : Control, INamingContainer { +#endif + static object abortTransaction = new object (); + static object commitTransaction = new object (); + static object error = new object (); + static string [] methodNames = { "Page_Init", + "Page_Load", + "Page_DataBind", + "Page_PreRender", + "Page_Disposed", + "Page_Error", + "Page_Unload", + "Page_AbortTransaction", + "Page_CommitTransaction" }; + + const BindingFlags bflags = BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.Instance; + #region Constructor protected TemplateControl () { + Construct (); } #endregion #region Properties - - [MonoTODO] + [EditorBrowsable (EditorBrowsableState.Never)] +#if NET_2_0 + [Obsolete] +#endif protected virtual int AutoHandlers { - get { return 1; } + get { return 0; } set { } } - [MonoTODO] + [EditorBrowsable (EditorBrowsableState.Never)] protected virtual bool SupportAutoEvents { - get { return false; } + get { return true; } } #endregion @@ -41,63 +95,169 @@ namespace System.Web.UI { } [MonoTODO] - protected virtual LiteralControl CreateResourceBasedLiteralControl ( - int offset, int size, bool fAsciiOnly) + protected LiteralControl CreateResourceBasedLiteralControl (int offset, + int size, + bool fAsciiOnly) { return null; } - [MonoTODO] + internal void WireupAutomaticEvents () + { + if (!SupportAutoEvents || !AutoEventWireup) + return; + + Type type = GetType (); + foreach (string methodName in methodNames) { + MethodInfo method = type.GetMethod (methodName, bflags); + if (method == null) + continue; + + if (method.DeclaringType != type) { + if (!method.IsPublic && !method.IsFamilyOrAssembly && + !method.IsFamilyAndAssembly && !method.IsFamily) + continue; + } + + if (method.ReturnType != typeof (void)) + continue; + + ParameterInfo [] parms = method.GetParameters (); + int length = parms.Length; + bool noParams = (length == 0); + if (!noParams && (length != 2 || + parms [0].ParameterType != typeof (object) || + parms [1].ParameterType != typeof (EventArgs))) + continue; + + int pos = methodName.IndexOf ("_"); + string eventName = methodName.Substring (pos + 1); + EventInfo evt = type.GetEvent (eventName); + if (evt == null) { + /* This should never happen */ + continue; + } + + if (noParams) { + NoParamsInvoker npi = new NoParamsInvoker (this, methodName); + evt.AddEventHandler (this, npi.FakeDelegate); + } else { + evt.AddEventHandler (this, Delegate.CreateDelegate ( + typeof (EventHandler), this, methodName)); + } + } + } + + [EditorBrowsable (EditorBrowsableState.Never)] protected virtual void FrameworkInitialize () { } - [MonoTODO] + Type GetTypeFromControlPath (string virtualPath) + { + if (virtualPath == null) + throw new ArgumentNullException ("virtualPath"); + + string vpath = UrlUtils.Combine (TemplateSourceDirectory, virtualPath); + string realpath = Context.Request.MapPath (vpath); + return UserControlParser.GetCompiledType (vpath, realpath, Context); + } + public Control LoadControl (string virtualPath) { - return null; +#if NET_2_0 + if (virtualPath == null) + throw new ArgumentNullException ("virtualPath"); +#else + if (virtualPath == null) + throw new HttpException ("virtualPath is null"); +#endif + Type type = GetTypeFromControlPath (virtualPath); + object [] attrs = type.GetCustomAttributes (typeof (PartialCachingAttribute), true); + if (attrs != null && attrs.Length == 1) { + PartialCachingAttribute attr = (PartialCachingAttribute) attrs [0]; + PartialCachingControl ctrl = new PartialCachingControl (type); + ctrl.VaryByParams = attr.VaryByParams; + ctrl.VaryByControls = attr.VaryByControls; + ctrl.VaryByCustom = attr.VaryByCustom; + return ctrl; + } + + object control = Activator.CreateInstance (type); + if (control is UserControl) + ((UserControl) control).InitializeAsUserControl (Page); + + return (Control) control; } - [MonoTODO] public ITemplate LoadTemplate (string virtualPath) { - return null; +#if NET_2_0 + if (virtualPath == null) + throw new ArgumentNullException ("virtualPath"); +#else + if (virtualPath == null) + throw new HttpException ("virtualPath is null"); +#endif + Type t = GetTypeFromControlPath (virtualPath); + return new SimpleTemplate (t); } - [MonoTODO] protected virtual void OnAbortTransaction (EventArgs e) { + EventHandler eh = Events [abortTransaction] as EventHandler; + if (eh != null) + eh (this, e); } - [MonoTODO] protected virtual void OnCommitTransaction (EventArgs e) { + EventHandler eh = Events [commitTransaction] as EventHandler; + if (eh != null) + eh (this, e); } - [MonoTODO] protected virtual void OnError (EventArgs e) { + EventHandler eh = Events [error] as EventHandler; + if (eh != null) + eh (this, e); } [MonoTODO] public Control ParseControl (string content) { + if (content == null) + throw new ArgumentNullException ("content"); + return null; } - [MonoTODO] + [EditorBrowsable (EditorBrowsableState.Never)] + public +#if !NET_2_0 + static +#endif + object ReadStringResource () + { + throw new NotSupportedException (); + } + + [EditorBrowsable (EditorBrowsableState.Never)] public static object ReadStringResource (Type t) { - return null; + throw new NotSupportedException (); } [MonoTODO] - protected void SetStringresourcePointer (object stringResourcePointer, + [EditorBrowsable (EditorBrowsableState.Never)] + protected void SetStringResourcePointer (object stringResourcePointer, int maxResourceOffset) { } [MonoTODO] + [EditorBrowsable (EditorBrowsableState.Never)] protected void WriteUTF8ResourceString (HtmlTextWriter output, int offset, int size, bool fAsciiOnly) { @@ -107,9 +267,82 @@ namespace System.Web.UI { #region Events - public event EventHandler AbortTransaction; - public event EventHandler CommitTransaction; - public event EventHandler Error; + [WebSysDescription ("Raised when the user aborts a transaction.")] + public event EventHandler AbortTransaction { + add { Events.AddHandler (abortTransaction, value); } + remove { Events.RemoveHandler (abortTransaction, value); } + } + + [WebSysDescription ("Raised when the user initiates a transaction.")] + public event EventHandler CommitTransaction { + add { Events.AddHandler (commitTransaction, value); } + remove { Events.RemoveHandler (commitTransaction, value); } + } + + [WebSysDescription ("Raised when an exception occurs that cannot be handled.")] + public event EventHandler Error { + add { Events.AddHandler (error, value); } + remove { Events.RemoveHandler (error, value); } + } + #endregion + + class SimpleTemplate : ITemplate + { + Type type; + + public SimpleTemplate (Type type) + { + this.type = type; + } + + public void InstantiateIn (Control control) + { + Control template = Activator.CreateInstance (type) as Control; + template.SetBindingContainer (false); + control.Controls.Add (template); + } + } + +#if NET_2_0 + protected object Eval (string expression) + { + return DataBinder.Eval (Page.GetDataItem(), expression); + } + + protected string Eval (string expression, string format) + { + return DataBinder.Eval (Page.GetDataItem(), expression, format); + } + + protected object XPath (string xpathexpression) + { + return XPathBinder.Eval (Page.GetDataItem(), xpathexpression); + } + + protected string XPath (string xpathexpression, string format) + { + return XPathBinder.Eval (Page.GetDataItem(), xpathexpression, format); + } + + protected IEnumerable XPathSelect (string xpathexpression) + { + return XPathBinder.Select (Page.GetDataItem(), xpathexpression); + } + + // IFilterResolutionService + + [MonoTODO] + int IFilterResolutionService.CompareFilters (string filter1, string filter2) + { + throw new NotImplementedException (); + } + + [MonoTODO] + bool IFilterResolutionService.EvaluateFilter (string filterName) + { + throw new NotImplementedException (); + } +#endif } }