Ejemplo n.º 1
0
        private bool MoveSelectedItems(SelectedListItemSet selectedItemSet, NodeTarget target)
        {
            if (target == null)
            {
                return(false);
            }

            ITreeFolder[] selectedFolders = selectedItemSet
                                            .Where(item => item is ITreeFolder)
                                            .Select(item => item as ITreeFolder).ToArray();

            //자신 내부에 이동시도시 Reject
            foreach (ITreeFolder folder in selectedFolders)
            {
                if (folder == target.node)
                {
                    return(false);
                }

                if (IsContainsChildRecursive(folder, target.node))
                {
                    MessageOccured?.Invoke("자신의 하위 폴더로 이동할 수 없습니다.");
                    return(false);
                }
            }

            //정렬
            ITreeItem[] sortedSelectedItems = CollectSelectedItems();

            //이동
            if (target.node is ITreeFolder && target.direction == NodeDirection.Bottom && ((ITreeFolder)target.node).ChildItemCollection.Count > 0)
            {
                target.direction = NodeDirection.InnerTop;
            }
            if (target.direction == NodeDirection.Bottom || target.direction == NodeDirection.InnerTop)
            {
                sortedSelectedItems = sortedSelectedItems.Reverse().ToArray();
            }
            foreach (ITreeItem item in sortedSelectedItems)
            {
                ITreeFolder oldParent = item.ParentItem;
                ITreeFolder newParent = null;
                int         index     = -1;

                FrameworkElement uiItem = (FrameworkElement)item;

                if (oldParent != null)
                {
                    oldParent.ChildItemCollection.Remove(item as UIElement);
                }
                else if (uiItem.Parent != null)
                {
                    ((Panel)uiItem.Parent).Children.Remove(uiItem);
                }

                if (target.direction == NodeDirection.InnerTop)
                {
                    //폴더 내부로
                    newParent = target.node as ITreeFolder;
                    index     = 0;
                }
                else if (target.direction == NodeDirection.InnerBottom)
                {
                    //폴더 내부로
                    newParent = target.node as ITreeFolder;
                    index     = newParent.ChildItemCollection.Count;
                }
                else
                {
                    //아이템 위아래로
                    newParent = target.node.ParentItem;
                    index     = newParent.ChildItemCollection.IndexOf(target.node as UIElement) +
                                (target.direction == NodeDirection.Bottom ? 1 : 0);
                }
                if (AutoApplyItemMove)
                {
                    newParent.ChildItemCollection.Insert(index, item as UIElement);
                }

                item.ParentItem = newParent;

                ItemMoved?.Invoke(item, oldParent, newParent, index);
            }
            return(true);
        }
Ejemplo n.º 2
0
 public void OnMessageOccured(MessageArgs m)
 {
     MessageOccured?.Invoke(this, m);
 }