New tests.
[mono.git] / mcs / class / System.Web.Mvc2 / System.Web.Mvc / MultiSelectList.cs
1 /* ****************************************************************************\r
2  *\r
3  * Copyright (c) Microsoft Corporation. All rights reserved.\r
4  *\r
5  * This software is subject to the Microsoft Public License (Ms-PL). \r
6  * A copy of the license can be found in the license.htm file included \r
7  * in this distribution.\r
8  *\r
9  * You must not remove this notice, or any other, from this software.\r
10  *\r
11  * ***************************************************************************/\r
12 \r
13 namespace System.Web.Mvc {\r
14     using System;\r
15     using System.Collections;\r
16     using System.Collections.Generic;\r
17     using System.Diagnostics.CodeAnalysis;\r
18     using System.Globalization;\r
19     using System.Linq;\r
20     using System.Web.UI;\r
21 \r
22     [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]\r
23     [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Multi",\r
24         Justification = "Common shorthand for 'multiple'.")]\r
25     public class MultiSelectList : IEnumerable<SelectListItem> {\r
26 \r
27         public MultiSelectList(IEnumerable items)\r
28             : this(items, null /* selectedValues */) {\r
29         }\r
30 \r
31         public MultiSelectList(IEnumerable items, IEnumerable selectedValues)\r
32             : this(items, null /* dataValuefield */, null /* dataTextField */, selectedValues) {\r
33         }\r
34 \r
35         public MultiSelectList(IEnumerable items, string dataValueField, string dataTextField)\r
36             : this(items, dataValueField, dataTextField, null /* selectedValues */) {\r
37         }\r
38 \r
39         public MultiSelectList(IEnumerable items, string dataValueField, string dataTextField, IEnumerable selectedValues) {\r
40             if (items == null) {\r
41                 throw new ArgumentNullException("items");\r
42             }\r
43 \r
44             Items = items;\r
45             DataValueField = dataValueField;\r
46             DataTextField = dataTextField;\r
47             SelectedValues = selectedValues;\r
48         }\r
49 \r
50         public string DataTextField {\r
51             get;\r
52             private set;\r
53         }\r
54 \r
55         public string DataValueField {\r
56             get;\r
57             private set;\r
58         }\r
59 \r
60         public IEnumerable Items {\r
61             get;\r
62             private set;\r
63         }\r
64 \r
65         public IEnumerable SelectedValues {\r
66             get;\r
67             private set;\r
68         }\r
69 \r
70         public virtual IEnumerator<SelectListItem> GetEnumerator() {\r
71             return GetListItems().GetEnumerator();\r
72         }\r
73 \r
74         [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate",\r
75             Justification = "Operation performs conversions and returns a unique instance on each call.")]\r
76         internal IList<SelectListItem> GetListItems() {\r
77             return (!String.IsNullOrEmpty(DataValueField)) ?\r
78                 GetListItemsWithValueField() :\r
79                 GetListItemsWithoutValueField();\r
80         }\r
81 \r
82         private IList<SelectListItem> GetListItemsWithValueField() {\r
83             HashSet<string> selectedValues = new HashSet<string>(StringComparer.OrdinalIgnoreCase);\r
84             if (SelectedValues != null) {\r
85                 selectedValues.UnionWith(from object value in SelectedValues select Convert.ToString(value, CultureInfo.CurrentCulture));\r
86             }\r
87 \r
88             var listItems = from object item in Items\r
89                             let value = Eval(item, DataValueField)\r
90                             select new SelectListItem {\r
91                                 Value = value,\r
92                                 Text = Eval(item, DataTextField),\r
93                                 Selected = selectedValues.Contains(value)\r
94                             };\r
95             return listItems.ToList();\r
96         }\r
97 \r
98         private IList<SelectListItem> GetListItemsWithoutValueField() {\r
99             HashSet<object> selectedValues = new HashSet<object>();\r
100             if (SelectedValues != null) {\r
101                 selectedValues.UnionWith(SelectedValues.Cast<object>());\r
102             }\r
103 \r
104             var listItems = from object item in Items\r
105                             select new SelectListItem {\r
106                                 Text = Eval(item, DataTextField),\r
107                                 Selected = selectedValues.Contains(item)\r
108                             };\r
109             return listItems.ToList();\r
110         }\r
111 \r
112         private static string Eval(object container, string expression) {\r
113             object value = container;\r
114             if (!String.IsNullOrEmpty(expression)) {\r
115                 value = DataBinder.Eval(container, expression);\r
116             }\r
117             return Convert.ToString(value, CultureInfo.CurrentCulture);\r
118         }\r
119 \r
120         #region IEnumerable Members\r
121         IEnumerator IEnumerable.GetEnumerator() {\r
122             return GetEnumerator();\r
123         }\r
124         #endregion\r
125     }\r
126 }\r