Inheritance: System.Windows.Controls.HeaderedItemsControl
		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;
        }
示例#3
0
 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));
        }
示例#9
0
        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;
		}
示例#19
0
		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;
		}