* Maintainer: gvaish@iitk.ac.in\r
* Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
* Implementation: yes\r
- * Status: 20%\r
+ * Status: 80%\r
* \r
* (C) Gaurav Vaish (2001)\r
*/\r
{\r
public abstract class BaseValidator: Label, IValidator\r
{\r
- //\r
- private PropertyDescriptor pDesc;\r
- private string ctValid = String.Empty;\r
- private ValidatorDisplay vDisp = ValidatorDisplay.Static;\r
- private bool enableClientScript; //TODO: check the default value := false;\r
- private bool enabled = true;\r
- private string errorMessage = String.Empty;\r
- private Color foreColor = Color.Red;\r
- private bool isValid = true;\r
+ private bool isValid;\r
+ private bool isPreRenderCalled;\r
+ private bool isPropertiesChecked;\r
private bool propertiesValid;\r
private bool renderUplevel;\r
-\r
- public static PropertyDescriptor GetValidationProperty(object component)\r
+ \r
+ protected BaseValidator() : base()\r
{\r
- //TODO: Have to workout this one!\r
- return null;\r
+ isValid = true;\r
+ ForeColor = Color.Red;\r
}\r
\r
public string ControlToValidate\r
{\r
get\r
{\r
- return ctValid;\r
+ object o = ViewState["ControlToValidate"];\r
+ if(o != null)\r
+ {\r
+ return (string)o;\r
+ }\r
+ return String.Empty;\r
}\r
set\r
{\r
- ctValid = value;\r
+ ViewState["ControlToValidate"] = value;\r
}\r
}\r
\r
{\r
get\r
{\r
- return vDisp;\r
+ object o = ViewState["Display"];\r
+ if(o != null)\r
+ {\r
+ return (ValidatorDisplay)o;\r
+ }\r
+ return ValidatorDisplay.Static;\r
}\r
set\r
{\r
- //TODO: Throw new exception ArgumentException("....") if the value is not valid\r
- vDisp = value;\r
+ if(!Enum.IsDefined(typeof(ValidatorDisplay), value))\r
+ {\r
+ throw new ArgumentException();\r
+ }\r
+ ViewState["ValidatorDisplay"] = value;\r
}\r
}\r
\r
{\r
get\r
{\r
- return enableClientScript;\r
+ object o = ViewState["EnableClientScript"];\r
+ if(o != null)\r
+ {\r
+ return (bool)o;\r
+ }\r
+ return true;\r
}\r
set\r
{\r
- enableClientScript = value;\r
+ ViewState["EnableClientScript"] = value;\r
}\r
}\r
\r
{\r
get\r
{\r
- return enabled;\r
+ return Enabled;\r
}\r
set\r
{\r
- enabled = value;\r
+ Enabled = value;\r
}\r
}\r
\r
{\r
get\r
{\r
- return errorMessage;\r
+ object o = ViewState["ErrorMessage"];\r
+ if(o != null)\r
+ {\r
+ return (string)o;\r
+ }\r
+ return String.Empty;\r
}\r
set\r
{\r
- errorMessage = value;\r
+ ViewState["ErrorMessage"] = value;\r
}\r
}\r
\r
{\r
get\r
{\r
- return foreColor;\r
+ return ForeColor;\r
}\r
set\r
{\r
- foreColor = value;\r
+ ForeColor = value;\r
}\r
}\r
\r
{\r
get\r
{\r
- return isValid;\r
+ object o = ViewState["IsValid"];\r
+ if(o != null)\r
+ {\r
+ return (bool)o;\r
+ }\r
+ return true;\r
}\r
set\r
{\r
- isValid = value;\r
+ ViewState["IsValid"] = value;\r
}\r
}\r
\r
- public void Validate()\r
+ public static PropertyDescriptor GetValidationProperty(object component)\r
{\r
- // TODO: write the validation code\r
- // TODO: update the value of isValid\r
+ ValidationPropertyAttribute attrib = (ValidationPropertyAttribute)((TypeDescriptor.GetAttributes(this))[typeof(ValidationPropertyAttribute]);\r
+ if(attrib != null && attrib.Name != null)\r
+ {\r
+ return TypeDescriptor.GetProperties(this, null);\r
+ }\r
+ return null;\r
}\r
\r
- protected BaseValidator()\r
+ public void Validate()\r
{\r
- // Dummy Constructor\r
+ if(!Visible || (Visible && !Enabled))\r
+ {\r
+ IsValid = true;\r
+ }\r
+ Control ctrl = Parent;\r
+ while(ctrl != null)\r
+ {\r
+ if(!ctrl.Visible)\r
+ {\r
+ IsValid = true;\r
+ return;\r
+ }\r
+ ctrl = ctrl.Parent;\r
+ }\r
+ isPropertiesChecked = false;\r
+ if(!PropertiesValid)\r
+ {\r
+ IsValid = true;\r
+ return;\r
+ }\r
+ IsValid = EvaluateValid();\r
}\r
\r
protected bool PropertiesValid\r
{\r
get\r
{\r
- // TODO: throw HttpException, but when? How do I know about all the controls?\r
+ if(!isPropertiesChecked)\r
+ {\r
+ propertiesValid = ControlPropertiesValid();\r
+ isPropertiesChecked = true;\r
+ }\r
return propertiesValid;\r
}\r
}\r
{\r
get\r
{\r
- //TODO: To set the value of renderUplevel. Problem: when, how?\r
return renderUplevel;\r
}\r
}\r
\r
+ protected override void AddAttributesToRender(HtmlTextWriter writer)\r
+ {\r
+ bool enabled = Enabled;\r
+ if(!Enabled)\r
+ {\r
+ Enabled = true;\r
+ }\r
+ AddAttributesToRender(writer);\r
+ if(RenderUplevel)\r
+ {\r
+ if(ID = null)\r
+ {\r
+ writer.AddAttribute("id", ClientID);\r
+ }\r
+ if(ControlToValidate.Length > 0)\r
+ {\r
+ writer.AddAttribute("controltovalidate", GetControlRenderID(ControlToValidate));\r
+ }\r
+ if(ErrorMesage.Length > 0)\r
+ {\r
+ writer.AddAttribute("errormessage", ErrorMessage, true);\r
+ }\r
+ if(Display == ValidatorDisplay.Static)\r
+ {\r
+ writer.AddAttribute("display", Enum.ToString(typeof(ValidatorDisplay), Display));\r
+ }\r
+ if(!IsValid)\r
+ {\r
+ writer.AddAttribute("isvalid", "False");\r
+ }\r
+ if(!enabled)\r
+ {\r
+ writer.AddAttribute("enabled", "False");\r
+ }\r
+ }\r
+ if(!enabled)\r
+ {\r
+ Enabled = false;\r
+ }\r
+ }\r
+ \r
protected void CheckControlValidationProperty(string name, string propertyName)\r
{\r
- //TODO: I think it needs to be overridden. I may be wrong!\r
- //TODO: When to throw HttpException(...)\r
+ Control ctrl = NamingContainer.FindControl(name);\r
+ if(ctrl == null)\r
+ {\r
+ throw new HttpException(HttpRuntime.FormatResourceString("Validator_control_not_found",\r
+ name, propertyName, ID));\r
+ }\r
+ PropertyDescriptor pd = GetValidationProperty(ctrl);\r
+ if(pd == null)\r
+ {\r
+ throw new HttpException(HttpRuntime.FormatResourceString("Validator_bad_control_type",\r
+ name, propertyName, ID));\r
+ }\r
}\r
-\r
+ \r
protected virtual bool ControlPropertiesValid()\r
{\r
- // Do I need to do anything? But what?\r
- // What do I do with ControlToValidate?\r
- return true;\r
+ if(ControlToValidate.Length == 0)\r
+ {\r
+ throw new HttpException(HttpRuntime.FormatResourceString("Validator_control_blank", ID));\r
+ }\r
+ CheckControlValidationProperty(ControlToValidate, "ControlToValidate");\r
}\r
\r
+ [MonoTODO]\r
protected virtual bool DetermineRenderUplevel()\r
{\r
- // From where?\r
- return true;\r
+ Page page = Page;\r
+ if(page == null || page.Request == null)\r
+ {\r
+ return false;\r
+ }\r
+ if(EnableClientScript)\r
+ {\r
+ throw new NotImplementedException();\r
+ //TODO: I need to get the (Browser->Dom_version_major >= 4 &&\r
+ // Brower->Ecma_script_version >= 1.2)\r
+ }\r
+ return false;\r
}\r
-\r
- protected abstract bool EvaluateIsValid();\r
-\r
- [MonoTODO]\r
+ \r
protected string GetControlRenderID(string name)\r
{\r
- // TODO: What value? What is it?\r
- throw new NotImplementedException();\r
+ Control ctrl = FindControl(name);\r
+ if(ctrl != null)\r
+ {\r
+ return ctrl.ClientID;\r
+ }\r
+ return String.Empty;\r
}\r
-\r
- [MonoTODO]\r
+ \r
protected string GetControlValidationValue(string name)\r
{\r
- throw new NotImplementedException();\r
- // TODO: What value? What is it?\r
+ Control ctrl = NamingContainer.FindControl(name);\r
+ if(ctrl != null)\r
+ {\r
+ PropertyDescriptor pd = GetValidationProperty(ctrl);\r
+ if(pd != null)\r
+ {\r
+ object item = pd.GetValue(ctrl);\r
+ if(item is ListItem)\r
+ {\r
+ return ((ListItem)item).Value;\r
+ }\r
+ return item.ToString();\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ protected override void OnInit(EventArgs e)\r
+ {\r
+ OnInit(e);\r
+ Page.Validators.Add(this);\r
+ }\r
+ \r
+ protected override void OnPreRender(EventArgs e)\r
+ {\r
+ OnPreRender(e);\r
+ isPreRenderCalled = true;\r
+ isPropertiesChecked = false;\r
+ renderUplevel = DetermineRenderUplevel();\r
+ if(renderUplevel)\r
+ {\r
+ RegisterValidatorCommonScript();\r
+ }\r
+ }\r
+ \r
+ protected override void OnUnload(EventArgs e)\r
+ {\r
+ if(Page != null)\r
+ {\r
+ Page.Validators.Remove(this);\r
+ }\r
+ OnUnload(e);\r
}\r
\r
- [MonoTODO]\r
+ [MonoTODO("What_do_I_have_to_do")]\r
protected void RegisterValidatorCommonScript()\r
{\r
throw new NotImplementedException();\r
- // TODO: Still wondering!\r
- // Note: This method is primarily used by control developers\r
}\r
\r
- [MonoTODO]\r
- protected void RegisterValidatorDeclaration()\r
+ [MonoTODO("I_have_to_know_javascript_for_this_I_know_it_but_for_ALL_browsers_NO")]\r
+ protected virtual void RegisterValidatorDeclaration()\r
{\r
- // TODO: Still wondering!\r
- // Note: This method is primarily used by control developers\r
- // The documentation in M$ refers to: Page_Validators array\r
throw new NotImplementedException();\r
+ //TODO: Since I have to access document.<ClientID> and register\r
+ // as page validator. Now this is Browser dependent :((\r
+ }\r
+\r
+ [MonoTODO("Render_ing_always_left")]\r
+ protected override void Render(HtmlTextWriter writer)\r
+ {\r
+ bool valid;\r
+ if(isPreRenderCalled)\r
+ {\r
+ valid = (Enabled && IsValid);\r
+ } else\r
+ {\r
+ isPropertiesChecked = true;\r
+ propertiesValid = true;\r
+ renderUplevel = false;\r
+ valid = true;\r
+ }\r
+ if(PropertiesValid)\r
+ {\r
+ if(Page != null)\r
+ {\r
+ Page.VerifyRenderingInServerForm(this);\r
+ }\r
+ ValidatorDisplay dis = Display;\r
+ if(RenderUplevel)\r
+ {\r
+ throw new NotImplementedException();\r
+ }\r
+ throw new NotImplementedException();\r
+ }\r
+ return;\r
}\r
}\r
}\r
--- /dev/null
+/**\r
+ * Namespace: System.Web.UI.WebControls\r
+ * Class: CustomValidator\r
+ * \r
+ * Author: Gaurav Vaish\r
+ * Maintainer: gvaish@iitk.ac.in\r
+ * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
+ * Implementation: yes\r
+ * Status: 100%\r
+ * \r
+ * (C) Gaurav Vaish (2002)\r
+ */\r
+\r
+using System;\r
+using System.Web;\r
+using System.Web.UI;\r
+\r
+namespace System.Web.UI.WebControls\r
+{\r
+ public class CustomValidator : BaseValidator\r
+ {\r
+ private static readonly object ServerValidateEvent = new object();\r
+\r
+ public CustomValidator()\r
+ {\r
+ }\r
+ \r
+ public string ClientValidationFunction\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["ClientValidationFunction"];\r
+ if(o != null)\r
+ {\r
+ return (string)o;\r
+ }\r
+ return String.Empty;\r
+ }\r
+ set\r
+ {\r
+ ViewState["ClientValidationFunction"] = value;\r
+ }\r
+ }\r
+ \r
+ public event ServerValidateEventHandler ServerValidate\r
+ {\r
+ add\r
+ {\r
+ Events.AddHandler(ServerValidateEvent, value);\r
+ }\r
+ remove\r
+ {\r
+ Events.RemoveHandler(ServerValidateEvent, value);\r
+ }\r
+ }\r
+ \r
+ protected override void AddAttributesToRender(HtmlTextWriter writer)\r
+ {\r
+ base.AddAttributesToRender(writer);\r
+ if(RenderUplevel)\r
+ {\r
+ writer.AddAttribute("evaluationfunction", "CustomValidatorEvaluateIsValid");\r
+ if(ClientValidationFunction.Length > 0)\r
+ {\r
+ writer.AddAttribute("clientvalidationfunction", ClientValidationFunction);\r
+ }\r
+ }\r
+ }\r
+ \r
+ protected override bool ControlPropertiesValid()\r
+ {\r
+ if(ControlToValidate.Length > 0)\r
+ {\r
+ CheckControlValidationProperty(ControlToValidate, "ControlToValidate");\r
+ }\r
+ }\r
+ \r
+ protected virtual bool OnServerValidate(string value)\r
+ {\r
+ if(Events != null)\r
+ {\r
+ ServerValidateEventHandler sveh = (ServerValidateEventHandler)(Events[ServerValidateEvent]);\r
+ if(sveh != null)\r
+ {\r
+ ServerValidateEventArgs args = new ServerValidateEventArgs(value, true));\r
+ sveh(this, args);\r
+ return args.IsValid;\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/**\r
+ * Namespace: System.Web.UI.WebControls\r
+ * Class: DataGridPagerStyle\r
+ * \r
+ * Author: Gaurav Vaish\r
+ * Maintainer: gvaish@iitk.ac.in\r
+ * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
+ * Implementation: yes\r
+ * Status: 100%\r
+ * \r
+ * (C) Gaurav Vaish (2002)\r
+ */\r
+\r
+using System;\r
+using System.Web;\r
+using System.Web.UI;\r
+\r
+namespace System.Web.UI.WebControls\r
+{\r
+ public class DataGridPagerStyle : TableItemStyle\r
+ {\r
+ DataGrid owner;\r
+ \r
+ public static int MODE = (0x01 << 19);\r
+ public static int NEXT_PG_TEXT = (0x01 << 20);\r
+ public static int PG_BTN_COUNT = (0x01 << 21);\r
+ public static int POSITION = (0x01 << 22);\r
+ public static int VISIBLE = (0x01 << 23);\r
+ public static int PREV_PG_TEXT = (0x01 << 24);\r
+\r
+ internal DataGridPagerStyle(DataGrid owner): base()\r
+ {\r
+ this.owner = owner;\r
+ }\r
+ \r
+ public PagerMode Mode\r
+ {\r
+ get\r
+ {\r
+ if(IsSet(MODE))\r
+ {\r
+ return (PagerMode)ViewState["Mode"];\r
+ }\r
+ return PagerMode.NextPrev;\r
+ }\r
+ set\r
+ {\r
+ if(!Enum.IsDefined(typeof(PagerMode), value))\r
+ {\r
+ throw new NotImplementedException();\r
+ }\r
+ ViewState["Mode"] = value;\r
+ Set(MODE);\r
+ }\r
+ }\r
+ \r
+ public string NextPageText\r
+ {\r
+ get\r
+ {\r
+ if(IsSet(NEXT_PG_TEXT))\r
+ {\r
+ return (string)ViewState["NextPageText"];\r
+ }\r
+ return ">";\r
+ }\r
+ set\r
+ {\r
+ ViewState["NextPageText"] = value;\r
+ Set(NEXT_PG_TEXT);\r
+ }\r
+ }\r
+ \r
+ public string PrevPageText\r
+ {\r
+ get\r
+ {\r
+ if(IsSet(PREV_PG_TEXT))\r
+ {\r
+ return (string)ViewState["PrevPageText"];\r
+ }\r
+ return "<";\r
+ }\r
+ set\r
+ {\r
+ ViewState["PrevPageText"] = value;\r
+ Set(PREV_PG_TEXT);\r
+ }\r
+ }\r
+ \r
+ public int PageButtonCount\r
+ {\r
+ get\r
+ {\r
+ if(IsSet(PG_BTN_COUNT))\r
+ {\r
+ return (int)ViewState["PageButtonCount"];\r
+ }\r
+ return 10;\r
+ }\r
+ set\r
+ {\r
+ ViewState["PageButtonCount"] = value;\r
+ Set(PG_BTN_COUNT);\r
+ }\r
+ }\r
+ \r
+ public PagerPosition Position\r
+ {\r
+ get\r
+ {\r
+ if(IsSet(POSITION))\r
+ {\r
+ return (PagerPosition)ViewState["Position"];\r
+ }\r
+ return PagerPosition.Bottom;\r
+ }\r
+ set\r
+ {\r
+ if(!Enum.IsDefined(typeof(PagerPosition), value))\r
+ {\r
+ throw new ArgumentException();\r
+ }\r
+ ViewState["Position"] = value;\r
+ Set(POSITION);\r
+ }\r
+ }\r
+ \r
+ public bool Visible\r
+ {\r
+ get\r
+ {\r
+ if(IsSet(VISIBLE))\r
+ {\r
+ return (bool)ViewState["Visible"];\r
+ }\r
+ return true;\r
+ }\r
+ set\r
+ {\r
+ ViewState["Visible"] = value;\r
+ Set(PG_BTN_COUNT);\r
+ }\r
+ }\r
+ \r
+ public override void CopyFrom(Style s)\r
+ {\r
+ if(s != null && !s.IsEmpty && s is TableItemStyle)\r
+ {\r
+ base.CopyFrom(s);\r
+ TableItemStyle from = (TableItemStyle)s;\r
+ if(from.IsSet(MODE))\r
+ {\r
+ Mode = from.Mode;\r
+ }\r
+ if(from.IsSet(NEXT_PG_TEXT))\r
+ {\r
+ NextPageText = from.NextPageText;\r
+ }\r
+ if(from.IsSet(PG_BTN_COUNT))\r
+ {\r
+ PageButtonCount = from.PageButtonCount;\r
+ }\r
+ if(from.IsSet(POSITION))\r
+ {\r
+ Position = from.Position;\r
+ }\r
+ if(from.IsSet(VISIBLE))\r
+ {\r
+ Visible = from.Visible;\r
+ }\r
+ if(from.IsSet(PREV_PG_TEXT))\r
+ {\r
+ PrevPageText = from.PrevPageText;\r
+ }\r
+ }\r
+ }\r
+ \r
+ public override void MergeWith(Style s)\r
+ {\r
+ if(s != null && !s.IsEmpty && s is TableItemStyle)\r
+ {\r
+ base.MergeWith(s);\r
+ TableItemStyle with = (TableItemStyle)s;\r
+ if(with.IsSet(MODE) && !IsSet(MODE))\r
+ {\r
+ Mode = from.Mode;\r
+ }\r
+ if(with.IsSet(NEXT_PG_TEXT) && !IsSet(NEXT_PG_TEXT))\r
+ {\r
+ NextPageText = with.NextPageText;\r
+ }\r
+ if(with.IsSet(PG_BTN_COUNT) && !IsSet(PG_BTN_COUNT))\r
+ {\r
+ PageButtonCount = with.PageButtonCount;\r
+ }\r
+ if(with.IsSet(POSITION) && !IsSet(POSITION))\r
+ {\r
+ Position = with.Position;\r
+ }\r
+ if(with.IsSet(VISIBLE) && !IsSet(VISIBLE))\r
+ {\r
+ Visible = with.Visible;\r
+ }\r
+ if(with.IsSet(PREV_PG_TEXT) && !IsSet(PREV_PG_TEXT))\r
+ {\r
+ PrevPageText = with.PrevPageText;\r
+ }\r
+ }\r
+ }\r
+\r
+ public override void Reset()\r
+ {\r
+ if(IsSet(MODE))\r
+ {\r
+ ViewState.Remove("Mode");\r
+ }\r
+ if(IsSet(NEXT_PG_TEXT))\r
+ {\r
+ ViewState.Remove("NextPageText");\r
+ }\r
+ if(IsSet(PG_BTN_COUNT))\r
+ {\r
+ ViewState.Remove("PageButtonCount");\r
+ }\r
+ if(IsSet(POSITION))\r
+ {\r
+ ViewState.Remove("Position");\r
+ }\r
+ if(IsSet(VISIBLE))\r
+ {\r
+ ViewState.Remove("Visible");\r
+ }\r
+ if(IsSet(PREV_PG_TEXT))\r
+ {\r
+ ViewState.Remove("PrevPageText");\r
+ }\r
+ base.Reset();\r
+ }\r
+ }\r
+}\r