2008-03-13 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / TemplateField.cs
1 //
2 // System.Web.UI.WebControls.TemplateField.cs
3 //
4 // Authors:
5 //  Lluis Sanchez Gual (lluis@novell.com)
6 //
7 // (C) 2005 Novell, Inc. (http://www.novell.com)
8 //
9
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 #if NET_2_0
32 using System.Collections;
33 using System.Collections.Specialized;
34 using System.Web.UI;
35 using System.Security.Permissions;
36 using System.ComponentModel;
37
38 namespace System.Web.UI.WebControls
39 {
40         [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
41         [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
42         public class TemplateField : DataControlField
43         {
44                 ITemplate alternatingItemTemplate;
45                 ITemplate editItemTemplate;
46                 ITemplate footerTemplate;
47                 ITemplate headerTemplate;
48                 ITemplate insertItemTemplate;
49                 ITemplate itemTemplate;
50                 
51                 [DefaultValue (null)]
52                 [TemplateContainer (typeof(IDataItemContainer), BindingDirection.TwoWay)]
53                 [PersistenceMode (PersistenceMode.InnerProperty)]
54                 [Browsable (false)]
55                 public virtual ITemplate AlternatingItemTemplate {
56                         get { return alternatingItemTemplate; }
57                         set { alternatingItemTemplate = value; OnFieldChanged (); }
58                 }
59                 
60                 [DefaultValueAttribute (true)]
61                 [WebCategoryAttribute ("Behavior")]
62                 public virtual bool ConvertEmptyStringToNull {
63                         get {
64                                 object ob = ViewState ["ConvertEmptyStringToNull"];
65                                 if (ob != null) return (bool) ob;
66                                 return true;
67                         }
68                         set {
69                                 ViewState ["ConvertEmptyStringToNull"] = value;
70                                 OnFieldChanged ();
71                         }
72                 }
73
74                 [DefaultValue (null)]
75                 [TemplateContainer (typeof(IDataItemContainer), BindingDirection.TwoWay)]
76                 [PersistenceMode (PersistenceMode.InnerProperty)]
77                 [Browsable (false)]
78                 public virtual ITemplate EditItemTemplate {
79                         get { return editItemTemplate; }
80                         set { editItemTemplate = value; OnFieldChanged (); }
81                 }
82
83                 [DefaultValue (null)]
84                 [TemplateContainer (typeof(IDataItemContainer), BindingDirection.OneWay)]
85                 [PersistenceMode (PersistenceMode.InnerProperty)]
86                 [Browsable (false)]
87                 public virtual ITemplate FooterTemplate {
88                         get { return footerTemplate; }
89                         set { footerTemplate = value; OnFieldChanged (); }
90                 }
91
92                 [DefaultValue (null)]
93                 [TemplateContainer (typeof(IDataItemContainer), BindingDirection.OneWay)]
94                 [PersistenceMode (PersistenceMode.InnerProperty)]
95                 [Browsable (false)]
96                 public virtual ITemplate HeaderTemplate {
97                         get { return headerTemplate; }
98                         set { headerTemplate = value; OnFieldChanged (); }
99                 }
100
101                 [DefaultValue (null)]
102                 [TemplateContainer (typeof(IDataItemContainer), BindingDirection.TwoWay)]
103                 [PersistenceMode (PersistenceMode.InnerProperty)]
104                 [Browsable (false)]
105                 public virtual ITemplate InsertItemTemplate {
106                         get { return insertItemTemplate; }
107                         set { insertItemTemplate = value; OnFieldChanged (); }
108                 }
109
110                 [DefaultValue (null)]
111                 [TemplateContainer (typeof(IDataItemContainer), BindingDirection.TwoWay)]
112                 [PersistenceMode (PersistenceMode.InnerProperty)]
113                 [Browsable (false)]
114                 public virtual ITemplate ItemTemplate {
115                         get { return itemTemplate; }
116                         set { itemTemplate = value; OnFieldChanged (); }
117                 }
118                 
119                 public override void InitializeCell (DataControlFieldCell cell,
120                                                      DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
121                 {
122                         base.InitializeCell (cell, cellType, rowState, rowIndex);
123                         if (cellType == DataControlCellType.Header) {
124                                 if (headerTemplate != null && ShowHeader) {
125                                         cell.Text = String.Empty;
126                                         headerTemplate.InstantiateIn (cell);
127                                 }
128                         } else if (cellType == DataControlCellType.Footer) {
129                                 if (footerTemplate != null) {
130                                         cell.Text = String.Empty;
131                                         footerTemplate.InstantiateIn (cell);
132                                 }
133                         } else {
134                                 cell.Text = String.Empty;
135                                 if ((rowState & DataControlRowState.Insert) != 0 &&
136                                                 insertItemTemplate != null) {
137                                         insertItemTemplate.InstantiateIn (cell);
138                                 }
139                                 else if ((rowState & DataControlRowState.Edit) != 0 &&
140                                                 editItemTemplate != null) {
141                                         editItemTemplate.InstantiateIn (cell);
142                                 }
143                                 else if ((rowState & DataControlRowState.Alternate) != 0 &&
144                                                 alternatingItemTemplate != null) {
145                                         alternatingItemTemplate.InstantiateIn (cell);
146                                 }
147                                 else if (itemTemplate != null) {
148                                         itemTemplate.InstantiateIn (cell);
149                                 }
150                                 else
151                                         cell.Text = "&nbsp;";
152                         }
153                 }
154                 
155                 public override void ExtractValuesFromCell (IOrderedDictionary dictionary,
156                                                             DataControlFieldCell cell, DataControlRowState rowState, bool includeReadOnly)
157                 {
158                         IBindableTemplate bt;
159                         
160                         if ((rowState & DataControlRowState.Insert) != 0)
161                                 bt = insertItemTemplate as IBindableTemplate; 
162                         else if ((rowState & DataControlRowState.Edit) != 0)
163                                 bt = editItemTemplate as IBindableTemplate;
164                         else if (alternatingItemTemplate !=null && (rowState & DataControlRowState.Alternate) != 0)
165                                 bt = alternatingItemTemplate as IBindableTemplate;
166                         else
167                                 bt = itemTemplate as IBindableTemplate;
168                         
169                         if (bt != null) {
170                                 IOrderedDictionary values = bt.ExtractValues (cell);
171                                 if (values == null)
172                                         return;
173                                 foreach (DictionaryEntry e in values)
174                                         dictionary [e.Key] = e.Value; 
175                         }
176                 }
177                 
178                 public override void ValidateSupportsCallback ()
179                 {
180                         throw new NotSupportedException ("Callback not supported on TemplateField. Turn disable callbacks on '" + Control.ID + "'.");
181                 }
182                 
183                 protected override DataControlField CreateField ()
184                 {
185                         return new TemplateField ();
186                 }
187                 
188                 protected override void CopyProperties (DataControlField newField)
189                 {
190                         base.CopyProperties (newField);
191                         TemplateField field = (TemplateField) newField;
192                         field.AlternatingItemTemplate = AlternatingItemTemplate;
193                         field.ConvertEmptyStringToNull = ConvertEmptyStringToNull;
194                         field.EditItemTemplate = EditItemTemplate;
195                         field.FooterTemplate = FooterTemplate;
196                         field.HeaderTemplate = HeaderTemplate;
197                         field.InsertItemTemplate = InsertItemTemplate;
198                         field.ItemTemplate = ItemTemplate;
199                 }
200         }
201 }
202 #endif