2004-06-09 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / ListBox.cs
1 //
2 // System.Web.UI.WebControls.ListBox.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 //\r
11 \r
12 using System;\r
13 using System.Drawing;\r
14 using System.Collections;\r
15 using System.Collections.Specialized;\r
16 using System.ComponentModel;\r
17 using System.Globalization;\r
18 using System.Web;\r
19 using System.Web.UI;\r
20 \r
21 namespace System.Web.UI.WebControls\r
22 {\r
23         [ValidationProperty("SelectedItem")]\r
24         public class ListBox : ListControl, IPostBackDataHandler\r
25         {\r
26                 public ListBox () : base ()\r
27                 {\r
28                 }\r
29
30                 [Browsable (false)]\r
31                 public override Color BorderColor\r
32                 {\r
33                         get { return base.BorderColor; }\r
34                         set { base.BorderColor = value; }\r
35                 }\r
36
37                 [Browsable (false)]\r
38                 public override BorderStyle BorderStyle\r
39                 {\r
40                         get { return base.BorderStyle; }\r
41                         set { base.BorderStyle = value; }\r
42                 }\r
43
44                 [Browsable (false)]\r
45                 public override Unit BorderWidth\r
46                 {\r
47                         get { return base.BorderWidth; }\r
48                         set { base.BorderWidth = value; }\r
49                 }\r
50
51
52                 [DefaultValue (4), Bindable (true), WebCategory ("Appearance")]
53                 [WebSysDescription ("The number of rows displayed by the control.")]\r
54                 public virtual int Rows\r
55                 {\r
56                         get {\r
57                                 object o = ViewState ["Rows"];\r
58                                 return (o == null) ? 4 : (int) o;\r
59                         }\r
60 \r
61                         set {\r
62                                 if (value < 1 || value > 2000)\r
63                                         throw new ArgumentOutOfRangeException ("value", "Rows value has to be >= 0 and <= 2000.");\r
64 \r
65                                 ViewState ["Rows"] = value;\r
66                         }\r
67                 }\r
68
69                 [DefaultValue (typeof (ListSelectionMode), "Single"), WebCategory ("Behavior")]
70                 [WebSysDescription ("The mode describing how the entries can be selected.")]\r
71                 public virtual ListSelectionMode SelectionMode\r
72                 {\r
73                         get\r
74                         {\r
75                                 object o = ViewState ["SelectionMode"];\r
76                                 return (o == null) ? ListSelectionMode.Single : (ListSelectionMode) o;\r
77                         }\r
78                         set\r
79                         {\r
80                                 if (!Enum.IsDefined (typeof (ListSelectionMode), value))\r
81                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
82                                 ViewState ["SelectionMode"] = value;\r
83                         }\r
84                 }\r
85
86                 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
87                 [Bindable (false), EditorBrowsable (EditorBrowsableState.Never)]\r
88                 public override string ToolTip\r
89                 {\r
90                         get { return String.Empty; }\r
91                         set { /* Don't do anything. */ }\r
92                 }\r
93 \r
94                 protected override void AddAttributesToRender (HtmlTextWriter writer)\r
95                 {\r
96                         if (Page != null)\r
97                                 Page.VerifyRenderingInServerForm (this);\r
98 \r
99                         writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);\r
100                         base.AddAttributesToRender (writer);\r
101                         writer.AddAttribute (HtmlTextWriterAttribute.Size,\r
102                                              Rows.ToString (NumberFormatInfo.InvariantInfo));\r
103 \r
104                         if (SelectionMode == ListSelectionMode.Multiple)\r
105                                 writer.AddAttribute (HtmlTextWriterAttribute.Multiple, "multiple");\r
106 \r
107                         if (AutoPostBack && Page != null){\r
108                                 writer.AddAttribute (HtmlTextWriterAttribute.Onchange,\r
109                                                      Page.GetPostBackClientEvent (this, ""));\r
110                                 writer.AddAttribute ("language", "javascript");\r
111                         }\r
112                 }\r
113 \r
114                 protected override void OnPreRender (EventArgs e)\r
115                 {\r
116                         base.OnPreRender (e);\r
117                         if (Page != null && SelectionMode == ListSelectionMode.Multiple && Enabled)\r
118                                 Page.RegisterRequiresPostBack(this);\r
119                 }\r
120 \r
121                 protected override void RenderContents (HtmlTextWriter writer)\r
122                 {\r
123                         bool isMultAllowed = (SelectionMode == ListSelectionMode.Multiple);\r
124                         bool selMade = false;\r
125                         foreach (ListItem current in Items){\r
126                                 writer.WriteBeginTag ("option");\r
127                                 if (current.Selected){\r
128                                         if (!isMultAllowed && selMade)\r
129                                                 throw new HttpException ("Cannot_MultiSelect_In_Single_Mode");\r
130                                         selMade = true;\r
131                                         writer.WriteAttribute ("selected", "selected");\r
132                                 }\r
133                                 writer.WriteAttribute ("value", current.Value, true);\r
134                                 writer.Write ('>');\r
135                                 writer.Write (HttpUtility.HtmlEncode (current.Text));\r
136                                 writer.WriteEndTag ("option");\r
137                                 writer.WriteLine ();\r
138                         }\r
139                 }\r
140 \r
141                 bool IPostBackDataHandler.LoadPostData (string postDataKey,\r
142                                                         NameValueCollection postCollection)\r
143                 {\r
144                         string[] vals = postCollection.GetValues (postDataKey);\r
145                         bool updated = false;\r
146                         if (vals != null){\r
147                                 if (SelectionMode == ListSelectionMode.Single){\r
148                                         int index = Items.FindByValueInternal (vals [0]);\r
149                                         if (SelectedIndex != index){\r
150                                                 SelectedIndex = index;\r
151                                                 updated       = true;\r
152                                         }\r
153                                 } else {\r
154                                         ArrayList indices = SelectedIndices;
155                                         int length = vals.Length;
156                                         ArrayList final = new ArrayList (length);
157                                         foreach (string current in vals)\r
158                                                 final.Add (Items.FindByValueInternal (current));\r
159
160                                         if (indices.Count == length) {
161                                                 for (int ctr = 0; ctr < length; ctr++){
162                                                         if (((int) final [ctr]) != ((int) indices [ctr])){
163                                                                 updated = true;\r
164                                                                 break;\r
165                                                         }\r
166                                                 }\r
167                                         } else {\r
168                                                 updated = true;\r
169                                         }\r
170                                         if (updated)
171                                                 Select (final);
172                                 }
173                         } else {\r
174                                 if (SelectedIndex != -1)\r
175                                         SelectedIndex = -1;\r
176                                 updated = true;\r
177                         }\r
178                         return updated;\r
179                 }\r
180 \r
181                 void IPostBackDataHandler.RaisePostDataChangedEvent ()\r
182                 {\r
183                         OnSelectedIndexChanged (EventArgs.Empty);\r
184                 }\r
185         }\r
186 }\r