private void SwagItemsControl_Export(object sender, RoutedEventArgs e)
        {
            SwagOptionControl soc = (SwagOptionControl)e.OriginalSource;
            SwagOption        opt = (SwagOption)soc.OptionCollection;

            SwagItemsControlHelper.ExportDataToFile <SwagOption>(opt);
        }
        private Boolean CheckIfValidDrop(TreeViewItemDropEventArgs tviea)
        {
            SwagOption targetOpt  = (SwagOption)tviea.TargetItem.DataContext;
            SwagOption droppedOpt = (SwagOption)tviea.DroppedItem.DataContext;
            Boolean    valid      = true;
            MoveType   moveType   = GetMoveType(tviea);

            SwagOption tempOpt = targetOpt.Parent;

            while (valid && tempOpt != null)
            {
                if (droppedOpt == tempOpt) //Don't drop within own descendants
                {
                    valid = false;
                    break;
                }
                tempOpt = tempOpt.Parent;
            }

            if (!valid)
            {
                tviea.DragEventArgs.Effects = DragDropEffects.None;
                tviea.DragEventArgs.Handled = true;
            }

            return(valid);
        }
        private void SwagItemsControl_Copy(object sender, RoutedEventArgs e)
        {
            SwagOptionControl soc = (SwagOptionControl)e.OriginalSource;
            SwagOption        opt = (SwagOption)soc.OptionCollection;

            SwagItemsControlHelper.SetClipBoardData <SwagOption>(opt);
        }
        private void SwagItemsControl_Add(object sender, RoutedEventArgs e)
        {
            FrameworkElement         fe  = (FrameworkElement)e.OriginalSource;
            ICollection <SwagOption> col = (ICollection <SwagOption>)fe.DataContext;

            SwagOption opt = null;
            String     tag = (fe.Tag ?? "").ToString();

            switch (tag)
            {
            case "GROUP":
                opt = new SwagOptionGroup();
                break;

            case "STRING":
                opt = new StringOption();
                break;

            case "DATE":
                opt = new DateOption();
                break;

            case "BOOL":
                opt = new BooleanOption();
                break;
            }

            col.Add(opt);
            CollectionViewSource.GetDefaultView(col).Refresh();
        }
        private void SwagItemsControl_Import(object sender, RoutedEventArgs e)
        {
            SwagOption opt = SwagItemsControlHelper.GetDataFromFile <SwagOption>();

            if (opt != null)
            {
                SwagOptionControl soc = (SwagOptionControl)e.OriginalSource;
                soc.OptionCollection = (SwagOptionGroup)opt;
            }
        }
        private void SwagItemsControl_Paste(object sender, RoutedEventArgs e)
        {
            SwagOption opt = SwagItemsControlHelper.GetClipBoardData <SwagOption>();

            if (opt != null)
            {
                SwagOptionControl soc = (SwagOptionControl)e.OriginalSource;
                soc.OptionCollection = (SwagOptionGroup)opt;
            }
        }
        private void Description_Click(object sender, RoutedEventArgs e)
        {
            FrameworkElement fe  = (FrameworkElement)e.OriginalSource;
            SwagOption       opt = (SwagOption)fe.DataContext;

            String description = UIHelper.StringInputDialog("Description", opt.Description);

            if (!String.IsNullOrEmpty(description))
            {
                opt.Description = description;
            }
        }
        private void SwagItemsControl_Remove(object sender, RoutedEventArgs e)
        {
            FrameworkElement fe  = (FrameworkElement)e.OriginalSource;
            SwagOption       opt = (SwagOption)fe.DataContext;

            opt.Parent.Children.Remove(opt);
            CollectionViewSource.GetDefaultView(opt.Parent.Children).Refresh();
            if (opt.Parent == OptionCollection)
            {
                CollectionViewSource.GetDefaultView(OptionCollection).Refresh();
            }
        }
        private void SwagItemsControl_TreeViewItemDrop(object sender, RoutedEventArgs e)
        {
            TreeViewItemDropEventArgs tviea = (TreeViewItemDropEventArgs)e;

            tviea.TargetItem.BorderThickness = new Thickness(0, 0, 0, 0);
            if (!CheckIfValidDrop(tviea))       //Drops are still possible because TreeViewItemDropPreview can be skipped
            {
                return;
            }

            MoveType   moveType   = GetMoveType(tviea);
            SwagOption targetOpt  = (SwagOption)tviea.TargetItem.DataContext;
            SwagOption droppedOpt = (SwagOption)tviea.DroppedItem.DataContext;

            SwagOptionGroup originalDroppedParent   = (SwagOptionGroup)droppedOpt.Parent;
            Boolean         sameParent              = originalDroppedParent == targetOpt.Parent;
            Int32           originalDroppedSequence = droppedOpt.Sequence,
                            currentDroppedSequence  = droppedOpt.Sequence,
                            targetSequence = targetOpt.Sequence,
                            delta          = targetSequence - originalDroppedSequence;

            switch (moveType)
            {
            case MoveType.Above:
            case MoveType.Below:
                if (!sameParent)
                {
                    originalDroppedParent.Children.Remove(droppedOpt);
                    droppedOpt.Sequence = -1;            //reset sequence
                    targetOpt.Parent.Children.Add(droppedOpt);
                    currentDroppedSequence = droppedOpt.Sequence;
                    delta = targetSequence - currentDroppedSequence;
                }

                switch (moveType)
                {
                case MoveType.Above:
                    if (delta != 0)
                    {
                        foreach (SwagOption sibling in targetOpt.Parent.Children)
                        {
                            if (sibling.Sequence >= Math.Min(currentDroppedSequence, targetSequence) && sibling.Sequence < Math.Max(currentDroppedSequence, targetSequence))
                            {
                                sibling.Sequence = (sibling.Sequence + (delta > 0 ? -1 : 1));
                            }
                        }
                        droppedOpt.Sequence = targetSequence + (delta > 0 ? -1 : 0);
                        if (targetOpt.Parent == null)
                        {
                            CollectionViewSource.GetDefaultView(OptionCollection).Refresh();
                        }
                        else
                        {
                            CollectionViewSource.GetDefaultView(targetOpt.Parent.Children).Refresh();
                        }
                    }
                    break;

                case MoveType.Below:
                    if (delta != 0)
                    {
                        foreach (SwagOption sibling in targetOpt.Parent.Children)
                        {
                            if (sibling.Sequence > Math.Min(currentDroppedSequence, targetSequence) && sibling.Sequence <= Math.Max(currentDroppedSequence, targetSequence))
                            {
                                sibling.Sequence = (sibling.Sequence + (delta > 0 ? -1 : 1));
                            }
                        }
                        droppedOpt.Sequence = targetSequence + (delta > 0 ? 0 : 1);
                        if (targetOpt.Parent == null)
                        {
                            CollectionViewSource.GetDefaultView(OptionCollection).Refresh();
                        }
                        else
                        {
                            CollectionViewSource.GetDefaultView(targetOpt.Parent.Children).Refresh();
                        }
                    }
                    break;
                }
                break;

            case MoveType.Into:
                if (tviea.TargetItem.DataContext is SwagOptionGroup grp)
                {
                    originalDroppedParent.Children.Remove(droppedOpt);
                    droppedOpt.Sequence = -1;            //reset sequence
                    grp.Children.Add(droppedOpt);
                }
                break;
            }
        }