2005-02-02 Lluis Sanchez Gual <lluis@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / LinkButton.cs
1 //
2 // System.Web.UI.WebControls.LinkButton.cs
3 //
4 // Authors:
5 //   Gaurav Vaish (gvaish@iitk.ac.in)
6 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
7 //
8 // (C) Gaurav Vaish (2002)
9 // (C) 2003 Andreas Nahr
10 //\r
11
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32 \r
33 using System;\r
34 using System.Web;\r
35 using System.Web.UI;\r
36 using System.ComponentModel;
37 using System.ComponentModel.Design;\r
38 \r
39 namespace System.Web.UI.WebControls\r
40 {\r
41         [DefaultEvent("Click")]\r
42         [DefaultProperty("Text")]\r
43         [ControlBuilder(typeof(LinkButtonControlBuilder))]\r
44         [Designer("System.Web.UI.Design.WebControls.LinkButtonDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]\r
45         [DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, " + Consts.AssemblySystem_Design)]\r
46         [ParseChildren(false)]\r
47         [ToolboxData("<{0}:LinkButton runat=\"server\">LinkButton</{0}:LinkButton>")]\r
48         public class LinkButton : WebControl, IPostBackEventHandler\r
49         {\r
50                 private static readonly object ClickEvent   = new object();\r
51                 private static readonly object CommandEvent = new object();\r
52 \r
53                 public LinkButton () : base (HtmlTextWriterTag.A)\r
54                 {\r
55                 }\r
56
57 #if NET_2_0\r
58                 [ThemeableAttribute (false)]\r
59 #else\r
60                 [Bindable (false)]\r
61 #endif\r
62                 [DefaultValue (true), WebCategory ("Behavior")]
63                 [WebSysDescription ("Determines if validation is performed when clicked.")]\r
64                 public bool CausesValidation\r
65                 {\r
66                         get {\r
67                                 object o = ViewState ["CausesValidation"];\r
68                                 return (o == null) ? true : (bool) o;\r
69                         }\r
70 \r
71                         set { ViewState ["CausesValidation"] = value; }\r
72                 }\r
73
74 #if NET_2_0\r
75                 [ThemeableAttribute (false)]\r
76 #endif\r
77                 [DefaultValue (""), Bindable (true), WebCategory ("Behavior")]
78                 [WebSysDescription ("An argument for the Command of this control.")]\r
79                 public string CommandArgument\r
80                 {\r
81                         get {\r
82                                 object o = ViewState ["CommandArgument"];\r
83                                 return (o == null) ? String.Empty : (string) o;\r
84                         }\r
85 \r
86                         set { ViewState ["CommandArgument"] = value; }\r
87                 }\r
88
89 #if NET_2_0\r
90                 [ThemeableAttribute (false)]\r
91 #endif\r
92                 [DefaultValue (""), WebCategory ("Behavior")]
93                 [WebSysDescription ("The name of the Command of this control.")]\r
94                 public string CommandName\r
95                 {\r
96                         get {\r
97                                 object o = ViewState ["CommandName"];\r
98                                 return (o == null) ? String.Empty : (string) o;\r
99                         }\r
100 \r
101                         set { ViewState ["CommandName"] = value; }\r
102                 }\r
103
104 #if NET_2_0\r
105                 [Localizable (true)]\r
106 #endif\r
107                 [DefaultValue (""), Bindable (true), WebCategory ("Appearance")]
108                 [PersistenceMode (PersistenceMode.InnerDefaultProperty)]
109                 [WebSysDescription ("The text that should be shown on this LinkButton.")]\r
110                 public virtual string Text\r
111                 {\r
112                         get {\r
113                                 object o = ViewState ["Text"];\r
114                                 return (o == null) ? String.Empty : (string) o;\r
115                         }\r
116 \r
117                         set { ViewState ["Text"] = value; }\r
118                 }\r
119
120                 [WebCategory ("Action")]
121                 [WebSysDescription ("Raised when the LinkButton is clicked.")]\r
122                 public event EventHandler Click\r
123                 {\r
124                         add { Events.AddHandler(ClickEvent, value); }\r
125                         remove { Events.RemoveHandler(ClickEvent, value); }\r
126                 }\r
127
128                 [WebCategory ("Action")]
129                 [WebSysDescription ("Raised when a LinkButton Command is executed.")]\r
130                 public event CommandEventHandler Command\r
131                 {\r
132                         add { Events.AddHandler(CommandEvent, value); }\r
133                         remove { Events.RemoveHandler(CommandEvent, value); }\r
134                 }\r
135 \r
136                 protected virtual void OnClick (EventArgs e)\r
137                 {\r
138                         if(Events != null){\r
139                                 EventHandler eh = (EventHandler) (Events [ClickEvent]);\r
140                                 if (eh != null)\r
141                                         eh (this, e);\r
142                         }\r
143                 }\r
144 \r
145                 protected virtual void OnCommand (CommandEventArgs e)\r
146                 {\r
147                         if(Events != null){\r
148                                 CommandEventHandler ceh = (CommandEventHandler) (Events [CommandEvent]);\r
149                                 if (ceh != null)\r
150                                         ceh (this, e);\r
151                         }\r
152                         RaiseBubbleEvent (this, e);\r
153                 }\r
154 \r
155                 protected override void OnPreRender (EventArgs e)\r
156                 {\r
157                         base.OnPreRender(e);\r
158                 }\r
159 \r
160                 void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)\r
161                 {\r
162                         if (CausesValidation)\r
163                                 Page.Validate ();\r
164                         OnClick (EventArgs.Empty);\r
165                         OnCommand (new CommandEventArgs (CommandName, CommandArgument));\r
166                 }\r
167 \r
168                 protected override void AddAttributesToRender (HtmlTextWriter writer)\r
169                 {\r
170                         base.AddAttributesToRender (writer);\r
171                         if (Enabled && Page != null){\r
172                                 if (CausesValidation && Page.Validators.Count > 0){\r
173                                         writer.AddAttribute (HtmlTextWriterAttribute.Href,\r
174                                                              "javascript:" + \r
175                                                              Utils.GetClientValidatedPostBack (this));\r
176                                         return;\r
177                                 }\r
178                                 writer.AddAttribute (HtmlTextWriterAttribute.Href,\r
179                                                      Page.GetPostBackClientHyperlink (this, ""));\r
180                         }\r
181                 }\r
182 \r
183                 protected override void AddParsedSubObject (object obj)\r
184                 {\r
185                         if (HasControls ()){\r
186                                 base.AddParsedSubObject (obj);\r
187                                 return;\r
188                         }\r
189 \r
190                         if (obj is LiteralControl){\r
191                                 Text = ((LiteralControl) obj).Text;\r
192                                 return;\r
193                         }\r
194 \r
195                         if (Text.Length > 0){\r
196                                 base.AddParsedSubObject (new LiteralControl (Text));\r
197                                 Text = String.Empty;\r
198                         }\r
199 \r
200                         base.AddParsedSubObject (obj);\r
201                 }\r
202 \r
203                 protected override void LoadViewState (object savedState)\r
204                 {\r
205                         if (savedState != null){\r
206                                 base.LoadViewState (savedState);\r
207                                 string savedText = (string) ViewState ["Text"];\r
208                                 if (savedText != null)\r
209                                         Text = savedText;\r
210                         }\r
211                 }\r
212 \r
213                 protected override void RenderContents (HtmlTextWriter writer)\r
214                 {\r
215                         if (HasControls ()){\r
216                                 base.RenderContents (writer);\r
217                                 return;\r
218                         }\r
219                         writer.Write (Text);\r
220                 }\r
221         }\r
222 }\r