private void AddDb_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                NpgsqlConnectionStringBuilder connectionBuilder;
                var addDbWindow = new AddDbWindow();
                if (addDbWindow.ShowDialog() == true)
                {
                    connectionBuilder = NpgsqlCommunication.CreateConnectionStringBuilder(
                        addDbWindow.Server, addDbWindow.Port, addDbWindow.Database,
                        addDbWindow.User, addDbWindow.Password);

                    var connection = new NpgsqlConnection(connectionBuilder.ConnectionString);
                    connection.Open();

                    if (connection.State == ConnectionState.Open)
                    {
                        MessageBox.Show("The connection to " + addDbWindow.Database + " was successful. Database saved",
                                        "Connected", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        MessageBox.Show("Failed to connect to database, maybe server is closed or your input is wrong.",
                                        "Failure", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    connection.Close();
                }
                else
                {
                    return;
                }

                var communication =
                    new NpgsqlCommunication(addDbWindow.Database, addDbWindow.User,
                                            addDbWindow.Server, addDbWindow.Port, addDbWindow.Password);

                // Create recording in the DbCourseWork.exe.Config
                var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                var settings   = configFile.ConnectionStrings.ConnectionStrings;
                if (settings[addDbWindow.Database] == null)
                {
                    settings.Add(new ConnectionStringSettings(addDbWindow.Database, connectionBuilder.ConnectionString));
                    settings[addDbWindow.Database].ProviderName = "PostgreSQL";

                    PostgreCommunications.Add(addDbWindow.Database, communication);
                    PostgreCommunications[addDbWindow.Database].FillDs();

                    BuildTreeView(DatabasesTreeView, communication);
                }

                else
                {
                    settings[addDbWindow.Database].Name             = addDbWindow.Database;
                    settings[addDbWindow.Database].ConnectionString = connectionBuilder.ConnectionString;
                    settings[addDbWindow.Database].ProviderName     = "PostgreSQL";

                    PostgreCommunications.Remove(addDbWindow.Database);
                    PostgreCommunications.Add(addDbWindow.Database, communication);
                    PostgreCommunications[addDbWindow.Database].FillDs();

                    RemoveTreeView(DatabasesTreeView, addDbWindow.Database);
                    BuildTreeView(DatabasesTreeView, communication);
                }

                configFile.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("connectionStrings");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void BuildTreeView(TreeView treeView, NpgsqlCommunication communication)
        {
            var dbContextMenu = new ContextMenu();
            var dbRefreshItem = new MenuItem {
                Header = "Refresh"
            };

            dbRefreshItem.Click += DbMenuItem_Refresh;
            dbContextMenu.Items.Add(dbRefreshItem);

            var dbDisconnectItem = new MenuItem {
                Header = "Disconnect"
            };

            dbDisconnectItem.Click += DbMenuItem_Disconnect;
            dbContextMenu.Items.Add(dbDisconnectItem);


            var dbView = new TreeViewItem
            {
                Header      = communication.Ds.DataSetName,
                ContextMenu = dbContextMenu
            };

            dbView.ContextMenu.PlacementTarget = dbView;

            dbView.Header = CreateHeaderWithIcon("Database", dbView.Header.ToString(),
                                                 new Thickness(0, 0, 0, 3), new Thickness(5, 0, 0, 0));

            treeView.Items.Add(dbView);

            foreach (DataTable table in communication.Ds.Tables)
            {
                var tableContextMenu = new ContextMenu();
                var tableViewAllItem = new MenuItem {
                    Header = "View all rows"
                };
                tableViewAllItem.Click += ViewAll_Click;
                tableContextMenu.Items.Add(tableViewAllItem);

                var tableViewFirstItem = new MenuItem {
                    Header = "View first 100 rows"
                };
                tableViewFirstItem.Click += ViewFirst_Click;
                tableContextMenu.Items.Add(tableViewFirstItem);

                var tableViewLastItem = new MenuItem {
                    Header = "View last 100 rows"
                };
                tableViewLastItem.Click += ViewLast_Click;
                tableContextMenu.Items.Add(tableViewLastItem);

                var tableView = new TreeViewItem
                {
                    Header      = table.TableName,
                    ContextMenu = tableContextMenu
                };
                tableView.ContextMenu.PlacementTarget = tableView;
                tableView.Header = CreateHeaderWithIcon("Table", tableView.Header.ToString(),
                                                        new Thickness(0), new Thickness(5, 0, 0, 5));
                dbView.Items.Add(tableView);

                foreach (DataColumn column in table.Columns)
                {
                    var columnView = new TreeViewItem {
                        Header = column.ColumnName
                    };
                    columnView.Header = CreateHeaderWithIcon("Column", columnView.Header.ToString(),
                                                             new Thickness(0), new Thickness(0, 0, 0, 2));
                    tableView.Items.Add(columnView);
                }
            }
        }