private void ApplyCanSelectMultiple()
            {
                if (!_owner.CanSelectMultiple)
                {
                    Debug.Assert(_toSelect.Count <= 1, "_toSelect.Count was > 1");

                    if (_toSelect.Count == 1) // this is all that should be selected, unselect _selectedItems
                    {
                        _toUnselect = new InternalSelectedItemsStorage(_owner._selectedItems);
                    }
                    else // _toSelect.Count == 0, and unselect all but one of _selectedItems
                    {
                        // This is when CanSelectMultiple changes from true to false.
                        if (_owner._selectedItems.Count > 1 && _owner._selectedItems.Count != _toUnselect.Count + 1)
                        {
                            // they didn't deselect enough; force deselection
                            ItemInfo selectedItem = _owner._selectedItems[0];

                            _toUnselect.Clear();
                            foreach (ItemInfo info in _owner._selectedItems)
                            {
                                if (info != selectedItem)
                                {
                                    _toUnselect.Add(info);
                                }
                            }
                        }
                    }
                }
            }
 /// <summary>
 /// Create a new SelectionChangeHelper -- there should only be one instance per Selector.
 /// </summary>
 /// <param name="s"></param>
 internal SelectionChanger(Selector s)
 {
     _owner         = s;
     _active        = false;
     _toSelect      = new InternalSelectedItemsStorage(1, MatchUnresolvedEqualityComparer);
     _toUnselect    = new InternalSelectedItemsStorage(1, MatchUnresolvedEqualityComparer);
     _toDeferSelect = new InternalSelectedItemsStorage(1, MatchUnresolvedEqualityComparer);
 }
            internal InternalSelectedItemsStorage(InternalSelectedItemsStorage collection, IEqualityComparer <ItemInfo> equalityComparer = null)
            {
                _equalityComparer = equalityComparer ?? collection._equalityComparer;

                _list = new List <ItemInfo>(collection._list);

                if (collection.UsesItemHashCodes)
                {
                    _set = new Dictionary <ItemInfo, ItemInfo>(collection._set, _equalityComparer);
                }

                _resolvedCount   = collection._resolvedCount;
                _unresolvedCount = collection._unresolvedCount;
            }
Exemplo n.º 4
0
            internal InternalSelectedItemsStorage(InternalSelectedItemsStorage collection)
            { 
                _list = new ArrayList(collection._list);

                if (collection.UsesItemHashCodes)
                { 
                    _set = new Dictionary<object, object>(collection._set);
                } 
            } 
Exemplo n.º 5
0
            private void CreateDeltaSelectionChange(List<object> unselectedItems, List<object> selectedItems) 
            {
                for (int i = 0; i < _toDeferSelect.Count; i++)
                {
                    object o = _toDeferSelect[i]; 
                    // If defered selected item exis in Items - move it to _toSelect
                    if (_owner.Items.Contains(o)) 
                    { 
                        _toSelect.Add(o);
                        _toDeferSelect.Remove(o); 
                        i--;
                    }
                }
 
                if (_toUnselect.Count > 0 || _toSelect.Count > 0)
                { 
                    if (_owner._selectedItems.UsesItemHashCodes) 
                    {
                        // Step 1: Keep current selection temp storage 
                        InternalSelectedItemsStorage currentSelectedItems = new InternalSelectedItemsStorage(_owner._selectedItems);

                        // Step 2: Clear the selection storage
                        _owner._selectedItems.Clear(); 

                        // STep 3: Process the items that need to be unselected 
                        foreach (object o in _toUnselect) 
                        {
                            _owner.ItemSetIsSelected(o, false); 
                            if (currentSelectedItems.Contains(o))
                            {
                                unselectedItems.Add(o);
                            } 
                        }
 
                        // Step 4: Add back items from the temp storage that are not in _toUnselect 
                        foreach (object o in currentSelectedItems)
                        { 
                            if (!_toUnselect.Contains(o))
                            {
                                _owner._selectedItems.Add(o);
                            } 
                        }
 
                    } 
                    else
                    { 
                        foreach (object o in _toUnselect)
                        {
                            _owner.ItemSetIsSelected(o, false);
                            if (_owner._selectedItems.Contains(o)) 
                            {
                                _owner._selectedItems.Remove(o); 
                                unselectedItems.Add(o); 
                            }
                        } 
                    }

                    foreach (object o in _toSelect)
                    { 
                        _owner.ItemSetIsSelected(o, true);
                        if (!_owner._selectedItems.Contains(o)) 
                        { 
                            _owner._selectedItems.Add(o);
                            selectedItems.Add(o); 
                        }
                    }
                }
            } 
Exemplo n.º 6
0
            private void ApplyCanSelectMultiple()
            { 
                if (!_owner.CanSelectMultiple) 
                {
                    Debug.Assert(_toSelect.Count <= 1, "_toSelect.Count was > 1"); 

                    if (_toSelect.Count == 1) // this is all that should be selected, unselect _selectedItems
                    {
                        _toUnselect = new InternalSelectedItemsStorage(_owner._selectedItems); 
                    }
                    else // _toSelect.Count == 0, and unselect all but one of _selectedItems 
                    { 
                        // This is when CanSelectMultiple changes from true to false.
                        if (_owner._selectedItems.Count > 1 && _owner._selectedItems.Count != _toUnselect.Count + 1) 
                        {
                            // they didn't deselect enough; force deselection
                            object selectedItem = _owner._selectedItems[0];
 
                            _toUnselect.Clear();
                            foreach (object o in _owner._selectedItems) 
                            { 
                                if (o != selectedItem)
                                { 
                                    _toUnselect.Add(o);
                                }
                            }
                        } 
                    }
                } 
            } 
Exemplo n.º 7
0
 /// <summary> 
 /// Create a new SelectionChangeHelper -- there should only be one instance per Selector.
 /// </summary> 
 /// <param name="s"></param>
 internal SelectionChanger(Selector s)
 {
     _owner = s; 
     _active = false;
     _toSelect = new InternalSelectedItemsStorage(1); 
     _toUnselect = new InternalSelectedItemsStorage(1); 
     _toDeferSelect = new InternalSelectedItemsStorage(1);
 } 
Exemplo n.º 8
0
        private void UpdateSelectedItems()
        {
            // Update SelectedItems.  We don't want to invalidate the property
            // because that defeats the ability of bindings to be able to listen 
            // for collection changes on that collection.  Instead we just want
            // to add all the items which are not already in the collection. 
 
            // Note: This is currently only called from SelectionChanger where SC.IsActive will be true.
            // If this is ever called from another location, ensure that SC.IsActive is true. 
            Debug.Assert(SelectionChange.IsActive, "SelectionChange.IsActive should be true");

            IList userSelectedItems = SelectedItemsImpl;
            if (userSelectedItems != null) 
            {
                InternalSelectedItemsStorage userSelectedItemsTable = new InternalSelectedItemsStorage(userSelectedItems.Count); 
                userSelectedItemsTable.UsesItemHashCodes = _selectedItems.UsesItemHashCodes; 

                for (int i = 0; i < userSelectedItems.Count; i++) 
                {
                    object userSelectedItem = userSelectedItems[i];
                    if (_selectedItems.Contains(userSelectedItem) && !userSelectedItemsTable.Contains(userSelectedItem))
                    { 
                        // cache the user's selected items into a table with O(1) lookup.
                        userSelectedItemsTable.Add(userSelectedItem); 
                    } 
                    else
                    { 
                        // Remove each thing that is in SelectedItems that's not in _selectedItems.
                        // Remove all duplicate items from userSelectedItems
                        userSelectedItems.RemoveAt(i);
                        i--; 
                    }
                } 
 
                // Add to SelectedItems everything missing that's in _selectedItems.
                foreach (object selectedItem in _selectedItems) 
                {
                    if (!userSelectedItemsTable.Contains(selectedItem))
                    {
                        userSelectedItems.Add(selectedItem); 
                    }
                } 
            } 
        }
 public BatchRemoveHelper(InternalSelectedItemsStorage owner)
 {
     _owner = owner;
 }