//
// System.Web.UI.WebControls.CheckBox.cs
//
-// Authors:
-// Gaurav Vaish (gvaish@iitk.ac.in)
-// Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+// Author:
+// Dick Porter <dick@ximian.com>
//
-// (C) Gaurav Vaish (2002)
-// (C) 2003 Andreas Nahr
-// Thanks to Leen Toelen (toelen@hotmail.com)'s classes that helped me
-// to write the contents of the function LoadPostData(...)
+// 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;
using System.Collections;
using System.Collections.Specialized;
-using System.Globalization;
-using System.Web;
-using System.Web.UI;
using System.ComponentModel;
-using System.ComponentModel.Design;
-
-namespace System.Web.UI.WebControls
-{
- [DefaultEvent("CheckedChanged")]
- [DefaultProperty("Text")]
- [DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, " + Consts.AssemblySystem_Design)]
- [Designer ("System.Web.UI.Design.WebControls.CheckBoxDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]
+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
{
- private static readonly object CheckedChangedEvent = new object();
+ string render_type;
+ AttributeCollection common_attrs;
+
+#if NET_2_0
+ AttributeCollection inputAttributes;
+ StateBag inputAttributesState;
+ AttributeCollection labelAttributes;
+ StateBag labelAttributesState;
+#endif
- public CheckBox(): base(HtmlTextWriterTag.Input)
+ public CheckBox () : base (HtmlTextWriterTag.Input)
+ {
+ render_type = "checkbox";
+ }
+
+ internal CheckBox (string render_type) : base (HtmlTextWriterTag.Input)
{
+ this.render_type = render_type;
}
- [DefaultValue (false), WebCategory ("Behavior")]
- [WebSysDescription ("The control automatically posts back after changing the text.")]
- public virtual bool AutoPostBack
+ [DefaultValue (false)]
+#if NET_2_0
+ [Themeable (false)]
+#endif
+ [WebSysDescription ("")]
+ [WebCategory ("Behavior")]
+ public virtual bool AutoPostBack
{
get {
- object o = ViewState ["AutoPostBack"];
- return (o == null) ? false : (bool) o;
+ return (ViewState.GetBool ("AutoPostBack",
+ false));
+ }
+ set {
+ ViewState["AutoPostBack"] = value;
}
-
- set { ViewState ["AutoPostBack"] = value; }
}
+#if NET_2_0
+ [DefaultValue (false)]
+ [Themeable (false)]
+ [MonoTODO]
+ [WebSysDescription ("")]
+ [WebCategory ("Behavior")]
+ public virtual bool CausesValidation
+ {
+ get { return ViewState.GetBool ("CausesValidation", false); }
+ set { ViewState ["CausesValidation"] = value; }
+ }
+#endif
+
- [DefaultValue (false), Bindable (true)]
- [WebSysDescription ("Determines if the control is checked.")]
- public virtual bool Checked
+ [DefaultValue (false)]
+#if NET_2_0
+ [Bindable (true, BindingDirection.TwoWay)]
+ [Themeable (false)]
+#else
+ [Bindable (true)]
+#endif
+ [WebSysDescription ("")]
+ [WebCategory ("Behavior")]
+ public virtual bool Checked
{
get {
- object o = ViewState ["Checked"];
- return (o == null) ? false : (bool) o;
+ return (ViewState.GetBool ("Checked", false));
+ }
+ set {
+ ViewState["Checked"] = value;
}
-
- set { ViewState ["Checked"] = value; }
}
- [DefaultValue (""), Bindable (true), WebCategory ("Appearance")]
- [WebSysDescription ("The text that this control displays.")]
- public virtual string Text
+#if NET_2_0
+ [Browsable (false)]
+ [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+ public AttributeCollection InputAttributes
{
get {
- object o = ViewState ["Text"];
- return (o == null) ? String.Empty : (string) o;
+ if (inputAttributes == null) {
+ if (inputAttributesState == null) {
+ inputAttributesState = new StateBag (true);
+ if (IsTrackingViewState)
+ inputAttributesState.TrackViewState();
+ }
+ inputAttributes = new AttributeCollection (inputAttributesState);
+ }
+ return inputAttributes;
}
-
- set { ViewState ["Text"] = value; }
}
-
- private bool SaveCheckedViewState
+
+ [Browsable (false)]
+ [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+ public AttributeCollection LabelAttributes
{
get {
- if (Events [CheckedChangedEvent] != null){
- if (!Enabled)
- return true;
-
- Type type = GetType ();
- if (type == typeof (CheckBox))
- return false;
-
- if (type == typeof (RadioButton))
- return false;
+ if (labelAttributes == null) {
+ if (labelAttributesState == null) {
+ labelAttributesState = new StateBag (true);
+ if (IsTrackingViewState)
+ labelAttributesState.TrackViewState();
+ }
+ labelAttributes = new AttributeCollection (labelAttributesState);
}
- return true;
+ return labelAttributes;
}
}
+#endif
-
- [DefaultValue (typeof (TextAlign), "Right"), Bindable (true), WebCategory ("Appearance")]
- [WebSysDescription ("The alignment of the text.")]
- public virtual TextAlign TextAlign
+ [DefaultValue ("")]
+ [Bindable (true)]
+#if NET_2_0
+ [Localizable (true)]
+#endif
+ [WebSysDescription ("")]
+ [WebCategory ("Appearance")]
+ public virtual string Text
{
get {
- object o = ViewState ["TextAlign"];
- return (o == null) ? TextAlign.Right : (TextAlign) o;
+ 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 (!System.Enum.IsDefined (typeof (TextAlign), value))
- throw new ArgumentException ();
- ViewState ["TextAlign"] = value;
+ 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
+
+ private static readonly object EventCheckedChanged = new object ();
+ [WebSysDescription ("")]
[WebCategory ("Action")]
- [WebSysDescription ("Raised when the control is checked or unchecked.")]
- public event EventHandler CheckedChanged
+ public event EventHandler CheckedChanged
{
- add { Events.AddHandler (CheckedChangedEvent, value); }
- remove { Events.RemoveHandler (CheckedChangedEvent, value); }
+ add {
+ Events.AddHandler (EventCheckedChanged, value);
+ }
+ remove {
+ Events.RemoveHandler (EventCheckedChanged, value);
+ }
}
-
- protected virtual void OnCheckedChanged(EventArgs e)
+
+ protected virtual void OnCheckedChanged (EventArgs e)
+ {
+ EventHandler handler = (EventHandler)Events[EventCheckedChanged];
+
+ if (handler != null) {
+ handler (this, e);
+ }
+ }
+
+ internal virtual string NameAttribute
{
- if(Events != null){
- EventHandler eh = (EventHandler) (Events [CheckedChangedEvent]);
- if(eh != null)
- eh (this, e);
+ get {
+ return (this.UniqueID);
}
}
- protected override void OnPreRender(EventArgs e)
+#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 ()
{
- if (Page != null && Enabled)
+ 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);
+
+ if (Page != null) {
Page.RegisterRequiresPostBack (this);
+ }
+ }
- if (!SaveCheckedViewState)
- ViewState.SetItemDirty ("Checked", false);
+ 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;
+ }
}
-
- protected override void Render (HtmlTextWriter writer)
+
+ void AddAttributesForSpan (HtmlTextWriter writer)
{
- bool hasBeginRendering = false;
- if(ControlStyleCreated && !ControlStyle.IsEmpty){
- hasBeginRendering = true;
- ControlStyle.AddAttributesToRender (writer, this);
+ 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);
}
+ Attributes.AddAttributes (writer);
+ }
+#if NET_2_0
+ protected internal
+#else
+ protected
+#endif
+ override void Render (HtmlTextWriter w)
+ {
+ if (Page != null)
+ Page.VerifyRenderingInServerForm (this);
+
+ bool need_span = ControlStyleCreated && !ControlStyle.IsEmpty;
+ if (need_span)
+ ControlStyle.AddAttributesToRender (w, this);
- if (!Enabled){
- hasBeginRendering = true;
- writer.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled");
+ if (!Enabled) {
+ w.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled");
+ need_span = true;
}
- if (ToolTip.Length > 0){
- hasBeginRendering = true;
- writer.AddAttribute (HtmlTextWriterAttribute.Title, ToolTip);
+ string tt = ToolTip;
+ if (tt != ""){
+ w.AddAttribute ("title", tt);
+ need_span = true;
}
if (Attributes.Count > 0){
- string val = Attributes ["value"];
- Attributes.Remove ("value");
- if (Attributes.Count > 0){
- hasBeginRendering = true;
- Attributes.AddAttributes (writer);
+ AddAttributesForSpan (w);
+ Attributes.AddAttributes (w);
+ need_span = true;
+ }
+
+ if (need_span)
+ w.RenderBeginTag (HtmlTextWriterTag.Span);
+
+ TextAlign align = TextAlign;
+ if (align == TextAlign.Right) {
+ w.AddAttribute (HtmlTextWriterAttribute.Id, ClientID);
+ w.AddAttribute (HtmlTextWriterAttribute.Type, render_type);
+ w.AddAttribute (HtmlTextWriterAttribute.Name, NameAttribute);
+ InternalAddAttributesToRender (w);
+ if (Checked)
+ w.AddAttribute (HtmlTextWriterAttribute.Checked, "checked");
+
+ if (AutoPostBack){
+ w.AddAttribute (HtmlTextWriterAttribute.Onclick,
+ Page.ClientScript.GetPostBackEventReference (this, String.Empty));
+ w.AddAttribute ("language", "javascript");
}
- if (val != null)
- Attributes ["value"] = val;
- }
+ if (AccessKey.Length > 0)
+ w.AddAttribute (HtmlTextWriterAttribute.Accesskey, AccessKey);
+
+ if (TabIndex != 0)
+ w.AddAttribute (HtmlTextWriterAttribute.Tabindex,
+ TabIndex.ToString (CultureInfo.InvariantCulture));
- if (hasBeginRendering)
- writer.RenderBeginTag (HtmlTextWriterTag.Span);
+ if (common_attrs != null)
+ common_attrs.AddAttributes (w);
+ w.RenderBeginTag (HtmlTextWriterTag.Input);
+ w.RenderEndTag ();
+ string text = Text;
+ if (text != "") {
+#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 ();
+ }
+ } else {
+ string text = Text;
+ if (text != "") {
+#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 ();
+ }
+
+ w.AddAttribute (HtmlTextWriterAttribute.Id, ClientID);
+ w.AddAttribute (HtmlTextWriterAttribute.Type, render_type);
+ w.AddAttribute (HtmlTextWriterAttribute.Name, NameAttribute);
+ InternalAddAttributesToRender (w);
+ if (Checked)
+ w.AddAttribute (HtmlTextWriterAttribute.Checked, "checked");
+
+ if (AutoPostBack){
+ w.AddAttribute (HtmlTextWriterAttribute.Onclick,
+ Page.ClientScript.GetPostBackEventReference (this, String.Empty));
+ w.AddAttribute ("language", "javascript");
+ }
- if (Text.Length > 0){
- TextAlign ta = TextAlign;
- if(ta == TextAlign.Right)
- RenderInputTag (writer, ClientID);
- writer.AddAttribute (HtmlTextWriterAttribute.For, ClientID);
- writer.RenderBeginTag (HtmlTextWriterTag.Label);
- writer.Write (Text);
- writer.RenderEndTag ();
- if(ta == TextAlign.Left)
- RenderInputTag (writer, ClientID);
+ 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 ();
}
- else
- RenderInputTag (writer, ClientID);
- if (hasBeginRendering)
- writer.RenderEndTag ();
+ if (need_span)
+ w.RenderEndTag ();
}
-
- internal virtual void RenderInputTag (HtmlTextWriter writer, string clientId)
+
+#if NET_2_0
+ protected virtual
+#endif
+ bool LoadPostData (string postDataKey, NameValueCollection postCollection)
{
- writer.AddAttribute (HtmlTextWriterAttribute.Id, clientId);
- writer.AddAttribute( HtmlTextWriterAttribute.Type, "checkbox");
- writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
- if (Checked)
- writer.AddAttribute (HtmlTextWriterAttribute.Checked, "checked");
+ if (!Enabled)
+ return false;
- if (AutoPostBack){
- writer.AddAttribute (HtmlTextWriterAttribute.Onclick,
- Page.GetPostBackClientEvent (this, String.Empty));
- writer.AddAttribute ("language", "javascript");
+ string postedValue = postCollection[postDataKey];
+ bool postedBool = ((postedValue != null) &&
+ (postedValue.Length > 0));
+
+ if (Checked != postedBool) {
+ Checked = postedBool;
+ return (true);
}
- if (AccessKey.Length > 0)
- writer.AddAttribute (HtmlTextWriterAttribute.Accesskey, AccessKey);
+ return (false);
+ }
- if (TabIndex != 0)
- writer.AddAttribute (HtmlTextWriterAttribute.Tabindex,
- TabIndex.ToString (NumberFormatInfo.InvariantInfo));
+#if NET_2_0
+ protected virtual
+#endif
+ void RaisePostDataChangedEvent ()
+ {
+#if NET_2_0
+ if (CausesValidation)
+ Page.Validate (ValidationGroup);
+#endif
+ OnCheckedChanged (EventArgs.Empty);
+ }
- writer.RenderBeginTag (HtmlTextWriterTag.Input);
- writer.RenderEndTag ();
+ bool IPostBackDataHandler.LoadPostData (string postDataKey, NameValueCollection postCollection)
+ {
+ return LoadPostData (postDataKey, postCollection);
}
- bool IPostBackDataHandler.LoadPostData (string postDataKey, NameValueCollection postCollection)
+ void IPostBackDataHandler.RaisePostDataChangedEvent ()
{
- string postedVal = postCollection [postDataKey];
-
- if (postedVal != null && postedVal.Length > 0) {
- Checked = !Checked;
- return true;
- }
+ RaisePostDataChangedEvent ();
+ }
- return false;
+#if NET_2_0
+ protected override void AddAttributesToRender (HtmlTextWriter writer)
+ {
+ base.AddAttributesToRender (writer);
}
-
- void IPostBackDataHandler.RaisePostDataChangedEvent()
+#endif
+
+ internal virtual void InternalAddAttributesToRender (HtmlTextWriter w)
{
- OnCheckedChanged (EventArgs.Empty);
+ if (!Enabled)
+ w.AddAttribute (HtmlTextWriterAttribute.Disabled, "disabled");
}
}
}