2004-05-26 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[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 \r
14 using System;\r
15 using System.Web;\r
16 using System.Web.UI;\r
17 using System.ComponentModel;
18 using System.ComponentModel.Design;\r
19 \r
20 namespace System.Web.UI.WebControls\r
21 {\r
22         [DefaultProperty("Text")]\r
23         [ControlBuilder(typeof(HyperLinkControlBuilder))]\r
24         [Designer("System.Web.UI.Design.WebControls.HyperLinkDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]\r
25         [DataBindingHandler("System.Web.UI.Design.HyperLinkDataBindingHandler, " + Consts.AssemblySystem_Design)]\r
26         [ParseChildren(false)]\r
27         [ToolboxData("<{0}:HyperLink runat=\"server\">HyperLink</{0}:HyperLink>")]\r
28         public class HyperLink: WebControl\r
29         {\r
30                 bool textSet;\r
31 \r
32                 public HyperLink(): base(HtmlTextWriterTag.A)\r
33                 {\r
34                 }\r
35
36                 [DefaultValue (""), Bindable (true), WebCategory ("Appearance")]
37                 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
38                 [WebSysDescription ("The URL to the image file.")]\r
39                 public virtual string ImageUrl\r
40                 {\r
41                         get\r
42                         {\r
43                                 object o = ViewState["ImageUrl"];\r
44                                 if(o!=null)\r
45                                         return (string)o;\r
46                                 return String.Empty;\r
47                         }\r
48                         set\r
49                         {\r
50                                 ViewState["ImageUrl"] = value;\r
51                         }\r
52                 }\r
53
54                 [DefaultValue (""), Bindable (true), WebCategory ("Navigation")]
55                 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
56                 [WebSysDescription ("The URL to navigate to.")]\r
57                 public string NavigateUrl\r
58                 {\r
59                         get\r
60                         {\r
61                                 object o = ViewState["NavigateUrl"];\r
62                                 if(o!=null)\r
63                                         return (string)o;\r
64                                 return String.Empty;\r
65                         }\r
66                         set\r
67                         {\r
68                                 ViewState["NavigateUrl"] = value;\r
69                         }\r
70                 }\r
71
72                 [DefaultValue (""), Bindable (true), WebCategory ("Navigation")]
73                 [TypeConverter (typeof (TargetConverter))]
74                 [WebSysDescription ("The target frame in which the navigation target should be opened.")]\r
75                 public string Target\r
76                 {\r
77                         get\r
78                         {\r
79                                 object o = ViewState["Target"];\r
80                                 if(o!=null)\r
81                                         return (string)o;\r
82                                 return String.Empty;\r
83                         }\r
84                         set\r
85                         {\r
86                                 ViewState["Target"] = value;\r
87                         }\r
88                 }\r
89
90                 [DefaultValue (""), Bindable (true), WebCategory ("Appearance")]
91                 [PersistenceMode (PersistenceMode.InnerDefaultProperty)]
92                 [WebSysDescription ("The text that should be shown on this HyperLink.")]\r
93                 public virtual string Text\r
94                 {\r
95                         get {\r
96                                 object o = ViewState ["Text"];\r
97                                 if (o != null)\r
98                                         return (string) o;\r
99 \r
100                                 return String.Empty;\r
101                         }\r
102                         set {\r
103                                 if (HasControls())\r
104                                         Controls.Clear();\r
105                                 ViewState["Text"] = value;\r
106                                 textSet = true;\r
107                         }\r
108                 }\r
109 \r
110                 string InternalText\r
111                 {\r
112                         get { return Text; }\r
113                         set { ViewState["Text"] = value; }\r
114                 }\r
115 \r
116                 protected override void AddAttributesToRender(HtmlTextWriter writer)\r
117                 {\r
118                         base.AddAttributesToRender(writer);\r
119                         if(NavigateUrl.Length > 0)\r
120                         {
121                                 string url = ResolveUrl (NavigateUrl);
122                                 writer.AddAttribute(HtmlTextWriterAttribute.Href, url);\r
123                         }\r
124                         if(Target.Length > 0)\r
125                         {\r
126                                 writer.AddAttribute(HtmlTextWriterAttribute.Target, Target);\r
127                         }\r
128                 }\r
129 \r
130                 protected override void AddParsedSubObject(object obj)\r
131                 {\r
132                         if(HasControls())\r
133                         {\r
134                                 base.AddParsedSubObject(obj);\r
135                                 return;\r
136                         }\r
137                         if(obj is LiteralControl)\r
138                         {\r
139                                 // This is a hack to workaround the behaviour of the code generator, which\r
140                                 // may split a text in several LiteralControls if there's a special character\r
141                                 // such as '<' in it.\r
142                                 if (textSet) {\r
143                                         Text = ((LiteralControl)obj).Text;\r
144                                         textSet = false;\r
145                                 } else {\r
146                                         InternalText += ((LiteralControl)obj).Text;\r
147                                 }\r
148                                 //\r
149 \r
150                                 return;\r
151                         }\r
152                         if(Text.Length > 0)\r
153                         {\r
154                                 base.AddParsedSubObject(new LiteralControl (Text));\r
155                                 Text = String.Empty;\r
156                         }\r
157                         base.AddParsedSubObject (obj);\r
158                 }\r
159 \r
160                 protected override void LoadViewState(object savedState)\r
161                 {\r
162                         if(savedState != null)\r
163                         {\r
164                                 base.LoadViewState(savedState);\r
165                                 object o = ViewState["Text"];\r
166                                 if(o!=null)\r
167                                         Text = (string)o;\r
168                         }\r
169                 }\r
170 \r
171                 protected override void RenderContents(HtmlTextWriter writer)\r
172                 {\r
173                         if(ImageUrl.Length > 0)\r
174                         {\r
175                                 Image img = new Image();\r
176                                 img.ImageUrl = ResolveUrl(ImageUrl);\r
177                                 if(ToolTip.Length > 0)\r
178                                         img.ToolTip = ToolTip;\r
179                                 if(Text.Length > 0)\r
180                                         img.AlternateText = Text;\r
181                                 img.RenderControl(writer);\r
182                                 return;\r
183                         }\r
184                         if(HasControls())\r
185                         {\r
186                                 base.RenderContents(writer);\r
187                                 return;\r
188                         }\r
189                         writer.Write(Text);\r
190                 }\r
191         }\r
192 }\r