private void InsertRenderings([CanBeNull] LayoutDesignerItem target, ControlDragAdornerPosition position, [NotNull] IEnumerable <IItem> items)
        {
            Debug.ArgumentNotNull(items, nameof(items));

            int index;

            if (target != null)
            {
                index = this.items.IndexOf(target);
                if (position == ControlDragAdornerPosition.Bottom)
                {
                    index++;
                }
            }
            else
            {
                index = this.items.Count;
            }

            string placeholderKey  = null;
            var    renderingTarget = target as RenderingItem;

            if (renderingTarget != null)
            {
                placeholderKey = renderingTarget.PlaceholderKey.Key;
            }

            var modified = false;
            LayoutDesignerItem selectedRendering = null;

            foreach (var item in items)
            {
                var renderingItem = new RenderingItem(this, item);

                var layoutItem = AddRendering(renderingItem, index, index);

                var rendering = layoutItem as RenderingItem;
                if (rendering != null && string.IsNullOrEmpty(rendering.PlaceholderKey.Key) && !string.IsNullOrEmpty(placeholderKey))
                {
                    rendering.PlaceholderKey = new PlaceHolderKey(placeholderKey);
                }

                if (selectedRendering == null)
                {
                    selectedRendering = layoutItem;
                }

                modified = true;
            }

            List.SelectedItem = selectedRendering;
            Keyboard.Focus(List);
            if (modified)
            {
                Modified = true;
            }
        }
        private void Update(ControlDragAdornerPosition position)
        {
            LastPosition = position;

            _adorner.Position = position;

            var adornerLayer = AdornerLayer.GetAdornerLayer(Control);

            adornerLayer.Update();
        }
        public ControlDragAdorner([NotNull] FrameworkElement control, ControlDragAdornerPosition allowedPositions)
        {
            Assert.ArgumentNotNull(control, nameof(control));

            Control          = control;
            AllowedPositions = allowedPositions;

            control.DragEnter += ControlDragEnter;
            control.DragLeave += ControlDragLeave;
            control.DragOver  += ControlDragMove;
            control.Drop      += ControlDrop;
        }
        public static void GetSortOrder([NotNull] ItemTreeViewItem target, ControlDragAdornerPosition position, int itemCount, out int sortOrder, out int sortOrderDelta, [CanBeNull] out ItemTreeViewItem parent, [CanBeNull] out ItemTreeViewItem anchor)
        {
            Debug.ArgumentNotNull(target, nameof(target));

            if (position == ControlDragAdornerPosition.Top)
            {
                GetBeforeSortOrder(target, itemCount, out sortOrder, out sortOrderDelta, out parent, out anchor);
                return;
            }

            GetAfterSortOrder(target, itemCount, out sortOrder, out sortOrderDelta, out parent, out anchor);
        }
        public DragCopyPipeline WithParameters([NotNull] ItemTreeViewItem target, [NotNull] IEnumerable <IItem> items, ControlDragAdornerPosition position, DragDropKeyStates keyStates)
        {
            Assert.ArgumentNotNull(target, nameof(target));
            Assert.ArgumentNotNull(items, nameof(items));

            KeyStates = keyStates;
            Target    = target;
            Items     = items;
            Position  = position;

            Start();

            return(this);
        }
        private void MoveRenderings([CanBeNull] LayoutDesignerItem target, ControlDragAdornerPosition position)
        {
            var selectedItems = new List <LayoutDesignerItem>();

            foreach (var selectedItem in List.SelectedItems.OfType <LayoutDesignerItem>())
            {
                selectedItems.Add(selectedItem);
            }

            if ((Keyboard.Modifiers & ModifierKeys.Shift) != ModifierKeys.Shift)
            {
                var text = string.Format("Are you sure you want to move these {0} elements?", selectedItems.Count);

                if (selectedItems.Count == 1)
                {
                    var selectedItem = selectedItems.First();

                    var renderingItem = selectedItem as RenderingItem;
                    if (renderingItem != null)
                    {
                        text = string.Format("Are you sure you want to move the '{0}' rendering?", renderingItem.GetDisplayName());
                    }

                    var placeholderItem = selectedItem as PlaceholderItem;
                    if (placeholderItem != null)
                    {
                        text = string.Format("Are you sure you want to move the '{0}' placeholder?", placeholderItem.Name);
                    }
                }

                if (AppHost.MessageBox(text, "Confirmation", MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK)
                {
                    return;
                }
            }

            var index = target != null?items.IndexOf(target) : items.Count;

            foreach (var selectedItem in selectedItems)
            {
                var i = items.IndexOf(selectedItem);

                if (i < index)
                {
                    index--;
                }

                items.Remove(selectedItem);
            }

            if (target != null && items.IndexOf(target) >= 0 && position == ControlDragAdornerPosition.Bottom)
            {
                index++;
            }

            if (index < 0)
            {
                index = 0;
            }

            var    modified = false;
            object selected = null;

            for (var n = selectedItems.Count - 1; n >= 0; n--)
            {
                var selectedItem = selectedItems[n];

                if (selected == null)
                {
                    selected = selectedItem;
                }

                items.Insert(index, selectedItem);
                modified = true;
            }

            List.SelectedItem = selected;

            if (modified)
            {
                Modified = true;
            }
        }
        private void CopyRenderings([CanBeNull] LayoutDesignerItem target, ControlDragAdornerPosition position)
        {
            var selectedItems = List.SelectedItems.OfType <RenderingItem>().ToList();

            if (!selectedItems.Any())
            {
                return;
            }

            var index = target != null?items.IndexOf(target) : items.Count;

            if (target != null && items.IndexOf(target) >= 0 && position == ControlDragAdornerPosition.Bottom)
            {
                index++;
            }

            if (index < 0)
            {
                index = 0;
            }

            string placeholderKey = null;

            var renderingTarget = target as RenderingItem;

            if (renderingTarget != null)
            {
                placeholderKey = renderingTarget.PlaceholderKey.Key;
            }

            var writer = new StringWriter();
            var output = new XmlTextWriter(writer);

            output.WriteStartElement("renderings");

            foreach (var selectedItem in selectedItems)
            {
                selectedItem.Write(output, true);
            }

            output.WriteEndElement();

            var root = writer.ToString().ToXElement();

            if (root == null)
            {
                return;
            }

            var renderings = root.Elements().Select(element => new RenderingItem(this, DatabaseUri, element, true)).ToList();

            foreach (var rendering in renderings)
            {
                items.Insert(index, rendering);

                if (!string.IsNullOrEmpty(placeholderKey))
                {
                    rendering.PlaceholderKey = new PlaceHolderKey(placeholderKey);
                }
            }

            List.SelectedItem = renderings.FirstOrDefault();
            Modified          = true;
        }