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<StepUI> 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);
|
}
|
}
|
}
|
}
|