2004-05-26 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / CheckBoxList.cs
1 //
2 // System.Web.UI.WebControls.CheckBoxList.cs
3 //
4 // Authors:
5 //   Gaurav Vaish (gvaish@iitk.ac.in)
6 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
7 //
8 // (C) Gaurav Vaish (2002)
9 // (C) 2003 Andreas Nahr
10 //
11 \r
12 using System;\r
13 using System.Collections.Specialized;\r
14 using System.ComponentModel;\r
15 using System.Globalization;\r
16 using System.Web;\r
17 using System.Web.UI;\r
18 \r
19 namespace System.Web.UI.WebControls\r
20 {\r
21         public class CheckBoxList: ListControl, IRepeatInfoUser, INamingContainer, IPostBackDataHandler\r
22         {\r
23                 CheckBox checkBoxRepeater;\r
24                 bool     isChangeNotified;\r
25 \r
26                 public CheckBoxList()\r
27                 {\r
28                         checkBoxRepeater = new CheckBox();\r
29                         checkBoxRepeater.ID = "0";\r
30                         checkBoxRepeater.EnableViewState = false;\r
31                         Controls.Add (checkBoxRepeater);\r
32                         isChangeNotified = false;\r
33                 }\r
34
35                 [DefaultValue (-1), Bindable (true), WebCategory ("Layout")]
36                 [WebSysDescription ("The border left within a CheckBox.")]\r
37                 public virtual int CellPadding\r
38                 {\r
39                         get\r
40                         {\r
41                                 return (ControlStyleCreated ? ((TableStyle)ControlStyle).CellPadding : -1);\r
42                         }\r
43                         set\r
44                         {\r
45                                 ((TableStyle)ControlStyle).CellPadding = value;\r
46                         }\r
47                 }\r
48
49                 [DefaultValue (-1), Bindable (true), WebCategory ("Layout")]
50                 [WebSysDescription ("The border left between CheckBoxes.")]\r
51                 public virtual int CellSpacing\r
52                 {\r
53                         get\r
54                         {\r
55                                 return (ControlStyleCreated ? ((TableStyle)ControlStyle).CellSpacing : -1);\r
56                         }\r
57                         set\r
58                         {\r
59                                 ((TableStyle)ControlStyle).CellSpacing = value;\r
60                         }\r
61                 }\r
62
63                 [DefaultValue (0), Bindable (true), WebCategory ("Layout")]
64                 [WebSysDescription ("The number of columns that should be used to display the CheckBoxes.")]\r
65                 public virtual int RepeatColumns\r
66                 {\r
67                         get\r
68                         {\r
69                                 object o = ViewState["RepeatColumns"];\r
70                                 if(o!=null)\r
71                                         return (int)o;\r
72                                 return 0;\r
73                         }\r
74                         set\r
75                         {\r
76                                 if(value < 0)\r
77                                         throw new ArgumentOutOfRangeException();\r
78                                 ViewState["RepeatColumns"] = value;\r
79                         }\r
80                 }\r
81
82                 [DefaultValue (typeof (RepeatDirection), "Vertical"), Bindable (true), WebCategory ("Layout")]
83                 [WebSysDescription ("The direction that is followed when doing the layout.")]\r
84                 public virtual RepeatDirection RepeatDirection\r
85                 {\r
86                         get\r
87                         {\r
88                                 object o = ViewState["RepeatDirection"];\r
89                                 if(o!=null)\r
90                                         return (RepeatDirection)o;\r
91                                 return RepeatDirection.Vertical;\r
92                         }\r
93                         set\r
94                         {\r
95                                 if(!System.Enum.IsDefined(typeof(RepeatDirection),value))\r
96                                         throw new ArgumentException();\r
97                                 ViewState["RepeatDirection"] = value;\r
98                         }\r
99                 }\r
100
101                 [DefaultValue (typeof (RepeatLayout), "Table"), Bindable (true), WebCategory ("Layout")]
102                 [WebSysDescription ("The method used to create the layout.")]\r
103                 public virtual RepeatLayout RepeatLayout\r
104                 {\r
105                         get\r
106                         {\r
107                                 object o = ViewState["RepeatLayout"];\r
108                                 if(o!=null)\r
109                                         return (RepeatLayout)o;\r
110                                 return RepeatLayout.Table;\r
111                         }\r
112                         set\r
113                         {\r
114                                 if(!System.Enum.IsDefined(typeof(RepeatLayout), value))\r
115                                         throw new ArgumentException();\r
116                                 ViewState["RepeatLayout"] = value;\r
117                         }\r
118                 }\r
119
120                 [DefaultValue (typeof (TextAlign), "Right"), Bindable (true), WebCategory ("Appearance")]
121                 [WebSysDescription ("The alignment of the CheckBox text.")]\r
122                 public virtual TextAlign TextAlign\r
123                 {\r
124                         get\r
125                         {\r
126                                 object o = ViewState["TextAlign"];\r
127                                 if(o!=null)\r
128                                         return (TextAlign)o;\r
129                                 return TextAlign.Right;\r
130                         }\r
131                         set\r
132                         {\r
133                                 if(!Enum.IsDefined(typeof(TextAlign), value))\r
134                                         throw new ArgumentException();\r
135                                 ViewState["TextAlign"] = value;\r
136                         }\r
137                 }\r
138 \r
139                 protected override Style CreateControlStyle()\r
140                 {\r
141                         return new TableStyle(ViewState);\r
142                 }\r
143 \r
144                 protected override Control FindControl(string id, int pathOffset)\r
145                 {\r
146                         return this;\r
147                 }\r
148 \r
149                 protected override void OnPreRender(EventArgs e)\r
150                 {\r
151                         checkBoxRepeater.AutoPostBack = AutoPostBack;\r
152                         if(Page!=null)\r
153                         {\r
154                                 for(int i=0; i < Items.Count; i++)\r
155                                 {\r
156                                         if(Items[i].Selected)\r
157                                         {\r
158                                                 checkBoxRepeater.ID = i.ToString(NumberFormatInfo.InvariantInfo);\r
159                                                 Page.RegisterRequiresPostBack(checkBoxRepeater);\r
160                                         }\r
161                                 }\r
162                         }\r
163                 }\r
164 \r
165                 protected override void Render(HtmlTextWriter writer)\r
166                 {\r
167                         RepeatInfo ri = new RepeatInfo();\r
168                         checkBoxRepeater.TabIndex = TabIndex;\r
169                         bool dirtyFlag = false;\r
170                         short  tTabIndex = TabIndex;\r
171                         Style s = (ControlStyleCreated ? ControlStyle : null);\r
172                         if(TabIndex != 0)\r
173                         {\r
174                                 if(!ViewState.IsItemDirty("TabIndex"))\r
175                                         dirtyFlag = true;\r
176                                 TabIndex = 0;\r
177                         }\r
178                         ri.RepeatColumns = RepeatColumns;\r
179                         ri.RepeatLayout  = RepeatLayout;\r
180                         ri.RepeatDirection = RepeatDirection;\r
181                         ri.RenderRepeater(writer, this, s, this);\r
182                         if(tTabIndex != 0)\r
183                         {\r
184                                 TabIndex = tTabIndex;\r
185                         }\r
186                         if(dirtyFlag)\r
187                         {\r
188                                 ViewState.SetItemDirty("TabIndex", false);\r
189                         }\r
190                 }\r
191
192                 bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
193                 {
194                         if (!Enabled)
195                                 return false;
196
197                         int index = Int32.Parse(postDataKey.Substring(UniqueID.Length + 1));\r
198                         if(index >= 0 && index < Items.Count)
199                         {
200                                 string v = postCollection [postDataKey];
201                                 bool exists = (v != null);
202                                 if(Items[index].Selected != exists)\r
203                                 {\r
204                                         Items[index].Selected = exists;\r
205                                         if(!isChangeNotified)\r
206                                         {\r
207                                                 isChangeNotified = true;\r
208                                                 return true;\r
209                                         }\r
210                                 }\r
211                         }\r
212                         return false;\r
213                 }\r
214 \r
215                 void IPostBackDataHandler.RaisePostDataChangedEvent()\r
216                 {\r
217                         OnSelectedIndexChanged(EventArgs.Empty);\r
218                 }\r
219 \r
220                 bool IRepeatInfoUser.HasFooter\r
221                 {\r
222                         get\r
223                         {\r
224                                 return false;\r
225                         }\r
226                 }\r
227 \r
228                 bool IRepeatInfoUser.HasHeader\r
229                 {\r
230                         get\r
231                         {\r
232                                 return false;\r
233                         }\r
234                 }\r
235 \r
236                 bool IRepeatInfoUser.HasSeparators\r
237                 {\r
238                         get\r
239                         {\r
240                                 return false;\r
241                         }\r
242                 }\r
243 \r
244                 int IRepeatInfoUser.RepeatedItemCount\r
245                 {\r
246                         get\r
247                         {\r
248                                 return Items.Count;\r
249                         }\r
250                 }\r
251 \r
252                 Style IRepeatInfoUser.GetItemStyle(ListItemType itemType, int repeatIndex)\r
253                 {\r
254                         return null;\r
255                 }\r
256 \r
257                 void IRepeatInfoUser.RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)\r
258                 {\r
259                         checkBoxRepeater.ID = repeatIndex.ToString(NumberFormatInfo.InvariantInfo);\r
260                         checkBoxRepeater.Text = Items[repeatIndex].Text;\r
261                         checkBoxRepeater.TextAlign = TextAlign;\r
262                         checkBoxRepeater.Checked = Items[repeatIndex].Selected;\r
263                         checkBoxRepeater.Enabled = Enabled;\r
264                         checkBoxRepeater.RenderControl(writer);\r
265                 }\r
266         }\r
267 }\r