Implement MachineKey.Protect and MachineKey.Unprotect
[mono.git] / mcs / class / System.Web.Mvc / 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         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]\r
71         public virtual IEnumerator<SelectListItem> GetEnumerator() {\r
72             return GetListItems().GetEnumerator();\r
73         }\r
74 \r
75         [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate",\r
76             Justification = "Operation performs conversions and returns a unique instance on each call.")]\r
77         internal IList<SelectListItem> GetListItems() {\r
78             return (!String.IsNullOrEmpty(DataValueField)) ?\r
79                 GetListItemsWithValueField() :\r
80                 GetListItemsWithoutValueField();\r
81         }\r
82 \r
83         private IList<SelectListItem> GetListItemsWithValueField() {\r
84             HashSet<string> selectedValues = new HashSet<string>(StringComparer.OrdinalIgnoreCase);\r
85             if (SelectedValues != null) {\r
86                 selectedValues.UnionWith(from object value in SelectedValues select Convert.ToString(value, CultureInfo.CurrentCulture));\r
87             }\r
88 \r
89             var listItems = from object item in Items\r
90                             let value = Eval(item, DataValueField)\r
91                             select new SelectListItem {\r
92                                 Value = value,\r
93                                 Text = Eval(item, DataTextField),\r
94                                 Selected = selectedValues.Contains(value)\r
95                             };\r
96             return listItems.ToList();\r
97         }\r
98 \r
99         private IList<SelectListItem> GetListItemsWithoutValueField() {\r
100             HashSet<object> selectedValues = new HashSet<object>();\r
101             if (SelectedValues != null) {\r
102                 selectedValues.UnionWith(SelectedValues.Cast<object>());\r
103             }\r
104 \r
105             var listItems = from object item in Items\r
106                             select new SelectListItem {\r
107                                 Text = Eval(item, DataTextField),\r
108                                 Selected = selectedValues.Contains(item)\r
109                             };\r
110             return listItems.ToList();\r
111         }\r
112 \r
113         private static string Eval(object container, string expression) {\r
114             object value = container;\r
115             if (!String.IsNullOrEmpty(expression)) {\r
116                 value = DataBinder.Eval(container, expression);\r
117             }\r
118             return Convert.ToString(value, CultureInfo.CurrentCulture);\r
119         }\r
120 \r
121         #region IEnumerable Members\r
122         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]\r
123         IEnumerator IEnumerable.GetEnumerator() {\r
124             return GetEnumerator();\r
125         }\r
126         #endregion\r
127     }\r
128 }\r