2002-03-26 Gaurav Vaish <gvaish@iitk.ac.in>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / BaseValidator.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     BaseValidator\r
4  *\r
5  * Author:  Gaurav Vaish\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
8  * Implementation: yes\r
9  * Status:  80%\r
10  *\r
11  * (C) Gaurav Vaish (2001)\r
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 using System.Drawing;\r
19 \r
20 namespace System.Web.UI.WebControls\r
21 {\r
22         [DefaultProperty("ErrorMessage")]\r
23         //TODO: [Designer("??")]\r
24         public abstract class BaseValidator: Label, IValidator\r
25         {\r
26                 private bool isValid;\r
27                 private bool isPreRenderCalled;\r
28                 private bool isPropertiesChecked;\r
29                 private bool propertiesValid;\r
30                 private bool renderUplevel;\r
31 \r
32                 protected BaseValidator() : base()\r
33                 {\r
34                         isValid = true;\r
35                         ForeColor = Color.Red;\r
36                 }\r
37 \r
38                 public string ControlToValidate\r
39                 {\r
40                         get\r
41                         {\r
42                                 object o = ViewState["ControlToValidate"];\r
43                                 if(o != null)\r
44                                 {\r
45                                         return (string)o;\r
46                                 }\r
47                                 return String.Empty;\r
48                         }\r
49                         set\r
50                         {\r
51                                 ViewState["ControlToValidate"] = value;\r
52                         }\r
53                 }\r
54 \r
55                 public ValidatorDisplay Display\r
56                 {\r
57                         get\r
58                         {\r
59                                 object o = ViewState["Display"];\r
60                                 if(o != null)\r
61                                 {\r
62                                         return (ValidatorDisplay)o;\r
63                                 }\r
64                                 return ValidatorDisplay.Static;\r
65                         }\r
66                         set\r
67                         {\r
68                                 if(!Enum.IsDefined(typeof(ValidatorDisplay), value))\r
69                                 {\r
70                                         throw new ArgumentException();\r
71                                 }\r
72                                 ViewState["ValidatorDisplay"] = value;\r
73                         }\r
74                 }\r
75 \r
76                 public bool EnableClientScript\r
77                 {\r
78                         get\r
79                         {\r
80                                 object o = ViewState["EnableClientScript"];\r
81                                 if(o != null)\r
82                                 {\r
83                                         return (bool)o;\r
84                                 }\r
85                                 return true;\r
86                         }\r
87                         set\r
88                         {\r
89                                 ViewState["EnableClientScript"] = value;\r
90                         }\r
91                 }\r
92 \r
93                 public override bool Enabled\r
94                 {\r
95                         get\r
96                         {\r
97                                 return Enabled;\r
98                         }\r
99                         set\r
100                         {\r
101                                 Enabled = value;\r
102                         }\r
103                 }\r
104 \r
105                 public string ErrorMessage\r
106                 {\r
107                         get\r
108                         {\r
109                                 object o = ViewState["ErrorMessage"];\r
110                                 if(o != null)\r
111                                 {\r
112                                         return (string)o;\r
113                                 }\r
114                                 return String.Empty;\r
115                         }\r
116                         set\r
117                         {\r
118                                 ViewState["ErrorMessage"] = value;\r
119                         }\r
120                 }\r
121 \r
122                 public override Color ForeColor\r
123                 {\r
124                         get\r
125                         {\r
126                                 return ForeColor;\r
127                         }\r
128                         set\r
129                         {\r
130                                 ForeColor = value;\r
131                         }\r
132                 }\r
133 \r
134                 public bool IsValid\r
135                 {\r
136                         get\r
137                         {\r
138                                 object o = ViewState["IsValid"];\r
139                                 if(o != null)\r
140                                 {\r
141                                         return (bool)o;\r
142                                 }\r
143                                 return true;\r
144                         }\r
145                         set\r
146                         {\r
147                                 ViewState["IsValid"] = value;\r
148                         }\r
149                 }\r
150 \r
151                 public static PropertyDescriptor GetValidationProperty(object component)\r
152                 {\r
153                         ValidationPropertyAttribute attrib = (ValidationPropertyAttribute)((TypeDescriptor.GetAttributes(component))[typeof(ValidationPropertyAttribute)]);\r
154                         if(attrib != null && attrib.Name != null)\r
155                         {\r
156                                 return (TypeDescriptor.GetProperties(component, null))[attrib.Name];\r
157                         }\r
158                         return null;\r
159                 }\r
160 \r
161                 public void Validate()\r
162                 {\r
163                         if(!Visible || (Visible && !Enabled))\r
164                         {\r
165                                 IsValid = true;\r
166                         }\r
167                         Control ctrl = Parent;\r
168                         while(ctrl != null)\r
169                         {\r
170                                 if(!ctrl.Visible)\r
171                                 {\r
172                                         IsValid = true;\r
173                                         return;\r
174                                 }\r
175                                 ctrl = ctrl.Parent;\r
176                         }\r
177                         isPropertiesChecked = false;\r
178                         if(!PropertiesValid)\r
179                         {\r
180                                 IsValid = true;\r
181                                 return;\r
182                         }\r
183                         IsValid = EvaluateIsValid();\r
184                 }\r
185 \r
186                 protected bool PropertiesValid\r
187                 {\r
188                         get\r
189                         {\r
190                                 if(!isPropertiesChecked)\r
191                                 {\r
192                                         propertiesValid = ControlPropertiesValid();\r
193                                         isPropertiesChecked = true;\r
194                                 }\r
195                                 return propertiesValid;\r
196                         }\r
197                 }\r
198 \r
199                 protected bool RenderUplevel\r
200                 {\r
201                         get\r
202                         {\r
203                                 return renderUplevel;\r
204                         }\r
205                 }\r
206 \r
207                 protected override void AddAttributesToRender(HtmlTextWriter writer)\r
208                 {\r
209                         bool enabled = Enabled;\r
210                         if(!Enabled)\r
211                         {\r
212                                 Enabled = true;\r
213                         }\r
214                         AddAttributesToRender(writer);\r
215                         if(RenderUplevel)\r
216                         {\r
217                                 if(ID == null)\r
218                                 {\r
219                                         writer.AddAttribute("id", ClientID);\r
220                                 }\r
221                                 if(ControlToValidate.Length > 0)\r
222                                 {\r
223                                         writer.AddAttribute("controltovalidate", GetControlRenderID(ControlToValidate));\r
224                                 }\r
225                                 if(ErrorMessage.Length > 0)\r
226                                 {\r
227                                         writer.AddAttribute("errormessage", ErrorMessage, true);\r
228                                 }\r
229                                 if(Display == ValidatorDisplay.Static)\r
230                                 {\r
231                                         writer.AddAttribute("display", Enum.Format(typeof(ValidatorDisplay), Display, "G").Replace('_','-'));\r
232                                         //writer.AddAttribute("display", PropertyConverter.EnumToString(typeof(ValidatorDisplay), Display));\r
233                                 }\r
234                                 if(!IsValid)\r
235                                 {\r
236                                         writer.AddAttribute("isvalid", "False");\r
237                                 }\r
238                                 if(!enabled)\r
239                                 {\r
240                                         writer.AddAttribute("enabled", "False");\r
241                                 }\r
242                         }\r
243                         if(!enabled)\r
244                         {\r
245                                 Enabled = false;\r
246                         }\r
247                 }\r
248 \r
249                 [MonoTODO]\r
250                 protected void CheckControlValidationProperty(string name, string propertyName)\r
251                 {\r
252                         Control ctrl = NamingContainer.FindControl(name);\r
253                         if(ctrl == null)\r
254                         {\r
255                                 throw new HttpException(HttpRuntime.FormatResourceString("Validator_control_not_found",\r
256                                                  name, propertyName/*, ID*/));\r
257                         }\r
258                         PropertyDescriptor pd = GetValidationProperty(ctrl);\r
259                         if(pd == null)\r
260                         {\r
261                                 throw new HttpException(HttpRuntime.FormatResourceString("Validator_bad_control_type",\r
262                                                  name, propertyName/*, ID*/));\r
263                         }\r
264                 }\r
265 \r
266                 protected virtual bool ControlPropertiesValid()\r
267                 {\r
268                         if(ControlToValidate.Length == 0)\r
269                         {\r
270                                 throw new HttpException(HttpRuntime.FormatResourceString("Validator_control_blank", ID));\r
271                         }\r
272                         CheckControlValidationProperty(ControlToValidate, "ControlToValidate");\r
273                         return true;\r
274                 }\r
275 \r
276                 [MonoTODO]\r
277                 protected virtual bool DetermineRenderUplevel()\r
278                 {\r
279                         Page page = Page;\r
280                         if(page == null || page.Request == null)\r
281                         {\r
282                                 return false;\r
283                         }\r
284                         if(EnableClientScript)\r
285                         {\r
286                                 throw new NotImplementedException();\r
287                                 //TODO: I need to get the (Browser->Dom_version_major >= 4 &&\r
288                                 //                         Brower->Ecma_script_version >= 1.2)\r
289                         }\r
290                         return false;\r
291                 }\r
292 \r
293                 protected string GetControlRenderID(string name)\r
294                 {\r
295                         Control ctrl = FindControl(name);\r
296                         if(ctrl != null)\r
297                         {\r
298                                 return ctrl.ClientID;\r
299                         }\r
300                         return String.Empty;\r
301                 }\r
302 \r
303                 protected string GetControlValidationValue(string name)\r
304                 {\r
305                         Control ctrl = NamingContainer.FindControl(name);\r
306                         if(ctrl != null)\r
307                         {\r
308                                 PropertyDescriptor pd = GetValidationProperty(ctrl);\r
309                                 if(pd != null)\r
310                                 {\r
311                                         object item = pd.GetValue(ctrl);\r
312                                         if(item is ListItem)\r
313                                         {\r
314                                                 return ((ListItem)item).Value;\r
315                                         }\r
316                                         return item.ToString();\r
317                                 }\r
318                         }\r
319                         return null;\r
320                 }\r
321 \r
322                 protected override void OnInit(EventArgs e)\r
323                 {\r
324                         OnInit(e);\r
325                         Page.Validators.Add(this);\r
326                 }\r
327 \r
328                 protected override void OnPreRender(EventArgs e)\r
329                 {\r
330                         OnPreRender(e);\r
331                         isPreRenderCalled   = true;\r
332                         isPropertiesChecked = false;\r
333                         renderUplevel       = DetermineRenderUplevel();\r
334                         if(renderUplevel)\r
335                         {\r
336                                 RegisterValidatorCommonScript();\r
337                         }\r
338                 }\r
339 \r
340                 protected override void OnUnload(EventArgs e)\r
341                 {\r
342                         if(Page != null)\r
343                         {\r
344                                 Page.Validators.Remove(this);\r
345                         }\r
346                         OnUnload(e);\r
347                 }\r
348 \r
349                 [MonoTODO("What_do_I_have_to_do")]\r
350                 protected void RegisterValidatorCommonScript()\r
351                 {\r
352                         throw new NotImplementedException();\r
353                 }\r
354 \r
355                 [MonoTODO("I_have_to_know_javascript_for_this_I_know_it_but_for_ALL_browsers_NO")]\r
356                 protected virtual void RegisterValidatorDeclaration()\r
357                 {\r
358                         throw new NotImplementedException();\r
359                         //TODO: Since I have to access document.<ClientID> and register\r
360                         // as page validator. Now this is Browser dependent :((\r
361                 }\r
362 \r
363                 [MonoTODO("Render_ing_always_left")]\r
364                 protected override void Render(HtmlTextWriter writer)\r
365                 {\r
366                         bool valid;\r
367                         if(isPreRenderCalled)\r
368                         {\r
369                                 valid = (Enabled && IsValid);\r
370                         } else\r
371                         {\r
372                                 isPropertiesChecked = true;\r
373                                 propertiesValid     = true;\r
374                                 renderUplevel       = false;\r
375                                 valid               = true;\r
376                         }\r
377                         if(PropertiesValid)\r
378                         {\r
379                                 if(Page != null)\r
380                                 {\r
381                                         Page.VerifyRenderingInServerForm(this);\r
382                                 }\r
383                                 ValidatorDisplay dis = Display;\r
384                                 if(RenderUplevel)\r
385                                 {\r
386                                         throw new NotImplementedException();\r
387                                 }\r
388                                 throw new NotImplementedException();\r
389                         }\r
390                         return;\r
391                 }\r
392 \r
393                 protected abstract bool EvaluateIsValid();\r
394         }\r
395 }\r