private bool PassFilter(Predicate <object> filter) { if (SubItems.Count > 0) { return(SubItems.OfType <ItemViewModel>().Any(i => i.PassFilter(filter)) || filter.Invoke(this)); } else { return(filter.Invoke(this)); } }
private void InsertSecureItem(SecureItemViewModel item) { if (item == null) { throw new ArgumentException("Folder's sub-item can't be null"); } if (item is SecureItemWithPasswordViewModel || item is SSHKeySecureItemViewModel) { var passwordCategory = SubItems.OfType <FolderCategoryViewModel>().FirstOrDefault(c => c.Type == FolderCategoryType.Password); if (passwordCategory == null) { passwordCategory = new FolderCategoryViewModel(FolderCategoryType.Password); SubItems.Add(passwordCategory); } passwordCategory.AddItemToCategory(item); } else if (item is BankAccountItemViewModel || item is CreditCardItemViewModel) { var dwCategory = SubItems.OfType <FolderCategoryViewModel>().FirstOrDefault(c => c.Type == FolderCategoryType.DigitalWallet); if (dwCategory == null) { dwCategory = new FolderCategoryViewModel(FolderCategoryType.DigitalWallet); SubItems.Add(dwCategory); } dwCategory.AddItemToCategory(item); } else if (item is SecureItemWithCountryViewModel || item is CompanySecureItemViewModel || item is EmailSecureItemViewModel || item is NameSecureItemViewModel) { var personalInfoCategory = SubItems.OfType <FolderCategoryViewModel>().FirstOrDefault(c => c.Type == FolderCategoryType.PersonalInfo); if (personalInfoCategory == null) { personalInfoCategory = new FolderCategoryViewModel(FolderCategoryType.PersonalInfo); SubItems.Add(personalInfoCategory); } personalInfoCategory.AddItemToCategory(item); } else { throw new ArgumentException("Unknown item type"); } SubItems.Sort(Comparison); RaisePropertyChanged("SubItems"); }
public LogicalGroup(ConditionGroup group) { List <LogicalItem> subItems = new List <LogicalItem>(); Group = group; foreach (ExpressionTreeBase current in group.Children) { foreach (LogicalItem next in ConditionGroup.Convert(current)) { subItems.Add(next); } } SubItems = subItems.ToArray(); IEnumerable <SelectorTypes> types = SubItems.Select(x => x.SingleSelector).Distinct(); if (IsSingleSelector = types.Count() == 1 && !SubItems.OfType <LogicalGroup>().Any(x => !x.IsSingleSelector)) { SingleSelector = types.First(); } List <List <LogicalItem> > chains = GetChains(subItems); List <SelectorGroup> groups = new List <SelectorGroup>(); foreach (List <LogicalItem> chain in chains) { List <LogicalItem> unknownItems = new List <LogicalItem>(); SelectorTypes[] newTypes = chain.Select(x => x is LogicalGroup ? (((LogicalGroup)x).IsSingleSelector ? x.SingleSelector : SelectorTypes.Invalid) : x.SingleSelector).Distinct().ToArray(); foreach (SelectorTypes current in newTypes) { List <LogicalItem> items = new List <LogicalItem>(); for (int i = chain.Count - 1; i >= 0; i--) { LogicalItem item = chain[i]; SelectorTypes?selector = item is LogicalGroup ? (((LogicalGroup)item).IsSingleSelector ? (SelectorTypes?)item.SingleSelector : null) : item.SingleSelector; if (selector == null) { unknownItems.Insert(0, item); chain.RemoveAt(i); } else if (selector == current) { items.Insert(0, item); } } if (items.Count > 0) { groups.Add(new SelectorGroup(items, current)); } } if (unknownItems.Count > 0) { groups.Add(new SelectorGroup(unknownItems, null)); } } for (int i = groups.Count - 1; i >= 0; i--) { if (i > 0) { if (groups[i].Selector == groups[i - 1].Selector) { SelectorGroup upperGroup = groups[i]; SelectorGroup lowerGroup = groups[i - 1]; groups.RemoveAt(i); groups.RemoveAt(i - 1); List <LogicalItem> items = new List <LogicalItem>(); items.AddRange(lowerGroup.Children); items.AddRange(upperGroup.Children); SelectorGroup joinedGroup = new SelectorGroup(items, upperGroup.Selector); groups.Insert(i - 1, joinedGroup); } } } SelectorGroups = groups.ToArray(); }