private void btnRemoveAllProjects_Click(object sender, EventArgs e)
        {
            if (treeProjects.Nodes.Count == 0)
            {
                return;
            }

            if (MessageBox.Show("Are you sure you want to remove all projects?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                lbFolders.BeginUpdate();
                lbFolders.Items.Clear();
                lbFolders.EndUpdate();

                foreach (TreeNode node in treeProjects.Nodes)
                {
                    DisposeOfNode(node);

                    SourceProjectBinding binding = node.Tag as SourceProjectBinding;
                    ProjectHeroSettingManager.Manager.PluginSettings.QuickSyncAssociations.Remove(binding);
                }

                treeProjects.BeginUpdate();
                treeProjects.Nodes.Clear();
                treeProjects.EndUpdate();

                propGrid.SelectedObject = null;

                btnSaveChanges_Click(null, null);
                LoadTreeView();
            }
        }
        private void lbFolders_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                if (lbFolders.Items.Count > 0 && lbFolders.SelectedItems != null && lbFolders.SelectedItems.Count > 0)
                {
                    if (MessageBox.Show("Are you sure you want to remove the selected folders?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                    {
                        TreeNode             selectedNode = treeProjects.SelectedNode;
                        SourceProjectBinding binding      = selectedNode.Tag as SourceProjectBinding;

                        lbFolders.BeginUpdate();

                        ArrayList tmpItemsToRemove = new ArrayList();
                        foreach (DestinationFolderBinding folderBinding in lbFolders.SelectedItems)
                        {
                            tmpItemsToRemove.Add(folderBinding);
                            binding.DestinationFolderCollection.Remove(folderBinding);
                        }

                        foreach (DestinationFolderBinding folderBinding in tmpItemsToRemove)
                        {
                            lbFolders.Items.Remove(folderBinding);
                        }

                        selectedNode.Tag = binding;

                        lbFolders.EndUpdate();
                    }
                }
            }
        }
        private void propGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
        {
            TreeNode             selectedNode = treeProjects.SelectedNode;
            SourceProjectBinding binding      = selectedNode.Tag as SourceProjectBinding;

            treeProjects.BeginUpdate();

            selectedNode.Text = !string.IsNullOrEmpty(binding.ProjectNickname) ? binding.ProjectNickname : binding.ProjectName;

            treeProjects.EndUpdate();

            if (binding.DestinationFolderCollection.Count == 0)
            {
                lbFolders.Items.Clear();
            }
            else
            {
                lbFolders.BeginUpdate();
                lbFolders.Items.Clear();

                foreach (DestinationFolderBinding folder in binding.DestinationFolderCollection.OrderBy(i => i.FolderName))
                {
                    lbFolders.Items.Add(folder);
                }

                lbFolders.EndUpdate();
            }
        }
        private void btnAddProject_Click(object sender, EventArgs e)
        {
            using (frmProjectSelection frmProjectSelect = new frmProjectSelection(_projectNodes))
            {
                frmProjectSelect.ShowDialog();

                if (frmProjectSelect.Tag == null)
                {
                    return;
                }

                List <ProjectHero2.Core.ucProjectHero.AvailableProjectNode> projectCollection = frmProjectSelect.Tag as List <ProjectHero2.Core.ucProjectHero.AvailableProjectNode>;
                foreach (ProjectHero2.Core.ucProjectHero.AvailableProjectNode project in projectCollection)
                {
                    if (ProjectHeroSettingManager.Manager.PluginSettings.QuickSyncAssociations.Where(i => i.MD5Hash.Equals(project.Md5Hash)).Count() > 0)
                    {
                        continue;
                    }

                    SourceProjectBinding binding = new SourceProjectBinding();
                    binding.MD5Hash         = project.Md5Hash;
                    binding.ProjectFilePath = project.FilePath;
                    binding.ProjectName     = project.Name;
                    binding.ProjectNickname = string.Empty;

                    ProjectHeroSettingManager.Manager.PluginSettings.QuickSyncAssociations.Add(binding);
                }

                LoadTreeView();
            }
        }
        private ContextMenuStrip GetChildLevelNodeContextMenu()
        {
            ContextMenuStrip ctxMenu = new ContextMenuStrip();

            // ================================================================================
            // Provide the ability to remove this node.
            // ================================================================================
            ctxMenu.Items.Add("Remove item", null, new EventHandler(delegate(object sender, EventArgs e)
            {
                if (MessageBox.Show("Are you sure you want to remove this item?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    treeProjects.BeginUpdate();

                    TreeNode selectedNode = treeProjects.SelectedNode;
                    SysFileItem item      = selectedNode.Tag as SysFileItem;

                    TreeNode parentNode          = selectedNode.Parent;
                    SourceProjectBinding binding = parentNode.Tag as SourceProjectBinding;

                    binding.SyncAssociationCollection.Remove(item);
                    parentNode.Tag = binding;

                    DisposeOfNode(selectedNode);
                    parentNode.Nodes.Remove(selectedNode);

                    treeProjects.EndUpdate();
                }
            }));

            return(ctxMenu);
        }
        private void treeProjects_AfterSelect(object sender, TreeViewEventArgs e)
        {
            TreeNode selectedNode = treeProjects.SelectedNode;

            if (selectedNode.Tag is SourceProjectBinding)
            {
                SourceProjectBinding binding = selectedNode.Tag as SourceProjectBinding;
                if (binding.DestinationFolderCollection.Count > 0)
                {
                    lbFolders.BeginUpdate();

                    lbFolders.Items.Clear();

                    foreach (DestinationFolderBinding folderBinding in binding.DestinationFolderCollection.OrderBy(i => i.FolderName))
                    {
                        lbFolders.Items.Add(folderBinding);
                    }

                    lbFolders.ContextMenuStrip.Enabled = true;

                    lbFolders.EndUpdate();
                }
                else
                {
                    lbFolders.Items.Clear();
                    lbFolders.ContextMenuStrip.Enabled = false;
                }

                if (selectedNode.Nodes.Count > 0)
                {
                    selectedNode.ContextMenuStrip.Items["removeAllAssociations"].Enabled = true;

                    bool isSelected = false;
                    foreach (TreeNode childNode in selectedNode.Nodes)
                    {
                        if (childNode.Checked)
                        {
                            isSelected = true;
                            break;
                        }
                    }
                }
                else
                {
                    selectedNode.ContextMenuStrip.Items["removeAllAssociations"].Enabled = false;
                }

                propGrid.SelectedObject = binding;
            }
            else
            {
                lbFolders.BeginUpdate();
                lbFolders.Items.Clear();
                lbFolders.EndUpdate();
                lbFolders.ContextMenuStrip.Enabled = false;

                propGrid.SelectedObject = selectedNode.Tag as SysFileItem;
            }
        }
        private void LoadListBox()
        {
            ContextMenuStrip ctxMenu = new ContextMenuStrip();

            ctxMenu.Items.Add("Remove folder", null, new EventHandler(delegate(object sender, EventArgs e)
            {
                if (lbFolders.SelectedItems == null || lbFolders.SelectedItems.Count == 0)
                {
                    return;
                }

                if (MessageBox.Show("Are you sure you want to remove the selected folders?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    ArrayList tmpList = new ArrayList();

                    lbFolders.BeginUpdate();

                    TreeNode selectedNode        = treeProjects.SelectedNode;
                    SourceProjectBinding binding = selectedNode.Tag as SourceProjectBinding;

                    foreach (DestinationFolderBinding folder in lbFolders.Items)
                    {
                        tmpList.Add(folder);
                        binding.DestinationFolderCollection.Remove(folder);
                    }

                    foreach (DestinationFolderBinding folder in tmpList)
                    {
                        lbFolders.Items.Remove(folder);
                    }

                    selectedNode.Tag = binding;

                    lbFolders.EndUpdate();
                }
            }));

            lbFolders.ContextMenuStrip = ctxMenu;
        }
        private ContextMenuStrip GetTopLevelNodeContextMenu()
        {
            ContextMenuStrip ctxMenu = new ContextMenuStrip();
            ToolStripItem    tsItem  = null;

            // ================================================================================
            // Provide the ability to add files and folders for the selected project.
            // ================================================================================
            tsItem = ctxMenu.Items.Add("Add Files/Folders", null, new EventHandler(delegate(object sender, EventArgs e)
            {
                if (treeProjects.SelectedNode == null)
                {
                    return;
                }

                TreeNode selectedNode        = treeProjects.SelectedNode;
                SourceProjectBinding binding = selectedNode.Tag as SourceProjectBinding;

                using (frmFileFolderSelectionDialog ofd = new frmFileFolderSelectionDialog(binding.ProjectFilePath))
                {
                    ofd.ShowDialog();

                    if (ofd.Tag != null && ofd.Tag is List <SysFileItem> )
                    {
                        treeProjects.BeginUpdate();

                        List <SysFileItem> fileList = ofd.Tag as List <SysFileItem>;
                        foreach (SysFileItem file in fileList)
                        {
                            if (binding.SyncAssociationCollection.Count > 0 && binding.SyncAssociationCollection.Where(i => i.Name.ToLower().Equals(file.Name.ToLower())).Count() > 0)
                            {
                                continue;
                            }

                            int childImageIndex        = (file.FileType == FileType.Directory) ? 7 : 6;
                            TreeNode childNode         = new TreeNode(file.Name, childImageIndex, childImageIndex);
                            childNode.Tag              = file;
                            childNode.ContextMenuStrip = GetChildLevelNodeContextMenu();

                            selectedNode.Nodes.Add(childNode);
                            binding.SyncAssociationCollection.Add(file);
                        }

                        selectedNode.Tag = binding;

                        treeProjects.EndUpdate();
                    }
                }
            }));
            tsItem.Name = "addFolder";

            // ================================================================================
            // Provide the ability to add source folders.
            // ================================================================================
            tsItem = ctxMenu.Items.Add("Add Sync Folder", null, new EventHandler(delegate(object sender, EventArgs e)
            {
                if (treeProjects.SelectedNode == null)
                {
                    return;
                }

                TreeNode selectedNode        = treeProjects.SelectedNode;
                SourceProjectBinding binding = selectedNode.Tag as SourceProjectBinding;

                if (binding == null)
                {
                    return;
                }

                using (FolderBrowserDialog fbd = new FolderBrowserDialog())
                {
                    fbd.Description         = "Select a folder to sync files to.";
                    fbd.ShowNewFolderButton = true;

                    fbd.ShowDialog();

                    if (!string.IsNullOrEmpty(fbd.SelectedPath))
                    {
                        string dirName = fbd.SelectedPath.Split('\\').Reverse().First();
                        if (binding.DestinationFolderCollection.Count > 0)
                        {
                            DestinationFolderBinding destFolderBinding = binding.DestinationFolderCollection.FirstOrDefault(i => i.FolderPath.ToLower().Equals(fbd.SelectedPath.ToLower().Trim()));

                            if (destFolderBinding != null)
                            {
                                return;
                            }
                        }

                        DestinationFolderBinding newFolderBinding = new DestinationFolderBinding(dirName, fbd.SelectedPath);

                        binding.DestinationFolderCollection.Add(newFolderBinding);
                        lbFolders.Items.Add(newFolderBinding);
                        lbFolders.ContextMenuStrip.Enabled = true;

                        selectedNode.Tag = binding;
                    }
                }
            }));
            tsItem.Name = "addSyncFolder";

            // ================================================================================
            // Provide the ability to remove all associations for the selected project.
            // ================================================================================
            tsItem = ctxMenu.Items.Add("Remove all associations", null, new EventHandler(delegate(object sender, EventArgs e)
            {
                if (treeProjects.SelectedNode == null)
                {
                    return;
                }

                TreeNode selectedNode        = treeProjects.SelectedNode;
                SourceProjectBinding binding = selectedNode.Tag as SourceProjectBinding;

                if (selectedNode.Nodes.Count == 0)
                {
                    return;
                }

                if (MessageBox.Show("Are you sure you want to remove all associations?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    treeProjects.BeginUpdate();

                    if (selectedNode.Nodes.Count > 0)
                    {
                        foreach (TreeNode childNode in selectedNode.Nodes)
                        {
                            DisposeOfNode(childNode);
                        }
                    }

                    selectedNode.Nodes.Clear();

                    binding.SyncAssociationCollection.Clear();
                    binding.DestinationFolderCollection.Clear();

                    lbFolders.Items.Clear();

                    selectedNode.Tag = binding;

                    treeProjects.EndUpdate();
                }
            }));
            tsItem.Name = "removeAllAssociations";

            // ================================================================================
            // Provide the ability to remove selected items only.
            // ================================================================================
            tsItem = ctxMenu.Items.Add("Remove selected items", null, new EventHandler(delegate(object sender, EventArgs e)
            {
                if (treeProjects.SelectedNode == null)
                {
                    return;
                }

                TreeNode selectedNode        = treeProjects.SelectedNode;
                SourceProjectBinding binding = selectedNode.Tag as SourceProjectBinding;

                if (selectedNode.Nodes.Count == 0)
                {
                    return;
                }

                bool hasItemsSelected = false;
                foreach (TreeNode childNode in selectedNode.Nodes)
                {
                    if (childNode.Checked)
                    {
                        hasItemsSelected = true;
                        break;
                    }
                }

                if (!hasItemsSelected)
                {
                    return;
                }

                if (MessageBox.Show("Are you sure you want to remove the selected items?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    treeProjects.BeginUpdate();

                    ArrayList tmpNodeList = new ArrayList();
                    foreach (TreeNode childNode in selectedNode.Nodes)
                    {
                        if (childNode.Checked)
                        {
                            SysFileItem item = childNode.Tag as SysFileItem;
                            binding.SyncAssociationCollection.Remove(item);

                            DisposeOfNode(childNode);

                            tmpNodeList.Add(childNode);
                        }
                    }

                    foreach (TreeNode node in tmpNodeList)
                    {
                        selectedNode.Nodes.Remove(node);
                    }

                    selectedNode.Tag = binding;

                    treeProjects.EndUpdate();
                }
            }));
            tsItem.Name = "removeSelectedItems";

            // ================================================================================
            // Provide the ability to remove the selected node.
            // ================================================================================
            tsItem = ctxMenu.Items.Add("Remove Project", null, new EventHandler(delegate(object sender, EventArgs e)
            {
                if (treeProjects.SelectedNode == null)
                {
                    return;
                }

                TreeNode selectedNode        = treeProjects.SelectedNode;
                SourceProjectBinding binding = selectedNode.Tag as SourceProjectBinding;

                if (MessageBox.Show("Are you sure you want to remove this project?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    DisposeOfNode(selectedNode);
                    ProjectHeroSettingManager.Manager.PluginSettings.QuickSyncAssociations.Remove(binding);

                    treeProjects.Nodes.Remove(selectedNode);
                    propGrid.SelectedObject = null;

                    LoadTreeView();
                }
            }));
            tsItem.Name = "removeProject";

            return(ctxMenu);
        }