private async void btnScanCaseCrossProject_Click(object sender, EventArgs e)
        {
            this.btnScanCaseCrossProject.Enabled = false;

            string        caseIDs    = this.txtCaseIdList.Text;
            List <string> caseIdList = new List <string>();

            if (String.IsNullOrEmpty(caseIDs) || caseIDs.Trim().Length == 0)
            {
                // Show one error message "ERROR: Please enter case id"
                (this.MdiParent as MainForm).ShowStatusMessage("ERROR: Please enter case id");

                this.btnScanCaseCrossProject.Enabled = true;
                return;
            }
            else
            {
                (this.MdiParent as MainForm).ShowStatusMessage("");

                string[] caseIDArray = caseIDs.Split(',');
                Regex    reg         = new Regex(@"\d{2}ACC-\d{5}");
                foreach (string caseId in caseIDArray)
                {
                    if (reg.IsMatch(caseId))
                    {
                        if (!caseIdList.Contains(caseId.Trim()))
                        {
                            caseIdList.Add(caseId.Trim());
                        }
                    }
                    else
                    {
                        // Show one error message "ERROR: Invalid Format for XXXX"
                        (this.MdiParent as MainForm).ShowStatusMessage("ERROR: Invalid Format for " + caseId);

                        this.btnScanCaseCrossProject.Enabled = true;
                        return;
                    }
                }
            }

            List <string> projects = new List <string>();

            projects.Add("ENGSUPP");

            if (this.chkProjectAATHETA.Checked)
            {
                projects.Add("AATHETA");
            }

            if (this.chkProjectCAGAMMA.Checked)
            {
                projects.Add("CAGAMMA");
            }

            if (this.chkProjectPMA.Checked)
            {
                projects.Add("PMA");
            }

            if (projects.Count == 0)
            {
                MessageBox.Show("Please select one project at least.");
                return;
            }

            var GetCaseList = SalesforceProxy.GetCaseList(caseIdList);
            var caseListTmp = await GetCaseList;
            Dictionary <string, AccelaCase> AccelaCaseMapper = new Dictionary <string, AccelaCase>();

            foreach (var caseInfo in caseListTmp)
            {
                AccelaCaseMapper.Add(caseInfo.CaseNumber, caseInfo);
            }

            List <AccelaCaseStatusMapper> AccelaCaseStatusMapper = new List <AccelaCaseStatusMapper>();

            foreach (string caseId in caseIdList)
            {
                var GetIssueListBySalesforceId = JiraProxy.GetIssueListBySalesforceId(caseId, projects);
                var issueListTmp = await GetIssueListBySalesforceId;
                AccelaCaseStatusMapper accelaCaseStatus = new AccelaCaseStatusMapper();

                foreach (var issue in issueListTmp)
                {
                    string jiraKey = issue.key;
                    string status  = (issue != null ? issue.fields.status.name : "");

                    if (jiraKey.StartsWith("ENGSUPP-"))
                    {
                        if (String.IsNullOrEmpty(accelaCaseStatus.SalesforceID))
                        {
                            accelaCaseStatus.SalesforceID = issue.fields.customfield_10600;
                        }

                        accelaCaseStatus.SuppJiraID     = jiraKey;
                        accelaCaseStatus.SuppJiraStatus = status;
                        accelaCaseStatus.SuppAssignee   = (issue.fields.assignee != null ? issue.fields.assignee.emailAddress : "");

                        if (AccelaCaseMapper.ContainsKey(accelaCaseStatus.SalesforceID))
                        {
                            AccelaCase accelaCase = AccelaCaseMapper[accelaCaseStatus.SalesforceID];
                            accelaCaseStatus.SFQueue  = accelaCase.Owner.Name;
                            accelaCaseStatus.SFStatus = accelaCase.Status;
                            accelaCaseStatus.Summary  = accelaCase.Subject;
                        }
                    }
                }

                foreach (var issue in issueListTmp)
                {
                    string jiraKey = issue.key;
                    string status  = (issue != null ? issue.fields.status.name : "");

                    if (!jiraKey.StartsWith("ENGSUPP-"))
                    {
                        if (String.IsNullOrEmpty(accelaCaseStatus.SalesforceID))
                        {
                            accelaCaseStatus.SalesforceID = issue.fields.customfield_10600;

                            if (AccelaCaseMapper.ContainsKey(accelaCaseStatus.SalesforceID))
                            {
                                AccelaCase accelaCase = AccelaCaseMapper[accelaCaseStatus.SalesforceID];
                                accelaCaseStatus.SFQueue  = accelaCase.Owner.Name;
                                accelaCaseStatus.SFStatus = accelaCase.Status;
                                accelaCaseStatus.Summary  = accelaCase.Subject;
                            }
                        }

                        // Skipe some jira issue when their status is same already.
                        //if (status == accelaCaseStatus.SuppJiraStatus)
                        //{
                        //    continue;
                        //}

                        if (String.IsNullOrEmpty(accelaCaseStatus.LinkedJiraID))
                        {
                            accelaCaseStatus.LinkedJiraID       = jiraKey;
                            accelaCaseStatus.LinkedJiraStatus   = status;
                            accelaCaseStatus.LinkedJiraAssignee = (issue.fields.assignee != null ? issue.fields.assignee.emailAddress : "");

                            if (status != accelaCaseStatus.SuppJiraStatus)
                            {
                                accelaCaseStatus.NeedSync = true;
                            }
                        }
                        else
                        {
                            accelaCaseStatus.LinkedJiraID += "," + jiraKey;

                            if (status != "" && accelaCaseStatus.LinkedJiraStatus.IndexOf(status) < 0)
                            {
                                accelaCaseStatus.LinkedJiraStatus += "," + status;
                            }

                            if (status != accelaCaseStatus.SuppJiraStatus)
                            {
                                accelaCaseStatus.NeedSync = true;
                            }

                            if (issue.fields.assignee != null && accelaCaseStatus.LinkedJiraAssignee.IndexOf(issue.fields.assignee.emailAddress) < 0)
                            {
                                accelaCaseStatus.LinkedJiraAssignee += "," + issue.fields.assignee.emailAddress;
                            }
                        }
                    }
                }

                // All status is same.
                //if (!String.IsNullOrEmpty(accelaCaseStatus.LinkedJiraID))
                {
                    AccelaCaseStatusMapper.Add(accelaCaseStatus);
                }
            }

            DataTable table = new DataTable("Accela Case Status Report");

            table.Columns.Add("No", typeof(int));
            table.Columns.Add("SFID", typeof(string));
            table.Columns.Add("SuppJiraID", typeof(string));
            table.Columns.Add("SuppJiraAssignee", typeof(string));
            table.Columns.Add("LinkedJiraID", typeof(string));
            table.Columns.Add("LinkedJiraAssignee", typeof(string));
            table.Columns.Add("Summary", typeof(string));
            table.Columns.Add("SFQueue", typeof(string));
            table.Columns.Add("SFStatus", typeof(string));
            table.Columns.Add("SuppJiraStatus", typeof(string));
            table.Columns.Add("LinkedJiraStatus", typeof(string));
            table.Columns.Add("Sync", typeof(bool));

            int index = 0;

            foreach (var accelaCaseStatus in AccelaCaseStatusMapper)
            {
                DataRow row = table.NewRow();
                row["No"]                 = ++index;
                row["SFID"]               = accelaCaseStatus.SalesforceID;
                row["SuppJiraID"]         = accelaCaseStatus.SuppJiraID;
                row["SuppJiraAssignee"]   = accelaCaseStatus.SuppAssignee;
                row["LinkedJiraID"]       = accelaCaseStatus.LinkedJiraID;
                row["LinkedJiraAssignee"] = accelaCaseStatus.LinkedJiraAssignee;
                row["Summary"]            = accelaCaseStatus.Summary;
                row["SFQueue"]            = accelaCaseStatus.SFQueue;
                row["SFStatus"]           = accelaCaseStatus.SFStatus;
                row["SuppJiraStatus"]     = accelaCaseStatus.SuppJiraStatus;
                row["LinkedJiraStatus"]   = accelaCaseStatus.LinkedJiraStatus;
                row["Sync"]               = accelaCaseStatus.NeedSync;

                table.Rows.Add(row);
            }

            this.grdAccelaCaseStatus.AutoGenerateColumns = false;
            this.grdAccelaCaseStatus.DataSource          = table;

            this.btnScanCaseCrossProject.Enabled = true;
        }