private void SetIndent(TreeViewItem parent, ref int siblingIndex) { while(true) { TreeViewItem child = (TreeViewItem)m_treeView.GetItemContainer(siblingIndex + 1); if(child == null) { return; } if(child.Parent != parent) { return; } child.m_indent = parent.m_indent + m_treeView.Indent; child.m_itemLayout.padding.left = child.m_indent; siblingIndex++; SetIndent(child, ref siblingIndex); } }
/// <summary> /// Get Next Child Of TreeViewItem /// </summary> /// <param name="currentChild"></param> /// <returns>next treeview item after current child</returns> public TreeViewItem NextChild(TreeViewItem currentChild) { if(currentChild == null) { throw new ArgumentNullException("currentChild"); } int siblingIndex = currentChild.transform.GetSiblingIndex(); siblingIndex++; TreeViewItem nextChild = (TreeViewItem)m_treeView.GetItemContainer(siblingIndex); while(nextChild != null && nextChild.IsDescendantOf(this)) { if(nextChild.Parent == this) { return nextChild; } siblingIndex++; nextChild = (TreeViewItem)m_treeView.GetItemContainer(siblingIndex); } return null; }
/// <summary> /// Is treeviewitem is descendant of another element /// </summary> /// <param name="ancestor">treeview item to test</param> /// <returns>true if treeview item is descendant of ancestor</returns> public bool IsDescendantOf(TreeViewItem ancestor) { if (ancestor == null) { return true; } if(ancestor == this) { return false; } TreeViewItem testItem = this; while (testItem != null) { if (ancestor == testItem) { return true; } testItem = testItem.Parent; } return false; }
public ParentChangedEventArgs(TreeViewItem oldParent, TreeViewItem newParent) { OldParent = oldParent; NewParent = newParent; }
private void OnTreeViewItemParentChanged(object sender, ParentChangedEventArgs e) { TreeViewItem tvItem = (TreeViewItem)sender; if (!CanHandleEvent(tvItem)) { return; } TreeViewItem oldParent = e.OldParent; if (DropMarker.Action != ItemDropAction.SetLastChild && DropMarker.Action != ItemDropAction.None) { if (oldParent != null && !oldParent.HasChildren) { oldParent.CanExpand = false; } return; } TreeViewItem tvDropTarget = e.NewParent; if (tvDropTarget != null) { if (tvDropTarget.CanExpand) { tvDropTarget.IsExpanded = true; } else { tvDropTarget.CanExpand = true; m_expandSilently = true; tvDropTarget.IsExpanded = true; m_expandSilently = false; } } TreeViewItem dragItemChild = tvItem.FirstChild(); TreeViewItem lastChild = null; if (tvDropTarget != null) { lastChild = tvDropTarget.LastChild(); if (lastChild == null) { lastChild = tvDropTarget; } } else { lastChild = (TreeViewItem)LastItemContainer(); } if (lastChild != tvItem) { TreeViewItem lastDescendant = lastChild.LastDescendant(); if (lastDescendant != null) { lastChild = lastDescendant; } if (!lastChild.IsDescendantOf(tvItem)) { DropItemAfter(lastChild, tvItem); } } if (dragItemChild != null) { MoveSubtree(tvItem, dragItemChild); } if (oldParent != null && !oldParent.HasChildren) { oldParent.CanExpand = false; } }