private void HandleDragOverSection([NotNull] DragDataDescriptor descriptor, [NotNull] DragEventArgs e)
        {
            Debug.ArgumentNotNull(descriptor, nameof(descriptor));
            Debug.ArgumentNotNull(e, nameof(e));

            var source        = GetDragSource(e.OriginalSource);
            var targetSection = source as UI.TemplateDesigner.TemplateSection;

            if (targetSection == null)
            {
                return;
            }

            if (targetSection.IsLastSection())
            {
                return;
            }

            if (targetSection == descriptor.Data)
            {
                return;
            }

            var position = e.GetPosition(targetSection);
            var sy       = position.Y < targetSection.ActualHeight / 2 ? 0 : targetSection.ActualHeight;
            var p        = targetSection.TranslatePoint(new Point(0, sy), this);

            descriptor.TargetSection  = targetSection.Section;
            descriptor.PositionBefore = sy == 0;

            SetAdorner((int)p.Y);
            e.Effects = DragDropEffects.Move;
        }
        public void HandleMouseMove([NotNull] object sender, [NotNull] MouseEventArgs e)
        {
            Assert.ArgumentNotNull(sender, nameof(sender));
            Assert.ArgumentNotNull(e, nameof(e));

            if (!DragManager.IsDragStart(this, e, ref _origin))
            {
                return;
            }

            var sectionControl = sender as UI.TemplateDesigner.TemplateSection;

            if (sectionControl != null && sectionControl.IsLastSection())
            {
                return;
            }

            var fieldControl = sender as UI.TemplateDesigner.TemplateField;

            if (fieldControl != null && fieldControl.IsLastField())
            {
                return;
            }

            var descriptor = new DragDataDescriptor
            {
                Type             = sender is UI.TemplateDesigner.TemplateSection ? @"section" : @"field",
                Data             = sender,
                TemplateDesigner = this
            };

            var dragData = new DataObject(@"SitecoreTemplateDesigner", descriptor);

            DragManager.DoDragDrop(this, dragData, DragDropEffects.Move);

            SetAdorner(-1);

            e.Handled = true;
        }
        private void HandleDragOverField([NotNull] DragDataDescriptor descriptor, [NotNull] DragEventArgs e)
        {
            Debug.ArgumentNotNull(descriptor, nameof(descriptor));
            Debug.ArgumentNotNull(e, nameof(e));

            var field = descriptor.Data as UI.TemplateDesigner.TemplateField;

            if (field == null)
            {
                return;
            }

            var y = -1;

            var source        = GetDragSource(e.OriginalSource);
            var targetSection = source as UI.TemplateDesigner.TemplateSection;
            var targetField   = source as UI.TemplateDesigner.TemplateField;

            if (targetSection != null)
            {
                if (targetSection.IsLastSection())
                {
                    return;
                }

                if (targetSection.Section == field.Field.Section)
                {
                    return;
                }

                var fieldStack = targetSection.FieldStack;
                if (fieldStack.Children.Count == 0)
                {
                    return;
                }

                var element = fieldStack.Children[fieldStack.Children.Count - 1];
                y = (int)element.TranslatePoint(new Point(0, 0), this).Y;

                descriptor.TargetSection = targetSection.Section;
                descriptor.Field         = null;
            }
            else if (targetField != null)
            {
                if (targetField == field)
                {
                    return;
                }

                if (targetField.IsLastField())
                {
                    return;
                }

                var position = e.GetPosition(targetField);
                var fy       = position.Y < targetField.ActualHeight / 2 ? 0 : targetField.ActualHeight;
                y = (int)targetField.TranslatePoint(new Point(0, fy), this).Y;

                descriptor.TargetSection  = targetField.Field.Section;
                descriptor.Field          = targetField.Field;
                descriptor.PositionBefore = fy == 0;
            }

            if (y == -1)
            {
                return;
            }

            SetAdorner(y);
            e.Effects = DragDropEffects.Move;
        }