6b8b0e21b1ae3c1627167eee9af642b7f320b53d
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / CheckBoxList.cs
1 /**\r
2 * Namespace: System.Web.UI.WebControls\r
3 * Class:     CheckBoxList\r
4 *\r
5 * Author:  Gaurav Vaish\r
6 * Maintainer: gvaish@iitk.ac.in\r
7 * Contact: <gvaish@iitk.ac.in>\r
8 * Implementation: yes\r
9 * Status:  100%\r
10 *\r
11 * (C) Gaurav Vaish (2001)\r
12 */\r
13 \r
14 using System;\r
15 using System.Collections.Specialized;\r
16 using System.ComponentModel;\r
17 using System.Globalization;\r
18 using System.Web;\r
19 using System.Web.UI;\r
20 \r
21 namespace System.Web.UI.WebControls\r
22 {\r
23         [DefaultEvent("SelectedIndexChanged")]\r
24         [DefaultProperty("DataSource")]\r
25         [ParseChildren(true, "Items")]\r
26         [PersistChildren(false)]\r
27         public class CheckBoxList: ListControl, IRepeatInfoUser, INamingContainer, IPostBackDataHandler\r
28         {\r
29                 CheckBox checkBoxRepeater;\r
30                 bool     isChangeNotified;\r
31 \r
32                 public CheckBoxList()\r
33                 {\r
34                         checkBoxRepeater = new CheckBox();\r
35                         checkBoxRepeater.ID = "0";\r
36                         checkBoxRepeater.EnableViewState = false;\r
37                         checkBoxRepeater.Controls.Add(this);\r
38                         isChangeNotified = false;\r
39                 }\r
40 \r
41                 public virtual int CellPadding\r
42                 {\r
43                         get\r
44                         {\r
45                                 return (ControlStyleCreated ? ((TableStyle)ControlStyle).CellPadding : -1);\r
46                         }\r
47                         set\r
48                         {\r
49                                 ((TableStyle)ControlStyle).CellPadding = value;\r
50                         }\r
51                 }\r
52 \r
53                 public virtual int CellSpacing\r
54                 {\r
55                         get\r
56                         {\r
57                                 return (ControlStyleCreated ? ((TableStyle)ControlStyle).CellSpacing : -1);\r
58                         }\r
59                         set\r
60                         {\r
61                                 ((TableStyle)ControlStyle).CellSpacing = value;\r
62                         }\r
63                 }\r
64 \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 \r
82                 public virtual RepeatDirection RepeatDirection\r
83                 {\r
84                         get\r
85                         {\r
86                                 object o = ViewState["RepeatDirection"];\r
87                                 if(o!=null)\r
88                                         return (RepeatDirection)o;\r
89                                 return RepeatDirection.Vertical;\r
90                         }\r
91                         set\r
92                         {\r
93                                 if(!System.Enum.IsDefined(typeof(RepeatDirection),value))\r
94                                         throw new ArgumentException();\r
95                                 ViewState["RepeatDirection"] = value;\r
96                         }\r
97                 }\r
98 \r
99                 public virtual RepeatLayout RepeatLayout\r
100                 {\r
101                         get\r
102                         {\r
103                                 object o = ViewState["RepeatLayout"];\r
104                                 if(o!=null)\r
105                                         return (RepeatLayout)o;\r
106                                 return RepeatLayout.Table;\r
107                         }\r
108                         set\r
109                         {\r
110                                 if(!System.Enum.IsDefined(typeof(RepeatLayout), value))\r
111                                         throw new ArgumentException();\r
112                                 ViewState["RepeatLayout"] = value;\r
113                         }\r
114                 }\r
115 \r
116                 public virtual TextAlign TextAlign\r
117                 {\r
118                         get\r
119                         {\r
120                                 object o = ViewState["TextAlign"];\r
121                                 if(o!=null)\r
122                                         return (TextAlign)o;\r
123                                 return TextAlign.Right;\r
124                         }\r
125                         set\r
126                         {\r
127                                 if(!Enum.IsDefined(typeof(TextAlign), value))\r
128                                         throw new ArgumentException();\r
129                                 ViewState["TextAlign"] = value;\r
130                         }\r
131                 }\r
132 \r
133                 protected override Style CreateControlStyle()\r
134                 {\r
135                         return new TableStyle(ViewState);\r
136                 }\r
137 \r
138                 protected override Control FindControl(string id, int pathOffset)\r
139                 {\r
140                         return this;\r
141                 }\r
142 \r
143                 protected override void OnPreRender(EventArgs e)\r
144                 {\r
145                         checkBoxRepeater.AutoPostBack = AutoPostBack;\r
146                         if(Page!=null)\r
147                         {\r
148                                 for(int i=0; i < Items.Count; i++)\r
149                                 {\r
150                                         if(Items[i].Selected)\r
151                                         {\r
152                                                 checkBoxRepeater.ID = i.ToString(NumberFormatInfo.InvariantInfo);\r
153                                                 Page.RegisterRequiresPostBack(checkBoxRepeater);\r
154                                         }\r
155                                 }\r
156                         }\r
157                 }\r
158 \r
159                 protected override void Render(HtmlTextWriter writer)\r
160                 {\r
161                         RepeatInfo ri = new RepeatInfo();\r
162                         checkBoxRepeater.TabIndex = TabIndex;\r
163                         bool dirtyFlag = false;\r
164                         short  tTabIndex = TabIndex;\r
165                         Style s = (ControlStyleCreated ? ControlStyle : null);\r
166                         if(TabIndex > 0)\r
167                         {\r
168                                 if(!ViewState.IsItemDirty("TabIndex"))\r
169                                         dirtyFlag = true;\r
170                                 TabIndex = 0;\r
171                         }\r
172                         ri.RepeatColumns = RepeatColumns;\r
173                         ri.RepeatLayout  = RepeatLayout;\r
174                         ri.RepeatDirection = RepeatDirection;\r
175                         ri.RenderRepeater(writer, this, s, this);\r
176                         if(tTabIndex > 0)\r
177                         {\r
178                                 TabIndex = tTabIndex;\r
179                         }\r
180                         if(dirtyFlag)\r
181                         {\r
182                                 ViewState.SetItemDirty("TabIndex", false);\r
183                         }\r
184                 }\r
185 \r
186                 bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)\r
187                 {\r
188                         int index = Int32.Parse(postDataKey.Substring(UniqueID.Length + 1));\r
189                         if(index >= 0 && index < Items.Count)\r
190                         {\r
191                                 bool exists = (postCollection[postDataKey]!=null);\r
192                                 if(Items[index].Selected != exists)\r
193                                 {\r
194                                         Items[index].Selected = exists;\r
195                                         if(!isChangeNotified)\r
196                                         {\r
197                                                 isChangeNotified = true;\r
198                                                 return true;\r
199                                         }\r
200                                 }\r
201                         }\r
202                         return false;\r
203                 }\r
204 \r
205                 void IPostBackDataHandler.RaisePostDataChangedEvent()\r
206                 {\r
207                         OnSelectedIndexChanged(EventArgs.Empty);\r
208                 }\r
209 \r
210                 bool IRepeatInfoUser.HasFooter\r
211                 {\r
212                         get\r
213                         {\r
214                                 return false;\r
215                         }\r
216                 }\r
217 \r
218                 bool IRepeatInfoUser.HasHeader\r
219                 {\r
220                         get\r
221                         {\r
222                                 return false;\r
223                         }\r
224                 }\r
225 \r
226                 bool IRepeatInfoUser.HasSeparators\r
227                 {\r
228                         get\r
229                         {\r
230                                 return false;\r
231                         }\r
232                 }\r
233 \r
234                 int IRepeatInfoUser.RepeatedItemCount\r
235                 {\r
236                         get\r
237                         {\r
238                                 return Items.Count;\r
239                         }\r
240                 }\r
241 \r
242                 Style IRepeatInfoUser.GetItemStyle(ListItemType itemType, int repeatIndex)\r
243                 {\r
244                         return null;\r
245                 }\r
246 \r
247                 void IRepeatInfoUser.RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)\r
248                 {\r
249                         checkBoxRepeater.ID = repeatIndex.ToString(NumberFormatInfo.InvariantInfo);\r
250                         checkBoxRepeater.Text = Items[repeatIndex].Text;\r
251                         checkBoxRepeater.TextAlign = TextAlign;\r
252                         checkBoxRepeater.Checked = Items[repeatIndex].Selected;\r
253                         checkBoxRepeater.RenderControl(writer);\r
254                 }\r
255         }\r
256 }\r