private void VerifyIndex(FilterFileItem filterFileItem = null)
        {
            bool lockTaken = false;

            try
            {
                _spinLock.TryEnter(ref lockTaken);
                FilterFile filterFile = new FilterFile();
                filterFile = (FilterFile)CurrentFile();
                ObservableCollection <FilterFileItem> contentList = TabItems[SelectedIndex].ContentList;

                // filterFile.EnablePatternNotifications(false);
                ObservableCollection <FilterFileItem> contentItems = filterFile.ContentItems;
                List <FilterFileItem> sortedFilterItems            = new List <FilterFileItem>(contentItems.OrderBy(x => x.Index));
                SetStatus(string.Format("VerifyIndex: contentList count: {0} contentItems count: {1}", contentList.Count, contentItems.Count));
                if (filterFileItem != null)
                {
                    SetStatus(string.Format("VerifyIndex: filterFileItem index: {0} pattern: {1}", filterFileItem.Index, filterFileItem.Filterpattern));
                }

                bool       dupes           = false;
                bool       needsSorting    = false;
                bool       needsReIndexing = false;
                List <int> indexList       = new List <int>();

                for (int i = 0; i < sortedFilterItems.Count; i++)
                {
                    int orderedFilterItemIndex = sortedFilterItems[i].Index;
                    if (orderedFilterItemIndex != contentItems[i].Index)
                    {
                        // original index does not equal sorted index
                        needsSorting = true;
                    }

                    if (!indexList.Contains(orderedFilterItemIndex))
                    {
                        // add filter item to temp list for compare
                        indexList.Add(orderedFilterItemIndex);
                    }
                    else
                    {
                        // item already exists in temp list based on filter index
                        dupes = true;
                    }

                    if (i != orderedFilterItemIndex)
                    {
                        needsReIndexing = true;
                    }
                }

                // does index need to be modified?
                if (!needsSorting && !dupes && !needsReIndexing)
                {
                    // do nothing
                    return;
                }
                else
                {
                    filterFile.EnablePatternNotifications(false);
                    // needs sorting or has dupes or needs reindexing
                    if (filterFileItem != null && sortedFilterItems.Count(x => x.Index == filterFileItem.Index) > 1)
                    {
                        // new / modifed filteritem index remove and insert selected item in list at
                        // lowest position in index of dupes
                        sortedFilterItems.RemoveAt(sortedFilterItems.IndexOf(filterFileItem));
                        sortedFilterItems.Insert((int)(sortedFilterItems.IndexOf(sortedFilterItems.First(x => x.Index == filterFileItem.Index))), filterFileItem);
                    }

                    // sync contentList
                    for (int i = 0; i < sortedFilterItems.Count; i++)
                    {
                        Debug.Print(string.Format("VerifyIndex:sync:sortedFilterItems index: {0} filterpattern: {1}", i, sortedFilterItems[i].Filterpattern));
                        Debug.Print(string.Format("VerifyIndex:sync:contentList index: {0} filterpattern: {1}", i, contentList[i].Filterpattern));
                        Debug.Print(string.Format("VerifyIndex:sync:contentItems index: {0} filterpattern: {1}", i, contentItems[i].Filterpattern));
                        contentList[i]        = sortedFilterItems[i];
                        contentItems[i]       = sortedFilterItems[i];
                        contentList[i].Index  = i;
                        contentItems[i].Index = i;
                    }

                    filterFile.EnablePatternNotifications(true);
                }
            }
            catch (LockRecursionException)
            {
                SetStatus("VerifyIndex:reentrant:skipping");
            }
            catch (Exception ex)
            {
                SetStatus("VerifyIndex:exception:" + ex.ToString());
            }
            finally
            {
                if (lockTaken)
                {
                    _spinLock.Exit();
                }
            }
        }
        public void ManageFilterFileItem(FilterFile filterFile, int filterIndex = -1, bool remove = false)
        {
            // add blank new item so defaults / modifications can be set some type of bug
            IEnumerable <FilterFileItem> results = null;
            int indexMax = -1;

            SetStatus("ManageNewFilterFileItem:" + filterFile.FileName);

            results = filterFile.ContentItems.Where(x => x.Enabled == false &&
                                                    x.Exclude == false &&
                                                    x.Regex == false &&
                                                    string.IsNullOrEmpty(x.Filterpattern) &&
                                                    string.IsNullOrEmpty(x.Notes));

            if (filterFile.ContentItems.Count > 0)
            {
                // valid enabled filter count
                indexMax = filterFile.ContentItems.Max(x => x.Index);
            }

            if (results == null | results != null && results.Count() == 0 | filterIndex >= 0)
            {
                // no empty / new filter item or index ge 0 (insert or remove)
                FilterFileItem fileItem = new FilterFileItem();

                filterFile.EnablePatternNotifications(false);
                fileItem.Index = indexMax + 1;

                SetStatus("ManageNewFilterFileItem:adding new line");

                if (filterIndex >= 0 && !remove)
                {
                    // insert in new enabled filter item at specified index
                    fileItem.Enabled = true;
                    fileItem.Index   = filterIndex;
                    fileItem         = SetFilterItemColors(filterFile, fileItem);
                    filterFile.AddPatternNotification(fileItem, true);
                    filterFile.ContentItems.Insert(filterIndex, fileItem);
                }
                else if (filterIndex >= 0 && remove)
                {
                    // remove old filter item at specified index
                    filterFile.AddPatternNotification(fileItem, false);
                    filterFile.ContentItems.RemoveAt(filterIndex);
                }
                else
                {
                    // add at end
                    fileItem = SetFilterItemColors(filterFile, fileItem);
                    filterFile.AddPatternNotification(fileItem, true);
                    filterFile.ContentItems.Add(fileItem);
                }

                filterFile.EnablePatternNotifications(true);
            }
            else if (results.Count() == 1)
            {
                if (results.ToList()[0].Index != indexMax)
                {
                    filterFile.EnablePatternNotifications(false);
                    results.ToList()[0].Index = indexMax + 1;
                    filterFile.EnablePatternNotifications(true);
                }

                return;
            }
            else
            {
                for (int i = 0; i < results.Count() - 1; i++)
                {
                    filterFile.ContentItems.Remove(results.ToList()[i]);
                }
            }
        }