public override void ChangeEdge(TEdge sinkEdge, TItem newItem, bool changeRoot) { Func <TItem> getItem = () => changeRoot ? sinkEdge.Root : sinkEdge.Leaf; Action <TItem> setItem = item => { if (changeRoot) { sinkEdge.Root = item; } else { sinkEdge.Leaf = item; } }; var itemBefore = getItem(); Source.ChangeEdge(sinkEdge, newItem, changeRoot); var lockObj = (object)sinkEdge; lock (lockObj) { // revert the changes, otherwise edge is not removed from Sink.Edges(itemBefore) setItem(itemBefore); Sink.ChangeEdge(sinkEdge, newItem, changeRoot); // ensure the changes are done if (!object.Equals(getItem(), newItem)) { setItem(newItem); } } }
public bool ChangeEdge(IVisualEdge edge, IVisual target, bool asRoot) { bool result = true; // test if there is a loop: if (target is IVisualEdge) { foreach (var visual in this.Twig(edge)) { if (visual == target) { return(false); } } } Graph.ChangeEdge(edge, target, asRoot); if (result) { State.Dirty = true; } return(result); }