diff --git a/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.cs b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.cs
new file mode 100644
index 0000000..b3fdbbc
--- /dev/null
+++ b/minisqlquery-master/src/MiniSqlQuery/PlugIns/ConnectionStringsManager/DbConnectionsForm.cs
@@ -0,0 +1,345 @@
+#region License
+
+// Copyright 2005-2019 Paul Kohler (https://github.com/paulkohler/minisqlquery). All rights reserved.
+// This source code is made available under the terms of the GNU Lesser General Public License v3.0
+// https://github.com/paulkohler/minisqlquery/blob/master/LICENSE
+#endregion
+
+using System;
+using System.Windows.Forms;
+using MiniSqlQuery.Core;
+using MiniSqlQuery.Properties;
+
+namespace MiniSqlQuery.PlugIns.ConnectionStringsManager
+{
+ /// <summary>The db connections form.</summary>
+ public partial class DbConnectionsForm : Form
+ {
+ /// <summary>The _host window.</summary>
+ private readonly IHostWindow _hostWindow;
+
+ /// <summary>The _services.</summary>
+ private readonly IApplicationServices _services;
+
+ /// <summary>The _settings.</summary>
+ private readonly IApplicationSettings _settings;
+
+ /// <summary>The _definition list.</summary>
+ private DbConnectionDefinitionList _definitionList;
+
+ private bool _loaded;
+
+ private bool _dirty;
+
+ /// <summary>Initializes a new instance of the <see cref="DbConnectionsForm"/> class.</summary>
+ public DbConnectionsForm()
+ {
+ InitializeComponent();
+ toolStripButtonAdd.Image = ImageResource.database_add;
+ toolStripButtonCopyAsNew.Image = ImageResource.database_add;
+ toolStripButtonEditConnStr.Image = ImageResource.database_edit;
+ toolStripButtonDelete.Image = ImageResource.database_delete;
+ Icon = ImageResource.disconnect_icon;
+ }
+
+ /// <summary>Initializes a new instance of the <see cref="DbConnectionsForm"/> class.</summary>
+ /// <param name="services">The services.</param>
+ /// <param name="hostWindow">The host window.</param>
+ /// <param name="settings">The settings.</param>
+ public DbConnectionsForm(IApplicationServices services, IHostWindow hostWindow, IApplicationSettings settings)
+ : this()
+ {
+ _services = services;
+ _hostWindow = hostWindow;
+ _settings = settings;
+ }
+
+ /// <summary>The load connection definitions.</summary>
+ /// <returns></returns>
+ private static DbConnectionDefinitionList LoadConnectionDefinitions()
+ {
+ return DbConnectionDefinitionList.FromXml(Utility.LoadConnections());
+ }
+
+
+ /// <summary>The add to list.</summary>
+ /// <param name="definition">The definition.</param>
+ private void AddToList(DbConnectionDefinition definition)
+ {
+ if (!lstConnections.Items.Contains(definition))
+ {
+ lstConnections.Items.Add(definition);
+ SetDirty();
+ }
+ }
+
+ /// <summary>The db connections form_ form closing.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void DbConnectionsForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (_dirty)
+ {
+ DialogResult saveFile = _hostWindow.DisplayMessageBox(
+ this,
+ Resources.The_connection_details_have_changed__do_you_want_to_save,
+ Resources.Save_Changes,
+ MessageBoxButtons.YesNoCancel,
+ MessageBoxIcon.Question,
+ MessageBoxDefaultButton.Button1,
+ 0,
+ null,
+ null);
+
+ switch (saveFile)
+ {
+ case DialogResult.Yes:
+ SaveConnectionDefinitions(_definitionList);
+ break;
+ case DialogResult.Cancel:
+ e.Cancel = true;
+ break;
+ }
+ }
+ }
+
+ /// <summary>The db connections form_ shown.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void DbConnectionsForm_Shown(object sender, EventArgs e)
+ {
+ _definitionList = LoadConnectionDefinitions();
+ UpdateListView();
+ _loaded = true;
+ }
+
+ /// <summary>The manage definition.</summary>
+ /// <param name="definition">The definition.</param>
+ private void ManageDefinition(DbConnectionDefinition definition)
+ {
+ ConnectionStringBuilderForm frm;
+ string oldName = null;
+
+ if (definition == null)
+ {
+ frm = new ConnectionStringBuilderForm(_hostWindow, _services); // new blank form
+ }
+ else
+ {
+ oldName = definition.Name;
+ frm = new ConnectionStringBuilderForm(_hostWindow, definition, _services);
+ }
+
+ frm.ShowDialog(this);
+
+ if (frm.DialogResult == DialogResult.OK)
+ {
+ SetDirty();
+
+ if (lstConnections.Items.Contains(frm.ConnectionDefinition) && definition != null)
+ {
+ if (definition.Name != oldName)
+ {
+ // want the list text to update due to name change
+ UpdateListView();
+ lstConnections.SelectedItem = definition;
+ }
+ else
+ {
+ UpdateDetailsPanel(lstConnections.SelectedItem as DbConnectionDefinition);
+ }
+ }
+ else
+ {
+ _definitionList.AddDefinition(frm.ConnectionDefinition);
+ AddToList(frm.ConnectionDefinition);
+ lstConnections.SelectedItem = frm.ConnectionDefinition;
+ }
+ }
+ }
+
+ /// <summary>The remove from list.</summary>
+ /// <param name="definition">The definition.</param>
+ private void RemoveFromList(DbConnectionDefinition definition)
+ {
+ if (lstConnections.Items.Contains(definition))
+ {
+ lstConnections.Items.Remove(definition);
+ SetDirty();
+ }
+ }
+
+
+ /// <summary>The save connection definitions.</summary>
+ /// <param name="data">The data.</param>
+ private void SaveConnectionDefinitions(DbConnectionDefinitionList data)
+ {
+ _settings.SetConnectionDefinitions(data);
+ Utility.SaveConnections(data);
+ _dirty = false;
+ }
+
+ /// <summary>The update details panel.</summary>
+ /// <param name="definition">The definition.</param>
+ private void UpdateDetailsPanel(DbConnectionDefinition definition)
+ {
+ if (definition != null)
+ {
+ txtName.Text = definition.Name;
+ txtProvider.Text = definition.ProviderName;
+ txtConn.Text = definition.ConnectionString;
+ txtComment.Text = definition.Comment;
+ }
+ else
+ {
+ txtName.Clear();
+ txtProvider.Clear();
+ txtConn.Clear();
+ txtComment.Clear();
+ }
+ }
+
+ /// <summary>The update list view.</summary>
+ private void UpdateListView()
+ {
+ if (_definitionList.Definitions != null && _definitionList.Definitions.Length > 0)
+ {
+ lstConnections.Items.Clear();
+ lstConnections.Items.AddRange(_definitionList.Definitions);
+ lstConnections.SelectedItem = _definitionList.Definitions[0];
+ }
+ }
+
+ /// <summary>The lst connections_ double click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void lstConnections_DoubleClick(object sender, EventArgs e)
+ {
+ DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+ if (definition != null)
+ {
+ ManageDefinition(definition);
+ }
+ }
+
+ /// <summary>The lst connections_ selected value changed.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void lstConnections_SelectedValueChanged(object sender, EventArgs e)
+ {
+ DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+ UpdateDetailsPanel(definition);
+ }
+
+ /// <summary>The tool strip button add_ click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void toolStripButtonAdd_Click(object sender, EventArgs e)
+ {
+ ManageDefinition(null);
+ }
+
+ /// <summary>The tool strip button cancel_ click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void toolStripButtonCancel_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+
+ /// <summary>The tool strip button copy as new_ click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void toolStripButtonCopyAsNew_Click(object sender, EventArgs e)
+ {
+ DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+ if (definition != null)
+ {
+ DbConnectionDefinition newDefinition = DbConnectionDefinition.FromXml(definition.ToXml());
+ newDefinition.Name = "Copy of " + newDefinition.Name;
+ ManageDefinition(newDefinition);
+ }
+ }
+
+ /// <summary>The tool strip button delete_ click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void toolStripButtonDelete_Click(object sender, EventArgs e)
+ {
+ DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+ if (definition != null)
+ {
+ int newIndex = Math.Max(lstConnections.SelectedIndex - 1, 0);
+ _definitionList.RemoveDefinition(definition);
+ RemoveFromList(definition);
+ if (lstConnections.Items.Count > 0)
+ {
+ lstConnections.SelectedIndex = newIndex;
+ }
+ }
+ }
+
+ /// <summary>The tool strip button edit conn str_ click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void toolStripButtonEditConnStr_Click(object sender, EventArgs e)
+ {
+ DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+ if (definition != null)
+ {
+ ManageDefinition(definition);
+ }
+ }
+
+ /// <summary>The tool strip button ok_ click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void toolStripButtonOk_Click(object sender, EventArgs e)
+ {
+ SaveConnectionDefinitions(_definitionList);
+ Close();
+ }
+
+ /// <summary>The tool strip button test_ click.</summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private void toolStripButtonTest_Click(object sender, EventArgs e)
+ {
+ // do a standalone raw connection test
+ DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition;
+ if (definition != null)
+ {
+ Exception exp = QueryRunner.TestDbConnection(definition.ProviderName, definition.ConnectionString);
+ if (exp == null)
+ {
+ string msg = string.Format("Connected to '{0}' successfully.", definition.Name);
+ _hostWindow.DisplaySimpleMessageBox(this, msg, "Connection Successful");
+ }
+ else
+ {
+ string msg = string.Format("Failed connecting to '{0}'.{1}{2}", definition.Name, Environment.NewLine, exp.Message);
+ _hostWindow.DisplaySimpleMessageBox(this, msg, "Connection Failed");
+ }
+ }
+ }
+
+ private void DbConnectionsForm_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ private void SetDirty()
+ {
+ if (!_loaded)
+ {
+ return;
+ }
+
+ if (!_dirty)
+ {
+ _dirty = true;
+ Text += "*";
+ }
+ }
+ }
+}
\ No newline at end of file