private bool ValidateTreeView(ProjectEditor editor, DragEventArgs e, bool bExecute, TreeView tree) { var sourceItem = e.Data.Get(DragDataFormats.Parent); var targetItem = (e.Source as IControl)?.Parent?.Parent; if (sourceItem is TreeViewItem source && targetItem is TreeViewItem target) { var sourceData = source.DataContext; var targetData = target.DataContext; switch (sourceData) { case LayerContainer sourceLayer: { switch (targetData) { case LayerContainer targetLayer: { if (bExecute) { // TODO: } return(true); } case PageContainer targetPage: { if (e.DragEffects == DragDropEffects.Copy) { if (bExecute) { var layer = editor?.Clone(sourceLayer); editor?.Project.AddLayer(targetPage, layer); } return(true); } else if (e.DragEffects == DragDropEffects.Move) { if (bExecute) { editor?.Project?.RemoveLayer(sourceLayer); editor?.Project.AddLayer(targetPage, sourceLayer); } return(true); } else if (e.DragEffects == DragDropEffects.Link) { if (bExecute) { editor?.Project.AddLayer(targetPage, sourceLayer); e.DragEffects = DragDropEffects.None; } return(true); } return(false); } case DocumentContainer targetDocument: { if (bExecute) { // TODO: } return(true); } } return(false); } case PageContainer sourcePage: { switch (targetData) { case LayerContainer targetLayer: { if (bExecute) { // TODO: } return(true); } case PageContainer targetPage: { if (bExecute) { // TODO: } return(true); } case DocumentContainer targetDocument: { if (e.DragEffects == DragDropEffects.Copy) { if (bExecute) { var page = editor?.Clone(sourcePage); editor?.Project.AddPage(targetDocument, page); editor?.Project?.SetCurrentContainer(page); } return(true); } else if (e.DragEffects == DragDropEffects.Move) { if (bExecute) { editor?.Project?.RemovePage(sourcePage); editor?.Project.AddPage(targetDocument, sourcePage); editor?.Project?.SetCurrentContainer(sourcePage); } return(true); } else if (e.DragEffects == DragDropEffects.Link) { if (bExecute) { editor?.Project.AddPage(targetDocument, sourcePage); editor?.Project?.SetCurrentContainer(sourcePage); } return(true); } return(false); } } return(false); } case DocumentContainer sourceDocument: { switch (targetData) { case LayerContainer targetLayer: { if (bExecute) { // TODO: } return(true); } case PageContainer targetPage: { if (bExecute) { // TODO: } return(true); } case DocumentContainer targetDocument: { if (bExecute) { // TODO: } return(true); } } return(false); } } } return(false); }