public static void Focus(MultiSelectTreeViewItem element, bool bringIntoView = false) { //System.Diagnostics.Debug.WriteLine("FocusHelper focusing " + (bringIntoView ? "[into view] " : "") + element.DataContext); FocusCore(element); if (bringIntoView) { FrameworkElement itemContent = (FrameworkElement) element.Template.FindName("headerBorder", element); if (itemContent != null) // May not be rendered yet... { itemContent.BringIntoView(); } } }
public bool Deselect(MultiSelectTreeViewItem item, bool bringIntoView = false) { var e = new PreviewSelectionChangedEventArgs(false, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) return false; treeView.SelectedItems.Remove(item.DataContext); if (item.DataContext == lastShiftRoot) { lastShiftRoot = null; } FocusHelper.Focus(item, bringIntoView); return true; }
public void RecursiveExpand(MultiSelectTreeViewItem item) { if (item.Items.Count > 0) { item.UpdateLayout(); foreach (var child in item.Items) { MultiSelectTreeViewItem tvi = item.ItemContainerGenerator.ContainerFromItem(child) as MultiSelectTreeViewItem; if (tvi != null) { tvi.IsExpanded = true; RecursiveExpand(tvi); } } } }
private bool SelectFromKey(MultiSelectTreeViewItem item) { if (item == null) { return(false); } // If Ctrl is pressed just focus it, so it can be selected by Space. Otherwise select it. if (IsControlKeyDown) { FocusHelper.Focus(item, true); return(true); } else { return(SelectCore(item)); } }
public bool Deselect(MultiSelectTreeViewItem item, bool bringIntoView = false) { var e = new PreviewSelectionChangedEventArgs(false, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { return(false); } treeView.SelectedItems.Remove(item.DataContext); if (item.DataContext == lastShiftRoot) { lastShiftRoot = null; } FocusHelper.Focus(item, bringIntoView); return(true); }
internal bool DeselectByRectangle(MultiSelectTreeViewItem item) { var e = new PreviewSelectionChangedEventArgs(false, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { lastShiftRoot = item.DataContext; return(false); } treeView.SelectedItems.Remove(item.DataContext); if (item.DataContext == lastShiftRoot) { lastShiftRoot = null; } return(true); }
internal bool SelectByRectangle(MultiSelectTreeViewItem item) { var e = new PreviewSelectionChangedEventArgs(true, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { lastShiftRoot = item.DataContext; return(false); } if (!treeView.SelectedItems.Contains(item.DataContext)) { treeView.SelectedItems.Add(item.DataContext); } lastShiftRoot = item.DataContext; return(true); }
private bool SelectPageUpDown(bool down) { List <MultiSelectTreeViewItem> items = MultiSelectTreeView.RecursiveTreeViewItemEnumerable(treeView, false, false).ToList(); MultiSelectTreeViewItem item = GetFocusedItem(); if (item == null) { return(down ? SelectLastFromKey() : SelectFirstFromKey()); } double targetY = item.TransformToAncestor(treeView).Transform(new Point()).Y; FrameworkElement itemContent = (FrameworkElement)item.Template.FindName("PART_Header", item); if (itemContent == null) { return(down ? SelectLastFromKey() : SelectFirstFromKey()); } double offset = treeView.ActualHeight - 2 * ((FrameworkElement)itemContent.Parent).ActualHeight; if (!down) { offset = -offset; } targetY += offset; while (true) { var newItem = down ? treeView.GetNextItem(item, items) : treeView.GetPreviousItem(item, items); if (newItem == null) { break; } item = newItem; double itemY = item.TransformToAncestor(treeView).Transform(new Point()).Y; if (down && itemY > targetY || !down && itemY < targetY) { break; } } return(SelectFromKey(item)); }
protected static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // The item has been selected through its IsSelected property. Update the SelectedItems // list accordingly (this is the authoritative collection). No PreviewSelectionChanged // event is fired - the item is already selected. MultiSelectTreeViewItem item = d as MultiSelectTreeViewItem; if (item != null) { if ((bool)e.NewValue) { if (!item.ParentTreeView.SelectedItems.Contains(item.DataContext)) { item.ParentTreeView.SelectedItems.Add(item.DataContext); } } else { item.ParentTreeView.SelectedItems.Remove(item.DataContext); } } }
public bool Select(MultiSelectTreeViewItem item) { if (IsControlKeyDown) { if (treeView.SelectedItems.Contains(item.DataContext)) { return(Deselect(item, true)); } else { var e = new PreviewSelectionChangedEventArgs(true, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { FocusHelper.Focus(item, true); return(false); } return(SelectCore(item)); } } else { if (treeView.SelectedItems.Count == 1 && treeView.SelectedItems[0] == item.DataContext) { // Requested to select the single already-selected item. Don't change the selection. FocusHelper.Focus(item, true); lastShiftRoot = item.DataContext; return(true); } else { return(SelectCore(item)); } } }
public bool Select(MultiSelectTreeViewItem item) { if (IsControlKeyDown) { if (treeView.SelectedItems.Contains(item.DataContext)) { return Deselect(item, true); } else { var e = new PreviewSelectionChangedEventArgs(true, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { FocusHelper.Focus(item, true); return false; } return SelectCore(item); } } else { if (treeView.SelectedItems.Count == 1 && treeView.SelectedItems[0] == item.DataContext) { // Requested to select the single already-selected item. Don't change the selection. FocusHelper.Focus(item, true); lastShiftRoot = item.DataContext; return true; } else { return SelectCore(item); } } }
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; }
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); }
private static ContentPresenter GetContentPresenter(MultiSelectTreeViewItem treeViewItem) { var contentPresenter = treeViewItem.Template.FindName("PART_Header", treeViewItem) as ContentPresenter; return contentPresenter; }
/// <summary> /// Initializes a new instance of the <see cref="MultiSelectTreeViewItemAutomationPeer"/> /// class. /// </summary> /// <param name="owner"> /// Das <see cref="T:System.Windows.Controls.MultiSelectTreeViewItem"/>, das diesem /// <see cref="T:System.Windows.Automation.Peers.MultiSelectTreeViewItemAutomationPeer"/> /// zugeordnet ist. /// </param> public MultiSelectTreeViewItemAutomationPeer(MultiSelectTreeViewItem owner) : base(owner) { }
internal MultiSelectTreeViewItem GetNextItem(MultiSelectTreeViewItem item, List<MultiSelectTreeViewItem> items) { int indexOfCurrent = item != null ? items.IndexOf(item) : -1; for (int i = indexOfCurrent + 1; i < items.Count; i++) { if (items[i].IsVisible) { return items[i]; } } return null; }
private bool SelectFromKey(MultiSelectTreeViewItem item) { if (item == null) { return false; } // If Ctrl is pressed just focus it, so it can be selected by Space. Otherwise select it. if (IsControlKeyDown) { FocusHelper.Focus(item, true); return true; } else { return SelectCore(item); } }
private bool CollectDeselectRecursive(MultiSelectTreeViewItem item, List<MultiSelectTreeViewItem> selectedChildren) { foreach (var child in item.Items) { MultiSelectTreeViewItem tvi = item.ItemContainerGenerator.ContainerFromItem(child) as MultiSelectTreeViewItem; if (tvi != null) { if (tvi.IsSelected) { var e = new PreviewSelectionChangedEventArgs(false, child); OnPreviewSelectionChanged(e); if (e.CancelAny) { return false; } selectedChildren.Add(tvi); } if (!CollectDeselectRecursive(tvi, selectedChildren)) { return false; } } } return true; }
public void BringItemIntoView(object item) { MultiSelectTreeViewItem node = GetTreeViewItemsFor(new List<object> { item }).First(); FrameworkElement itemContent = (FrameworkElement) node.Template.FindName("headerBorder", node); itemContent.BringIntoView(); }
internal MultiSelectTreeViewItem GetPreviousItem(MultiSelectTreeViewItem item, List<MultiSelectTreeViewItem> items) { int indexOfCurrent = item != null ? items.IndexOf(item) : -1; for (int i = indexOfCurrent - 1; i >= 0; i--) { if (items[i].IsVisible) { return items[i]; } } return null; }
internal IEnumerable<MultiSelectTreeViewItem> GetNodesToSelectBetween(MultiSelectTreeViewItem firstNode, MultiSelectTreeViewItem lastNode) { var allNodes = RecursiveTreeViewItemEnumerable(this, false, false).ToList(); var firstIndex = allNodes.IndexOf(firstNode); var lastIndex = allNodes.IndexOf(lastNode); if (firstIndex >= allNodes.Count) { throw new InvalidOperationException( "First node index " + firstIndex + "greater or equal than count " + allNodes.Count + "."); } if (lastIndex >= allNodes.Count) { throw new InvalidOperationException( "Last node index " + lastIndex + " greater or equal than count " + allNodes.Count + "."); } var nodesToSelect = new List<MultiSelectTreeViewItem>(); if (lastIndex == firstIndex) { return new List<MultiSelectTreeViewItem> { firstNode }; } if (lastIndex > firstIndex) { for (int i = firstIndex; i <= lastIndex; i++) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } else { for (int i = firstIndex; i >= lastIndex; i--) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } return nodesToSelect; }
internal bool DeselectByRectangle(MultiSelectTreeViewItem item) { var e = new PreviewSelectionChangedEventArgs(false, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { lastShiftRoot = item.DataContext; return false; } treeView.SelectedItems.Remove(item.DataContext); if (item.DataContext == lastShiftRoot) { lastShiftRoot = null; } return true; }
internal bool SelectByRectangle(MultiSelectTreeViewItem item) { var e = new PreviewSelectionChangedEventArgs(true, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { lastShiftRoot = item.DataContext; return false; } if (!treeView.SelectedItems.Contains(item.DataContext)) { treeView.SelectedItems.Add(item.DataContext); } lastShiftRoot = item.DataContext; return true; }
internal IEnumerable <MultiSelectTreeViewItem> GetNodesToSelectBetween(MultiSelectTreeViewItem firstNode, MultiSelectTreeViewItem lastNode) { var allNodes = RecursiveTreeViewItemEnumerable(this, false, false).ToList(); var firstIndex = allNodes.IndexOf(firstNode); var lastIndex = allNodes.IndexOf(lastNode); if (firstIndex >= allNodes.Count) { throw new InvalidOperationException( "First node index " + firstIndex + "greater or equal than count " + allNodes.Count + "."); } if (lastIndex >= allNodes.Count) { throw new InvalidOperationException( "Last node index " + lastIndex + " greater or equal than count " + allNodes.Count + "."); } var nodesToSelect = new List <MultiSelectTreeViewItem>(); if (lastIndex == firstIndex) { return(new List <MultiSelectTreeViewItem> { firstNode }); } if (lastIndex > firstIndex) { for (int i = firstIndex; i <= lastIndex; i++) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } else { for (int i = firstIndex; i >= lastIndex; i--) { if (allNodes[i].IsVisible) { nodesToSelect.Add(allNodes[i]); } } } return(nodesToSelect); }
internal bool DeselectRecursive(MultiSelectTreeViewItem item, bool includeSelf) { List<MultiSelectTreeViewItem> selectedChildren = new List<MultiSelectTreeViewItem>(); if (includeSelf) { if (item.IsSelected) { var e = new PreviewSelectionChangedEventArgs(false, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { return false; } selectedChildren.Add(item); } } if (!CollectDeselectRecursive(item, selectedChildren)) { return false; } foreach (var child in selectedChildren) { child.IsSelected = false; } return true; }