private void MoveNode(NodeWriteAccess nodeToMove, NodeWriteAccess targetNode, DropLocation operation) { var siblings = targetNode.Siblings; var dropPos = siblings.IndexOf(targetNode); if (operation == DropLocation.After) { dropPos++; } if (siblings.Contains(nodeToMove)) { var oldPos = siblings.IndexOf(nodeToMove); if (oldPos < dropPos) { // ObservableCollection first removes the item and then reinserts which invalidates the index dropPos--; } siblings.Move(oldPos, dropPos); } else { if (dropPos < siblings.Count) { ChangeParent(nodeToMove, n => siblings.Insert(dropPos, n), targetNode.GetParent()); } else { ChangeParent(nodeToMove, n => siblings.Add(n), targetNode.GetParent()); } } }
private void ChangeParent(NodeWriteAccess nodeToMove, Action <NodeWriteAccess> insertionOperation, NodeWriteAccess newParent) { var oldParent = nodeToMove.GetParent(); oldParent.Children.Remove(nodeToMove); insertionOperation(nodeToMove); nodeToMove.SetParent(newParent.Node); }
public void ApplyDrop(NodeDropRequest request) { var droppedNode = new NodeWriteAccess(request.DroppedNode); var dropTarget = new NodeWriteAccess(request.DropTarget); if (request.DropTarget == myRoot) { ChangeParent(droppedNode, n => myRoot.Children.Add(n), myRoot); } else if (request.Location == DropLocation.Before || request.Location == DropLocation.After) { MoveNode(droppedNode, dropTarget, request.Location); } else { ChangeParent(droppedNode, n => dropTarget.Children.Add(n), dropTarget); } }
public bool Contains(NodeWriteAccess node) { return(myCollection.Contains(node.Node)); }
public int IndexOf(NodeWriteAccess node) { return(myCollection.IndexOf(node.Node)); }
public void Remove(NodeWriteAccess node) { (( IList )myCollection).Remove(node.Node); }
public void Insert(int pos, NodeWriteAccess node) { (( IList )myCollection).Insert(pos, node.Node); }
public void Add(NodeWriteAccess node) { (( IList )myCollection).Add(node.Node); }
public DragDropBehavior(INode root) { Contract.RequiresNotNull(root, "root"); myRoot = new NodeWriteAccess(root); }