Merge pull request #249 from pcc/xgetinputfocus
[mono.git] / mcs / class / System.Web.Mvc3 / Mvc / ValueProviderFactoryCollection.cs
1 namespace System.Web.Mvc {
2     using System;
3     using System.Collections.Generic;
4     using System.Collections.ObjectModel;
5     using System.Linq;
6
7     public class ValueProviderFactoryCollection : Collection<ValueProviderFactory> {
8         private IResolver<IEnumerable<ValueProviderFactory>> _serviceResolver;
9
10         public ValueProviderFactoryCollection() {
11             _serviceResolver = new MultiServiceResolver<ValueProviderFactory>(() => Items);
12         }
13
14         public ValueProviderFactoryCollection(IList<ValueProviderFactory> list)
15             : base(list) {
16             _serviceResolver = new MultiServiceResolver<ValueProviderFactory>(() => Items);
17         }
18
19         internal ValueProviderFactoryCollection(IResolver<IEnumerable<ValueProviderFactory>> serviceResolver, params ValueProviderFactory[] valueProviderFactories)
20             : base(valueProviderFactories) {
21             _serviceResolver = serviceResolver ?? new MultiServiceResolver<ValueProviderFactory>(
22                    () => Items
23                    );
24         }
25
26         public IValueProvider GetValueProvider(ControllerContext controllerContext) {
27             var valueProviders = from factory in _serviceResolver.Current
28                                  let valueProvider = factory.GetValueProvider(controllerContext)
29                                  where valueProvider != null
30                                  select valueProvider;
31
32             return new ValueProviderCollection(valueProviders.ToList());
33         }
34
35
36         protected override void InsertItem(int index, ValueProviderFactory item) {
37             if (item == null) {
38                 throw new ArgumentNullException("item");
39             }
40             base.InsertItem(index, item);
41         }
42
43         protected override void SetItem(int index, ValueProviderFactory item) {
44             if (item == null) {
45                 throw new ArgumentNullException("item");
46             }
47             base.SetItem(index, item);
48         }
49
50     }
51 }