Пример #1
0
        public void SelectFirst()
        {
            TreeViewExItem item = TreeViewElementFinder.FindFirst(treeViewEx, true);

            if (item != null)
            {
                SelectSingleItem(item);
            }

            FocusHelper.Focus(item);
        }
Пример #2
0
 internal void SelectByRectangle(TreeViewExItem item)
 {
     if (!treeViewEx.CheckSelectionAllowed(item.DataContext, true))
     {
         return;
     }
     treeViewEx.SelectedItems.Add(item.DataContext);
     FocusHelper.Focus(item);
     item.IsSelected = true;
     lastShiftRoot   = item.DataContext;
 }
Пример #3
0
        public void FocusItem(object item, bool bringIntoView = false)
        {
            MultiSelectTreeViewItem node = GetTreeViewItemsFor(new List <object> {
                item
            }).FirstOrDefault();

            if (node != null)
            {
                FocusHelper.Focus(node, bringIntoView);
            }
        }
Пример #4
0
        internal void StopEditing()
        {
            if (editedItem == null)
            {
                return;
            }

            Keyboard.Focus(editedItem);
            editedItem.IsEditing = false;
            FocusHelper.Focus(editedItem);
            editedItem = null;
        }
Пример #5
0
        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);
            FocusHelper.Focus(item, bringIntoView);
            return(true);
        }
Пример #6
0
 public bool Select(MultiSelectTreeViewItem item)
 {
     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);
         return(true);
     }
     else
     {
         return(SelectCore(item));
     }
 }
Пример #7
0
 public void SelectFromProperty(TreeViewExItem item, bool isSelected)
 {
     // we do not check if selection is allowed, because selecting on that way is no user action.
     // Hopefully the programmer knows what he does...
     if (isSelected)
     {
         treeViewEx.SelectedItems.Add(item.DataContext);
         lastShiftRoot = item.DataContext;
         FocusHelper.Focus(item);
     }
     else
     {
         treeViewEx.SelectedItems.Remove(item.DataContext);
     }
 }
Пример #8
0
        public void UnSelect(TreeViewExItem item)
        {
            if (!treeViewEx.CheckSelectionAllowed(item.DataContext, false))
            {
                return;
            }

            treeViewEx.SelectedItems.Remove(item.DataContext);
            item.IsSelected = false;
            if (item.DataContext == lastShiftRoot)
            {
                lastShiftRoot = null;
            }
            FocusHelper.Focus(item);
        }
Пример #9
0
        internal override void OnMouseUp(MouseButtonEventArgs e)
        {
            base.OnMouseUp(e);

            // click
            if (selectItem != null && e.ChangedButton == selectButton)
            {
                // select item
                SelectSingleItem(selectItem);
                FocusHelper.Focus(selectItem);

                // end click
                selectItem = null;
            }
        }
Пример #10
0
        internal void StopEditing(bool raiseEvent)
        {
            if (editedItem == null)
            {
                return;
            }

            Keyboard.Focus(editedItem);
            editedItem.IsEditingCallbackEnabled = false;
            editedItem.IsEditing = false;
            editedItem.IsEditingCallbackEnabled = true;
            FocusHelper.Focus(editedItem);
            if (raiseEvent)
            {
                editedItem.RaiseOnEdited();
            }
            editedItem = null;
        }
Пример #11
0
        public void SelectNextFromKey()
        {
            TreeViewExItem item = GetFocusedItem();

            item = TreeViewElementFinder.FindNext(item, true);
            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);
        }
        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));
            }
        }
Пример #13
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);
        }
Пример #14
0
        internal override void OnMouseDown(MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.ChangedButton != MouseButton.Left)
            {
                return;
            }

            TreeViewExItem item = GetTreeViewItemUnderMouse(e.GetPosition(treeViewEx));

            if (item == null || item.IsEditing)
            {
                return;
            }

            SelectSingleItem(item);

            FocusHelper.Focus(item);
        }
Пример #15
0
        public bool SelectCurrentBySpace()
        {
            var item = GetFocusedItem();
            var e    = new PreviewSelectionChangedEventArgs(true, item.DataContext);

            OnPreviewSelectionChanged(e);
            if (e.CancelAny)
            {
                FocusHelper.Focus(item, true);
                return(false);
            }

            item.IsSelected = true;
            if (!treeView.SelectedItems.Contains(item.DataContext))
            {
                treeView.SelectedItems.Add(item.DataContext);
            }

            FocusHelper.Focus(item, true);
            return(true);
        }
Пример #16
0
        internal override void OnMouseUp(MouseButtonEventArgs e)
        {
            base.OnMouseUp(e);

            TreeViewExItem item = GetTreeViewItemUnderMouse(e.GetPosition(treeViewEx));

            if (item == null)
            {
                return;
            }
            if (e.ChangedButton != MouseButton.Left && !(e.ChangedButton == MouseButton.Right && item.ContextMenu != null))
            {
                return;
            }
            if (item.IsEditing)
            {
                return;
            }

            SelectSingleItem(item);

            FocusHelper.Focus(item);
        }
Пример #17
0
        public void SelectPreviousFromKey()
        {
            List <TreeViewExItem> items = TreeViewEx.RecursiveTreeViewItemEnumerable(treeViewEx, true).ToList();
            TreeViewExItem        item;
            TreeViewExItem        focusedItem = GetFocusedItem();

            item = treeViewEx.GetPreviousItem(focusedItem, items);

            if (item == null)
            {
                return;
            }

            // if ctrl is pressed just focus it, so it can be selected by space. Otherwise select it.
            if (IsControlKeyDown)
            {
                FocusHelper.Focus(item);
            }
            else
            {
                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 SelectCurrentBySpace()
        {
            // Another item was focused by Ctrl+Arrow key
            var item = GetFocusedItem();

            if (treeView.SelectedItems.Contains(item.DataContext))
            {
                // With Ctrl key, toggle this item selection (deselect now).
                // Without Ctrl key, always select it (is already selected).
                if (IsControlKeyDown)
                {
                    if (!Deselect(item, true))
                    {
                        return(false);
                    }
                    item.IsSelected = false;
                }
            }
            else
            {
                var e = new PreviewSelectionChangedEventArgs(true, item.DataContext);
                OnPreviewSelectionChanged(e);
                if (e.CancelAny)
                {
                    FocusHelper.Focus(item, true);
                    return(false);
                }

                item.IsSelected = true;
                if (!treeView.SelectedItems.Contains(item.DataContext))
                {
                    treeView.SelectedItems.Add(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);
        }
Пример #21
0
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (!e.Handled)
            {
                Key key = e.Key;
                switch (key)
                {
                case Key.Left:
                    if (IsExpanded)
                    {
                        IsExpanded = false;
                    }

                    e.Handled = true;
                    break;

                case Key.Right:
                    if (CanExpand)
                    {
                        IsExpanded = true;
                    }

                    e.Handled = true;
                    break;

                case Key.Up:
                    ParentTreeView.Selection.SelectPreviousFromKey();
                    e.Handled = true;
                    break;

                case Key.Down:
                    ParentTreeView.Selection.SelectNextFromKey();
                    e.Handled = true;
                    break;

                case Key.Add:
                    if (CanExpandOnInput && !IsExpanded)
                    {
                        IsExpanded = true;
                    }

                    e.Handled = true;
                    break;

                case Key.Subtract:
                    if (CanExpandOnInput && IsExpanded)
                    {
                        IsExpanded = false;
                    }

                    e.Handled = true;
                    break;

                case Key.F2:
                    if (ContentTemplateEdit != null && IsFocused && IsEditable)
                    {
                        IsEditing = true;
                    }

                    e.Handled = true;
                    break;

                case Key.Escape:
                    StopEditing();
                    e.Handled = true;
                    break;

                case Key.Return:
                    FocusHelper.Focus(this);
                    IsEditing = false;
                    e.Handled = true;
                    break;

                case Key.Space:
                    ParentTreeView.Selection.SelectCurrentBySpace();
                    e.Handled = true;
                    break;

                case Key.Home:
                    ParentTreeView.Selection.SelectFirst();
                    e.Handled = true;
                    break;

                case Key.End:
                    ParentTreeView.Selection.SelectLast();
                    e.Handled = true;
                    break;
                }
            }
        }
 private void StopEditing()
 {
     FocusHelper.Focus(this, true);
     IsEditing = false;
 }
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (!e.Handled)
            {
                Key key = e.Key;
                switch (key)
                {
                case Key.Left:
                    if (IsExpanded)
                    {
                        IsExpanded = false;
                    }
                    else
                    {
                        ParentTreeView.Selection.SelectParentFromKey();
                    }
                    e.Handled = true;
                    break;

                case Key.Right:
                    if (CanExpand)
                    {
                        if (!IsExpanded)
                        {
                            IsExpanded = true;
                        }
                        else
                        {
                            ParentTreeView.Selection.SelectNextFromKey();
                        }
                    }
                    e.Handled = true;
                    break;

                case Key.Up:
                    ParentTreeView.Selection.SelectPreviousFromKey();
                    e.Handled = true;
                    break;

                case Key.Down:
                    ParentTreeView.Selection.SelectNextFromKey();
                    e.Handled = true;
                    break;

                case Key.Home:
                    ParentTreeView.Selection.SelectFirstFromKey();
                    e.Handled = true;
                    break;

                case Key.End:
                    ParentTreeView.Selection.SelectLastFromKey();
                    e.Handled = true;
                    break;

                case Key.PageUp:
                    ParentTreeView.Selection.SelectPageUpFromKey();
                    e.Handled = true;
                    break;

                case Key.PageDown:
                    ParentTreeView.Selection.SelectPageDownFromKey();
                    e.Handled = true;
                    break;

                case Key.A:
                    if (e.KeyboardDevice.Modifiers == ModifierKeys.Control)
                    {
                        ParentTreeView.Selection.SelectAllFromKey();
                        e.Handled = true;
                    }
                    break;

                case Key.Add:
                    if (CanExpandOnInput && !IsExpanded)
                    {
                        IsExpanded = true;
                    }
                    e.Handled = true;
                    break;

                case Key.Multiply:
                    if (CanExpandOnInput && !IsExpanded)
                    {
                        IsExpanded = true;
                        ParentTreeView.RecursiveExpand(this);
                    }
                    e.Handled = true;
                    break;

                case Key.Subtract:
                    if (CanExpandOnInput && IsExpanded)
                    {
                        IsExpanded = false;
                    }
                    e.Handled = true;
                    break;

                case Key.F2:
                    if (ParentTreeView.AllowEditItems && ContentTemplateEdit != null && IsFocused && IsEditable)
                    {
                        IsEditing = true;
                        e.Handled = true;
                    }
                    break;

                case Key.Escape:
                    StopEditing();
                    e.Handled = true;
                    break;

                case Key.Return:
                    FocusHelper.Focus(this, true);
                    IsEditing = false;
                    e.Handled = true;
                    break;

                case Key.Space:
                    ParentTreeView.Selection.SelectCurrentBySpace();
                    e.Handled = true;
                    break;
                }
            }
        }
Пример #24
0
        public void SelectFromUiAutomation(TreeViewExItem item)
        {
            SelectSingleItem(item);

            FocusHelper.Focus(item);
        }
Пример #25
0
        private void OnMouseMove(object sender, MouseEventArgs e)
        {
            if (mouseDown)
            {
                if (DateTime.UtcNow > lastScrollTime.AddMilliseconds(100))
                {
                    Point currentPointWin = Mouse.GetPosition(scrollViewer);
                    if (currentPointWin.Y < 16)
                    {
                        scrollViewer.LineUp();
                        scrollViewer.UpdateLayout();
                        lastScrollTime = DateTime.UtcNow;
                    }
                    if (currentPointWin.Y > scrollViewer.ActualHeight - 16)
                    {
                        scrollViewer.LineDown();
                        scrollViewer.UpdateLayout();
                        lastScrollTime = DateTime.UtcNow;
                    }
                }

                Point  currentPoint = Mouse.GetPosition(content);
                double width        = currentPoint.X - startPoint.X + 1;
                double height       = currentPoint.Y - startPoint.Y + 1;
                double left         = startPoint.X;
                double top          = startPoint.Y;

                if (isFirstMove)
                {
                    if (Math.Abs(width) <= SystemParameters.MinimumHorizontalDragDistance &&
                        Math.Abs(height) <= SystemParameters.MinimumVerticalDragDistance)
                    {
                        return;
                    }

                    isFirstMove = false;
                    if (!SelectionMultiple.IsControlKeyDown)
                    {
                        if (!treeView.ClearSelectionByRectangle())
                        {
                            EndAction();
                            return;
                        }
                    }
                }

                // Debug.WriteLine(string.Format("Drawing: {0};{1};{2};{3}",startPoint.X,startPoint.Y,width,height));
                if (width < 1)
                {
                    width = Math.Abs(width - 1) + 1;
                    left  = startPoint.X - width + 1;
                }

                if (height < 1)
                {
                    height = Math.Abs(height - 1) + 1;
                    top    = startPoint.Y - height + 1;
                }

                border.Width = width;
                Canvas.SetLeft(border, left);
                border.Height = height;
                Canvas.SetTop(border, top);

                border.Visibility = Visibility.Visible;

                double right  = left + width - 1;
                double bottom = top + height - 1;

                // Debug.WriteLine(string.Format("left:{1};right:{2};top:{3};bottom:{4}", null, left, right, top, bottom));
                SelectionMultiple selection = (SelectionMultiple)treeView.Selection;
                bool foundFocusItem         = false;
                foreach (var item in items)
                {
                    FrameworkElement itemContent = (FrameworkElement)item.Template.FindName("PART_Header", item);
                    if (itemContent == null)
                    {
                        continue;
                    }

                    Point  p          = ((FrameworkElement)itemContent.Parent).TransformToAncestor(content).Transform(new Point());
                    double itemLeft   = p.X;
                    double itemRight  = p.X + itemContent.ActualWidth - 1;
                    double itemTop    = p.Y;
                    double itemBottom = p.Y + itemContent.ActualHeight - 1;

                    // Debug.WriteLine(string.Format("element:{0};itemleft:{1};itemright:{2};itemtop:{3};itembottom:{4}",item.DataContext,itemLeft,itemRight,itemTop,itemBottom));

                    // Compute the current input states for determining the new selection state of the item
                    bool intersect       = !(itemLeft > right || itemRight <left || itemTop> bottom || itemBottom < top);
                    bool initialSelected = initialSelection != null && initialSelection.Contains(item.DataContext);
                    bool ctrl            = SelectionMultiple.IsControlKeyDown;

                    // Decision matrix:
                    // If the Ctrl key is pressed, each intersected item will be toggled from its initial selection.
                    // Without the Ctrl key, each intersected item is selected, others are deselected.
                    //
                    // newSelected
                    // ─────────┬───────────────────────
                    //          │ intersect
                    //          │  0        │  1
                    //          ├───────────┴───────────
                    //          │ initial
                    //          │  0  │  1  │  0  │  1
                    // ─────────┼─────┼─────┼─────┼─────
                    // ctrl  0  │  0  │  0  │  1  │  1   = intersect
                    // ─────────┼─────┼─────┼─────┼─────
                    //       1  │  0  │  1  │  1  │  0   = intersect XOR initial
                    //
                    bool newSelected = intersect ^ (initialSelected && ctrl);

                    // The new selection state for this item has been determined. Apply it.
                    if (newSelected)
                    {
                        // The item shall be selected
                        if (!treeView.SelectedItems.Contains(item.DataContext))
                        {
                            // The item is not currently selected. Try to select it.
                            if (!selection.SelectByRectangle(item))
                            {
                                if (selection.LastCancelAll)
                                {
                                    EndAction();
                                    return;
                                }
                            }
                        }
                    }
                    else
                    {
                        // The item shall be deselected
                        if (treeView.SelectedItems.Contains(item.DataContext))
                        {
                            // The item is currently selected. Try to deselect it.
                            if (!selection.DeselectByRectangle(item))
                            {
                                if (selection.LastCancelAll)
                                {
                                    EndAction();
                                    return;
                                }
                            }
                        }
                    }

                    // Always focus and bring into view the item under the mouse cursor
                    if (!foundFocusItem &&
                        currentPoint.X >= itemLeft && currentPoint.X <= itemRight &&
                        currentPoint.Y >= itemTop && currentPoint.Y <= itemBottom)
                    {
                        FocusHelper.Focus(item, true);
                        scrollViewer.UpdateLayout();
                        foundFocusItem = true;
                    }
                }

                if (e != null)
                {
                    e.Handled = true;
                }
            }
        }
Пример #26
0
        private void SelectCore(TreeViewExItem item)
        {
            if (IsControlKeyDown)
            {
                if (!treeViewEx.CheckSelectionAllowed(item.DataContext, true))
                {
                    return;
                }

                if (treeViewEx.SelectedItems.Contains(item.DataContext))
                {
                    throw new InvalidOperationException("The item must not be contained.");
                }

                treeViewEx.SelectedItems.Add(item.DataContext);
                item.IsSelected = true;
                lastShiftRoot   = item.DataContext;
            }
            else if (IsShiftKeyDown && treeViewEx.SelectedItems.Count > 0)
            {
                object         firstSelectedItem = lastShiftRoot ?? treeViewEx.SelectedItems.First();
                TreeViewExItem shiftRootItem     = treeViewEx.GetTreeViewItemsFor(new List <object> {
                    firstSelectedItem
                }).First();

                IEnumerable <object> items = treeViewEx.GetNodesToSelectBetween(shiftRootItem, item).Select(x => x.DataContext);

                IEnumerable <object> itemsToSelect   = GetItemsNotInCollection((IEnumerable <object>)treeViewEx.SelectedItems, items);
                IEnumerable <object> itemsToUnSelect = GetItemsNotInCollection(items, (IEnumerable <object>)treeViewEx.SelectedItems);
                if (!treeViewEx.CheckSelectionAllowed(itemsToSelect, itemsToUnSelect))
                {
                    return;
                }

                treeViewEx.SelectedItems.Clear();

                foreach (var node in TreeViewEx.RecursiveTreeViewItemEnumerable(treeViewEx, false))
                {
                    if (items.Contains(node.DataContext))
                    {
                        treeViewEx.SelectedItems.Add(node.DataContext);
                        node.IsSelected = true;
                    }
                    else
                    {
                        node.IsSelected = false;
                    }
                }
            }
            else
            {
                if (!treeViewEx.CheckSelectionAllowed(item.DataContext, true))
                {
                    return;
                }

                // check if selection is already item, otherwise set it
                if (!(treeViewEx.SelectedItems.Count == 1 && treeViewEx.SelectedItems[0] == item.DataContext))
                {
                    foreach (var treeViewItem in TreeViewEx.RecursiveTreeViewItemEnumerable(treeViewEx, false))
                    {
                        treeViewItem.IsSelected = false;
                    }

                    treeViewEx.SelectedItems.Clear();
                    treeViewEx.SelectedItems.Add(item.DataContext);
                }

                lastShiftRoot = item.DataContext;
            }

            FocusHelper.Focus(item);
        }