public bool SelectCore(MultiSelectTreeViewItem item)
{
if (IsControlKeyDown)
{
if (!treeView.SelectedItems.Contains(item.DataContext))
{
treeView.SelectedItems.Add(item.DataContext);
}
lastShiftRoot = item.DataContext;
}
else if (IsShiftKeyDown && treeView.SelectedItems.Count > 0)
{
object firstSelectedItem = lastShiftRoot ?? treeView.SelectedItems.First();
MultiSelectTreeViewItem shiftRootItem = treeView.GetTreeViewItemsFor(new List<object> { firstSelectedItem }).First();
var newSelection = treeView.GetNodesToSelectBetween(shiftRootItem, item).Select(n => n.DataContext).ToList();
// Make a copy of the list because we're modifying it while enumerating it
var selectedItems = new object[treeView.SelectedItems.Count];
treeView.SelectedItems.CopyTo(selectedItems, 0);
// Remove all items no longer selected
foreach (var selItem in selectedItems.Where(i => !newSelection.Contains(i)))
{
var e = new PreviewSelectionChangedEventArgs(false, selItem);
OnPreviewSelectionChanged(e);
if (e.CancelAll)
{
FocusHelper.Focus(item);
return false;
}
if (!e.CancelThis)
{
treeView.SelectedItems.Remove(selItem);
}
}
// Add new selected items
foreach (var newItem in newSelection.Where(i => !selectedItems.Contains(i)))
{
var e = new PreviewSelectionChangedEventArgs(true, newItem);
OnPreviewSelectionChanged(e);
if (e.CancelAll)
{
FocusHelper.Focus(item, true);
return false;
}
if (!e.CancelThis)
{
treeView.SelectedItems.Add(newItem);
}
}
}
else
{
if (treeView.SelectedItems.Count > 0)
{
foreach (var selItem in new ArrayList(treeView.SelectedItems))
{
var e2 = new PreviewSelectionChangedEventArgs(false, selItem);
OnPreviewSelectionChanged(e2);
if (e2.CancelAll)
{
FocusHelper.Focus(item);
lastShiftRoot = item.DataContext;
return false;
}
if (!e2.CancelThis)
{
treeView.SelectedItems.Remove(selItem);
}
}
}
var e = new PreviewSelectionChangedEventArgs(true, item.DataContext);
OnPreviewSelectionChanged(e);
if (e.CancelAny)
{
FocusHelper.Focus(item, true);
lastShiftRoot = item.DataContext;
return false;
}
treeView.SelectedItems.Add(item.DataContext);
lastShiftRoot = item.DataContext;
}
FocusHelper.Focus(item, true);
return true;
}