2004-09-12 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / BoundColumn.cs
index 13bcb75f8dbe50de6b7d5f424ee6c145b190479f..04654f8c706ccb4e15e16d8cac822aea97e5f715 100755 (executable)
-/**\r
- * Namespace: System.Web.UI.WebControls\r
- * Class:     BoundColumn\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:  60%\r
- * \r
- * (C) Gaurav Vaish (2001)\r
- */\r
-\r
-using System;\r
-using System.ComponentModel;\r
-using System.Web;\r
-using System.Web.UI;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       public class BoundColumn : DataGridColumn\r
-       {\r
-               public static readonly string thisExpr = "!";\r
-               \r
-               private string dataField;\r
-               private string dataFormatString;\r
-               private bool readOnly;\r
-               \r
-               private PropertyDescriptor desc;\r
-\r
-               public BoundColumn(): base()\r
-               {\r
-                       //TODO: The start work\r
-                       Initialize();\r
-               }\r
-               \r
-               public override void Initialize()\r
-               {\r
-                       base.Initialize();\r
-                       dataField        = String.Empty;\r
-                       dataFormatString = String.Empty;\r
-                       readOnly         = false;\r
-                       desc             = null;\r
-               }\r
-\r
-               [MonoTODO]\r
-               public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType)\r
-               {\r
-                       //TODO: What to do?\r
-                       InitializeCell(cell, columnIndex, itemType);\r
-//                     switch(itemType)\r
-//                     {\r
-//                             case \r
-//                     }\r
-                       throw new NotImplementedException();\r
-               }\r
-               \r
-               public virtual string DataField\r
-               {\r
-                       get\r
-                       {\r
-                               return dataField;\r
-                       }\r
-                       set\r
-                       {\r
-                               dataField = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual string DataFormatString\r
-               {\r
-                       get\r
-                       {\r
-                               return dataFormatString;\r
-                       }\r
-                       set\r
-                       {\r
-                               dataFormatString = value;\r
-                       }\r
-               }\r
-               \r
-               public virtual bool ReadOnly\r
-               {\r
-                       get\r
-                       {\r
-                               return readOnly;\r
-                       }\r
-                       set\r
-                       {\r
-                               readOnly = value;\r
-                       }\r
-               }\r
-               \r
-               [MonoTODO]\r
-               protected virtual string FormatDataValue(Object dataValue)\r
-               {\r
-                       // TODO: How to extract the value from the object?\r
-                       // TODO: Then format the value. Here's a possible solution\r
-                       if(dataFormatString == null || dataFormatString.Equals(String.Empty))\r
-                               return dataValue.ToString();\r
-                       if(dataValue is DateTime)\r
-                               return ((DateTime)dataValue).ToString(dataFormatString);\r
-                       throw new NotImplementedException();\r
-                       // and so on for int, String, double..\r
-                       // something's wrong here. there must be some shorter method!\r
-                       //string val = dataValue.toString(dataFormatString);\r
-               }\r
-       }\r
-}\r
+//
+// System.Web.UI.WebControls.BoundColumn.cs
+//
+// Authors:
+//   Gaurav Vaish (gvaish@iitk.ac.in)
+//   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+//
+// (C) Gaurav Vaish (2002)
+// (C) 2003 Andreas Nahr
+//\r
+
+//
+// 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.ComponentModel;
+using System.Web;
+using System.Web.UI;
+
+namespace System.Web.UI.WebControls
+{
+       public class BoundColumn : DataGridColumn
+       {
+               public static readonly string thisExpr = "!";
+
+               private bool boundFieldDescriptionValid;
+               private string boundField;
+               private string formatting;
+               
+               private PropertyDescriptor desc;
+
+               public BoundColumn(): base()
+               {
+               }
+
+               public override void Initialize()
+               {
+                       base.Initialize();
+
+                       desc       = null;
+                       boundField = DataField;
+                       formatting = DataFormatString;
+                       boundFieldDescriptionValid = false;
+               }
+
+               public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType)
+               {
+                       base.InitializeCell(cell, columnIndex, itemType);
+
+                       Control bindCtrl = null;
+                       Control toAdd    = null;
+                       switch(itemType)
+                       {
+                               case ListItemType.Item : goto case ListItemType.SelectedItem;
+                               case ListItemType.AlternatingItem
+                                                      : goto case ListItemType.SelectedItem;
+                               case ListItemType.SelectedItem
+                                                      : if(DataField.Length != 0)
+                                                               bindCtrl = cell;
+                                                        break;
+                               case ListItemType.EditItem
+                                                          : if(!ReadOnly)
+                                                            {
+                                                               TextBox box = new TextBox();
+                                                               toAdd = box;
+                                                               if(DataField.Length != 0)
+                                                                       bindCtrl = box;
+                                                            } else 
+                                                                    goto case ListItemType.SelectedItem;
+
+                                                            break;
+                       }
+                       if(toAdd != null)
+                               cell.Controls.Add(toAdd);
+                       if(bindCtrl != null)
+                               bindCtrl.DataBinding += new EventHandler(OnDataBindColumn);
+                       //throw new NotImplementedException();
+               }
+
+               private void OnDataBindColumn(object sender, EventArgs e)
+               {
+                       Control senderCtrl = (Control)sender;
+                       DataGridItem item  = (DataGridItem)senderCtrl.NamingContainer;
+                       object       data  = item.DataItem;
+
+                       if(!boundFieldDescriptionValid)
+                       {
+                               if(boundField != BoundColumn.thisExpr)
+                               {
+                                       desc = TypeDescriptor.GetProperties(data).Find(boundField, true);
+                                       if(desc == null && !DesignMode)
+                                       {
+                                               throw new HttpException(
+                                                         HttpRuntime.FormatResourceString("File_Not_Found",
+                                                                                          boundField));
+                                       }
+                                       boundFieldDescriptionValid = true;
+                               }
+                       }
+                       object value = data;
+                       string val = String.Empty;
+                       if(desc == null && DesignMode)
+                       {
+                               throw new NotImplementedException();
+                       } else
+                       {
+                               if(desc != null)
+                                       value = desc.GetValue(data);
+                               val = FormatDataValue(value);
+                       }
+                       if(senderCtrl is TableCell)
+                       {
+                               if(val.Length == 0)
+                                       val = "&nbsp;";
+                               ((TableCell)senderCtrl).Text = val;
+                       } else
+                       {
+                               ((TextBox)senderCtrl).Text = val;
+                       }
+               }
+
+               [DefaultValue (""), WebCategory ("Misc")]
+               [WebSysDescription ("The field that this column is bound to.")]
+               public virtual string DataField
+               {
+                       get
+                       {
+                               object o = ViewState["DataField"];
+                               if(o != null)
+                                       return (string)o;
+                               return String.Empty;
+                       }
+                       set
+                       {
+                               ViewState["DataField"] = value;
+                               OnColumnChanged();
+                       }
+               }
+
+               [DefaultValue (""), WebCategory ("Misc")]
+               [WebSysDescription ("A format string that is applied to the data value.")]
+               public virtual string DataFormatString
+               {
+                       get
+                       {
+                               object o = ViewState["DataFormatString"];
+                               if(o != null)
+                                       return (string)o;
+                               return String.Empty;
+                       }
+                       set
+                       {
+                               ViewState["DataFormatString"] = value;
+                               OnColumnChanged();
+                       }
+               }
+
+               [DefaultValue (false), WebCategory ("Misc")]
+               [WebSysDescription ("Determines if the databound field can only be displayed or also edited.")]
+               public virtual bool ReadOnly
+               {
+                       get
+                       {
+                               object o = ViewState["ReadOnly"];
+                               if(o != null)
+                                       return (bool)o;
+                               return false;
+                       }
+                       set
+                       {
+                               ViewState["ReadOnly"] = value;
+                       }
+               }
+
+               protected virtual string FormatDataValue(Object dataValue)
+               {
+                       string retVal = String.Empty;
+                       if(dataValue != null)
+                       {
+                               if(formatting.Length == 0)
+                                       retVal = dataValue.ToString();
+                               else
+                                       retVal = String.Format(formatting, dataValue);
+                       }
+                       return retVal;
+               }
+       }
+}