use ResolveClientUrl instead of ResolveUrl to be complient with MS.NET
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / TableCell.cs
index fa978e0fb6e9708453c7ff9918fa3edda13b8461..dd0dd5bb301b80f2c7243837e9fd9eb1a5458f46 100644 (file)
-/**\r
- * Namespace: System.Web.UI.WebControls\r
- * Class:     TableCell\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.Globalization;\r
-using System.Web;\r
-using System.Web.UI;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       public class TableCell: WebControl\r
-       {\r
-               [MonoTODO]\r
-               public TableCell(): base(HtmlTextWriterTag.Td)\r
-               {\r
-                       //TODO: What's the function to prevent Control to give _auto_generated_id\r
-               }\r
-               \r
-               [MonoTODO]\r
-               internal TableCell(HtmlTextWriterTag tag): base(tag)\r
-               {\r
-                       //TODO: What's the function to prevent Control to give _auto_generated_id\r
-               }\r
-               \r
-               public virtual int ColumnSpan\r
-               {\r
-                       get\r
-                       {\r
-                               object o = ViewState["ColumnSpan"];\r
-                               if(o != null)\r
-                                       return (int)o;\r
-                               return 0;\r
-                       }\r
-                       set\r
-                       {\r
-                               ViewState["ColumnSpan"] = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual int RowSpan\r
-               {\r
-                       get\r
-                       {\r
-                               object o = ViewState["RowSpan"];\r
-                               if(o != null)\r
-                                       return (int)o;\r
-                               return 0;\r
-                       }\r
-                       set\r
-                       {\r
-                               ViewState["RowSpan"] = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual string Text\r
-               {\r
-                       get\r
-                       {\r
-                               object o = ViewState["Text"];\r
-                               if(o != null)\r
-                                       return (string)o;\r
-                               return String.Empty;\r
-                       }\r
-                       set\r
-                       {\r
-                               ViewState["Text"] = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual HorizontalAlign HorizontalAlign\r
-               {\r
-                       get\r
-                       {\r
-                               if(ControlStyleCreated)\r
-                                       return ((TableItemStyle)ControlStyle).HorizontalAlign;\r
-                               return HorizontalAlign.NotSet;\r
-                       }\r
-                       set\r
-                       {\r
-                               ((TableItemStyle)ControlStyle).HorizontalAlign = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual VerticalAlign VerticalAlign\r
-               {\r
-                       get\r
-                       {\r
-                               if(ControlStyleCreated)\r
-                                       return ((TableItemStyle)ControlStyle).VerticalAlign;\r
-                               return VerticalAlign.NotSet;\r
-                       }\r
-                       set\r
-                       {\r
-                               ((TableItemStyle)ControlStyle).VerticalAlign = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual bool Wrap\r
-               {\r
-                       get\r
-                       {\r
-                               if(ControlStyleCreated)\r
-                                       return ((TableItemStyle)ControlStyle).Wrap;\r
-                               return true;\r
-                       }\r
-                       set\r
-                       {\r
-                               ((TableItemStyle)ControlStyle).Wrap = value;\r
-                       }\r
-               }\r
-               \r
-               protected override void AddAttributesToRender(HtmlTextWriter writer): AddAttributesToRender(writer)\r
-               {\r
-                       if(ColumnSpan > 0)\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Colspan, Colspan.ToString(NumberFormatInfo.InvariantInfo));\r
-                       if(RowSpan > 0)\r
-                               writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, Rowspan.ToString(NumberFormatInfo.InvariantInfo));\r
-               }\r
-               \r
-               protected override void AddParsedSubObject(object obj)\r
-               {\r
-                       if(HasControls())\r
-                       {\r
-                               AddParsedSubObject(obj);\r
-                               return;\r
-                       }\r
-                       if(obj is LiteralControl)\r
-                       {\r
-                               Text = ((LiteralControl)obj).Text;\r
-                               return;\r
-                       }\r
-                       string text = Text;\r
-                       if(text.Length > 0)\r
-                       {\r
-                               Text = String.Empty;\r
-                               AddParsedSubObject(new LiteralControl(text));\r
-                       }\r
-                       AddParsedSubObject(obj);\r
-               }\r
-               \r
-               protected override Style CreateControlStyle()\r
-               {\r
-                       return new TableItemStyle(ViewState);\r
-               }\r
-               \r
-               protected override void RenderContents(HtmlTextWriter writer)\r
-               {\r
-                       if(HasControls())\r
-                       {\r
-                               RenderContents(writer);\r
-                               return;\r
-                       }\r
-                       writer.Write(Text);\r
-               }\r
-       }\r
-}\r
+//
+// System.Web.UI.WebControls.TableCell.cs
+//
+// Author:
+//     Sebastien Pouliot  <sebastien@ximian.com>
+//
+// 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.ComponentModel;
+using System.Globalization;
+using System.Security.Permissions;
+using System.Text;
+
+namespace System.Web.UI.WebControls {
+
+       // CAS
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       // attributes
+       [ControlBuilder (typeof (TableCellControlBuilder))]
+       [DefaultProperty ("Text")]
+       [ParseChildren (false)]
+       [ToolboxItem ("")]
+#if NET_2_0
+       [Bindable (false)]
+       [Designer ("System.Web.UI.Design.WebControls.PreviewControlDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
+#else
+       [PersistChildren (true)]
+#endif
+       public class TableCell : WebControl {
+
+               public TableCell ()
+                       : base (HtmlTextWriterTag.Td)
+               {
+                       AutoID = false;
+               }
+
+               // FIXME: is there a clean way to change the tag's name without using a ctor ?
+               // if not then this truly limits the usefulness of inheritance
+               internal TableCell (HtmlTextWriterTag tag)
+                       : base (tag)
+               {
+                       AutoID = false;
+               }
+
+
+#if NET_2_0
+               [DefaultValue (null)]
+               [TypeConverter (typeof (StringArrayConverter))]
+               public virtual string[] AssociatedHeaderCellID {
+                       get {
+                               object o = ViewState ["AssociatedHeaderCellID"];
+                               return (o == null) ? new string[0] : (string[]) o;
+                       }
+                       set {
+                               if (value == null)
+                                       ViewState.Remove ("AssociatedHeaderCellID");
+                               else
+                                       ViewState ["AssociatedHeaderCellID"] = value;
+                       }
+               }
+#endif
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (0)]
+               [WebSysDescription ("")]
+               [WebCategory ("Appearance")]
+               public virtual int ColumnSpan {
+                       get {
+                               object o = ViewState ["ColumnSpan"];
+                               return (o == null) ? 0 : (int) o;
+                       }
+                       set {
+                               // LAMESPEC: undocumented (but like Table.CellPadding)
+                               if (value < 0)
+                                       throw new ArgumentOutOfRangeException ("< 0");
+                               ViewState ["ColumnSpan"] = value;
+                       }
+               }
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (HorizontalAlign.NotSet)]
+               [WebSysDescription ("")]
+               [WebCategory ("Layout")]
+               public virtual HorizontalAlign HorizontalAlign {
+                       get {
+                               if (!ControlStyleCreated)
+                                       return HorizontalAlign.NotSet; // default value
+                               return TableItemStyle.HorizontalAlign;
+                       }
+                       set { TableItemStyle.HorizontalAlign = value; }
+               }
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (0)]
+               [WebSysDescription ("")]
+               [WebCategory ("Layout")]
+               public virtual int RowSpan {
+                       get {
+                               object o = ViewState ["RowSpan"];
+                               return (o == null) ? 0 : (int) o;
+                       }
+                       set {
+                               // LAMESPEC: undocumented (but like Table.CellPadding)
+                               if (value < 0)
+                                       throw new ArgumentOutOfRangeException ("< 0");
+                               ViewState ["RowSpan"] = value;
+                       }
+               }
+
+#if NET_2_0
+               [Localizable (true)]
+               [PersistenceMode (PersistenceMode.InnerDefaultProperty)]
+#else
+               [Bindable (true)]
+#endif
+               [DefaultValue ("")]
+               [WebSysDescription ("")]
+               [WebCategory ("Appearance")]
+               public virtual string Text {
+                       get {
+                               object o = ViewState ["Text"];
+                               return (o == null) ? String.Empty : (string) o;
+                       }
+                       set {
+                               if (value == null)
+                                       ViewState.Remove ("Text");
+                               else {
+                                       ViewState ["Text"] = value;
+                                       if (HasControls ())
+                                               Controls.Clear ();
+                               }
+                       }
+               }
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (VerticalAlign.NotSet)]
+               [WebSysDescription ("")]
+               [WebCategory ("Layout")]
+               public virtual VerticalAlign VerticalAlign {
+                       get {
+                               if (!ControlStyleCreated)
+                                       return VerticalAlign.NotSet; // default value
+                               return TableItemStyle.VerticalAlign;
+                       }
+                       set { TableItemStyle.VerticalAlign = value; }
+               }
+
+#if ONLY_1_1
+               [Bindable (true)]
+#endif
+               [DefaultValue (true)]
+               [WebSysDescription ("")]
+               [WebCategory ("Layout")]
+               public virtual bool Wrap {
+                       get {
+                               if (!ControlStyleCreated)
+                                       return true; // default value
+                               return TableItemStyle.Wrap;
+                       }
+                       set { TableItemStyle.Wrap = value; }
+               }
+
+               private TableItemStyle TableItemStyle {
+                       get { return (ControlStyle as TableItemStyle); }
+               }
+
+
+               protected override void AddAttributesToRender (HtmlTextWriter writer)
+               {
+                       base.AddAttributesToRender (writer);
+                       if (writer == null)
+                               return;
+
+                       int i = ColumnSpan;
+                       if (i > 0)
+                               writer.AddAttribute (HtmlTextWriterAttribute.Colspan, i.ToString (CultureInfo.InvariantCulture));
+
+                       i = RowSpan;
+                       if (i > 0)
+                               writer.AddAttribute (HtmlTextWriterAttribute.Rowspan, i.ToString (CultureInfo.InvariantCulture));
+#if NET_2_0
+                       string[] ahci = AssociatedHeaderCellID;
+                       if (ahci.Length > 1) {
+                               StringBuilder sb = new StringBuilder ();
+                               for (i = 0; i < ahci.Length - 1; i++) {
+                                       sb.Append (ahci [i]);
+                                       sb.Append (",");
+                               }
+                               sb.Append (ahci.Length - 1);
+                               writer.AddAttribute (HtmlTextWriterAttribute.Headers, sb.ToString ());
+                       } else if (ahci.Length == 1) {
+                               // most common case (without a StringBuilder)
+                               writer.AddAttribute (HtmlTextWriterAttribute.Headers, ahci [0]);
+                       }
+#endif
+               }
+
+               protected override void AddParsedSubObject (object obj)
+               {
+                       if (HasControls ()) {
+                               base.AddParsedSubObject (obj);
+                               return;
+                       }
+                       
+                       LiteralControl lc = (obj as LiteralControl);
+                       if (lc == null) {
+                               string s = Text;
+                               if (s.Length > 0) {
+                                       Controls.Add (new LiteralControl (s));
+                                       // remove from viewstate
+                                       Text = null;
+                               }
+                               base.AddParsedSubObject(obj);
+                       } else {
+                               // this will clear any existing controls
+                               Text = lc.Text;
+                       }
+               }
+
+               protected override Style CreateControlStyle ()
+               {
+                       return new TableItemStyle (ViewState);
+               }
+
+#if NET_2_0
+               protected internal
+#else          
+               protected
+#endif         
+               override void RenderContents (HtmlTextWriter writer)
+               {
+                       if (HasControls ())
+                               base.RenderContents (writer);
+                       else
+                               writer.Write (Text);
+               }
+       }
+}
+