Пример #1
0
        private void _validateLoaded()
        {
            if (!_isLoaded)
            {
                if (_entryComparer == null)
                {
                    _entryComparer = new DatabaseItemSorter <TValue>(_settings.AttributeList);
                    _entryComparer.SetSort(_settings.AttId.AttributeName, ListSortDirection.Ascending);
                }

                _load();
                _isLoaded = true;
            }
        }
Пример #2
0
        private void _filterInternal(string currentSearch)
        {
            lock (_filterLock) {
                IsFiltering = true;

                try {
                    if (currentSearch != _searchItemsFilter)
                    {
                        return;
                    }
                    if (_items == null)
                    {
                        return;
                    }

                    List <TValue> allItems;

                    if (SubsetCondition != null)
                    {
                        allItems = _table.FastItems.Where(p => SubsetCondition(p)).ToList();
                    }
                    else
                    {
                        allItems = _table.FastItems;
                    }

                    if (SetupImageDataGetter != null)
                    {
                        allItems.Where(p => p.GetImageData == null).ToList().ForEach(p => SetupImageDataGetter(p));
                    }

                    List <string> search = _getSearch(currentSearch);

                    if (allItems.Count == 0)
                    {
                        _items.Dispatch(r => r.ItemsSource = new RangeObservableCollection <TValue>(new List <TValue>()));
                        WpfUtilities.TextBoxOk(_tbSearchItems);
                        OnFilterFinished(new List <TValue>());
                        return;
                    }

                    WpfUtilities.TextBoxProcessing(_tbSearchItems);

                    if (!_searchFirstTimeSet)
                    {
                        _entryComparer = new DatabaseItemSorter <TValue>(_settings.AttributeList);
                        _entryComparer.SetSort(_settings.AttId.AttributeName, ListSortDirection.Ascending);
                        _searchFirstTimeSet = true;
                    }

                    _items.Dispatch(p => _entryComparer.SetSort(WpfUtils.GetLastGetSearchAccessor(_items), WpfUtils.GetLastSortDirection(_items)));

                    if (search.Count == 0 &&
                        !_attributes.Where(p => p.DataType.BaseType == typeof(Enum)).Any(p => _itemsSearchSettings[p]) &&
                        !_itemsSearchSettings[GSearchSettings.TupleAdded] &&
                        !_itemsSearchSettings[GSearchSettings.TupleModified] &&
                        !_itemsSearchSettings[GSearchSettings.TupleRange])
                    {
                        allItems = allItems.OrderBy(p => p, _entryComparer).ToList();
                        _items.Dispatch(r => r.ItemsSource = new RangeObservableCollection <TValue>(allItems));
                        WpfUtilities.TextBoxOk(_tbSearchItems);
                        OnFilterFinished(allItems);
                        return;
                    }

                    if (currentSearch != _searchItemsFilter)
                    {
                        return;
                    }

                    string predicateSearch = _tbItemsRange.Dispatch(() => _tbItemsRange.Text);
                    bool   isWiden         = _itemsSearchSettings.Get(GSearchSettings.Mode) == "0";

                    List <Func <TValue, string, bool> > generalPredicates =
                        (from attribute in _attributes
                         where attribute != null
                         let attributeCopy = attribute
                                             where _itemsSearchSettings[attributeCopy]
                                             where attribute.DataType.BaseType != typeof(Enum)
                                             select new Func <TValue, string, bool>((p, s) => p.GetValue <string>(attributeCopy).IndexOf(s, StringComparison.OrdinalIgnoreCase) != -1)).ToList();

                    bool isAttributeRestricted = false;

                    if (search.Any(p => p.StartsWith("[", StringComparison.Ordinal) && p.EndsWith("]", StringComparison.Ordinal)))
                    {
                        generalPredicates.Clear();

                        for (int index = 0; index < search.Count; index++)
                        {
                            string se = search[index];
                            int    ival;

                            if (se.StartsWith("[", StringComparison.Ordinal) && se.EndsWith("]", StringComparison.Ordinal))
                            {
                                se = se.Substring(1, se.Length - 2);
                                se = se.Replace("_", " ");
                                var att = _settings.AttributeList.Attributes.FirstOrDefault(p => p.DisplayName.IndexOf(se, 0, StringComparison.OrdinalIgnoreCase) > -1);

                                if (Int32.TryParse(se, out ival) || att != null)
                                {
                                    if (ival < _settings.AttributeList.Attributes.Count)
                                    {
                                        DbAttribute attribute = att ?? _settings.AttributeList.Attributes[ival];
                                        isAttributeRestricted = true;
                                        //generalPredicates.Add(new Func<TValue, string, bool>((p, s) => p.GetValue<string>(attribute).IndexOf(s, StringComparison.OrdinalIgnoreCase) != -1));
                                        string nextSearch = index + 1 < search.Count ? search[index + 1] : "";
                                        generalPredicates.Add(new Func <TValue, string, bool>((p, s) => String.Compare(p.GetValue <string>(attribute), nextSearch, StringComparison.OrdinalIgnoreCase) == 0));
                                    }
                                    search.RemoveAt(index);
                                    index--;
                                }
                            }
                        }
                    }

                    List <DbAttribute> enumAttributes = _attributes.Where(p => p.DataType.BaseType == typeof(Enum) && _itemsSearchSettings[p]).ToList();

                    bool hasTuplePredicates = _itemsSearchSettings[GSearchSettings.TupleAdded] ||
                                              _itemsSearchSettings[GSearchSettings.TupleModified] ||
                                              _itemsSearchSettings[GSearchSettings.TupleRange] ||
                                              enumAttributes.Any();

                    Func <TValue, bool> tuplePredicate = null;

                    if (hasTuplePredicates)
                    {
                        tuplePredicate = _getTuplePredicates(enumAttributes, predicateSearch);
                    }
                    if (currentSearch != _searchItemsFilter)
                    {
                        return;
                    }

                    List <TValue> result = _getResults(search, isAttributeRestricted, generalPredicates, allItems, tuplePredicate, isWiden);

                    if (currentSearch != _searchItemsFilter)
                    {
                        WpfUtilities.TextBoxOk(_tbSearchItems);
                        return;
                    }

                    _items.Dispatch(r => r.ItemsSource = new RangeObservableCollection <TValue>(result));
                    WpfUtilities.TextBoxOk(_tbSearchItems);
                    OnFilterFinished(result);
                }
                catch {
                    WpfUtilities.TextBoxOk(_tbSearchItems);
                }
                finally {
                    IsFiltering = false;
                }
            }
        }