public override void OnMouseMove(MouseActionEventArgs e)
        {
            base.OnMouseMove(e);
            Resolved = Resolved && Source != null;

            if (Resolved && (e.Button != MouseActionButtons.Left))
            {
                EndAction();
            }
            if (Resolved && !Dragging)
            {
                Dragging = true;
                InprocDragDrop.Dragging = true;
                InprocDragDrop.Data     = new GraphCursor <IVisual, IVisualEdge>(Scene.Graph, Source);

                try {
                    var startData =
                        new DragStartData(
                            DragDropViz.TransferDataOfVisual(Scene.Graph, Source),
                            DragDropAction.All,
                            GetDragImageBackend(Scene.Graph, Source),
                            e.Location.X, e.Location.Y);

                    DragDropHandler.DragStart(startData);
                } catch {} finally {
                    EndAction();
                }
            }
        }
        public virtual void Paste()
        {
            var     scene = this.Scene;
            IVisual item  = null;

#if TRACE
            Trace.WriteLine($"{this.GetType ().Name}.{nameof(Paste)}:\t" + string.Join(" | ", Clipboard.GetTypesAvailable().Select(f => f.Id)));
#endif
            if (InprocDragDrop.ClipboardData != null)
            {
                // TODO: refactor to use same code as above
                var source = InprocDragDrop.ClipboardData as GraphCursor <IVisual, IVisualEdge>;
                if (source != null && source.Cursor != item)
                {
                    item = Mesh.LookUp(source.Graph, scene.Graph, source.Cursor);
                    if (item == null)
                    {
                        //TODO: error here
                        //return;
                    }
                }
            }

            if (item == null)
            {
                item = DragDropViz.VisualOfTransferData(scene.Graph, Clipboard.GetTransferData(Clipboard.GetTypesAvailable())); //DragDropViz.DataManager.DataTypes));
            }
            if (item != null)
            {
                SceneExtensions.PlaceVisual(scene, scene.Focused, item, Layout);
            }
        }
        public virtual void Copy()
        {
            if (false)
            {
                // TODO: it has to be cleared, if the next stuff is copied into clipboard
                // a clipboard Pasted-Event is needed
                InprocDragDrop.ClipboardData = new GraphCursor <IVisual, IVisualEdge>(Scene.Graph, Scene.Focused);
            }

            if (Scene.Focused == null)
            {
                Registry.Pooled <IMessageBoxShow> ().Show("Warning", "Select something to copy", MessageBoxButtons.Ok);
                return;
            }

            Clipboard.SetTransferData(DragDropViz.TransferDataOfVisual(Scene.Graph, Scene.Focused));
        }
        public override void Dropped(DragEventArgs e)
        {
            var pt     = Camera.ToSource(e.Position);
            var scene  = this.Scene;
            var target = scene.Hovered ?? HitTestFocused(e.Position);

            IVisual item = null;

            if (Dragging && Dropping)
            {
                // the current Drop has started in this instance
                // so we make a link
                if (target != null && Source != target)
                {
                    SceneExtensions.CreateEdge(scene, Source, target);
                }
                e.Success = true;
                return;
            }

            if (InprocDragDrop.Dragging)
            {
                var source = InprocDragDrop.Data as GraphCursor <IVisual, IVisualEdge>;
                if (source != null && source.Cursor != target)
                {
                    item = Mesh.LookUp(source.Graph, scene.Graph, source.Cursor);
                    if (item == null)
                    {
                        //TODO: error here
                        //return;
                    }
                }
            }

            if (item == null)
            {
                item = DragDropViz.VisualOfTransferData(scene.Graph, e.Data);
                if (item != null)
                {
                    item.Location = pt;
                }
            }

            if (item != null)
            {
                SceneExtensions.AddItem(scene, item, Layout, pt);
                if (target != null && !scene.Graph.Edges(target).Any(edge => edge.Leaf == item || edge.Root == item))
                {
                    SceneExtensions.CreateEdge(scene, target, item);
                }
            }
            else
            {
                // no known type found to import
                string dt = "not found:\t";
            }

            InprocDragDrop.Data     = null;
            InprocDragDrop.Dragging = false;
            Dragging = false;
        }
 public override TransferDataSource GetTransferData()
 {
     return(DragDropViz.TransferDataOfVisual(this.Scene.Graph, this.Scene.Focused));
 }