merge -r 98047:98048
[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 #if NET_2_0
141                         if (ID != null)
142                                 writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
143 #else
144                         writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
145 #endif
146
147                         if (AutoPostBack) {
148 #if NET_2_0
149                                 string onchange = Page.ClientScript.GetPostBackEventReference (GetPostBackOptions (), true);
150                                 onchange = String.Concat ("setTimeout('", onchange.Replace ("\\", "\\\\").Replace ("'", "\\'"), "', 0)");
151                                 writer.AddAttribute (HtmlTextWriterAttribute.Onchange, BuildScriptAttribute ("onchange", onchange));
152 #else
153                                 writer.AddAttribute (HtmlTextWriterAttribute.Onchange,
154                                                      BuildScriptAttribute ("onchange",
155                                                                            Page.ClientScript.GetPostBackClientHyperlink (this, "")));
156 #endif
157                         }
158                         
159                         if (SelectionMode == ListSelectionMode.Multiple)
160                                 writer.AddAttribute (HtmlTextWriterAttribute.Multiple,
161                                                 "multiple", false);
162                         writer.AddAttribute (HtmlTextWriterAttribute.Size,
163                                         Rows.ToString (CultureInfo.InvariantCulture));
164                         
165                         base.AddAttributesToRender (writer);
166                 }
167
168 #if NET_2_0
169                 PostBackOptions GetPostBackOptions () {
170                         PostBackOptions options = new PostBackOptions (this);
171                         options.ActionUrl = null;
172                         options.ValidationGroup = null;
173                         options.Argument = "";
174                         options.RequiresJavaScriptProtocol = false;
175                         options.ClientSubmit = true;
176                         options.PerformValidation = CausesValidation && Page != null && Page.AreValidatorsUplevel (ValidationGroup);
177                         if (options.PerformValidation)
178                                 options.ValidationGroup = ValidationGroup;
179
180                         return options;
181                 }
182 #endif          
183
184 #if ONLY_1_1
185                 protected override void RenderContents (HtmlTextWriter writer)
186                 {
187                         foreach (ListItem item in Items) {
188                                 if (item.Selected) {
189                                         writer.AddAttribute (HtmlTextWriterAttribute.Selected, "selected", false);
190                                 }
191                                 writer.AddAttribute (HtmlTextWriterAttribute.Value, item.Value, true);
192                                 writer.RenderBeginTag (HtmlTextWriterTag.Option);
193                                 
194                                 string encoded = HttpUtility.HtmlEncode (item.Text);
195                                 writer.Write (encoded);
196                                 writer.RenderEndTag ();
197                                 writer.WriteLine ();
198                         }
199                 }
200 #endif
201
202 #if NET_2_0
203                 protected internal
204 #else           
205                 protected
206 #endif          
207                 override void OnPreRender (EventArgs e)
208                 {
209                         base.OnPreRender (e);
210                         if (Page != null && Enabled)
211                                 Page.RegisterRequiresPostBack (this);
212                 }
213
214 #if NET_2_0
215                 protected virtual
216 #endif
217                 bool LoadPostData (string postDataKey, NameValueCollection postCollection)
218                 {
219 #if NET_2_0
220                         EnsureDataBound ();
221 #endif
222                         string [] values = postCollection.GetValues (postDataKey);
223                         if (values == null || values.Length == 0) {
224                                 int prev_index = SelectedIndex;
225                                 SelectedIndex = -1;
226                                 return (prev_index != -1);
227                         }
228
229                         if (SelectionMode == ListSelectionMode.Single)
230                                 return SelectSingle (values);
231                         return SelectMultiple (values);
232                 }
233
234                 bool SelectSingle (string [] values)
235                 {
236                         string val = values [0];
237                         int idx = Items.IndexOf (val);
238                         int prev_index = SelectedIndex;
239                         if (idx != prev_index) {
240                                 // This will set both the index value and the item.Selected property
241                                 SelectedIndex = idx;
242                                 return true;
243                         }
244                         return false;
245                 }
246
247                 bool SelectMultiple (string [] values)
248                 {
249                         ArrayList prev_selected = GetSelectedIndicesInternal ();
250                         ClearSelection ();
251                         foreach (string val in values) {
252                                 ListItem item = Items.FindByValue (val);
253                                 if (item != null)
254                                         item.Selected = true;
255                         }
256
257                         ArrayList new_selection = GetSelectedIndicesInternal ();
258                         int i = prev_selected.Count;
259                         if (new_selection.Count != i)
260                                 return true;
261
262                         while (--i >= 0) {
263                                 if ((int) prev_selected [i] != (int) new_selection [i])
264                                         return true;
265                         }
266
267                         return false;
268                 }
269
270 #if NET_2_0
271                 protected virtual
272 #endif
273                 void RaisePostDataChangedEvent ()
274                 {
275 #if NET_2_0
276                         if (CausesValidation)
277                                 Page.Validate (ValidationGroup);
278 #endif
279                         OnSelectedIndexChanged (EventArgs.Empty);
280                 }
281                         
282                 bool IPostBackDataHandler.LoadPostData (string postDataKey,
283                                                         NameValueCollection postCollection)
284                 {
285                         return LoadPostData (postDataKey, postCollection);
286                 }
287
288                 void IPostBackDataHandler.RaisePostDataChangedEvent ()
289                 {
290                         RaisePostDataChangedEvent ();
291                 }
292 #if NET_2_0
293         protected internal override void VerifyMultiSelect()
294         {
295             //by default the ListControl will throw an exception in this method,
296             //therefor we should override the method if the class is supporting
297             //MultiSelect option.
298             if (this.SelectionMode != ListSelectionMode.Multiple)
299                 throw new HttpException("Multiple select option is not supported");
300         }
301 #endif
302         }
303 }
304
305
306