// // System.Web.UI.WebControls.CheckBox.cs // // Author: // Dick Porter // // Copyright (C) 2005 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.Globalization; using System.Security.Permissions; namespace System.Web.UI.WebControls { // CAS [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] // attributes [Designer ("System.Web.UI.Design.WebControls.CheckBoxDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")] [DataBindingHandler ("System.Web.UI.Design.TextDataBindingHandler, " + Consts.AssemblySystem_Design)] [DefaultEvent ("CheckedChanged")] [DefaultProperty ("Text")] #if NET_2_0 [ControlValueProperty ("Checked", null)] [SupportsEventValidation] #endif public class CheckBox : WebControl, IPostBackDataHandler #if NET_2_0 , ICheckBoxControl #endif { string render_type; AttributeCollection common_attrs; #if NET_2_0 AttributeCollection inputAttributes; StateBag inputAttributesState; AttributeCollection labelAttributes; StateBag labelAttributesState; #endif public CheckBox () : base (HtmlTextWriterTag.Input) { render_type = "checkbox"; } internal CheckBox (string render_type) : base (HtmlTextWriterTag.Input) { this.render_type = render_type; } [DefaultValue (false)] #if NET_2_0 [Themeable (false)] #endif [WebSysDescription ("")] [WebCategory ("Behavior")] public virtual bool AutoPostBack { get { return (ViewState.GetBool ("AutoPostBack", false)); } set { ViewState["AutoPostBack"] = value; } } #if NET_2_0 [DefaultValue (false)] [Themeable (false)] [WebSysDescription ("")] [WebCategory ("Behavior")] public virtual bool CausesValidation { get { return ViewState.GetBool ("CausesValidation", false); } set { ViewState ["CausesValidation"] = value; } } #endif [DefaultValue (false)] #if NET_2_0 [Bindable (true, BindingDirection.TwoWay)] [Themeable (false)] #else [Bindable (true)] #endif [WebSysDescription ("")] [WebCategory ("Behavior")] public virtual bool Checked { get { return (ViewState.GetBool ("Checked", false)); } set { ViewState["Checked"] = value; } } #if NET_2_0 [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public AttributeCollection InputAttributes { get { if (inputAttributes == null) { if (inputAttributesState == null) { inputAttributesState = new StateBag (true); if (IsTrackingViewState) inputAttributesState.TrackViewState(); } inputAttributes = new AttributeCollection (inputAttributesState); } return inputAttributes; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public AttributeCollection LabelAttributes { get { if (labelAttributes == null) { if (labelAttributesState == null) { labelAttributesState = new StateBag (true); if (IsTrackingViewState) labelAttributesState.TrackViewState(); } labelAttributes = new AttributeCollection (labelAttributesState); } return labelAttributes; } } #endif [DefaultValue ("")] [Bindable (true)] #if NET_2_0 [Localizable (true)] #endif [WebSysDescription ("")] [WebCategory ("Appearance")] public virtual string Text { get { return (ViewState.GetString ("Text", String.Empty)); } set { ViewState["Text"] = value; } } [DefaultValue (TextAlign.Right)] #if ONLY_1_1 [Bindable (true)] #endif [WebSysDescription ("")] [WebCategory ("Appearance")] public virtual TextAlign TextAlign { get { return (TextAlign) ViewState.GetInt ("TextAlign", (int)TextAlign.Right); } set { if (value != TextAlign.Left && value != TextAlign.Right) { throw new ArgumentOutOfRangeException ("value"); } ViewState["TextAlign"] = value; } } #if NET_2_0 [Themeable (false)] [DefaultValue ("")] [WebSysDescription ("")] [WebCategoryAttribute ("Behavior")] public virtual string ValidationGroup { get { return ViewState.GetString ("ValidationGroup", String.Empty); } set { ViewState["ValidationGroup"] = value; } } #endif static readonly object EventCheckedChanged = new object (); [WebSysDescription ("")] [WebCategory ("Action")] public event EventHandler CheckedChanged { add { Events.AddHandler (EventCheckedChanged, value); } remove { Events.RemoveHandler (EventCheckedChanged, value); } } protected virtual void OnCheckedChanged (EventArgs e) { EventHandler handler = (EventHandler)Events[EventCheckedChanged]; if (handler != null) { handler (this, e); } } internal virtual string NameAttribute { get { return (this.UniqueID); } } #if NET_2_0 protected override void LoadViewState (object savedState) { if (savedState == null) { base.LoadViewState (null); return; } Triplet saved = (Triplet) savedState; base.LoadViewState (saved.First); if (saved.Second != null) { if (inputAttributesState == null) { inputAttributesState = new StateBag(true); inputAttributesState.TrackViewState (); } inputAttributesState.LoadViewState (saved.Second); } if (saved.Third != null) { if (labelAttributesState == null) { labelAttributesState = new StateBag(true); labelAttributesState.TrackViewState (); } labelAttributesState.LoadViewState (saved.Third); } } protected override object SaveViewState () { object baseView = base.SaveViewState (); object inputAttrView = null; object labelAttrView = null; if (inputAttributesState != null) inputAttrView = inputAttributesState.SaveViewState (); if (labelAttributesState != null) labelAttrView = labelAttributesState.SaveViewState (); if (baseView == null && inputAttrView == null && labelAttrView == null) return null; return new Triplet (baseView, inputAttrView, labelAttrView); } protected override void TrackViewState () { base.TrackViewState(); if (inputAttributesState != null) inputAttributesState.TrackViewState (); if (labelAttributesState != null) labelAttributesState.TrackViewState (); } #endif #if NET_2_0 protected internal #else protected #endif override void OnPreRender (EventArgs e) { base.OnPreRender (e); Page page = Page; bool enabled = Enabled; if (page != null && enabled) { page.RegisterRequiresPostBack (this); } #if NET_2_0 if (Page != null && enabled) page.RegisterEnabledControl (this); #endif } static bool IsInputOrCommonAttr (string attname) { attname = attname.ToUpper (CultureInfo.InvariantCulture); switch (attname) { case "VALUE": case "CHECKED": case "SIZE": case "MAXLENGTH": case "SRC": case "ALT": case "USEMAP": case "DISABLED": case "READONLY": case "ACCEPT": case "ACCESSKEY": case "TABINDEX": case "ONFOCUS": case "ONBLUR": case "ONSELECT": case "ONCHANGE": case "ONCLICK": case "ONDBLCLICK": case "ONMOUSEDOWN": case "ONMOUSEUP": case "ONMOUSEOVER": case "ONMOUSEMOVE": case "ONMOUSEOUT": case "ONKEYPRESS": case "ONKEYDOWN": case "ONKEYUP": return true; default: return false; } } bool AddAttributesForSpan (HtmlTextWriter writer) { ICollection k = Attributes.Keys; string [] keys = new string [k.Count]; k.CopyTo (keys, 0); foreach (string key in keys) { if (!IsInputOrCommonAttr (key)) continue; if (common_attrs == null) common_attrs = new AttributeCollection (new StateBag ()); common_attrs [key] = Attributes [key]; Attributes.Remove (key); } if (Attributes.Count > 0) { Attributes.AddAttributes (writer); return true; } return false; } #if NET_2_0 protected internal #else protected #endif override void Render (HtmlTextWriter w) { Page page = Page; if (page != null) { page.VerifyRenderingInServerForm (this); #if NET_2_0 page.ClientScript.RegisterForEventValidation (UniqueID); #endif } bool need_span = ControlStyleCreated && !ControlStyle.IsEmpty; if (need_span) { #if NET_2_0 AddDisplayStyleAttribute (w); #endif ControlStyle.AddAttributesToRender (w, this); } if (!Enabled) { w.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled", false); need_span = true; } string tt = ToolTip; if (tt != null && tt.Length > 0){ w.AddAttribute ("title", tt); need_span = true; } #if NET_2_0 if (HasAttributes && AddAttributesForSpan (w)) need_span = true; #else if (Attributes.Count > 0 && AddAttributesForSpan (w)) need_span = true; #endif if (need_span) w.RenderBeginTag (HtmlTextWriterTag.Span); TextAlign align = TextAlign; if (align == TextAlign.Right) { RenderInput (w); RenderLabel (w); } else { RenderLabel (w); RenderInput (w); } if (need_span) w.RenderEndTag (); } void RenderInput (HtmlTextWriter w) { if (ClientID != null && ClientID.Length > 0) w.AddAttribute (HtmlTextWriterAttribute.Id, ClientID); w.AddAttribute (HtmlTextWriterAttribute.Type, render_type); string nameAttr = NameAttribute; if (nameAttr != null && nameAttr.Length > 0) w.AddAttribute (HtmlTextWriterAttribute.Name, nameAttr); InternalAddAttributesToRender (w); #if NET_2_0 AddAttributesToRender (w); if (inputAttributes != null) inputAttributes.AddAttributes (w); #endif if (Checked) w.AddAttribute (HtmlTextWriterAttribute.Checked, "checked", false); if (AutoPostBack) { #if NET_2_0 string onclick = Page.ClientScript.GetPostBackEventReference (GetPostBackOptions (), true); onclick = String.Concat ("setTimeout('", onclick.Replace ("\\", "\\\\").Replace ("'", "\\'"), "', 0)"); w.AddAttribute (HtmlTextWriterAttribute.Onclick, BuildScriptAttribute ("onclick", onclick)); #else w.AddAttribute (HtmlTextWriterAttribute.Onclick, BuildScriptAttribute ("onclick", Page.ClientScript.GetPostBackEventReference (this, String.Empty))); w.AddAttribute ("language", "javascript", false); #endif } if (AccessKey.Length > 0) w.AddAttribute (HtmlTextWriterAttribute.Accesskey, AccessKey); if (TabIndex != 0) w.AddAttribute (HtmlTextWriterAttribute.Tabindex, TabIndex.ToString (NumberFormatInfo.InvariantInfo)); if (common_attrs != null) common_attrs.AddAttributes (w); w.RenderBeginTag (HtmlTextWriterTag.Input); w.RenderEndTag (); } void RenderLabel (HtmlTextWriter w) { string text = Text; if (text.Length > 0) { #if NET_2_0 if (labelAttributes != null) labelAttributes.AddAttributes (w); #endif w.AddAttribute (HtmlTextWriterAttribute.For, ClientID); w.RenderBeginTag (HtmlTextWriterTag.Label); w.Write (text); w.RenderEndTag (); } } #if NET_2_0 protected virtual #endif bool LoadPostData (string postDataKey, NameValueCollection postCollection) { if (!Enabled) return false; string postedValue = postCollection[postDataKey]; bool postedBool = ((postedValue != null) && (postedValue.Length > 0)); if (Checked != postedBool) { Checked = postedBool; return (true); } return (false); } #if NET_2_0 protected virtual #endif void RaisePostDataChangedEvent () { #if NET_2_0 ValidateEvent (UniqueID, String.Empty); if (CausesValidation) Page.Validate (ValidationGroup); #endif OnCheckedChanged (EventArgs.Empty); } bool IPostBackDataHandler.LoadPostData (string postDataKey, NameValueCollection postCollection) { return LoadPostData (postDataKey, postCollection); } void IPostBackDataHandler.RaisePostDataChangedEvent () { RaisePostDataChangedEvent (); } #if NET_2_0 PostBackOptions GetPostBackOptions () { PostBackOptions options = new PostBackOptions (this); options.ActionUrl = null; options.ValidationGroup = null; options.Argument = String.Empty; options.RequiresJavaScriptProtocol = false; options.ClientSubmit = true; options.PerformValidation = CausesValidation && Page != null && Page.AreValidatorsUplevel (ValidationGroup); if (options.PerformValidation) options.ValidationGroup = ValidationGroup; return options; } protected override void AddAttributesToRender (HtmlTextWriter writer) { } #endif internal virtual void InternalAddAttributesToRender (HtmlTextWriter w) { if (!Enabled) w.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled", false); } } }