TokenEditorPresenter FindNearestPresenter(Point p)
        {
            var panel = LayoutTreeHelper.GetVisualChildren(AssociatedObject).OfType <TokenEditorPanel>().FirstOrDefault();

            if (panel?.Children == null)
            {
                return(null);
            }
            var distance = double.MaxValue;
            TokenEditorPresenter presenter = null;

            for (int i = 0; i < panel.Children.Count; i++)
            {
                var child = panel.Children[i] as TokenEditorPresenter;
                if (child.IsNewTokenEditorPresenter)
                {
                    continue;
                }
                var bounds = child.TransformToVisual(AssociatedObject).TransformBounds(new Rect(child.RenderSize));
                var center = new Point(bounds.X + bounds.Width / 2.0, bounds.Y + bounds.Height / 2.0);
                var length = (center - p).LengthSquared;
                if (distance > length)
                {
                    distance  = length;
                    presenter = child;
                }
            }
            return(presenter);
        }
        void AddAdorner(TokenEditorPresenter tokenEditorPresenter, Position position)
        {
            RemoveAdorner();
            var adornerLayer = AdornerLayer.GetAdornerLayer(tokenEditorPresenter);

            adornerLayer.Add(new PositionAdorner(tokenEditorPresenter, position));
            adornedElement = tokenEditorPresenter;
        }