private void addConnectionStringButton_Click(object sender, EventArgs e)
        {
            if (this.ValidateAddConnectionForm())
            {
                if (cbConnection.SelectedItem is LastDirectConnectionString)
                {
                    if (
                        !connectionStringsListBox.Items.OfType <LastDirectConnectionString>()
                        .Any(x => x.Equals(cbConnection.SelectedItem)))
                    {
                        connectionStringsListBox.Items.Add(cbConnection.SelectedItem);
                        UpdateAddConnectionButtonState();
                    }
                }
                else if (cbConnection.SelectedItem is LastDirectConnectionStringGroup)
                {
                    LastDirectConnectionStringGroup connectionGroup = cbConnection.SelectedItem as LastDirectConnectionStringGroup;

                    connectionStringsListBox.Items.Clear();
                    connectionStringsListBox.Items.AddRange(connectionGroup.ConnectionStrings.ToArray());

                    UpdateAddConnectionButtonState(connectionGroup.GroupName);
                }
            }
        }
        /// <summary>
        /// Returns true if ldcGroup is last selected element in the combobox
        /// </summary>
        ///
        private bool IsConnStrGroupWasSelected(LastDirectConnectionStringGroup ldcGroup)
        {
            List <string> singleConnNames = Program.Model.Settings.LastDirectConnectionStrings.Select(x => x.Name).ToList();

            string[] groupNameElements = ldcGroup.GroupName.Split(',');                 // Group name consists from names of single connections

            for (int i = 0; i < groupNameElements.Length; i++)
            {
                if (i > singleConnNames.Count - 1)
                {
                    return(false);
                }

                if (singleConnNames.ElementAt(i) != groupNameElements[i])
                {
                    return(false);
                }
            }

            return(true);
        }
        private bool ValidateAddConnectionForm()
        {
            bool result = true;

            LastDirectConnectionString connectionString =
                this.cbConnection.SelectedItem as LastDirectConnectionString;

            LastDirectConnectionStringGroup connectionStringGroup =
                this.cbConnection.SelectedItem as LastDirectConnectionStringGroup;

            if ((connectionString == null || string.IsNullOrEmpty(connectionString.ConnectionString)) &&
                (connectionStringGroup == null || connectionStringGroup.ConnectionStrings == null))
            {
                this.errorProvider.SetError(this.cbConnection, this.GetLocalizedText("SelectServerError"));

                result = false;
            }
            else
            {
                this.errorProvider.SetError(this.cbConnection, string.Empty);
            }

            return(result);
        }
		/// <summary>
		/// The bt ok_ click.
		/// </summary>
		/// <param name="sender">
		/// The sender.
		/// </param>
		/// <param name="e">
		/// The e.
		/// </param>
		private void BtOkClick(object sender, EventArgs e)
		{
			if (!this.ValidateForm())
			{
				return;
			}

			SettingsInfo settingsCopy = Program.Model.Settings.GetCopy();

			List<LastDirectConnectionString> connectionStrings =
				this.connectionStringsListBox.Items.OfType<LastDirectConnectionString>()
					.ToList();

			foreach (LastDirectConnectionString connectionString in connectionStrings)
			{
				if (connectionString != null &&
					!settingsCopy.LastDirectConnectionStringsItems.Any(
						x => x.ConnectionString == connectionString.ConnectionString
						&& x.IsODBC == connectionString.IsODBC
					)
				)
				{
					settingsCopy.LastDirectConnectionStringsItems.Add(connectionString);
				}
			}

			LastDirectConnectionStringGroup newGroup = new LastDirectConnectionStringGroup()
			{
				ConnectionStrings = connectionStrings,
				GroupName = ConnectionGroupName
			};

			// check if the group does not exist
			if (!settingsCopy.LastDirectConnectionStringsGroups.Any(x => x.Equals(newGroup)))
			{
				bool addNewGroup = true;

				// check whether the group with the same name
				// (but with different settings) exists
				foreach (LastDirectConnectionStringGroup connGroup in settingsCopy.LastDirectConnectionStringsGroups)
				{
					if (LastDirectConnectionStringGroup.InSettingsComparer.Equals(newGroup, connGroup))
					{
						// update it with new settings
						connGroup.ConnectionStrings = newGroup.ConnectionStrings;
						addNewGroup = false;
						break;
					}
				}

				if (addNewGroup)
				{
					settingsCopy.LastDirectConnectionStringsGroups.Add(newGroup);
				}
			}

			settingsCopy.LastDirectConnectionStrings = connectionStrings;

			if (rbSelectExistTemplate.Checked)
			{
				Template templateFile = this.cbTemplate.SelectedItem as Template;

				if (templateFile != null)
				{
					settingsCopy.LastSelectedTemplateId = templateFile.Id;
				}
			}
			else if (rbOpenTemplateFromFile.Checked)
			{
				string templateFile = this.cbPathToFile.Text;

				if (!String.IsNullOrWhiteSpace(templateFile) && File.Exists(templateFile))
				{
					Program.Model.Settings.LastExternalTemplatesItems.Add(templateFile);
					settingsCopy.LastSelectedTemplateId = templateFile;
				}
			}

			if (this.cbDataBaseType.SelectedItem != null)
			{
				settingsCopy.LastSelectedDataBaseType = (this.cbDataBaseType.SelectedItem as DBType).Name;
			}

			if (this.cbModuleType.SelectedItem !=null)
			{
				settingsCopy.LastSelectedTemplateType = ((KeyValuePair<string, string>)this.cbModuleType.SelectedItem).Value;
			}

			Program.Model.SetSettings(settingsCopy);

			if (Program.Model.Settings.LastDirectConnectionStrings != null &&
				Program.Model.Settings.LastDirectConnectionStrings.Any(
					x => !string.IsNullOrEmpty(x.ConnectionString)
				)
			)
			{
				this.SetConnectionProperties(
					Program.Model.Settings.LastDirectConnectionStrings.Where(
						x => !string.IsNullOrEmpty(x.ConnectionString)
					).ToList()
				);
			}

			this.DialogResult = DialogResult.OK;
		}
		/// <summary>
		/// Returns true if ldcGroup is last selected element in the combobox
		/// </summary>
		///
		private bool IsConnStrGroupWasSelected(LastDirectConnectionStringGroup ldcGroup)
		{
			List<string> singleConnNames   = Program.Model.Settings.LastDirectConnectionStrings.Select(x => x.Name).ToList();
			string[]     groupNameElements = ldcGroup.GroupName.Split(','); // Group name consists from names of single connections

			for (int i = 0; i < groupNameElements.Length;i++)
			{
				if (i > singleConnNames.Count - 1)
				{
					return false;
				}

				if (singleConnNames.ElementAt(i) != groupNameElements[i])
				{
					return false;
				}
			}

			return true;
		}
        /// <summary>
        /// The bt ok_ click.
        /// </summary>
        /// <param name="sender">
        /// The sender.
        /// </param>
        /// <param name="e">
        /// The e.
        /// </param>
        private void BtOkClick(object sender, EventArgs e)
        {
            if (!this.ValidateForm())
            {
                return;
            }

            SettingsInfo settingsCopy = Program.Model.Settings.GetCopy();

            List <LastDirectConnectionString> connectionStrings =
                this.connectionStringsListBox.Items.OfType <LastDirectConnectionString>()
                .ToList();

            foreach (LastDirectConnectionString connectionString in connectionStrings)
            {
                if (connectionString != null &&
                    !settingsCopy.LastDirectConnectionStringsItems.Any(
                        x => x.ConnectionString == connectionString.ConnectionString &&
                        x.IsODBC == connectionString.IsODBC
                        )
                    )
                {
                    settingsCopy.LastDirectConnectionStringsItems.Add(connectionString);
                }
            }

            LastDirectConnectionStringGroup newGroup = new LastDirectConnectionStringGroup()
            {
                ConnectionStrings = connectionStrings,
                GroupName         = ConnectionGroupName
            };

            // check if the group does not exist
            if (!settingsCopy.LastDirectConnectionStringsGroups.Any(x => x.Equals(newGroup)))
            {
                bool addNewGroup = true;

                // check whether the group with the same name
                // (but with different settings) exists
                foreach (LastDirectConnectionStringGroup connGroup in settingsCopy.LastDirectConnectionStringsGroups)
                {
                    if (LastDirectConnectionStringGroup.InSettingsComparer.Equals(newGroup, connGroup))
                    {
                        // update it with new settings
                        connGroup.ConnectionStrings = newGroup.ConnectionStrings;
                        addNewGroup = false;
                        break;
                    }
                }

                if (addNewGroup)
                {
                    settingsCopy.LastDirectConnectionStringsGroups.Add(newGroup);
                }
            }

            settingsCopy.LastDirectConnectionStrings = connectionStrings;

            if (rbSelectExistTemplate.Checked)
            {
                Template templateFile = this.cbTemplate.SelectedItem as Template;

                if (templateFile != null)
                {
                    settingsCopy.LastSelectedTemplateId = templateFile.Id;
                }
            }
            else if (rbOpenTemplateFromFile.Checked)
            {
                string templateFile = this.cbPathToFile.Text;

                if (!String.IsNullOrWhiteSpace(templateFile) && File.Exists(templateFile))
                {
                    Program.Model.Settings.LastExternalTemplatesItems.Add(templateFile);
                    settingsCopy.LastSelectedTemplateId = templateFile;
                }
            }

            if (this.cbDataBaseType.SelectedItem != null)
            {
                settingsCopy.LastSelectedDataBaseType = (this.cbDataBaseType.SelectedItem as DBType).Name;
            }

            if (this.cbModuleType.SelectedItem != null)
            {
                settingsCopy.LastSelectedTemplateType = ((KeyValuePair <string, string>) this.cbModuleType.SelectedItem).Value;
            }

            Program.Model.SetSettings(settingsCopy);

            if (Program.Model.Settings.LastDirectConnectionStrings != null &&
                Program.Model.Settings.LastDirectConnectionStrings.Any(
                    x => !string.IsNullOrEmpty(x.ConnectionString)
                    )
                )
            {
                this.SetConnectionProperties(
                    Program.Model.Settings.LastDirectConnectionStrings.Where(
                        x => !string.IsNullOrEmpty(x.ConnectionString)
                        ).ToList()
                    );
            }

            this.DialogResult = DialogResult.OK;
        }
        private void cbConnectionUpdate()
        {
            string selDbType = String.Empty;
            LastDirectConnectionStringGroup selectedGroup = null;

            if (cbDataBaseType.SelectedItem != null)
            {
                DBType selItem = cbDataBaseType.SelectedItem as DBType;
                setModuleTypeItems(selItem);
                selDbType = selItem.Id.ToString();
            }

            cbConnection.Items.Clear();

            foreach (LastDirectConnectionString connectionString in Program.Model.Settings.LastDirectConnectionStringsItems.Where(c => c.DataBaseType == selDbType))
            {
                this.cbConnection.Items.Add(connectionString);
            }

            foreach (LastDirectConnectionStringGroup connectionStringGroup in Program.Model.Settings.LastDirectConnectionStringsGroups)
            {
                LastDirectConnectionString firstGroupConnection = connectionStringGroup.ConnectionStrings.ElementAt(0);
                if (firstGroupConnection.DataBaseType != selDbType)
                {
                    continue;
                }

                if (connectionStringGroup.ConnectionStrings.Count == 1 &&
                    firstGroupConnection.ConnectionString.Equals(connectionStringGroup.GroupName))
                {
                    continue;
                }

                this.cbConnection.Items.Add(connectionStringGroup);

                if (IsConnStrGroupWasSelected(connectionStringGroup) && selectedGroup == null)
                {
                    selectedGroup = connectionStringGroup;
                }
            }

            if (this.cbConnection.Items.Count == 1)
            {
                this.cbConnection.SelectedIndex = 0;
                return;
            }

            if (selectedGroup != null)
            {
                this.cbConnection.SelectedItem = selectedGroup;
            }
            else
            {
                LastDirectConnectionString ldcStr = Program.Model.Settings.LastDirectConnectionStrings.FirstOrDefault();

                if (ldcStr != null)
                {
                    foreach (object item in cbConnection.Items)
                    {
                        if (!(item is LastDirectConnectionString))
                        {
                            continue;
                        }

                        string itemName = (item as LastDirectConnectionString).Name;

                        if (itemName == ldcStr.Name)
                        {
                            cbConnection.SelectedItem = item;
                        }
                    }
                }
            }
        }