using System.Collections.Generic; using System.Linq; using TINK.Model; namespace TINK.ViewModel.Map { /// Helper functionality. /// Former name: MapPageFilterFactory public static class GroupFilterMapPageHelper { /// Verifies that filters available are always consistent with filter configuration from settings page/ user group. /// Last filter from map page. Might have to be updated. /// Filter from settings page/ user group. public static IGroupFilterMapPage CreateUpdated( this IGroupFilterMapPage mapPageFilterDictionary, IEnumerable settingsAndUserFilter) { if (settingsAndUserFilter == null) { // All filters are null filters no update has to be performed. return mapPageFilterDictionary; } if (mapPageFilterDictionary == null || mapPageFilterDictionary.Count <= 0) { return new GroupFilterMapPage(); } // Filter dictionary by enumeration. var updatedMapPageFilterDictionary = new Dictionary(mapPageFilterDictionary).Where(x => settingsAndUserFilter.Contains(x.Key)).ToDictionary(x => x.Key, x => x.Value); // Get key of activated filter if there is still one. var activatedFilter = updatedMapPageFilterDictionary.FirstOrDefault(x => x.Value == FilterState.On).Key ?? string.Empty; // Add entries which have become available. var filterState = FilterState.On; // Set first filter added to on. var filtersToAdd = settingsAndUserFilter.Except(updatedMapPageFilterDictionary.Select(x => x.Key)); foreach (var l_oEntry in filtersToAdd) { updatedMapPageFilterDictionary.Add(l_oEntry, filterState); filterState = FilterState.Off; } if (updatedMapPageFilterDictionary.Count <= 0) { return new GroupFilterMapPage(updatedMapPageFilterDictionary); } // Ensure that there is at least one element on. if (updatedMapPageFilterDictionary.Where(x => x.Value == FilterState.On).Count() == 0) { // No element is active. Set one element active. updatedMapPageFilterDictionary[updatedMapPageFilterDictionary.ToArray()[0].Key] = FilterState.On; return new GroupFilterMapPage(updatedMapPageFilterDictionary); } // Ensure that there is only one selected element. if (updatedMapPageFilterDictionary.Where(x => x.Value == FilterState.On).Count() > 1) { // More than one element is active. Set element inactive. if (updatedMapPageFilterDictionary.ContainsKey(activatedFilter)) { // Turn filter off. updatedMapPageFilterDictionary[activatedFilter] = FilterState.Off; } return new GroupFilterMapPage(updatedMapPageFilterDictionary); } return new GroupFilterMapPage(updatedMapPageFilterDictionary); } } }