/// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            var address = PromptUserData.Prompt("Server Address", "Insert Server Address", "http://sonar");

            if (address == null)
            {
                throw new Exception("Server Address must not be empty");
            }

            using (var dialog = new Security.Windows.Forms.UserCredentialsDialog())
            {
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    if (dialog.SaveChecked)
                    {
                        dialog.ConfirmCredentials(true);
                    }

                    AuthtenticationHelper.EstablishAConnection(new SonarRestService(new JsonSonarConnector()), address, dialog.User, dialog.PasswordToString());
                }
                else
                {
                    throw new Exception("user name and pass should be set");
                }
            }


            this.SonarQubeView = new SonarQubeViewModel("standalone", null);
            this.SonarQubeView.InitModelFromPackageInitialization(new VsEnvironmentHelper(), new VsStatusBarDummy(), new ServiceProviderDummy(), Environment.CurrentDirectory);
        }
        /// <summary>
        /// Adjusts the effort for rule.
        /// </summary>
        private void AdjustEffortForRule()
        {
            var minutes = PromptUserData.Prompt("effort in minutes", "new value in minutes");
            var min     = 0;

            if (string.IsNullOrEmpty(minutes) || !int.TryParse(minutes, out min))
            {
                return;
            }

            foreach (var item in this.model.SelectedItems)
            {
                var issue = item as Issue;
                var rule  = this.analyser.GetRuleForKey(issue.Rule, this.assignProject);

                if (rule == null)
                {
                    continue;
                }

                var dic = new Dictionary <string, string> {
                    { "debt_remediation_fn_type", rule.RemediationFunction.ToString() }
                };

                if (rule.RemediationFunction.Equals(RemediationFunction.LINEAR) || rule.RemediationFunction.Equals(RemediationFunction.LINEAR_OFFSET))
                {
                    dic.Add("debt_remediation_fy_coeff", minutes + "min");
                }

                if (rule.RemediationFunction.Equals(RemediationFunction.CONSTANT_ISSUE) || rule.RemediationFunction.Equals(RemediationFunction.LINEAR_OFFSET))
                {
                    if (rule.RemediationFunction.Equals(RemediationFunction.LINEAR_OFFSET))
                    {
                        minutes = PromptUserData.Prompt("Adjust a new offset for the rule", "new value in minutes");
                        if (string.IsNullOrEmpty(minutes) || !int.TryParse(minutes, out min))
                        {
                            return;
                        }
                    }

                    dic.Add("debt_remediation_fn_offset", minutes + "min");
                }

                List <string> reply = this.rest.UpdateRule(AuthtenticationHelper.AuthToken, rule.Key, dic);
                if (reply != null && reply.Count != 0)
                {
                    this.manager.ReportMessage(new Message {
                        Id = "SetSqaleMenu", Data = "Failed to change effort value for: " + issue.Rule + " : do you have the correct permissions"
                    });
                }
                else
                {
                    this.manager.ReportMessage(new Message {
                        Id = "SetSqaleMenu", Data = "New value for effort was taken into use"
                    });
                }
            }
        }
        /// <summary>
        /// Called when [save as search command].
        /// </summary>
        /// <exception cref="System.NotImplementedException"></exception>
        private void OnSaveAsSearchCommand()
        {
            var search = this.GetCurrentSearch();
            var data   = PromptUserData.Prompt("Save as....", "Save as....");

            if (string.IsNullOrEmpty(data))
            {
                return;
            }

            search.Name = data;
            this.savedSearchModel.SaveSearch(search);
        }
        /// <summary>
        /// Called when [attache to issue tracker].
        /// </summary>
        private void OnAttachToIssueTracker()
        {
            if (this.model.SelectedItems == null || this.model.SelectedItems.Count == 0)
            {
                return;
            }

            try
            {
                if (this.CommandText.Equals("new issue and attach"))
                {
                    var    issues    = this.model.SelectedItems.Cast <Issue>().ToList();
                    string id        = string.Empty;
                    var    replydata = this.issueTrackerPlugin.AttachToNewDefect(issues, out id);

                    // update issues
                    foreach (var issue in issues)
                    {
                        issue.IssueTrackerId = id;
                    }

                    if (string.IsNullOrEmpty(replydata))
                    {
                        this.manager.ReportMessage(new Message {
                            Id = "IssueTrackerMenu", Data = "Failed to create defect"
                        });
                        return;
                    }

                    var builder = new StringBuilder();
                    builder.AppendLine(CommentMessageForIssue + id);
                    builder.AppendLine(replydata);
                    this.rest.CommentOnIssues(this.config, issues, builder.ToString());
                }

                if (this.CommandText.Equals("attach to existent"))
                {
                    var id = PromptUserData.Prompt("Enter Item Id", "Issue Tracker Id");
                    if (string.IsNullOrEmpty(id))
                    {
                        return;
                    }

                    try
                    {
                        var issues    = this.model.SelectedItems.Cast <Issue>().ToList();
                        var replydata = this.issueTrackerPlugin.AttachToExistentDefect(issues, id);

                        if (string.IsNullOrEmpty(replydata))
                        {
                            this.manager.ReportMessage(new Message {
                                Id = "IssueTrackerMenu", Data = "Failed to attach to defect"
                            });
                            return;
                        }

                        // update issues
                        foreach (var issue in issues)
                        {
                            issue.IssueTrackerId = id;
                        }

                        var builder = new StringBuilder();
                        builder.AppendLine(CommentMessageForIssue + id);
                        builder.AppendLine(replydata);
                        this.rest.CommentOnIssues(this.config, issues, builder.ToString());
                    }
                    catch (Exception ex)
                    {
                        this.manager.ReportMessage(new Message {
                            Id = "IssueTrackerMenu", Data = "Failed to attach to defect: " + ex.Message
                        });
                        this.manager.ReportException(ex);
                        return;
                    }
                }

                if (this.CommandText.Equals("show info"))
                {
                    var id = this.parent.CommandText;
                    if (!this.parent.parent.defectCache.ContainsKey(id))
                    {
                        try
                        {
                            var defect = this.issueTrackerPlugin.GetDefect(id);
                            this.parent.parent.defectCache.Add(id, defect);
                        }
                        catch (Exception ex)
                        {
                            this.manager.ReportMessage(new Message {
                                Id = "IssueTrackerMenu", Data = "Failed to get info for defect: " + ex.Message
                            });
                            this.manager.ReportException(ex);
                            return;
                        }
                    }

                    var    item    = this.parent.parent.defectCache[id];
                    string message = string.Format("Summary:\t\t {0}\r\nStatus:\t\t {1}\r\nId:\t {2}\r\n", item.Summary, item.Status, item.Id);
                    MessageDisplayBox.DisplayMessage(message, string.Empty);
                }
            }
            catch (Exception ex)
            {
                UserExceptionMessageBox.ShowException("Cannot Perform Operation in Plan: " + ex.Message + " please check vs output log for detailed information", ex);
            }
        }