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