using GongSolutions.Wpf.DragDrop; using NationalInstruments.TestStand.Interop.API; using Plugin.SeqEditor.Entity; using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; namespace Plugin.SeqEditor.ViewModel { public class TreeListViewHandler : DefaultDropHandler { private SeqEditorViewModel model; public TreeListViewHandler(SeqEditorViewModel model) { this.model = model; } public bool CanConvert(IDropInfo dropInfo) { if (!(dropInfo.TargetItem is StepUI target)) { return false; } if (!(dropInfo.Data is StepUI source)) { return false; } if (source == target) { return false; } if (target.sequence != source.sequence) { return false; } return true; } public override void DragOver(IDropInfo dropInfo) { if (CanConvert(dropInfo)) { dropInfo.Effects = DragDropEffects.Move; if (dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.TargetItemCenter)) { dropInfo.DropTargetAdorner = null; } else { dropInfo.DropTargetAdorner = DropTargetAdorners.Insert; } //if (dropInfo.DropTargetAdorner == DropTargetAdorners.Highlight) { //} //dropInfo.DropTargetAdorner = DropTargetAdorners.Insert; dropInfo.DropTargetHintState = DropHintState.Active; dropInfo.DropTargetHintAdorner = DropTargetAdorners.Hint; } else { dropInfo.Effects = DragDropEffects.None; dropInfo.DropTargetHintAdorner = DropTargetAdorners.Hint; dropInfo.DropTargetHintState = DropHintState.Error; } } public override void Drop(IDropInfo dropInfo) { if (!CanConvert(dropInfo)) { return; } //var sourceItem = (TreeItemData)dropInfo.Data; //var targetItem = (TreeItemData)dropInfo.TargetItem; var source = dropInfo.Data as StepUI; var target = dropInfo.TargetItem as StepUI; int sourceIndex = source.IndexInSequence; int targetIndex = target.IndexInSequence; if (sourceIndex == targetIndex) { return; } bool insertBefore = dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.BeforeTargetItem); if (!insertBefore && (sourceIndex == targetIndex + 1)) { return; } ObservableCollection datasource = model.sequenceCache[source.sequence]; int uiSourceIndex = datasource.IndexOf(source); int uiTargetIndex = datasource.IndexOf(target); StepGroups group = target.StepGroup; if (sourceIndex < targetIndex) { source.sequence.DeleteStep(sourceIndex, source.StepGroup); target.sequence.InsertStep(source.step, targetIndex, group); datasource.Move(uiSourceIndex, uiTargetIndex); } else if (sourceIndex > targetIndex) { source.sequence.DeleteStep(sourceIndex, source.StepGroup); target.sequence.InsertStep(source.step, targetIndex, group); datasource.Move(uiSourceIndex, uiTargetIndex); } } } }