2003-10-29 Ben Maurer <bmaurer@users.sourceforge.net>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / HyperLinkColumn.cs
1 //
2 // System.Web.UI.WebControls.HyperLinkColumn.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.ComponentModel;\r
16 using System.Web;\r
17 using System.Web.UI;\r
18 \r
19 namespace System.Web.UI.WebControls\r
20 {\r
21         public class HyperLinkColumn: DataGridColumn\r
22         {\r
23                 PropertyDescriptor textFieldDescriptor;\r
24                 PropertyDescriptor urlFieldDescriptor;\r
25 \r
26                 public HyperLinkColumn ()\r
27                 {\r
28                 }\r
29
30                 [DefaultValue (""), WebCategory ("Misc")]
31                 [WebSysDescription ("The field that gets data-bound to the NavigateUrl.")]\r
32                 public virtual string DataNavigateUrlField {\r
33                         get {\r
34                                 object o = ViewState ["DataNavigateUrlField"];\r
35                                 if (o != null)\r
36                                         return (string) o;\r
37                                 return String.Empty;\r
38                         }\r
39 \r
40                         set {\r
41                                 ViewState ["DataNavigateUrlField"] = value;\r
42                                 OnColumnChanged ();\r
43                         }\r
44                 }
45
46                 // LAMESPEC should use WebSysDescription as all others do, but MS uses Description here\r
47
48                 [DefaultValue (""), WebCategory ("Misc")]
49                 [Description ("The formatting rule for the text content that gets data-bound to the NavigateUrl.")]\r
50                 public virtual string DataNavigateUrlFormatString {\r
51                         get {\r
52                                 object o = ViewState ["DataNavigateUrlFormatString"];\r
53                                 if (o != null)\r
54                                         return (string) o;\r
55                                 return String.Empty;\r
56                         }\r
57 \r
58                         set {\r
59                                 ViewState ["DataNavigateUrlFormatString"] = value;\r
60                                 OnColumnChanged ();\r
61                         }\r
62                 }\r
63
64                 [DefaultValue (""), WebCategory ("Misc")]
65                 [WebSysDescription ("The field that gets data-bound to the Text property.")]\r
66                 public virtual string DataTextField {\r
67                         get {\r
68                                 object o = ViewState ["DataTextField"];\r
69                                 if (o != null)\r
70                                         return (string) o;\r
71                                 return String.Empty;\r
72                         }\r
73                         set {\r
74                                 ViewState ["DataTextField"] = value;\r
75                                 OnColumnChanged ();\r
76                         }\r
77                 }\r
78
79                 // LAMESPEC should use WebSysDescription as all others do, but MS uses Description here
80
81                 [DefaultValue (""), WebCategory ("Misc")]
82                 [Description ("The formatting rule for the text content that gets data-bound to the Text property.")]\r
83                 public virtual string DataTextFormatString {\r
84                         get {\r
85                                 object o = ViewState ["DataTextFormatString"];\r
86                                 if (o != null)\r
87                                         return (string) o;\r
88                                 return String.Empty;\r
89                         }\r
90 \r
91                         set {\r
92                                 ViewState ["DataTextFormatString"] = value;\r
93                                 OnColumnChanged ();\r
94                         }\r
95                 }\r
96
97                 [DefaultValue (""), WebCategory ("Misc")]
98                 [WebSysDescription ("The URL that this hyperlink links to.")]\r
99                 public virtual string NavigateUrl {\r
100                         get {\r
101                                 object o = ViewState ["NavigateUrl"];\r
102                                 if (o != null)\r
103                                         return (string) o;\r
104                                 return String.Empty;\r
105                         }\r
106 \r
107                         set {\r
108                                 ViewState ["NavigateUrl"] = value;\r
109                                 OnColumnChanged ();\r
110                         }\r
111                 }\r
112
113                 [DefaultValue (""), WebCategory ("Misc")]
114                 [WebSysDescription ("The target frame in which the NavigateUrl property should be opened.")]\r
115                 public virtual string Target {\r
116                         get {\r
117                                 object o = ViewState ["Target"];\r
118                                 if (o != null)\r
119                                         return (string) o;\r
120                                 return String.Empty;\r
121                         }\r
122 \r
123                         set {\r
124                                 ViewState ["Target"] = value;\r
125                                 OnColumnChanged ();\r
126                         }\r
127                 }\r
128
129                 [DefaultValue (""), WebCategory ("Misc")]
130                 [WebSysDescription ("The Text for the hyperlink.")]\r
131                 public virtual string Text {\r
132                         get {\r
133                                 object o = ViewState ["Text"];\r
134                                 if (o != null)\r
135                                         return (string) o;\r
136                                 return String.Empty;\r
137                         }\r
138 \r
139                         set {\r
140                                 ViewState ["Text"] = value;\r
141                                 OnColumnChanged ();\r
142                         }\r
143                 }\r
144 \r
145                 public override void Initialize ()\r
146                 {\r
147                         textFieldDescriptor = null;\r
148                         urlFieldDescriptor  = null;\r
149                         base.Initialize ();\r
150                 }\r
151 \r
152                 public override void InitializeCell (TableCell cell, int columnIndex, ListItemType itemType)\r
153                 {\r
154                         base.InitializeCell (cell, columnIndex, itemType);\r
155 \r
156                         if (itemType != ListItemType.Header && itemType != ListItemType.Footer) {\r
157                                 HyperLink toDisplay = new HyperLink ();\r
158                                 toDisplay.Text = Text;\r
159                                 toDisplay.NavigateUrl = NavigateUrl;\r
160                                 toDisplay.Target = Target;\r
161 \r
162                                 if (DataTextField.Length > 0 || DataNavigateUrlField.Length > 0)\r
163                                         toDisplay.DataBinding += new EventHandler (OnDataBindHyperLinkColumn);\r
164 \r
165                                 cell.Controls.Add (toDisplay);\r
166                         }\r
167                 }\r
168 \r
169                 private void OnDataBindHyperLinkColumn (object sender, EventArgs e)
170                 {
171                         HyperLink link = (HyperLink) sender;
172                         object item = ((DataGridItem) link.NamingContainer).DataItem;
173
174                         PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (item);
175                         if (textFieldDescriptor == null)
176                                 textFieldDescriptor = properties.Find (DataTextField, true);
177
178                         if (urlFieldDescriptor == null)
179                                 urlFieldDescriptor = properties.Find (DataNavigateUrlField, true);
180
181                         if (DataTextField.Length > 0 && textFieldDescriptor == null && !DesignMode)
182                                 throw new HttpException (HttpRuntime.FormatResourceString (
183                                                                 "Field_Not_Found", DataTextField));
184
185                         if (DataNavigateUrlField.Length > 0 && urlFieldDescriptor == null && !DesignMode)
186                                 throw new HttpException (HttpRuntime.FormatResourceString (
187                                                                 "Field_Not_Found", DataNavigateUrlField));
188
189                         if (textFieldDescriptor != null) {
190                                 link.Text = FormatDataTextValue (textFieldDescriptor.GetValue (item));
191                         } else {
192                                 link.Text = Text;
193                         }
194
195                         if (urlFieldDescriptor != null) {
196                                 link.NavigateUrl = FormatDataNavigateUrlValue (urlFieldDescriptor.GetValue (item));
197                         } else {
198                                 link.NavigateUrl = "url";
199                         }
200                 }
201
202                 protected virtual string FormatDataNavigateUrlValue (object dataUrlValue)\r
203                 {\r
204                         if (dataUrlValue == null)\r
205                                 return String.Empty;\r
206 \r
207                         string retVal;\r
208                         if (DataNavigateUrlFormatString.Length > 0) {\r
209                                 retVal = String.Format (DataNavigateUrlFormatString, dataUrlValue);\r
210                         } else {\r
211                                 retVal = dataUrlValue.ToString ();\r
212                         }\r
213 \r
214                         return retVal;\r
215                 }\r
216 \r
217                 protected virtual string FormatDataTextValue (object dataTextValue)\r
218                 {\r
219                         if (dataTextValue == null)\r
220                                 return String.Empty;\r
221 \r
222                         string retVal;\r
223                         if (DataTextFormatString.Length > 0) {\r
224                                 retVal = String.Format (DataTextFormatString, dataTextValue);\r
225                         } else {\r
226                                 retVal = dataTextValue.ToString ();\r
227                         }\r
228 \r
229                         return retVal;\r
230                 }\r
231         }\r
232 }\r
233 \r