fixed tests
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / ListBox.cs
1 //
2 // System.Web.UI.WebControls.Literal.cs
3 //
4 // Authors:
5 //      Jackson Harper (jackson@ximian.com)
6 //
7 // (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System.Collections;
30 using System.ComponentModel;
31 using System.Drawing;
32 using System.Globalization;
33 using System.Collections.Specialized;
34 using System.Security.Permissions;
35
36 namespace System.Web.UI.WebControls {
37
38         // CAS
39         [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
40         [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
41         // attributes
42         [ValidationProperty("SelectedItem")]
43 #if NET_2_0
44         [SupportsEventValidation]
45 #endif
46         public class ListBox : ListControl, IPostBackDataHandler {
47
48                 public ListBox ()
49                 {
50                 }
51
52                 [Browsable(false)]
53 #if NET_2_0 && HAVE_CONTROL_ADAPTERS
54                 public virtual new
55 #else           
56                 public override
57 #endif
58                 Color BorderColor {
59                         get { return base.BorderColor; }
60                         set { base.BorderColor = value; }
61                 }
62
63                 [Browsable(false)]
64 #if NET_2_0 && HAVE_CONTROL_ADAPTERS
65                 public virtual new
66 #else           
67                 public override
68 #endif
69                 BorderStyle BorderStyle {
70                         get { return base.BorderStyle; }
71                         set { base.BorderStyle = value; }
72                 }
73
74                 [Browsable(false)]
75 #if NET_2_0 && HAVE_CONTROL_ADAPTERS
76                 public virtual new
77 #else           
78                 public override
79 #endif
80                 Unit BorderWidth {
81                         get { return base.BorderWidth; }
82                         set { base.BorderWidth = value; }
83                 }
84
85 #if ONLY_1_1
86                 [Bindable(true)]
87 #endif          
88                 [DefaultValue(4)]
89                 [WebSysDescription ("")]
90                 [WebCategory ("Appearance")]
91                 public virtual int Rows {
92                         get {
93                                 return ViewState.GetInt ("Rows", 4);
94                         }
95                         set {
96                                 if (value < 1 || value > 2000)
97                                         throw new ArgumentOutOfRangeException ("value");
98                                 ViewState ["Rows"] = value;
99                         }
100                 }
101
102                 [DefaultValue(ListSelectionMode.Single)]
103                 [WebSysDescription ("")]
104                 [WebCategory ("Behavior")]
105                 public virtual ListSelectionMode SelectionMode {
106                         get {
107                                 return (ListSelectionMode) ViewState.GetInt ("SelectionMode",
108                                                 (int) ListSelectionMode.Single);
109                         }
110                         set {
111                                 if (!Enum.IsDefined (typeof (ListSelectionMode), value))
112                                         throw new ArgumentOutOfRangeException ("value");
113                                 ViewState ["SelectionMode"] = value;
114                         }
115                 }
116
117 #if ONLY_1_1
118                 [Bindable(false)]
119                 [Browsable(false)]
120                 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
121                 [EditorBrowsable(EditorBrowsableState.Never)]
122                 public override string ToolTip {
123                         get { return String.Empty; }
124                         set { /* Tooltip is always String.Empty */ }
125                 }
126 #endif          
127
128 #if NET_2_0
129                 public virtual int[] GetSelectedIndices ()
130                 {
131                         return (int []) GetSelectedIndicesInternal ().ToArray (typeof (int));
132                 }
133 #endif          
134                 
135                 protected override void AddAttributesToRender (HtmlTextWriter writer)
136                 {
137                         if (Page != null)
138                                 Page.VerifyRenderingInServerForm (this);
139
140                         base.AddAttributesToRender (writer);
141 #if NET_2_0
142                         if (ID != null)
143                                 writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
144 #else
145                         writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
146 #endif
147
148                         if (AutoPostBack)
149 #if NET_2_0
150                                 writer.AddAttribute (HtmlTextWriterAttribute.Onchange, Page.ClientScript.GetPostBackEventReference (GetPostBackOptions (), true));
151 #else
152                                 writer.AddAttribute (HtmlTextWriterAttribute.Onchange,
153                                                 Page.ClientScript.GetPostBackClientHyperlink (this, ""));
154 #endif
155
156                         if (SelectionMode == ListSelectionMode.Multiple)
157                                 writer.AddAttribute (HtmlTextWriterAttribute.Multiple,
158                                                 "multiple");
159                         writer.AddAttribute (HtmlTextWriterAttribute.Size,
160                                         Rows.ToString (CultureInfo.InvariantCulture));
161                 }
162
163 #if NET_2_0
164                 PostBackOptions GetPostBackOptions () {
165                         PostBackOptions options = new PostBackOptions (this);
166                         options.ActionUrl = null;
167                         options.ValidationGroup = null;
168                         options.Argument = "";
169                         options.RequiresJavaScriptProtocol = false;
170                         options.ClientSubmit = true;
171                         options.PerformValidation = CausesValidation && Page != null && Page.AreValidatorsUplevel (ValidationGroup);
172                         if (options.PerformValidation)
173                                 options.ValidationGroup = ValidationGroup;
174
175                         return options;
176                 }
177 #endif          
178
179 #if !NET_2_0
180                 protected override void RenderContents (HtmlTextWriter writer)
181                 {
182                         foreach (ListItem item in Items) {
183                                 writer.WriteBeginTag ("option");
184                                 if (item.Selected) {
185                                         writer.WriteAttribute ("selected", "selected", false);
186                                 }
187                                 writer.WriteAttribute ("value", item.Value, true);
188
189                                 writer.Write (">");
190                                 string encoded = HttpUtility.HtmlEncode (item.Text);
191                                 writer.Write (encoded);
192                                 writer.WriteEndTag ("option");
193                                 writer.WriteLine ();
194                         }
195                 }
196 #endif
197
198 #if NET_2_0
199                 protected internal
200 #else           
201                 protected
202 #endif          
203                 override void OnPreRender (EventArgs e)
204                 {
205                         base.OnPreRender (e);
206                         if (Page != null && Enabled)
207                                 Page.RegisterRequiresPostBack (this);
208                 }
209
210 #if NET_2_0
211                 protected virtual
212 #endif
213                 bool LoadPostData (string postDataKey, NameValueCollection postCollection)
214                 {
215 #if NET_2_0
216                         EnsureDataBound ();
217 #endif
218                         string [] values = postCollection.GetValues (postDataKey);
219                         if (values == null || values.Length == 0) {
220                                 int prev_index = SelectedIndex;
221                                 SelectedIndex = -1;
222                                 return (prev_index != -1);
223                         }
224
225                         if (SelectionMode == ListSelectionMode.Single)
226                                 return SelectSingle (values);
227                         return SelectMultiple (values);
228                 }
229
230                 bool SelectSingle (string [] values)
231                 {
232                         string val = values [0];
233                         int idx = Items.IndexOf (val);
234                         int prev_index = SelectedIndex;
235                         if (idx != prev_index) {
236                                 // This will set both the index value and the item.Selected property
237                                 SelectedIndex = idx;
238                                 return true;
239                         }
240                         return false;
241                 }
242
243                 bool SelectMultiple (string [] values)
244                 {
245                         ArrayList prev_selected = GetSelectedIndicesInternal ();
246                         ClearSelection ();
247                         foreach (string val in values) {
248                                 ListItem item = Items.FindByValue (val);
249                                 if (item != null)
250                                         item.Selected = true;
251                         }
252
253                         ArrayList new_selection = GetSelectedIndicesInternal ();
254                         int i = prev_selected.Count;
255                         if (new_selection.Count != i)
256                                 return true;
257
258                         while (--i >= 0) {
259                                 if ((int) prev_selected [i] != (int) new_selection [i])
260                                         return true;
261                         }
262
263                         return false;
264                 }
265
266 #if NET_2_0
267                 protected virtual
268 #endif
269                 void RaisePostDataChangedEvent ()
270                 {
271 #if NET_2_0
272                         if (CausesValidation)
273                                 Page.Validate (ValidationGroup);
274 #endif
275                         OnSelectedIndexChanged (EventArgs.Empty);
276                 }
277                         
278                 bool IPostBackDataHandler.LoadPostData (string postDataKey,
279                                                         NameValueCollection postCollection)
280                 {
281                         return LoadPostData (postDataKey, postCollection);
282                 }
283
284                 void IPostBackDataHandler.RaisePostDataChangedEvent ()
285                 {
286                         RaisePostDataChangedEvent ();
287                 }
288 #if NET_2_0
289         protected internal override void VerifyMultiSelect()
290         {
291             //by default the ListControl will throw an exception in this method,
292             //therefor we should override the method if the class is supporting
293             //MultiSelect option.
294             if (this.SelectionMode != ListSelectionMode.Multiple)
295                 throw new HttpException("Multiple select option is not supported");
296         }
297 #endif
298         }
299 }
300
301
302