#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 { /// The db connections form. public partial class DbConnectionsForm : Form { /// The _host window. private readonly IHostWindow _hostWindow; /// The _services. private readonly IApplicationServices _services; /// The _settings. private readonly IApplicationSettings _settings; /// The _definition list. private DbConnectionDefinitionList _definitionList; private bool _loaded; private bool _dirty; /// Initializes a new instance of the class. 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; } /// Initializes a new instance of the class. /// The services. /// The host window. /// The settings. public DbConnectionsForm(IApplicationServices services, IHostWindow hostWindow, IApplicationSettings settings) : this() { _services = services; _hostWindow = hostWindow; _settings = settings; } /// The load connection definitions. /// private static DbConnectionDefinitionList LoadConnectionDefinitions() { return DbConnectionDefinitionList.FromXml(Utility.LoadConnections()); } /// The add to list. /// The definition. private void AddToList(DbConnectionDefinition definition) { if (!lstConnections.Items.Contains(definition)) { lstConnections.Items.Add(definition); SetDirty(); } } /// The db connections form_ form closing. /// The sender. /// The e. 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; } } } /// The db connections form_ shown. /// The sender. /// The e. private void DbConnectionsForm_Shown(object sender, EventArgs e) { _definitionList = LoadConnectionDefinitions(); UpdateListView(); _loaded = true; } /// The manage definition. /// The definition. 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; } } } /// The remove from list. /// The definition. private void RemoveFromList(DbConnectionDefinition definition) { if (lstConnections.Items.Contains(definition)) { lstConnections.Items.Remove(definition); SetDirty(); } } /// The save connection definitions. /// The data. private void SaveConnectionDefinitions(DbConnectionDefinitionList data) { _settings.SetConnectionDefinitions(data); Utility.SaveConnections(data); _dirty = false; } /// The update details panel. /// The definition. 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(); } } /// The update list view. private void UpdateListView() { if (_definitionList.Definitions != null && _definitionList.Definitions.Length > 0) { lstConnections.Items.Clear(); lstConnections.Items.AddRange(_definitionList.Definitions); lstConnections.SelectedItem = _definitionList.Definitions[0]; } } /// The lst connections_ double click. /// The sender. /// The e. private void lstConnections_DoubleClick(object sender, EventArgs e) { DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition; if (definition != null) { ManageDefinition(definition); } } /// The lst connections_ selected value changed. /// The sender. /// The e. private void lstConnections_SelectedValueChanged(object sender, EventArgs e) { DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition; UpdateDetailsPanel(definition); } /// The tool strip button add_ click. /// The sender. /// The e. private void toolStripButtonAdd_Click(object sender, EventArgs e) { ManageDefinition(null); } /// The tool strip button cancel_ click. /// The sender. /// The e. private void toolStripButtonCancel_Click(object sender, EventArgs e) { Close(); } /// The tool strip button copy as new_ click. /// The sender. /// The e. 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); } } /// The tool strip button delete_ click. /// The sender. /// The e. 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; } } } /// The tool strip button edit conn str_ click. /// The sender. /// The e. private void toolStripButtonEditConnStr_Click(object sender, EventArgs e) { DbConnectionDefinition definition = lstConnections.SelectedItem as DbConnectionDefinition; if (definition != null) { ManageDefinition(definition); } } /// The tool strip button ok_ click. /// The sender. /// The e. private void toolStripButtonOk_Click(object sender, EventArgs e) { SaveConnectionDefinitions(_definitionList); Close(); } /// The tool strip button test_ click. /// The sender. /// The e. 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("连接数据库'{0}' 成功.", definition.Name); _hostWindow.DisplaySimpleMessageBox(this, msg, "连接成功"); } else { string msg = string.Format("连接失败'{0}'.{1}{2}", definition.Name, Environment.NewLine, exp.Message); _hostWindow.DisplaySimpleMessageBox(this, msg, "连接失败"); } } } private void DbConnectionsForm_Load(object sender, EventArgs e) { } private void SetDirty() { if (!_loaded) { return; } if (!_dirty) { _dirty = true; Text += "*"; } } } }