public bool SelectLastFromKey()
        {
            List <MultiSelectTreeViewItem> items = MultiSelectTreeView.RecursiveTreeViewItemEnumerable(treeView, false, false).ToList();
            MultiSelectTreeViewItem        item  = treeView.GetLastItem(items);

            return(SelectFromKey(item));
        }
        public bool SelectPreviousFromKey()
        {
            List <MultiSelectTreeViewItem> items = MultiSelectTreeView.RecursiveTreeViewItemEnumerable(treeView, false, false).ToList();
            MultiSelectTreeViewItem        item  = treeView.GetPreviousItem(GetFocusedItem(), items);

            return(SelectFromKey(item));
        }
 public void ApplyTemplate()
 {
     borderSelectionLogic = new BorderSelectionLogic(
         treeView,
         treeView.Template.FindName("selectionBorder", treeView) as Border,
         treeView.Template.FindName("scrollViewer", treeView) as ScrollViewer,
         treeView.Template.FindName("content", treeView) as ItemsPresenter,
         MultiSelectTreeView.RecursiveTreeViewItemEnumerable(treeView, false, false));
 }
 private MultiSelectTreeViewItem GetFocusedItem()
 {
     foreach (var item in MultiSelectTreeView.RecursiveTreeViewItemEnumerable(treeView, false, false))
     {
         if (item.IsFocused)
         {
             return(item);
         }
     }
     return(null);
 }
        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));
        }
        public bool SelectAllFromKey()
        {
            var items = MultiSelectTreeView.RecursiveTreeViewItemEnumerable(treeView, false, false).ToList();

            // Add new selected items
            foreach (var item in items.Where(i => !treeView.SelectedItems.Contains(i.DataContext)))
            {
                var e = new PreviewSelectionChangedEventArgs(true, item.DataContext);
                OnPreviewSelectionChanged(e);
                if (e.CancelAll)
                {
                    return(false);
                }
                if (!e.CancelThis)
                {
                    treeView.SelectedItems.Add(item.DataContext);
                }
            }
            return(true);
        }