private void UnMark_Click(object sender, RoutedEventArgs e)
        {
            var item = GetSelectedTreeViewItem(sender);

            if (item != null)
            {
                if (item.Tag is TreeNode tag)
                {
                    ThumbMarker.DelThumbMarker(tag.Path, true);
                    ExpandFolder(item.Parent as TreeViewItem);
                }
            }
        }
        private void ExpandFolder(TreeViewItem item)
        {
            item.Items.Clear();
            try
            {
                foreach (string dir in Directory.GetDirectories(((TreeNode)item.Tag).Path))
                {
                    TreeViewItem subitem = new TreeViewItem
                    {
                        Header = dir.Substring(dir.LastIndexOf("\\") + 1),
                        Tag    = new TreeNode()
                        {
                            Type = NodeDataType.Folder,
                            Path = dir
                        },
                        FontWeight = FontWeights.Normal,
                    };

                    if (ThumbMarker.HasThumpMarker(dir))
                    {
                        subitem.Foreground = new SolidColorBrush(Colors.Orange);
                    }

                    subitem.Items.Add(null);
                    subitem.Expanded += new RoutedEventHandler(Folder_Expanded);
                    item.Items.Add(subitem);
                }

                foreach (string file in Directory.GetFiles(((TreeNode)item.Tag).Path))
                {
                    TreeViewItem subitem = new TreeViewItem
                    {
                        Header = Path.GetFileName(file),
                        Tag    = new TreeNode()
                        {
                            Type = NodeDataType.File,
                            Path = file
                        },
                        FontWeight = FontWeights.Normal,
                    };

                    item.Items.Add(subitem);
                }
            }
            catch (Exception ex)
            {
                Log.Instance.Error(ex);
            }
        }
        private void LeftTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            if (sender is TreeView tv)
            {
                if (tv.SelectedItem is TreeViewItem selectedItem)
                {
                    if (selectedItem.Tag is TreeNode tag)
                    {
                        switch (tag.Type)
                        {
                        case NodeDataType.Folder:
                            var contextMenu = leftTree.Resources["sourceTreeContext"] as ContextMenu;

                            if (ThumbMarker.HasThumpMarker(tag.Path))
                            {
                                (contextMenu.Items[2] as MenuItem).Visibility = Visibility.Collapsed;
                                (contextMenu.Items[3] as MenuItem).Visibility = Visibility.Visible;
                            }
                            else
                            {
                                (contextMenu.Items[2] as MenuItem).Visibility = Visibility.Visible;
                                (contextMenu.Items[3] as MenuItem).Visibility = Visibility.Collapsed;
                            }

                            leftTree.ContextMenu = contextMenu;

                            break;

                        default:
                            leftTree.ContextMenu = null;
                            break;
                        }
                    }
                }
            }
        }
        private async void Copy_Click(object sender, RoutedEventArgs e)
        {
            if (rightTree.Items.Count == 0)
            {
                MessageBox.Show("You need first to select the destination drive!",
                                "Info",
                                MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }

            var item = GetSelectedTreeViewItem(sender);

            if (item != null)
            {
                if (item.Tag is TreeNode tag)
                {
                    Log.Instance.Info($"Folder '{tag.Path}' started copying...");

                    try
                    {
                        BlockUI(true);
                        _cancelSource = new CancellationTokenSource();

                        var taskRes = Task.Run(() => FolderProcessor.ProcessFolder(tag.Path, _destinationDrive, SetProgress, _cancelSource.Token));

                        await taskRes;

                        if (taskRes.IsFaulted)
                        {
                            SetProgress("Opearion failed!");
                            MessageBox.Show($"Operation failed! For details check the log file!",
                                            "Error",
                                            MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                        else if (taskRes.IsCompleted && taskRes.Result.Errors > 0)
                        {
                            SetProgress("Opearion completed with errors!");
                            MessageBox.Show($"Operation completed with {taskRes.Result} errors! For details check the log file!",
                                            "Warning",
                                            MessageBoxButton.OK, MessageBoxImage.Warning);
                        }
                        else if (!taskRes.IsCanceled)
                        {
                            ThumbMarker.PutThumbMarker(tag.Path, true);
                            ExpandFolder(item.Parent as TreeViewItem);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Instance.Error(ex);
                        SetProgress("Opearion failed!");
                    }
                    finally
                    {
                        BlockUI(false);
                        _cancelSource.Dispose();
                        _cancelSource = null;
                    }
                }
            }
        }