2009-10-30 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / DataListItem.cs
index f8235ae57cac684cebd3c3a76e4265508a9ab2b4..3a17bf3b935ff43da50db9647873ad41b6c8beea 100644 (file)
@@ -1,4 +1,10 @@
-
+//
+// System.Web.UI.WebControls.DataListItem.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
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-/**\r
- * Namespace: System.Web.UI.WebControls\r
- * Class:     DataListItem\r
- *\r
- * Authors:  Gaurav Vaish, Gonzalo Paniagua (gonzalo@ximian.com)\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
- * (c) 2002 Ximian, Inc. (http://www.ximian.com)\r
- */\r
-\r
-using System;\r
-using System.Collections;\r
-using System.Web;\r
-using System.Web.UI;\r
-using System.ComponentModel;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       [ToolboxItem(false)]\r
-       public class DataListItem : WebControl, INamingContainer\r
-#if NET_2_0\r
-               , IDataItemContainer\r
-#endif\r
-       {\r
-               int itemIndex;\r
-               ListItemType itemType;\r
-               object dataItem;\r
-\r
-               public DataListItem(int itemIndex, ListItemType itemType)\r
-               {\r
-                       this.itemIndex = itemIndex;\r
-                       this.itemType  = itemType;\r
-               }\r
-\r
-               public virtual object DataItem\r
-               {\r
-                       get\r
-                       {\r
-                               return dataItem;\r
-                       }\r
-                       set\r
-                       {\r
-                               dataItem = value;\r
-                       }\r
-               }\r
-\r
-               public virtual int ItemIndex\r
-               {\r
-                       get\r
-                       {\r
-                               return itemIndex;\r
-                       }\r
-               }\r
-\r
-               public virtual ListItemType ItemType\r
-               {\r
-                       get\r
-                       {\r
-                               return itemType;\r
-                       }\r
-               }\r
-\r
-               public virtual void RenderItem (HtmlTextWriter writer, bool extractRows, bool tableLayout)\r
-               {\r
-                       if (extractRows){\r
-                               Table tbl = null;\r
-                               foreach (Control ctrl in Controls){\r
-                                       if (ctrl is Table){\r
-                                               tbl = (Table) ctrl;\r
-                                               break;\r
-                                       }\r
-                               }\r
-                               \r
-                               if (tbl == null)\r
-                                       throw new HttpException ("Template table not found!");\r
-\r
-                               foreach (TableRow row in tbl.Rows)\r
-                                       row.RenderControl (writer);\r
-                       } else {\r
-                               if (tableLayout)\r
-                                       RenderContents (writer);\r
-                               else\r
-                                       RenderControl (writer);\r
-                       }\r
-\r
-               }\r
-\r
-               protected override Style CreateControlStyle()\r
-               {\r
-                       return new TableItemStyle();\r
-               }\r
-\r
-               protected override bool OnBubbleEvent(object source, EventArgs e)\r
-               {\r
-                       if(e is CommandEventArgs)\r
-                       {\r
-                               RaiseBubbleEvent(this, new DataListCommandEventArgs(this, source, (CommandEventArgs)e));\r
-                               return true;\r
-                       }\r
-                       return false;\r
-               }\r
-\r
-               protected internal virtual void SetItemType(ListItemType itemType)\r
-               {\r
-                       if(Enum.IsDefined(typeof(ListItemType), itemType))\r
-                       {\r
-                               this.itemType = itemType;\r
-                       }\r
-               }\r
-       }\r
-}\r
+
+using System.Collections;
+using System.ComponentModel;
+using System.Security.Permissions;
+
+namespace System.Web.UI.WebControls {
+
+       // CAS
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       // attributes
+       [ToolboxItem ("")]
+#if NET_2_0
+       public class DataListItem : WebControl, INamingContainer, IDataItemContainer {
+#else
+       public class DataListItem : WebControl, INamingContainer {
+#endif
+               int index;
+               ListItemType type;
+               object item;
+
+               public DataListItem (int itemIndex, ListItemType itemType)
+               {
+                       index = itemIndex;
+                       type = itemType;
+               }
+
+               public virtual object DataItem {
+                       get { return item; }
+                       set { item = value; }
+               }
+
+               public virtual int ItemIndex {
+                       get { return index; }
+               }
+
+               public virtual ListItemType ItemType {
+                       get { return type; }
+               }
+
+               protected override Style CreateControlStyle ()
+               {
+                       return new TableItemStyle (ViewState);
+               }
+
+               // see ... "Building DataBound Templated Custom ASP.NET" on msdn
+               // http://msdn.microsoft.com/library/en-us/dnaspp/html/databoundtemplatedcontrols.asp
+               //
+               // This technique is used in the DataGrid, DataList, and Repeater to handle the
+               // Command event of Buttons, LinkButtons, and ImageButtons within the
+               // controls. Since the button's Command event calls RaiseBubbleEvent(), this
+               // percolates the event up to the button's parent.
+               protected override bool OnBubbleEvent (object source, EventArgs e)
+               {
+                       CommandEventArgs ce = e as CommandEventArgs;
+                       if (ce != null) {
+                               base.RaiseBubbleEvent (this, new DataListCommandEventArgs (this, source, ce));
+                               return true;
+                       }
+                       return false;
+               }
+
+               public virtual void RenderItem (HtmlTextWriter writer, bool extractRows, bool tableLayout)
+               {
+                       bool span = (!extractRows && !tableLayout); 
+                       if (span) {
+                               writer.RenderBeginTag (TagKey);
+                       }
+                       
+                       if (HasControls ()) {
+                               if (extractRows) {
+                                       bool table = false;
+                                       foreach (Control c in Controls) {
+                                               Table t = (c as Table);
+                                               if (t != null) {
+                                                       table = true;
+                                                       foreach (TableRow tr in t.Rows) {
+                                                               if (ControlStyleCreated && !ControlStyle.IsEmpty) {
+                                                                       tr.ControlStyle.MergeWith (ControlStyle);
+                                                               }
+                                                               tr.RenderControl (writer);
+                                                       }
+                                                       break; // ignore all, but the first, table
+                                               }
+                                       }
+                                       if (!table) {
+                                               // if it has controls then it must have a Table control
+                                               throw new HttpException ("No Table found in DataList template.");
+                                               // other controls are ignored (as long as a Table is there)
+                                       }
+                               } else {
+                                       // this get rides of the extra <span>...</span> around our stuff
+                                       RenderContents (writer);
+                               }
+                       }
+                       
+                       if (span) {
+                               writer.RenderEndTag ();
+                       }
+               }
+
+               protected virtual void SetItemType (ListItemType itemType)
+               {
+                       type = itemType;
+               }
+
+#if NET_2_0
+               object IDataItemContainer.DataItem {
+                       get { return item; }
+               }
+
+               int IDataItemContainer.DataItemIndex {
+                       get { return index; }
+               }
+
+               int IDataItemContainer.DisplayIndex {
+                       get { return index; }
+               }
+#endif
+       }
+}