예제 #1
0
        protected override void OnKeyUp(KeyEventArgs e)
        {
            base.OnKeyUp(e);
            if (!e.Handled)
            {
                Key key = e.Key;
                switch (key)
                {
                case Key.Left:
                case Key.Right:
                case Key.Up:
                case Key.Down:
                case Key.Add:
                case Key.Subtract:
                case Key.Space:
                    IEnumerable <TreeViewExItem> items = TreeViewElementFinder.FindAll(ParentTreeView, false);
                    TreeViewExItem focusedItem         = items.FirstOrDefault(x => x.IsFocused);

                    if (focusedItem != null)
                    {
                        focusedItem.BringIntoView(new Rect(1, 1, 1, 1));
                    }

                    break;
                }
            }
        }
예제 #2
0
        internal TreeViewExItem GetTreeViewItemFor(object item)
        {
            foreach (var treeViewExItem in TreeViewElementFinder.FindAll(this, false))
            {
                if (item == treeViewExItem.DataContext)
                {
                    return(treeViewExItem);
                }
            }

            return(null);
        }
예제 #3
0
        private TreeViewExItem GetFocusedItem()
        {
            foreach (var item in TreeViewElementFinder.FindAll(treeViewEx, false))
            {
                if (item.IsFocused)
                {
                    return(item);
                }
            }

            return(null);
        }
예제 #4
0
        private void OnSelectedItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                object last = null;
                foreach (var item in GetTreeViewItemsFor(e.NewItems))
                {
                    item.IsSelected = true;
                    item.BringIntoView();

                    last = item.DataContext;
                }

                LastSelectedItem = last;
                break;

            case NotifyCollectionChangedAction.Remove:
                foreach (var item in GetTreeViewItemsFor(e.OldItems))
                {
                    item.IsSelected = false;
                    if (item.DataContext == LastSelectedItem)
                    {
                        if (SelectedItems.Count > 0)
                        {
                            LastSelectedItem = SelectedItems[SelectedItems.Count - 1];
                        }
                        else
                        {
                            LastSelectedItem = null;
                        }
                    }
                }

                break;

            case NotifyCollectionChangedAction.Reset:
                foreach (var item in TreeViewElementFinder.FindAll(this, false))
                {
                    if (item.IsSelected)
                    {
                        item.IsSelected = false;
                    }
                }

                LastSelectedItem = null;
                break;

            default:
                throw new InvalidOperationException();
            }
        }
예제 #5
0
        internal IEnumerable <TreeViewExItem> GetNodesToSelectBetween(TreeViewExItem firstNode, TreeViewExItem lastNode)
        {
            var allNodes   = TreeViewElementFinder.FindAll(this, 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 <TreeViewExItem>();

            if (lastIndex == firstIndex)
            {
                return(new List <TreeViewExItem> {
                    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);
        }
예제 #6
0
        internal IEnumerable <TreeViewExItem> GetTreeViewItemsFor(IEnumerable objects)
        {
            if (objects == null)
            {
                yield break;
            }
            var items = objects.Cast <object>().ToList();

            foreach (var treeViewExItem in TreeViewElementFinder.FindAll(this, false))
            {
                if (items.Contains(treeViewExItem.DataContext))
                {
                    yield return(treeViewExItem);
                }
            }
        }
예제 #7
0
        public void SelectPreviousFromKey()
        {
            List <TreeViewExItem> items = TreeViewElementFinder.FindAll(treeViewEx, true).ToList();
            TreeViewExItem        item  = GetFocusedItem();

            item = treeViewEx.GetPreviousItem(item, items);
            if (item == null)
            {
                return;
            }

            // if ctrl is pressed just focus it, so it can be selected by space. Otherwise select it.
            if (!IsControlKeyDown)
            {
                SelectSingleItem(item);
            }

            FocusHelper.Focus(item);
        }
예제 #8
0
        public SelectionMultiple(TreeViewEx treeViewEx)
        {
            this.treeViewEx = treeViewEx;

            BorderSelectionLogic = new BorderSelectionLogic(treeViewEx, TreeViewElementFinder.FindAll(treeViewEx, false));
        }