public void ModelChanged(object sender, ModelChangedEventArgs<Node, Relationship> e)
{
NodeControl focusedNode = null;
var controller = sender as SuperGraphController;
if (controller != null)
{
Context = controller.Context;
}
/// TODO: Need to refactor the following to be self-contained.
foreach (KeyValuePair<Node, ModelOperationType> viewModelNodeOperation in e.Nodes)
{
if (viewModelNodeOperation.Value == ModelOperationType.New ||
viewModelNodeOperation.Value == ModelOperationType.Clone)
{
var viewModelNode = viewModelNodeOperation.Key;
var nodeControl = NodeFactory.CreateNode(viewModelNode, this);
if (nodeControl != null && !NodeContainer.Children.Contains(nodeControl))
{
nodeControl.RenderTransform = MoveGraphTransform;
nodeControl.CutClicked += OnCutClicked;
nodeControl.CopyClicked += OnCopyClicked;
nodeControl.CloneClicked += OnCloneClicked;
nodeControl.NodeClicked += OnNodeClicked;
nodeControl.ChangeNodeTypeClicked += OnChangeNodeTypeClicked;
nodeControl.NodeSelected += OnNodeSelected;
if (viewModelNode.IsFocused)
{
focusedNode = nodeControl;
}
//nodeControl.NodeCornerControl.DataContext = viewModelNode;
NodeContainer.Children.Add(nodeControl);
}
}
else if (viewModelNodeOperation.Value == ModelOperationType.Deleted)
{
var viewModelNode = viewModelNodeOperation.Key;
if (viewModelNode == null)
{
continue;
}
var removedNodeSet = NodeFactory.RemoveNode(viewModelNode);
if (removedNodeSet != null)
{
NodeContainer.Children.Remove(removedNodeSet.Control);
if (removedNodeSet.Control != null)
{
removedNodeSet.Control.Dispose();
}
}
var irrelevantArrowSets = ArrowFactory.RemoveArrows(viewModelNode);
foreach (ArrowControlFactorySet irrelevantArrowSet in irrelevantArrowSets)
{
NodeContainer.Children.Remove(irrelevantArrowSet.Control);
}
}
}
var arrows = ArrowFactory.ReassessPendingRelationships();
foreach (ArrowControl arrow in arrows)
{
NodeContainer.Children.Add(arrow);
}
/// TODO: Need to refactor the following to be self-contained.
foreach (KeyValuePair<Relationship, ModelOperationType> viewModelRelationshipOperation in e.Relationships)
{
if (viewModelRelationshipOperation.Value == ModelOperationType.New)
{
var viewModelRelationship = viewModelRelationshipOperation.Key;
var arrow = ArrowFactory.CreateArrow(viewModelRelationship);
if (arrow != null)
{
arrow.RenderTransform = MoveGraphTransform;
arrow.Ref = this;
if (!NodeContainer.Children.Contains(arrow))
{
NodeContainer.Children.Add(arrow);
}
}
}
else if (viewModelRelationshipOperation.Value == ModelOperationType.Deleted)
{
var viewModelRelationship = viewModelRelationshipOperation.Key;
var arrowSet = ArrowFactory.RemoveArrow(viewModelRelationship);
if (arrowSet != null)
{
NodeContainer.Children.Remove(arrowSet.Control);
arrowSet.Control.UnlinkRelatedNodeControls();
}
}
}
GC.Collect();
NodeContainer.InvalidateArrange();
if (focusedNode != null && focusedNode.Name.Trim().Length == 0)
{
focusedNode.SetEditFocus();
focusedNode.GiveEditorFocus();
}
}