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); }
public void OnMessageOccured(MessageArgs m) { MessageOccured?.Invoke(this, m); }