update RenderItem() so that each item in the RadioButtonList or the
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / RadioButtonList.cs
1 //
2 // System.Web.UI.WebControls.RadioButtonList.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         [ValidationProperty("SelectedItem")]\r
22         public class RadioButtonList : ListControl, IRepeatInfoUser, INamingContainer, IPostBackDataHandler\r
23         {\r
24                 private bool  selectionIndexChanged;\r
25                 private short  tabIndex;\r
26 \r
27                 public RadioButtonList(): base()\r
28                 {\r
29                         selectionIndexChanged = false;\r
30                 }\r
31
32                 [DefaultValue (-1), Bindable (true), WebCategory ("Layout")]
33                 [WebSysDescription ("The border left within a RadioButton.")]\r
34                 public virtual int CellPadding\r
35                 {\r
36                         get\r
37                         {\r
38                                 if(ControlStyleCreated)\r
39                                 {\r
40                                         return (int)(((TableStyle)ControlStyle).CellPadding);\r
41                                 }\r
42                                 return -1;\r
43                         }\r
44                         set {
45                                 if (value < -1)
46                                         throw new ArgumentOutOfRangeException ("value", "CellPadding value has to be -1 for 'not set' or > -1.");\r
47                                 ((TableStyle)ControlStyle).CellPadding = value;\r
48                         }\r
49                 }\r
50
51                 [DefaultValue (-1), Bindable (true), WebCategory ("Layout")]
52                 [WebSysDescription ("The border left between RadioButtons.")]\r
53                 public virtual int CellSpacing\r
54                 {\r
55                         get\r
56                         {\r
57                                 if(ControlStyleCreated)\r
58                                 {\r
59                                         return (int)(((TableStyle)ControlStyle).CellSpacing);\r
60                                 }\r
61                                 return -1;\r
62                         }\r
63                         set {
64                                 if (value < -1)
65                                         throw new ArgumentOutOfRangeException ("value", "CellSpacing value has to be -1 for 'not set' or > -1.");\r
66                                 ((TableStyle)ControlStyle).CellSpacing = value;\r
67                         }\r
68                 }\r
69
70                 [DefaultValue (0), Bindable (true), WebCategory ("Layout")]
71                 [WebSysDescription ("The number of columns that should be used to display the RadioButtons.")]\r
72                 public virtual int RepeatColumns\r
73                 {\r
74                         get\r
75                         {\r
76                                 object o = ViewState["RepeatColumns"];\r
77                                 if(o != null)\r
78                                         return (int)o;\r
79                                 return 0;\r
80                         }\r
81                         set {\r
82                                 if (value < 0)\r
83                                         throw new ArgumentOutOfRangeException ("value", "RepeatColumns value has to be 0 for 'not set' or > 0.");\r
84                                 ViewState["RepeatColumns"] = value;\r
85                         }\r
86                 }\r
87
88                 [DefaultValue (typeof (RepeatDirection), "Vertical"), Bindable (true), WebCategory ("Layout")]
89                 [WebSysDescription ("The direction that is followed when doing the layout.")]\r
90                 public virtual RepeatDirection RepeatDirection\r
91                 {\r
92                         get\r
93                         {\r
94                                 object o = ViewState["RepeatDirection"];\r
95                                 if(o != null)\r
96                                         return (RepeatDirection)o;\r
97                                 return RepeatDirection.Vertical;\r
98                         }\r
99                         set\r
100                         {\r
101                                 if(!Enum.IsDefined(typeof(RepeatDirection), value))\r
102                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
103                                 ViewState["RepeatDirection"] = value;\r
104                         }\r
105                 }\r
106
107                 [DefaultValue (typeof (RepeatLayout), "Table"), Bindable (true), WebCategory ("Layout")]
108                 [WebSysDescription ("The method used to create the layout.")]\r
109                 public virtual RepeatLayout RepeatLayout\r
110                 {\r
111                         get\r
112                         {\r
113                                 object o = ViewState["RepeatLayout"];\r
114                                 if(o != null)\r
115                                         return (RepeatLayout)o;\r
116                                 return RepeatLayout.Table;\r
117                         }\r
118                         set\r
119                         {\r
120                                 if(!Enum.IsDefined(typeof(RepeatLayout), value))\r
121                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
122                                 ViewState["RepeatLayout"] = value;\r
123                         }\r
124                 }\r
125
126                 [DefaultValue (typeof (TextAlign), "Right"), Bindable (true), WebCategory ("Appearance")]
127                 [WebSysDescription ("The alignment of the RadioButton text.")]\r
128                 public virtual TextAlign TextAlign\r
129                 {\r
130                         get\r
131                         {\r
132                                 object o = ViewState["TextAlign"];\r
133                                 if(o != null)\r
134                                         return (TextAlign)o;\r
135                                 return TextAlign.Right;\r
136                         }\r
137                         set\r
138                         {\r
139                                 if(!Enum.IsDefined(typeof(TextAlign), value))\r
140                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
141                                 ViewState["TextAlign"] = value;\r
142                         }\r
143                 }\r
144 \r
145                 protected override Style CreateControlStyle()\r
146                 {\r
147                         return new TableStyle(ViewState);\r
148                 }\r
149 \r
150                 protected override void Render(HtmlTextWriter writer)\r
151                 {\r
152                         RepeatInfo info = new RepeatInfo();\r
153                         Style cStyle = (ControlStyleCreated ? ControlStyle : null);\r
154                         bool dirty = false;\r
155                         tabIndex = TabIndex;\r
156                         if(tabIndex != 0)\r
157                         {\r
158                                 dirty = !ViewState.IsItemDirty("TabIndex");\r
159                                 TabIndex = 0;\r
160                         }\r
161                         info.RepeatColumns = RepeatColumns;\r
162                         info.RepeatDirection = RepeatDirection;\r
163                         info.RenderRepeater(writer, this, cStyle, this);\r
164                         if(tabIndex != 0)\r
165                         {\r
166                                 TabIndex = tabIndex;\r
167                         }\r
168                         if(dirty)\r
169                         {\r
170                                 ViewState.SetItemDirty("TabIndex", false);\r
171                         }\r
172                 }\r
173
174                 bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
175                 {
176                         string value = postCollection [postDataKey];
177                         int c = Items.Count;
178                         for (int i = 0; i < c; i++) {
179                                 if (Items [i].Value != value)
180                                         continue;
181
182                                 if (i != SelectedIndex) {
183                                         SelectedIndex = i;
184                                         selectionIndexChanged = true;
185                                 }
186
187                                 return true;
188                         }
189
190                         return false;
191                 }
192
193                 void IPostBackDataHandler.RaisePostDataChangedEvent()\r
194                 {\r
195                         if(selectionIndexChanged)\r
196                                 OnSelectedIndexChanged(EventArgs.Empty);\r
197                 }\r
198 \r
199                 Style IRepeatInfoUser.GetItemStyle(System.Web.UI.WebControls.ListItemType itemType, int repeatIndex)\r
200                 {\r
201                         return null;\r
202                 }\r
203 \r
204                 void IRepeatInfoUser.RenderItem (System.Web.UI.WebControls.ListItemType itemType,\r
205                                                  int repeatIndex,\r
206                                                  RepeatInfo repeatInfo,\r
207                                                  HtmlTextWriter writer)\r
208                 {\r
209                         /* Create a new RadioButton as if it was defined in the page and render it */\r
210                         RadioButton button = new RadioButton ();\r
211                         button.Page = Page;
212                         button.GroupName = UniqueID;\r
213                         button.TextAlign = TextAlign;\r
214                         button.AutoPostBack = AutoPostBack;\r
215                         button.ID = ClientID + "_" + repeatIndex.ToString (NumberFormatInfo.InvariantInfo);;\r
216                         button.TabIndex = tabIndex;
217                         ListItem current = Items [repeatIndex];\r
218                         button.Text = current.Text;\r
219                         button.Attributes ["value"] = current.Value;\r
220                         button.Checked = current.Selected;\r
221                         button.Enabled = Enabled;\r
222                         button.RenderControl (writer);\r
223                 }\r
224 \r
225                 bool IRepeatInfoUser.HasFooter\r
226                 {\r
227                         get\r
228                         {\r
229                                 return false;\r
230                         }\r
231                 }\r
232 \r
233                 bool IRepeatInfoUser.HasHeader\r
234                 {\r
235                         get\r
236                         {\r
237                                 return false;\r
238                         }\r
239                 }\r
240 \r
241                 bool IRepeatInfoUser.HasSeparators\r
242                 {\r
243                         get\r
244                         {\r
245                                 return false;\r
246                         }\r
247                 }\r
248 \r
249                 int IRepeatInfoUser.RepeatedItemCount\r
250                 {\r
251                         get\r
252                         {\r
253                                 return Items.Count;\r
254                         }\r
255                 }\r
256         }\r
257 }\r