protected void remove_WLock(MediaItem item)
        {
            SelectableMediaItem selectableItem = new SelectableMediaItem(item);

            int index = MediaCollectionView.IndexOf(selectableItem);

            removeAt_WLock(index);
        }
        public void selectRange(MediaItem end)
        {
            EnterWriteLock();
            try
            {
                bool selectionChanged = false;

                MediaItem start = null;

                int startIndex = getSelectedItem_RLock(out start);
                int endIndex   = MediaCollectionView.IndexOf(new SelectableMediaItem(end));

                if (endIndex == -1)
                {
                    return;
                }
                else if (startIndex == -1)
                {
                    startIndex = 0;
                }

                if (endIndex < startIndex)
                {
                    int temp = startIndex;
                    startIndex = endIndex;
                    endIndex   = temp;
                }

                for (int i = startIndex; i <= endIndex; i++)
                {
                    MediaCollectionView[i].SelectionChanged -= selectableItem_SelectionChanged;

                    if (MediaCollectionView[i].IsSelected == false)
                    {
                        selectionChanged = true;
                    }

                    MediaCollectionView[i].IsSelected = true;

                    MediaCollectionView[i].SelectionChanged += selectableItem_SelectionChanged;
                }

                if (selectionChanged)
                {
                    QueueSelectionChangedEvent();
                }
            }
            finally
            {
                ExitWriteLock();
            }
        }
        protected void reSort(MediaItem item)
        {
            int oldIndex = 0;
            int newIndex = 0;

            EnterWriteLock();
            try
            {
                SelectableMediaItem selectableItem = new SelectableMediaItem(item);

                oldIndex = MediaCollectionView.IndexOf(selectableItem);
                newIndex = oldIndex;

                if (oldIndex != -1)
                {
                    selectableItem = MediaCollectionView[oldIndex];

                    // item is already in the list
                    if (Filter(selectableItem))
                    {
                        // remove and reinsert item
                        MediaCollectionView.RemoveAt(oldIndex);
                        if (oldIndex < sortedItemEnd)
                        {
                            sortedItemEnd -= 1;
                        }

                        newIndex = insertSorted_WLock(selectableItem);

                        if (newIndex != oldIndex)
                        {
                            QueueItemResortedEvent(item, oldIndex, newIndex);
                        }
                    }
                    else
                    {
                        // remove item from list
                        removeAt_WLock(oldIndex);
                    }
                }
                else
                {
                    // add item to list
                    add_WLock(item);
                }
            }
            finally
            {
                ExitWriteLock();
            }
        }
 /// <summary>
 /// Returns index of Media item, query under read lock
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public int IndexOf(SelectableMediaItem item)
 {
     return(MediaCollectionView.IndexOf(item));
 }