[bcl] Rename variables to avoid conflict with later renames
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Button.cs
1 //
2 // System.Web.UI.WebControls.Button.cs
3 //
4 // Authors:
5 //      Jordi Mas i Hernandez (jordi@ximian.com)
6 //
7 // (C) 2005-2010 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System.ComponentModel;
30 using System.ComponentModel.Design;
31 using System.Security.Permissions;
32
33 namespace System.Web.UI.WebControls
34 {
35         // CAS
36         [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
37         [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
38         // attributes
39         [DefaultEvent ("Click")]
40         [DataBindingHandler ("System.Web.UI.Design.TextDataBindingHandler, " + Consts.AssemblySystem_Design)]
41         [DefaultProperty ("Text")]
42         [Designer ("System.Web.UI.Design.WebControls.ButtonDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
43         [ToolboxDataAttribute ("<{0}:Button runat=\"server\" Text=\"Button\"></{0}:Button>")]
44         [SupportsEventValidation]
45         public class Button : WebControl, IPostBackEventHandler, IButtonControl
46         {
47                 static readonly object ClickEvent = new object ();
48                 static readonly object CommandEvent = new object ();
49
50                 public Button () : base (HtmlTextWriterTag.Input)
51                 {
52                 }
53
54                 [WebSysDescription ("")]
55                 [WebCategory ("Behavior")]
56                 [DefaultValue (true)]
57                 [Themeable (false)]
58                 public virtual bool CausesValidation {
59                         get { return ViewState.GetBool ("CausesValidation", true); }
60                         set { ViewState ["CausesValidation"] = value; }
61                 }
62
63                 [DefaultValue ("")]
64                 [Bindable (true)]
65                 [WebSysDescription ("")]
66                 [WebCategory ("Behavior")]
67                 [Themeable (false)]
68                 public string CommandArgument {
69                         get { return ViewState.GetString ("CommandArgument", String.Empty); }
70                         set { ViewState ["CommandArgument"] = value; }
71                 }
72
73                 [DefaultValue ("")]
74                 [WebSysDescription ("")]
75                 [WebCategory ("Behavior")]
76                 [Themeable (false)]
77                 public string CommandName {
78                         get { return ViewState.GetString ("CommandName", String.Empty); }
79                         set { ViewState ["CommandName"] = value; }
80                 }
81
82                 [Themeable (false)]
83                 [DefaultValue ("")]
84                 [WebSysDescription ("")]
85                 [WebCategoryAttribute ("Behavior")]
86                 public virtual string OnClientClick {
87                         get { return ViewState.GetString ("OnClientClick", String.Empty); }
88                         set { ViewState ["OnClientClick"] = value; }
89                 }
90
91                 [DefaultValue ("")]
92                 [Bindable (true)]
93                 [WebSysDescription ("")]
94                 [WebCategory ("Appearance")]
95                 [Localizable (true)]
96                 public string Text {
97                         get { return ViewState.GetString ("Text", String.Empty); }
98                         set { ViewState ["Text"] = value; }
99                 }
100
101                 [DefaultValue (true)]
102                 [Themeable (false)]
103                 [WebSysDescription ("")]
104                 [WebCategoryAttribute ("Behavior")]
105                 public virtual bool UseSubmitBehavior  {
106                         get { return ViewState.GetBool ("UseSubmitBehavior", true); }
107                         set { ViewState ["UseSubmitBehavior"] = value; }
108                 }
109
110                 protected override void AddAttributesToRender (HtmlTextWriter writer)
111                 {
112                         Page page = Page;
113                         if (page != null)
114                                 page.VerifyRenderingInServerForm (this);
115                         
116                         writer.AddAttribute (HtmlTextWriterAttribute.Type, UseSubmitBehavior ? "submit" : "button", false);
117                         writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
118                         writer.AddAttribute (HtmlTextWriterAttribute.Value, Text);
119
120                         string onclick = OnClientClick;
121                         onclick = ClientScriptManager.EnsureEndsWithSemicolon (onclick);
122                         if (HasAttributes && Attributes ["onclick"] != null) {
123                                 onclick = ClientScriptManager.EnsureEndsWithSemicolon (onclick + Attributes ["onclick"]);
124                                 Attributes.Remove ("onclick");
125                         }
126
127                         if (page != null)
128                                 onclick += GetClientScriptEventReference ();
129
130                         if (onclick.Length > 0)
131                                 writer.AddAttribute (HtmlTextWriterAttribute.Onclick, onclick);
132
133                         base.AddAttributesToRender (writer);
134                 }
135
136                 internal virtual string GetClientScriptEventReference ()
137                 {
138                         PostBackOptions options = GetPostBackOptions ();
139                         Page page = Page;
140                         if (page != null)
141                                 return page.ClientScript.GetPostBackEventReference (options, true);
142                         else
143                                 return String.Empty;
144                 }
145
146                 protected virtual PostBackOptions GetPostBackOptions () 
147                 {
148                         PostBackOptions options = new PostBackOptions (this);
149                         options.ActionUrl = (PostBackUrl.Length > 0 ? 
150                                 Page.ResolveClientUrl (PostBackUrl) 
151                                 : null);
152                         options.ValidationGroup = null;
153                         options.Argument = String.Empty;
154                         options.RequiresJavaScriptProtocol = false;
155                         options.ClientSubmit = !UseSubmitBehavior;
156
157                         Page page = Page;
158                         options.PerformValidation = CausesValidation && page != null && page.AreValidatorsUplevel (ValidationGroup);
159                         if (options.PerformValidation)
160                                 options.ValidationGroup = ValidationGroup;
161
162                         return options;
163                 }
164
165                 void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
166                 {
167                         RaisePostBackEvent (eventArgument);
168                 }
169
170                 protected virtual void OnClick (EventArgs e)
171                 {
172                         if (Events != null) {
173                                 EventHandler eh = (EventHandler) (Events [ClickEvent]);
174                                 if (eh != null)
175                                         eh (this, e);
176                         }
177                 }
178
179                 protected virtual void OnCommand (CommandEventArgs e)
180                 {
181                         if (Events != null) {
182                                 CommandEventHandler eh = (CommandEventHandler) (Events [CommandEvent]);
183                                 if (eh != null)
184                                         eh (this, e);
185                         }
186
187                         RaiseBubbleEvent (this, e);
188                 }
189
190                 protected virtual void RaisePostBackEvent (string eventArgument)
191                 {
192                         ValidateEvent (UniqueID, eventArgument);
193                         if (CausesValidation) {
194                                 Page page = Page;
195                                 if (page != null)
196                                         page.Validate (ValidationGroup);
197                         }
198                         
199                         OnClick (EventArgs.Empty);
200                         OnCommand (new CommandEventArgs (CommandName, CommandArgument));
201                 }
202
203                 protected internal override void OnPreRender (EventArgs e)
204                 {
205                         // Why override?
206                         base.OnPreRender (e);
207                 }
208
209                 protected internal override void RenderContents (HtmlTextWriter writer)
210                 {
211                 }
212                 
213                 [WebSysDescription ("")]
214                 [WebCategory ("Action")]
215                 public event EventHandler Click {
216                         add { Events.AddHandler (ClickEvent, value); }
217                         remove { Events.RemoveHandler (ClickEvent, value); }
218                 }
219
220                 [WebSysDescription ("")]
221                 [WebCategory ("Action")]
222                 public event CommandEventHandler Command {
223                         add { Events.AddHandler (CommandEvent, value); }
224                         remove { Events.RemoveHandler (CommandEvent, value); }
225                 }
226
227                 [DefaultValue ("")]
228                 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
229                 [Themeable (false)]
230                 [UrlProperty("*.aspx")]
231                 public virtual string PostBackUrl {
232                         get { return ViewState.GetString ("PostBackUrl", String.Empty); }
233                         set { ViewState ["PostBackUrl"] = value; }
234                 }
235
236                 [DefaultValue ("")]
237                 [Themeable (false)]
238                 [WebSysDescription ("")]
239                 [WebCategoryAttribute ("Behavior")]
240                 public virtual string ValidationGroup {
241                         get { return ViewState.GetString ("ValidationGroup", String.Empty); }
242                         set { ViewState ["ValidationGroup"] = value; }
243                 }
244         }
245 }