private bool replaceNode(Node node, Node newnode) { if (node == null || !node.IsFSM && node.ParentConnector == null || newnode == null) { return false; } bool replaced = (node.Children.Count == 0); if (!replaced && newnode.CanAdoptChildren(node)) { foreach(Node.Connector connector in node.Connectors) { Node.Connector newConnector = newnode.GetConnector(connector.Identifier); if (newConnector != null) { for (int i = 0; i < connector.ChildCount; ++i) { replaced |= newnode.AddChild(newConnector, (Node)connector.GetChild(i)); } connector.ClearChildrenInternal(); } } } if (replaced) { Node parentNode = (Node)node.Parent; if (node.IsFSM) { Debug.Check(newnode.IsFSM); parentNode.RemoveFSMNode(node); parentNode.AddFSMNode(newnode); newnode.ScreenLocation = node.ScreenLocation; } else { Node.Connector parentConnector = node.ParentConnector; Debug.Check(parentConnector != null); int index = parentConnector.GetChildIndex(node); Debug.Check(index >= 0); parentNode.RemoveChild(parentConnector, node); parentNode.AddChild(parentConnector, newnode, index); } foreach (Attachments.Attachment attach in node.Attachments) { if (attach != null && newnode.AcceptsAttachment(attach)) newnode.AddAttachment(attach); } } return replaced; }