Merge pull request #1155 from steffen-kiess/json-string
[mono.git] / mcs / class / System.Web / System.Web.UI.HtmlControls / HtmlInputButton.cs
index 1defe4341f65c1d9e3c14ea9b3366d68ca6348b2..86aee3dd4156cb4082aa2b36363f1aad5a31f2b3 100644 (file)
@@ -4,7 +4,7 @@
 // Authors:
 //     Jackson Harper (jackson@ximian.com)
 //
-// (C) 2005 Novell, Inc.
+// (C) 2005-2010 Novell, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -28,7 +28,9 @@
 
 using System.ComponentModel;
 using System.Globalization;
+using System.Reflection;
 using System.Security.Permissions;
+using System.Web.Util;
 
 namespace System.Web.UI.HtmlControls {
 
@@ -37,12 +39,10 @@ namespace System.Web.UI.HtmlControls {
        [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
        // attributes
        [DefaultEventAttribute ("ServerClick")]
-#if NET_2_0
        [SupportsEventValidation]
-#endif
-       public class HtmlInputButton : HtmlInputControl, IPostBackEventHandler {
-
-               private static readonly object ServerClickEvent = new object();
+       public class HtmlInputButton : HtmlInputControl, IPostBackEventHandler 
+       {
+               static readonly object ServerClickEvent = new object();
 
                public HtmlInputButton () : this ("button")
                {
@@ -55,12 +55,7 @@ namespace System.Web.UI.HtmlControls {
                [DefaultValue(true)]
                [WebSysDescription("")]
                [WebCategory("Behavior")]
-#if NET_2_0
-               public virtual
-#else          
-               public
-#endif         
-               bool CausesValidation {
+               public virtual bool CausesValidation {
                        get {
                                string flag = Attributes["CausesValidation"];
 
@@ -74,7 +69,6 @@ namespace System.Web.UI.HtmlControls {
                        }
                }
 
-#if NET_2_0
                [DefaultValue ("")]
                public virtual string ValidationGroup
                {
@@ -93,41 +87,118 @@ namespace System.Web.UI.HtmlControls {
                                        Attributes["ValidationGroup"] = value;
                        }
                }
-#endif
 
                void RaisePostBackEventInternal (string eventArgument)
                {
+                       ValidateEvent (UniqueID, eventArgument);
                        if (CausesValidation)
-#if NET_2_0
                                Page.Validate (ValidationGroup);
-#else
-                               Page.Validate ();
-#endif
-                       OnServerClick (EventArgs.Empty);
+                       
+                       if (String.Compare (Type, "reset", true, Helpers.InvariantCulture) != 0)
+                               OnServerClick (EventArgs.Empty);
+                       else
+                               ResetForm (FindForm ());
+               }
+
+               HtmlForm FindForm ()
+               {
+                       Page p = Page;
+                       if (p != null)
+                               return p.Form;
+
+                       return null;
+               }
+               
+               void ResetForm (HtmlForm form)
+               {
+                       if (form == null || !form.HasControls ())
+                               return;
+                       
+                       ResetChildrenValues (form.Controls);
+               }
+
+               void ResetChildrenValues (ControlCollection children)
+               {
+                       foreach (Control child in children) {
+                               if (child == null)
+                                       continue;
+                               
+                               if (child.HasControls ())
+                                       ResetChildrenValues (child.Controls);
+                               ResetChildValue (child);
+                       }
+               }
+
+               void ResetChildValue (Control child)
+               {
+                       Type type = child.GetType ();
+                       object[] attributes = type.GetCustomAttributes (false);
+                       if (attributes == null || attributes.Length == 0)
+                               return;
+
+                       string defaultProperty = null;
+                       DefaultPropertyAttribute defprop;
+                       
+                       foreach (object attr in attributes) {
+                               defprop = attr as DefaultPropertyAttribute;
+                               if (defprop == null)
+                                       continue;
+                               defaultProperty = defprop.Name;
+                               break;
+                       }
+
+                       if (defaultProperty == null || defaultProperty.Length == 0)
+                               return;
+
+                       PropertyInfo pi = null;
+                       try {
+                               pi = type.GetProperty (defaultProperty,
+                                                      BindingFlags.Instance |
+                                                      BindingFlags.Public |
+                                                      BindingFlags.Static |
+                                                      BindingFlags.IgnoreCase);
+                       } catch (Exception) {
+                               // ignore
+                       }
+                       if (pi == null || !pi.CanWrite)
+                               return;
+                       
+                       attributes = pi.GetCustomAttributes (false);
+                       if (attributes == null || attributes.Length == 0)
+                               return;
+
+                       DefaultValueAttribute defval = null;
+                       object value = null;
+                       
+                       foreach (object attr in attributes) {
+                               defval = attr as DefaultValueAttribute;
+                               if (defval == null)
+                                       continue;
+                               value = defval.Value;
+                               break;
+                       }
+                       
+                       if (value == null || pi.PropertyType != value.GetType ())
+                               return;
+
+                       try {
+                               pi.SetValue (child, value, null);
+                       } catch (Exception) {
+                               // ignore
+                       }
                }
 
-#if NET_2_0
                protected virtual void RaisePostBackEvent (string eventArgument)
                {
                        RaisePostBackEventInternal (eventArgument);
                }
-#endif
                
                void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
                {
-#if NET_2_0
                        RaisePostBackEvent (eventArgument);
-#else
-                       RaisePostBackEventInternal (eventArgument);
-#endif
                }
 
-#if NET_2_0
-               protected internal
-#else          
-               protected
-#endif         
-               override void OnPreRender (EventArgs e)
+               protected internal override void OnPreRender (EventArgs e)
                {
                        base.OnPreRender (e);
                        if (Events [ServerClickEvent] != null)
@@ -141,30 +212,9 @@ namespace System.Web.UI.HtmlControls {
                                server_click (this, e);
                }
 
-#if !NET_2_0
-               bool RenderOnClick ()
-               {
-                       if (Page == null || !CausesValidation)
-                               return false;
-
-                       CultureInfo inv = CultureInfo.InvariantCulture;
-                       string input_type = Type;
-                       if (0 == String.Compare (input_type, "submit", true, inv) &&
-                               Page.Validators.Count > 0)
-                               return true;
-
-                       if (0 == String.Compare (input_type, "button", true, inv) &&
-                               Events [ServerClickEvent] != null)
-                               return true;
-
-                       return false;
-               }
-#endif
-
                protected override void RenderAttributes (HtmlTextWriter writer)
                {
-#if NET_2_0
-                       CultureInfo inv = CultureInfo.InvariantCulture;
+                       CultureInfo inv = Helpers.InvariantCulture;
                        string input_type = Type;
                        if (0 != String.Compare (input_type, "reset", true, inv) &&
                                ((0 == String.Compare (input_type, "submit", true, inv)) ||
@@ -175,60 +225,47 @@ namespace System.Web.UI.HtmlControls {
                                        onclick = ClientScriptManager.EnsureEndsWithSemicolon (Attributes ["onclick"] + onclick);
                                        Attributes.Remove ("onclick");
                                }
-                               if (Page != null) {
+
+                               Page page = Page;
+                               if (page != null) {
                                        PostBackOptions options = GetPostBackOptions ();
-                                       Page.ClientScript.RegisterForEventValidation (options);
-                                       onclick += Page.ClientScript.GetPostBackEventReference (options);
+                                       onclick += page.ClientScript.GetPostBackEventReference (options, true);
                                }
 
                                if (onclick.Length > 0) {
-                                       writer.WriteAttribute ("onclick", onclick);
-                                       writer.WriteAttribute ("language", "javascript");
-                               }
-                       }
-#else
-                       if (RenderOnClick ()) {
-                               string oc = null;
-                               ClientScriptManager csm = new ClientScriptManager (Page);
-                               if (Page.AreValidatorsUplevel ()) {
-                                       oc = csm.GetClientValidationEvent ();
-                               } else if (Events [ServerClickEvent] != null) {
-                                       oc = Attributes ["onclick"] + " " + csm.GetPostBackEventReference (this, "");
-                               }
-                               
-                               if (oc != null) {
+                                       bool encode = true;
+                                       if (Events [ServerClickEvent] != null)
+                                               encode = false; // tests show that this is indeed
+                                                               // the case...
+                                       writer.WriteAttribute ("onclick", onclick, encode);
                                        writer.WriteAttribute ("language", "javascript");
-                                       writer.WriteAttribute ("onclick", oc);
                                }
                        }
-#endif
 
                        Attributes.Remove ("CausesValidation");
-#if NET_2_0
                        // LAMESPEC: MS doesn't actually remove this
                        //attribute.  it shows up in the rendered
                        //output.
 
                        // Attributes.Remove("ValidationGroup");
-#endif
                        base.RenderAttributes (writer);
                }
 
-#if NET_2_0
-               PostBackOptions GetPostBackOptions () {
+               PostBackOptions GetPostBackOptions ()
+               {
+                       Page page = Page;
                        PostBackOptions options = new PostBackOptions (this);
                        options.ValidationGroup = null;
                        options.ActionUrl = null;
-                       options.Argument = "";
+                       options.Argument = String.Empty;
                        options.RequiresJavaScriptProtocol = false;
-                       options.ClientSubmit = (0 != String.Compare (Type, "submit", true, CultureInfo.InvariantCulture));
-                       options.PerformValidation = CausesValidation && Page != null && Page.Validators.Count > 0;
+                       options.ClientSubmit = (0 != String.Compare (Type, "submit", true, Helpers.InvariantCulture));
+                       options.PerformValidation = CausesValidation && page != null && page.Validators.Count > 0;
                        if (options.PerformValidation)
                                options.ValidationGroup = ValidationGroup;
 
                        return options;
                }
-#endif
 
                [WebSysDescription("")]
                [WebCategory("Action")]
@@ -236,7 +273,6 @@ namespace System.Web.UI.HtmlControls {
                        add { Events.AddHandler (ServerClickEvent, value); }
                        remove { Events.RemoveHandler (ServerClickEvent, value); }
                }
-       }
-       
+       }       
 }