2001-12-01 Gaurav Vaish <gvaish@iitk.ac.in>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / ListControl.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     ListControl\r
4  *\r
5  * Author:  Gaurav Vaish\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
8  * Status:  100%\r
9  *\r
10  * (C) Gaurav Vaish (2001)\r
11  */\r
12 \r
13 using System;\r
14 using System.Collections;\r
15 using System.ComponentModel;\r
16 using System.Web;\r
17 using System.Web.UI;\r
18 using System.Web.Utils;\r
19 \r
20 namespace System.Web.UI.WebControls\r
21 {\r
22         public class ListControl: WebControl\r
23         {\r
24                 private static readonly object SelectedIndexChangedEvent = new object();\r
25 \r
26                 private object             dataSource;\r
27                 private ListItemCollection items;\r
28 \r
29                 private int cachedSelectedIndex = -1;\r
30                 \r
31                 public ListControl(): base(HtmlTextWriterTag.Select)\r
32                 {\r
33                 }\r
34                 \r
35                 public event EventHandler SelectedIndexChanged\r
36                 {\r
37                         add\r
38                         {\r
39                                 Events.AddHandler(SelectedIndexChangedEvent, value);\r
40                         }\r
41                         remove\r
42                         {\r
43                                 Events.RemoveHandler(SelectedIndexChangedEvent, value);\r
44                         }\r
45                 }\r
46                 \r
47                 public virtual bool AutoPostBack\r
48                 {\r
49                         get\r
50                         {\r
51                                 object o = ViewState["AutoPostBack"];\r
52                                 if(o!=null)\r
53                                         return (bool)o;\r
54                                 return false;\r
55                         }\r
56                         set\r
57                         {\r
58                                 ViewState["AutoPostBack"] = value;\r
59                         }\r
60                 }\r
61                 \r
62                 public virtual string DataMember\r
63                 {\r
64                         get\r
65                         {\r
66                                 object o = ViewState["DataMember"];\r
67                                 if(o!=null)\r
68                                         return (string)o;\r
69                                 return String.Empty;\r
70                         }\r
71                         set\r
72                         {\r
73                                 ViewState["DataMember"] = value;\r
74                         }\r
75                 }\r
76                 \r
77                 public virtual object DataSource\r
78                 {\r
79                         get\r
80                         {\r
81                                 return dataSource;\r
82                         }\r
83                         set\r
84                         {\r
85                                 if(value != null)\r
86                                 {\r
87                                         if(value is IListSource || value is IEnumerable)\r
88                                         {\r
89                                                 dataSource = value;\r
90                                                 return;\r
91                                         }\r
92                                 }\r
93                                 throw new ArgumentException(/*HttpRuntime.FormatResourceString(ID, "Invalid DataSource Type")*/);\r
94                         }\r
95                 }\r
96                 \r
97                 public virtual string DataTextField\r
98                 {\r
99                         get\r
100                         {\r
101                                 object o = ViewState["DataTextField"];\r
102                                 if(o!=null)\r
103                                         return (string)o;\r
104                                 return String.Empty;\r
105                         }\r
106                         set\r
107                         {\r
108                                 ViewState["DataTextField"] = value;\r
109                         }\r
110                 }\r
111                 \r
112                 public virtual string DataTextFormatString\r
113                 {\r
114                         get\r
115                         {\r
116                                 object o = ViewState["DataTextFormatString"];\r
117                                 if(o!=null)\r
118                                         return (string)o;\r
119                                 return String.Empty;\r
120                         }\r
121                         set\r
122                         {\r
123                                 ViewState["DataTextFormatString"] = value;\r
124                         }\r
125                 }\r
126                 \r
127                 public virtual string DataValueField\r
128                 {\r
129                         get\r
130                         {\r
131                                 object o = ViewState["DataValueField"];\r
132                                 if(o!=null)\r
133                                         return (string)o;\r
134                                 return String.Empty;\r
135                         }\r
136                         set\r
137                         {\r
138                                 ViewState["DataValueField"] = value;\r
139                         }\r
140                 }\r
141                 \r
142                 public virtual ListItemCollection Items\r
143                 {\r
144                         get\r
145                         {\r
146                                 if(items==null)\r
147                                 {\r
148                                         items = new ListItemCollection();\r
149                                         if(IsTrackingViewState)\r
150                                         {\r
151                                                 //items.TrackViewState();\r
152                                         }\r
153                                 }\r
154                                 return items;\r
155                         }\r
156                 }\r
157                 \r
158                 public virtual int SelectedIndex\r
159                 {\r
160                         get\r
161                         {\r
162                                 object o = ViewState["SelectedIndex"];\r
163                                 if(o!=null)\r
164                                         return (int)o;\r
165                                 return -1;\r
166                         }\r
167                         set\r
168                         {\r
169                                 if(value < -1 || value > Items.Count)\r
170                                         throw new ArgumentOutOfRangeException();\r
171                                 ViewState["SelectedIndex"] = value;\r
172                         }\r
173                 }\r
174                 \r
175                 public virtual ListItem SelectedItem\r
176                 {\r
177                         get\r
178                         {\r
179                                 if(SelectedIndex > 0)\r
180                                 {\r
181                                         return Items[SelectedIndex];\r
182                                 }\r
183                                 return null;\r
184                         }\r
185                 }\r
186 \r
187                 internal virtual ArrayList SelectedIndices\r
188                 {\r
189                         get\r
190                         {\r
191                                 ArrayList si = new ArrayList();\r
192                                 for(int i=0; i < Items.Count; i++)\r
193                                 {\r
194                                         if(Items[i].Selected)\r
195                                                 ArrayList.Add(i);\r
196                                 }\r
197                                 return si;\r
198                         }\r
199                 }\r
200                 \r
201                 internal void Select(ArrayList indices)\r
202                 {\r
203                         ClearSelection();\r
204                         foreach(int index in indices)\r
205                         {\r
206                                 if(index >= 0 && index < Items.Count)\r
207                                         Items[index].Selected = true;\r
208                         }\r
209                 }\r
210 \r
211                 public virtual void ClearSelection()\r
212                 {\r
213                         for(int i=0; i < Items.Count; i++)\r
214                         {\r
215                                 Items[i].Selected = false;\r
216                         }\r
217                 }\r
218                 \r
219                 protected override void LoadViewState(object savedState)\r
220                 {\r
221                         //Order: BaseClass, Items (Collection), Indices\r
222                         if(savedState != null && savedState is Triplet)\r
223                         {\r
224                                 Triplet state = (Triplet)savedState;\r
225                                 base.LoadViewState(state.First);\r
226                                 Items.LoadViewState(state.Second);\r
227                                 object indices = state.Third;\r
228                                 if(indices != null)\r
229                                 {\r
230                                         Select((ArrayList)indices);\r
231                                 }\r
232                         }\r
233                 }\r
234                 \r
235                 protected override void OnDataBinding(EventArgs e)\r
236                 {\r
237                         base.OnDataBinding(e);\r
238                         IEnumerable resolvedData = DataSourceHelper.GetResolvedDataSource(DataSource, DataMember);\r
239                         if(resolvedData != null)\r
240                         {\r
241                                 string dataTextField = DataTextField;\r
242                                 string dataValueField = DataValueField;\r
243                                 Items.Clear();\r
244                                 ICollection rdsCollection = resolvedDataSource as ICollection;\r
245                                 if(rdsCollection != null)\r
246                                 {\r
247                                         Items.Capacity = rdsCollection.Count;\r
248                                 }\r
249                                 bool valid = ( (dataTextField.Length >= 0) && (dataValueField.Length >=0) );\r
250                                 foreach(IEnumerable current in resolvedDataSource.GetEnumerator())\r
251                                 {\r
252                                         ListItem li = new ListItem();\r
253                                         if(valid)\r
254                                         {\r
255                                                 if(dataTextField.Length >= 0)\r
256                                                 {\r
257                                                         li.Text = DataBinder.GetPropertyValue(current, dataTextField, null);\r
258                                                 }\r
259                                                 if(dataValueField.Length >= 0)\r
260                                                 {\r
261                                                         li.Value = DataBinder.GetPropertyValue(current, dataValueField, null);\r
262                                                 }\r
263                                         } else\r
264                                         {\r
265                                                 li.Text  = dataTextField.ToString();\r
266                                                 li.Value = dataValueField.ToString();\r
267                                         }\r
268                                         Items.Add(li);\r
269                                 }\r
270                         }\r
271                         if(cachedSelectedIndex != -1)\r
272                         {\r
273                                 SelectedIndex = cachedSelectedIndex;\r
274                                 cachedSelectedIndex = -1;\r
275                         }\r
276                 }\r
277                 \r
278                 protected virtual void OnSelectedIndexChanged(EventArgs e)\r
279                 {\r
280                         if(Events!=null)\r
281                                 {\r
282                                         EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);\r
283                                         if(eh!=null)\r
284                                                 eh(this, e);\r
285                                 }\r
286                 }\r
287                 \r
288                 protected override object SaveViewState()\r
289                 {\r
290                         //Order: BaseClass, Items (Collection), Indices\r
291                         object vs = base.SaveViewState();\r
292                         object itemSvs = Items.SaveViewState();\r
293                         object indices = null;\r
294                         if(SaveSelectedIndicesViewState)\r
295                                 indices = SelectedIndices;\r
296                         if(vs!= null && itemSvs != null && indices != null)\r
297                         {\r
298                                 return new Triplet(vs, itemSvs, indices);\r
299                         }\r
300                         return null;\r
301                 }\r
302                 \r
303                 protected ovrride void TrackViewState()\r
304                 {\r
305                         base.TrackViewState();\r
306                         Items.TrackViewState();\r
307                 }\r
308                 \r
309                 private bool SaveSelectedIndicesViewState\r
310                 {\r
311                         get\r
312                         {\r
313                                 if( Events[SelectedIndexChangedEvent] != null && Enabled && Visible)\r
314                                 {\r
315                                         Type t = GetType();\r
316                                         // If I am a derivative, let it take of storing the selected indices.\r
317                                         // Why should I bother.\r
318                                         if(t == typeof(DropDownList) || t == typeof(ListBox) || t == typeof(CheckBoxList) || t == typeof(RadioButtonList))\r
319                                                 return false;\r
320                                 }\r
321                                 return true;\r
322                         }\r
323                 }\r
324         }\r
325 }\r