2 // System.Web.UI.WebControls.TableCell.cs
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.ComponentModel;
30 using System.Globalization;
31 using System.Security.Permissions;
33 using System.Web.Util;
35 namespace System.Web.UI.WebControls {
38 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
39 [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
41 [ControlBuilder (typeof (TableCellControlBuilder))]
42 [DefaultProperty ("Text")]
43 [ParseChildren (false)]
47 [Designer ("System.Web.UI.Design.WebControls.PreviewControlDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
49 [PersistChildren (true)]
51 public class TableCell : WebControl {
54 : base (HtmlTextWriterTag.Td)
59 // FIXME: is there a clean way to change the tag's name without using a ctor ?
60 // if not then this truly limits the usefulness of inheritance
61 internal TableCell (HtmlTextWriterTag tag)
70 [TypeConverter (typeof (StringArrayConverter))]
71 public virtual string[] AssociatedHeaderCellID {
73 object o = ViewState ["AssociatedHeaderCellID"];
74 return (o == null) ? new string[0] : (string[]) o;
78 ViewState.Remove ("AssociatedHeaderCellID");
80 ViewState ["AssociatedHeaderCellID"] = value;
89 [WebSysDescription ("")]
90 [WebCategory ("Appearance")]
91 public virtual int ColumnSpan {
93 object o = ViewState ["ColumnSpan"];
94 return (o == null) ? 0 : (int) o;
97 // LAMESPEC: undocumented (but like Table.CellPadding)
99 throw new ArgumentOutOfRangeException ("< 0");
100 ViewState ["ColumnSpan"] = value;
107 [DefaultValue (HorizontalAlign.NotSet)]
108 [WebSysDescription ("")]
109 [WebCategory ("Layout")]
110 public virtual HorizontalAlign HorizontalAlign {
112 if (!ControlStyleCreated)
113 return HorizontalAlign.NotSet; // default value
114 return TableItemStyle.HorizontalAlign;
116 set { TableItemStyle.HorizontalAlign = value; }
123 [WebSysDescription ("")]
124 [WebCategory ("Layout")]
125 public virtual int RowSpan {
127 object o = ViewState ["RowSpan"];
128 return (o == null) ? 0 : (int) o;
131 // LAMESPEC: undocumented (but like Table.CellPadding)
133 throw new ArgumentOutOfRangeException ("< 0");
134 ViewState ["RowSpan"] = value;
140 [PersistenceMode (PersistenceMode.InnerDefaultProperty)]
145 [WebSysDescription ("")]
146 [WebCategory ("Appearance")]
147 public virtual string Text {
149 object o = ViewState ["Text"];
150 return (o == null) ? String.Empty : (string) o;
154 ViewState.Remove ("Text");
156 ViewState ["Text"] = value;
166 [DefaultValue (VerticalAlign.NotSet)]
167 [WebSysDescription ("")]
168 [WebCategory ("Layout")]
169 public virtual VerticalAlign VerticalAlign {
171 if (!ControlStyleCreated)
172 return VerticalAlign.NotSet; // default value
173 return TableItemStyle.VerticalAlign;
175 set { TableItemStyle.VerticalAlign = value; }
181 [DefaultValue (true)]
182 [WebSysDescription ("")]
183 [WebCategory ("Layout")]
184 public virtual bool Wrap {
186 if (!ControlStyleCreated)
187 return true; // default value
188 return TableItemStyle.Wrap;
190 set { TableItemStyle.Wrap = value; }
193 public override bool SupportsDisabledAttribute {
194 get { return RenderingCompatibilityLessThan40; }
197 TableItemStyle TableItemStyle {
198 get { return (ControlStyle as TableItemStyle); }
201 protected override void AddAttributesToRender (HtmlTextWriter writer)
203 base.AddAttributesToRender (writer);
209 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, i.ToString (Helpers.InvariantCulture), false);
213 writer.AddAttribute (HtmlTextWriterAttribute.Rowspan, i.ToString (Helpers.InvariantCulture), false);
215 string[] ahci = AssociatedHeaderCellID;
216 if (ahci.Length > 1) {
217 StringBuilder sb = new StringBuilder ();
218 for (i = 0; i < ahci.Length - 1; i++) {
219 sb.Append (ahci [i]);
222 sb.Append (ahci.Length - 1);
223 writer.AddAttribute (HtmlTextWriterAttribute.Headers, sb.ToString ());
224 } else if (ahci.Length == 1) {
225 // most common case (without a StringBuilder)
226 writer.AddAttribute (HtmlTextWriterAttribute.Headers, ahci [0]);
231 protected override void AddParsedSubObject (object obj)
233 if (HasControls ()) {
234 base.AddParsedSubObject (obj);
238 LiteralControl lc = (obj as LiteralControl);
242 Controls.Add (new LiteralControl (s));
243 // remove from viewstate
246 base.AddParsedSubObject(obj);
248 // this will clear any existing controls
253 protected override Style CreateControlStyle ()
255 return new TableItemStyle (ViewState);
263 override void RenderContents (HtmlTextWriter writer)
265 if (HasControls () || HasRenderMethodDelegate ())
266 base.RenderContents (writer);