/// <summary>
        /// Recreates the SQL Editor sub menu items.
        /// </summary>
        public void RecreateSqlEditorMenus()
        {
            var notifierMenu = InstanceMenuItem.GetCurrentParent();

            if (notifierMenu != null && notifierMenu.InvokeRequired)
            {
                notifierMenu.Invoke(new MethodInvoker(RecreateSqlEditorMenus));
            }
            else
            {
                if (!MySqlWorkbench.AllowsExternalConnectionsManagement)
                {
                    return;
                }

                if (SqlEditorMenuItem == null)
                {
                    SqlEditorMenuItem = new ToolStripMenuItem(Resources.SQLEditor);
                }
                else
                {
                    SqlEditorMenuItem.DropDownItems.Clear();
                }

                SqlEditorMenuItem.Enabled = BoundInstance.WorkbenchConnection != null ||
                                            BoundInstance.RelatedConnections.Count > 1;
                if (BoundInstance.RelatedConnections.Count == 0)
                {
                    return;
                }

                if (BoundInstance.RelatedConnections.Count == 1)
                {
                    SqlEditorMenuItem.Click -= SqlEditorMenuItem_Click;
                    SqlEditorMenuItem.Click += SqlEditorMenuItem_Click;
                    SqlEditorMenuItem.Tag    = BoundInstance.WorkbenchConnection;
                    return;
                }

                // We have more than 1 connection so we create a submenu.
                foreach (var conn in BoundInstance.RelatedConnections)
                {
                    var menu = new ToolStripMenuItem(conn.Name);
                    if (conn == BoundInstance.WorkbenchConnection)
                    {
                        var boldFont = new Font(menu.Font, FontStyle.Bold);
                        menu.Font = boldFont;
                    }

                    menu.Tag    = conn;
                    menu.Click += SqlEditorMenuItem_Click;
                    SqlEditorMenuItem.DropDownItems.Add(menu);
                }
            }
        }
        /// <summary>
        /// Enables and disables menus based on the bound MySQL instance's connection status.
        /// </summary>
        /// <param name="refreshing">Flag indicating if the instance is refreshing its status.</param>
        public void Update(bool refreshing)
        {
            var menu = InstanceMenuItem.GetCurrentParent();

            if (menu == null)
            {
                return;
            }

            if (menu.InvokeRequired)
            {
                menu.Invoke(new MethodInvoker(() => Update(refreshing)));
            }

            else
            {
                var suffix = refreshing
          ? Resources.RefreshingStatusText
          : $" - {BoundInstance.ConnectionStatusText}";
                InstanceMenuItem.Text = BoundInstance.DisplayConnectionSummaryText + suffix;
                switch (BoundInstance.ConnectionStatus)
                {
                case MySqlWorkbenchConnection.ConnectionStatusType.AcceptingConnections:
                    InstanceMenuItem.Image = Resources.NotifierIconRunning;
                    break;

                case MySqlWorkbenchConnection.ConnectionStatusType.RefusingConnections:
                    InstanceMenuItem.Image = Resources.NotifierIconStopped;
                    break;

                case MySqlWorkbenchConnection.ConnectionStatusType.Unknown:
                    InstanceMenuItem.Image = Resources.NotifierIcon;
                    break;
                }

                if (SqlEditorMenuItem != null)
                {
                    SqlEditorMenuItem.Enabled = MySqlWorkbench.AllowsExternalConnectionsManagement &&
                                                BoundInstance.WorkbenchConnection != null;
                    SqlEditorMenuItem.ToolTipText = SqlEditorMenuItem.Enabled
            ? null
            : string.Format(Resources.NoWorkbenchConnectionsFound, "instance");
                }

                if (ConfigureMenuItem != null)
                {
                    ConfigureMenuItem.Enabled     = BoundInstance.RelatedServers.Count > 0;
                    ConfigureMenuItem.ToolTipText = ConfigureMenuItem.Enabled
            ? null
            : string.Format(Resources.NoWorkbenchServersFound, "instance");
                }
            }
        }
        /// <summary>
        /// Enables and disables menus based on the bound MySQL instance's connection status.
        /// </summary>
        /// <param name="refreshing">Flag indicating if the instance is refreshing its status.</param>
        public void Update(bool refreshing)
        {
            ToolStrip menu = InstanceMenuItem.GetCurrentParent();

            if (menu == null)
            {
                return;
            }

            if (menu.InvokeRequired)
            {
                menu.Invoke(new MethodInvoker(() => Update(refreshing)));
            }

            else
            {
                InstanceMenuItem.Text = BoundInstance.HostIdentifier + (refreshing ? Resources.RefreshingStatusText : " - " + BoundInstance.ConnectionStatusText);
                switch (BoundInstance.ConnectionStatus)
                {
                case MySqlWorkbenchConnection.ConnectionStatusType.AcceptingConnections:
                    InstanceMenuItem.Image = Resources.NotifierIconRunning;
                    break;

                case MySqlWorkbenchConnection.ConnectionStatusType.RefusingConnections:
                    InstanceMenuItem.Image = Resources.NotifierIconStopped;
                    break;

                case MySqlWorkbenchConnection.ConnectionStatusType.Unknown:
                    InstanceMenuItem.Image = Resources.NotifierIcon;
                    break;
                }

                if (SqlEditorMenuItem != null)
                {
                    SqlEditorMenuItem.Enabled = MySqlWorkbench.AllowsExternalConnectionsManagement && BoundInstance.WorkbenchConnection != null;
                }

                if (ConfigureMenuItem != null)
                {
                    ConfigureMenuItem.Enabled = BoundInstance.WorkbenchServer != null;
                }
            }
        }
        /// <summary>
        /// Releases all resources used by the <see cref="MySqlInstanceMenuGroup"/> class
        /// </summary>
        /// <param name="disposing">If true this is called by Dispose(), otherwise it is called by the finalizer</param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                try
                {
                    // Free managed resources
                    if (ConfigureMenuItem != null)
                    {
                        ConfigureMenuItem.Dispose();
                    }

                    if (InstanceMenuItem != null)
                    {
                        InstanceMenuItem.Dispose();
                    }

                    if (SqlEditorMenuItem != null)
                    {
                        SqlEditorMenuItem.Dispose();
                    }

                    if (Separator != null)
                    {
                        Separator.Dispose();
                    }
                }
                catch
                {
                    // Sometimes when the dispose is done from a thread different than the main one a cross-thread exception is thrown which is not critical
                    // since these menu items will be disposed later by the garbage collector. No Exception is being actually handled or logged since we do
                    // not wat to overwhelm the log with these error messages since they do not affect the Notifier's execution.
                }
            }

            // Add class finalizer if unmanaged resources are added to the class
            // Free unmanaged resources if there are any
        }