Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
        }