add Http callback support for J2EE portlets.
[mono.git] / mcs / class / System.Web / System.Web.UI.HtmlControls / HtmlForm.cs
index 674fb7f1699e07c246cee3baa532a5b0613ce801..2b72c79083383c3530388e39412124855173d2c6 100644 (file)
-/*     System.Web.UI.HtmlControls\r
-*      Authors\r
-*              Leen Toelen (toelen@hotmail.com)\r
-*/\r
-\r
-using System;\r
-using System.Collections;\r
-using System.ComponentModel;\r
-using System.Text;\r
-using System.Web;\r
-using System.Web.UI;\r
-using System.Web.Util;\r
-\r
-namespace System.Web.UI.HtmlControls{\r
-       \r
-       public class HtmlForm : HtmlContainerControl{\r
-               \r
-               // Unused\r
-               //private static string SmartNavIncludeScriptKey  = "SmartNavIncludeScript";\r
-               \r
-               public HtmlForm(): base("form"){}\r
-                               \r
-               protected override void RenderAttributes(HtmlTextWriter writer){\r
-                       writer.WriteAttribute("name", Name);\r
-                       Attributes.Remove("name");\r
-                       writer.WriteAttribute("method", Method);\r
-                       Attributes.Remove("method");\r
-                       writer.WriteAttribute("action", Action, true);\r
-                       Attributes.Remove("action");\r
-                       if (Enctype != null){\r
-                               writer.WriteAttribute ("enctype", Enctype);\r
-                               Attributes.Remove ("enctype");\r
-                       }\r
-\r
-                       Hashtable onSubmit = Page.ClientScript.submitStatements;\r
-                       if (onSubmit != null && onSubmit.Count > 0){\r
-                               StringBuilder sb = new StringBuilder ();\r
-                               string prev = Attributes ["onsubmit"];\r
-                               if (prev != null){\r
-                                       sb.Append (prev);\r
-                                       Attributes.Remove ("onsubmit");\r
-                               }\r
-\r
-                               foreach (string s in onSubmit.Values)\r
-                                       sb.Append (s);\r
-\r
-                               writer.WriteAttribute ("language", "javascript");\r
-                               writer.WriteAttribute ("onsubmit", sb.ToString ());\r
-                       }\r
-\r
-                       if (ID == null)\r
-                               writer.WriteAttribute ("id", ClientID);\r
-\r
-                       base.RenderAttributes (writer);\r
-               }\r
-               \r
-               protected override void Render(HtmlTextWriter output){\r
-                       /*** Disabled smart navigation. We have no scripts - Gonzalo\r
-                       if (Page.SmartNavigation == false){\r
-                               base.Render (output);\r
-                               return;\r
-                       }\r
-\r
-                       ((IAttributeAccessor) this).SetAttribute("_smartNavigation","true");\r
-                       HttpBrowserCapabilities browserCap = Context.Request.Browser;\r
-                       if (browserCap.Browser.ToLower() != "ie" && browserCap.MajorVersion < 5){\r
-                               base.Render(output);\r
-                               return;\r
-                       }\r
-                       output.WriteLine("<IFRAME ID=_hifSmartNav NAME=_hifSmartNav STYLE=display:none ></IFRAME>");\r
-                               \r
-                       if (browserCap.MinorVersion < 0.5 && browserCap.MajorVersion != 5)\r
-                               Page.RegisterClientScriptFile("SmartNavIncludeScript","JScript","SmartNavIE5.js");\r
-                       else if (Page.IsPostBack) Page.RegisterClientScriptFile("SmartNavIncludeScript","JScript","SmartNav.js");\r
-                       */\r
-                       base.Render(output);\r
-               }\r
-               \r
-               protected override void RenderChildren (HtmlTextWriter writer)\r
-               {\r
-                       Page.OnFormRender (writer,ClientID);\r
-                       base.RenderChildren (writer);\r
-                       Page.OnFormPostRender (writer,ClientID);\r
-               }\r
-               \r
-               protected override void OnInit(EventArgs e){\r
-                       base.OnInit(e);\r
-                       Page.RegisterViewStateHandler();\r
-               }\r
-               \r
-               internal string Action {\r
-                       get{\r
-                               string executionFilePath = Context.Request.CurrentExecutionFilePath;\r
-                               string filePath = Context.Request.FilePath;\r
-                               string attr;\r
-                               if (executionFilePath == filePath) {\r
-                                       attr = filePath;\r
-                                       int lastSlash = attr.LastIndexOf('/');\r
-                                       if (lastSlash >= 0)\r
-                                               attr = attr.Substring(lastSlash + 1);\r
-                               } else {\r
-                                       attr = UrlUtils.MakeRelative (executionFilePath, UrlUtils.GetDirectory (filePath));\r
-                                       if (attr == null)\r
-                                               attr = executionFilePath;\r
-                               }\r
-                               string queryString = Context.Request.QueryStringRaw;\r
-                               if (queryString != null && queryString.Length > 0)\r
-                                       attr = String.Concat(attr, '?', queryString);\r
-                               return attr;\r
-                       }\r
-               }\r
-               \r
-               [DefaultValue("")]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]\r
-               [WebCategory("Behavior")]\r
-               public string Enctype{\r
-                       get{\r
-                               string attr = Attributes["enctype"];\r
-                               if (attr != null){\r
-                                       return attr;\r
-                               }\r
-                               return "";\r
-                       }\r
-                       set{\r
-                               Attributes["enctype"] = AttributeToString(value);\r
-                       }\r
-               }\r
-               \r
-               [DefaultValue("")]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]\r
-               [WebCategory("Behavior")]\r
-               public string Method{\r
-                       get{\r
-                               string attr = Attributes["method"];\r
-                               if (attr != null){\r
-                                       return attr;\r
-                               }\r
-                               return "post";\r
-                       }\r
-                       set{\r
-                               Attributes["method"] = AttributeToString(value);\r
-                       }\r
-               }\r
-               \r
-               [DefaultValue("")]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]\r
-               [WebCategory("Behavior")]\r
-               public string Target{\r
-                       get{\r
-                               string attr = Attributes["target"];\r
-                               if (attr != null){\r
-                                       return attr;\r
-                               }\r
-                               return String.Empty;\r
-                       }\r
-                       set{\r
-                               Attributes["target"] = AttributeToString(value);\r
-                       }\r
-               }\r
-               \r
-               [DefaultValue("")]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]\r
-               [WebCategory("Appearance")]\r
-               public virtual string Name{\r
-                       get{\r
-                               return UniqueID;\r
-                       }\r
-                       set {\r
-                       }\r
-               }               \r
-       } // class HtmlForm\r
-} // namespace System.Web.UI.HtmlControls\r
-\r
+//
+// System.Web.UI.HtmlControls.HtmlForm.cs
+//
+// Author:
+//     Dick Porter  <dick@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.ComponentModel;
+using System.Collections.Specialized;
+using System.Security.Permissions;
+using System.Web.Util;
+using System.Web.UI.WebControls;
+
+namespace System.Web.UI.HtmlControls 
+{
+       // CAS
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       public class HtmlForm : HtmlContainerControl 
+       {
+               bool inited;
+
+               public HtmlForm () : base ("form")
+               {
+               }
+
+#if NET_2_0
+               string defaultbutton = "";
+               [DefaultValue ("")]
+               public string DefaultButton
+               {
+                       get {
+                               return defaultbutton;
+                       }
+                       set {
+                               defaultbutton = (value == null ? "" : value);
+                       }
+               }
+
+               string defaultfocus = "";
+               [DefaultValue ("")]
+               public string DefaultFocus
+               {
+                       get {
+                               return defaultfocus;
+                       }
+                       set {
+                               defaultfocus = (value == null ? "" : value);
+                       }
+               }
+#endif         
+
+               [DefaultValue ("")]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public string Enctype 
+               {
+                       get {
+                               string enc = Attributes["enctype"];
+
+                               if (enc == null) {
+                                       return (String.Empty);
+                               }
+
+                               return (enc);
+                       }
+                       set {
+                               if (value == null) {
+                                       Attributes.Remove ("enctype");
+                               } else {
+                                       Attributes["enctype"] = value;
+                               }
+                       }
+               }
+               
+               [DefaultValue ("")]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public string Method 
+               {
+                       get {
+                               string method = Attributes["method"];
+
+                               if ((method == null) || (method.Length == 0)) {
+                                       return ("post");
+                               }
+                               
+                               return (method);
+                       }
+                       set {
+                               if (value == null) {
+                                       Attributes.Remove ("method");
+                               } else {
+                                       Attributes["method"] = value;
+                               }
+                       }
+               }
+
+               [DefaultValue ("")]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public virtual string Name 
+               {
+                       get {
+                               return UniqueID;
+                       }
+                       set {
+                               /* why am i here? I do nothing. */
+                       }
+               }
+
+#if NET_2_0
+               bool submitdisabledcontrols = false;
+               [DefaultValue (false)]
+               public virtual bool SubmitDisabledControls 
+               {
+                       get {
+                               return submitdisabledcontrols;
+                       }
+                       set {
+                               submitdisabledcontrols = value;
+                       }
+               }
+#endif
+                       
+               [DefaultValue ("")]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public string Target 
+               {
+                       get {
+                               string target = Attributes["target"];
+
+                               if (target == null) {
+                                       return (String.Empty);
+                               }
+                               
+                               return (target);
+                       }
+                       set {
+                               if (value == null) {
+                                       Attributes.Remove ("target");
+                               } else {
+                                       Attributes["target"] = value;
+                               }
+                       }
+               }
+
+               public override string UniqueID {
+                       get {
+                               return base.UniqueID;
+                       }
+               }
+
+#if NET_2_0            
+               [MonoTODO ("why override?")]
+               protected override ControlCollection CreateControlCollection ()
+               {
+                       return base.CreateControlCollection ();
+               }
+#endif         
+
+#if NET_2_0
+               protected internal
+#else          
+               protected
+#endif         
+               override void OnInit (EventArgs e)
+               {
+                       inited = true;
+                       Page.RegisterViewStateHandler ();
+
+#if NET_2_0
+                       Page.RegisterForm (this);
+#endif
+
+                       base.OnInit (e);
+               }
+
+#if NET_2_0
+               internal bool DetermineRenderUplevel ()
+               {
+                       /* this bit is c&p'ed from BaseValidator.DetermineRenderUplevel */
+                       try {
+                               if (Page != null && Page.Request != null)
+                                       return (
+                                               /* From someplace on the web: "JavaScript 1.2
+                                                * and later (also known as ECMAScript) has
+                                                * built-in support for regular
+                                                * expressions" */
+                                               ((Page.Request.Browser.EcmaScriptVersion.Major == 1
+                                                 && Page.Request.Browser.EcmaScriptVersion.Minor >= 2)
+                                                || (Page.Request.Browser.EcmaScriptVersion.Major > 1))
+
+                                               /* document.getElementById, .getAttribute,
+                                                * etc, are all DOM level 1.  I don't think we
+                                                * use anything in level 2.. */
+                                               && Page.Request.Browser.W3CDomVersion.Major >= 1);
+                       }
+                       catch {
+                               /* this can happen with a fake Page in nunit
+                                * tests, since Page.Context == null */
+                               ;
+                       }
+
+                       return false;
+               }
+
+               protected internal override void OnPreRender (EventArgs e)
+               {
+                       base.OnPreRender(e);
+               }
+#endif         
+
+               protected override void RenderAttributes (HtmlTextWriter w)
+               {
+                       /* Need to always render: name, method, action
+                        * and id
+                        */
+
+                       string action;
+                       string file_path = Page.Request.FilePath;
+                       string current_path = Page.Request.CurrentExecutionFilePath;
+                       if (file_path == current_path) {
+                               // Just the filename will do
+                               action = UrlUtils.GetFile (file_path);
+                       } else {
+                               // Fun. We need to make cookieless sessions work, so no
+                               // absolute paths here.
+                               Uri current_uri = new Uri ("http://host" + current_path);
+                               Uri fp_uri = new Uri ("http://host" + file_path);
+                               action = fp_uri.MakeRelative (current_uri);
+                       }
+
+                       action += Page.Request.QueryStringRaw;
+#if TARGET_J2EE
+                       // Allow the page to transform action to a portlet action url
+                       if (Page.IsPortletRender)
+                               action = Page.RenderResponse.createActionURL(action);
+#endif
+
+                       w.WriteAttribute ("name", Name);
+
+                       w.WriteAttribute ("method", Method);
+                       w.WriteAttribute ("action", action);
+
+                       if (ID == null) {
+                               /* If ID != null then HtmlControl will
+                                * write the id attribute
+                                */
+                               w.WriteAttribute ("id", ClientID);
+                               Attributes.Remove ("id");
+                       }
+
+                       string submit = Page.GetSubmitStatements ();
+                       if (submit != null && submit != "") {
+                               Attributes.Remove ("onsubmit");
+                               w.WriteAttribute ("onsubmit", submit);
+                       }
+                       
+                       /* enctype and target should not be written if
+                        * they are empty
+                        */
+                       string enctype = Enctype;
+                       if (enctype != null && enctype != "") {
+                               w.WriteAttribute ("enctype", enctype);
+                       }
+
+                       string target = Target;
+                       if (target != null && target != "") {
+                               w.WriteAttribute ("target", target);
+                       }
+
+#if NET_2_0
+                       string defaultbutton = DefaultButton;
+                       if (defaultbutton != null && defaultbutton != "") {
+                               Control c = FindControl (defaultbutton);
+
+                               if (c == null || !(c is IButtonControl))
+                                       throw new InvalidOperationException(String.Format ("The DefaultButton of '{0}' must be the ID of a control of type IButtonControl.",
+                                                                                          ID));
+                       }
+#endif
+
+                       /* Now remove them from the hash so the base
+                        * RenderAttributes can do all the rest
+                        */
+                       Attributes.Remove ("method");
+                       Attributes.Remove ("enctype");
+                       Attributes.Remove ("target");
+
+                       base.RenderAttributes (w);
+               }
+
+#if NET_2_0
+               protected internal
+#else          
+               protected
+#endif         
+               override void RenderChildren (HtmlTextWriter w)
+               {
+                       if (!inited) {
+                               Page.RegisterViewStateHandler ();
+#if NET_2_0
+                               Page.RegisterForm (this);
+#endif
+                       }
+                       Page.OnFormRender (w, ClientID);
+                       base.RenderChildren (w);
+                       Page.OnFormPostRender (w, ClientID);
+               }
+
+#if NET_2_0
+               /* According to corcompare */
+               [MonoTODO ("why override?")]
+               public override void RenderControl (HtmlTextWriter w)
+               {
+                       base.RenderControl (w);
+               }
+#endif         
+
+#if NET_2_0
+               protected internal
+#else          
+               protected
+#endif         
+               override void Render (HtmlTextWriter w)
+               {
+                       base.Render (w);
+               }
+       }
+}
+
+