Add licensing info
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / HyperLink.cs
1 //
2 // System.Web.UI.WebControls.HyperLink.cs
3 //
4 // Authors:
5 //   Gaurav Vaish (gvaish@iitk.ac.in)
6 //   Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //
9 // (c) 2002 Ximian, Inc. (http://www.ximian.com)
10 // (C) Gaurav Vaish (2002)
11 // (C) 2003 Andreas Nahr
12 //\r
13
14 //
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
22 // 
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
25 // 
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 //
34 \r
35 using System;\r
36 using System.Web;\r
37 using System.Web.UI;\r
38 using System.ComponentModel;
39 using System.ComponentModel.Design;\r
40 \r
41 namespace System.Web.UI.WebControls\r
42 {\r
43         [DefaultProperty("Text")]\r
44         [ControlBuilder(typeof(HyperLinkControlBuilder))]\r
45         [Designer("System.Web.UI.Design.WebControls.HyperLinkDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]\r
46         [DataBindingHandler("System.Web.UI.Design.HyperLinkDataBindingHandler, " + Consts.AssemblySystem_Design)]\r
47         [ParseChildren(false)]\r
48         [ToolboxData("<{0}:HyperLink runat=\"server\">HyperLink</{0}:HyperLink>")]\r
49         public class HyperLink: WebControl\r
50         {\r
51                 bool textSet;\r
52 \r
53                 public HyperLink(): base(HtmlTextWriterTag.A)\r
54                 {\r
55                 }\r
56
57                 [DefaultValue (""), Bindable (true), WebCategory ("Appearance")]
58                 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
59                 [WebSysDescription ("The URL to the image file.")]\r
60                 public virtual string ImageUrl\r
61                 {\r
62                         get\r
63                         {\r
64                                 object o = ViewState["ImageUrl"];\r
65                                 if(o!=null)\r
66                                         return (string)o;\r
67                                 return String.Empty;\r
68                         }\r
69                         set\r
70                         {\r
71                                 ViewState["ImageUrl"] = value;\r
72                         }\r
73                 }\r
74
75                 [DefaultValue (""), Bindable (true), WebCategory ("Navigation")]
76                 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
77                 [WebSysDescription ("The URL to navigate to.")]\r
78                 public string NavigateUrl\r
79                 {\r
80                         get\r
81                         {\r
82                                 object o = ViewState["NavigateUrl"];\r
83                                 if(o!=null)\r
84                                         return (string)o;\r
85                                 return String.Empty;\r
86                         }\r
87                         set\r
88                         {\r
89                                 ViewState["NavigateUrl"] = value;\r
90                         }\r
91                 }\r
92
93                 [DefaultValue (""), Bindable (true), WebCategory ("Navigation")]
94                 [TypeConverter (typeof (TargetConverter))]
95                 [WebSysDescription ("The target frame in which the navigation target should be opened.")]\r
96                 public string Target\r
97                 {\r
98                         get\r
99                         {\r
100                                 object o = ViewState["Target"];\r
101                                 if(o!=null)\r
102                                         return (string)o;\r
103                                 return String.Empty;\r
104                         }\r
105                         set\r
106                         {\r
107                                 ViewState["Target"] = value;\r
108                         }\r
109                 }\r
110
111                 [DefaultValue (""), Bindable (true), WebCategory ("Appearance")]
112                 [PersistenceMode (PersistenceMode.InnerDefaultProperty)]
113                 [WebSysDescription ("The text that should be shown on this HyperLink.")]\r
114                 public virtual string Text\r
115                 {\r
116                         get {\r
117                                 object o = ViewState ["Text"];\r
118                                 if (o != null)\r
119                                         return (string) o;\r
120 \r
121                                 return String.Empty;\r
122                         }\r
123                         set {\r
124                                 if (HasControls())\r
125                                         Controls.Clear();\r
126                                 ViewState["Text"] = value;\r
127                                 textSet = true;\r
128                         }\r
129                 }\r
130 \r
131                 string InternalText\r
132                 {\r
133                         get { return Text; }\r
134                         set { ViewState["Text"] = value; }\r
135                 }\r
136 \r
137                 protected override void AddAttributesToRender(HtmlTextWriter writer)\r
138                 {\r
139                         base.AddAttributesToRender(writer);\r
140                         if(NavigateUrl.Length > 0)\r
141                         {
142                                 string url = ResolveUrl (NavigateUrl);
143                                 writer.AddAttribute(HtmlTextWriterAttribute.Href, url);\r
144                         }\r
145                         if(Target.Length > 0)\r
146                         {\r
147                                 writer.AddAttribute(HtmlTextWriterAttribute.Target, Target);\r
148                         }\r
149                 }\r
150 \r
151                 protected override void AddParsedSubObject(object obj)\r
152                 {\r
153                         if(HasControls())\r
154                         {\r
155                                 base.AddParsedSubObject(obj);\r
156                                 return;\r
157                         }\r
158                         if(obj is LiteralControl)\r
159                         {\r
160                                 // This is a hack to workaround the behaviour of the code generator, which\r
161                                 // may split a text in several LiteralControls if there's a special character\r
162                                 // such as '<' in it.\r
163                                 if (textSet) {\r
164                                         Text = ((LiteralControl)obj).Text;\r
165                                         textSet = false;\r
166                                 } else {\r
167                                         InternalText += ((LiteralControl)obj).Text;\r
168                                 }\r
169                                 //\r
170 \r
171                                 return;\r
172                         }\r
173                         if(Text.Length > 0)\r
174                         {\r
175                                 base.AddParsedSubObject(new LiteralControl (Text));\r
176                                 Text = String.Empty;\r
177                         }\r
178                         base.AddParsedSubObject (obj);\r
179                 }\r
180 \r
181                 protected override void LoadViewState(object savedState)\r
182                 {\r
183                         if(savedState != null)\r
184                         {\r
185                                 base.LoadViewState(savedState);\r
186                                 object o = ViewState["Text"];\r
187                                 if(o!=null)\r
188                                         Text = (string)o;\r
189                         }\r
190                 }\r
191 \r
192                 protected override void RenderContents(HtmlTextWriter writer)\r
193                 {\r
194                         if(ImageUrl.Length > 0)\r
195                         {\r
196                                 Image img = new Image();\r
197                                 img.ImageUrl = ResolveUrl(ImageUrl);\r
198                                 if(ToolTip.Length > 0)\r
199                                         img.ToolTip = ToolTip;\r
200                                 if(Text.Length > 0)\r
201                                         img.AlternateText = Text;\r
202                                 img.RenderControl(writer);\r
203                                 return;\r
204                         }\r
205                         if(HasControls())\r
206                         {\r
207                                 base.RenderContents(writer);\r
208                                 return;\r
209                         }\r
210                         writer.Write(Text);\r
211                 }\r
212         }\r
213 }\r