#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.Collections.Generic; using System.Diagnostics; using System.Windows.Forms; using MiniSqlQuery.Core; using MiniSqlQuery.Core.Commands; using MiniSqlQuery.Properties; using WeifenLuo.WinFormsUI.Docking; namespace MiniSqlQuery { /// The main form. public partial class MainForm : Form, IHostWindow { /// The _services. private readonly IApplicationServices _services; /// The _settings. private readonly IApplicationSettings _settings; /// The _arguements. private string[] _arguements; /// The _db inspector. private IDatabaseInspector _dbInspector; /// The _initialized. private bool _initialized; /// Initializes a new instance of the class. public MainForm() { InitializeComponent(); SetPointerState(Cursors.AppStarting); } /// Initializes a new instance of the class. /// The services. /// The settings. public MainForm(IApplicationServices services, IApplicationSettings settings) : this() { _services = services; _settings = settings; AllowDrop = true; DragEnter += WindowDragEnter; DragDrop += WindowDragDrop; } /// Gets or sets ActiveChildForm. public Form ActiveChildForm { get; internal set; } /// Gets DatabaseInspector. public IDatabaseInspector DatabaseInspector { get { if (_dbInspector == null || ((Form)_dbInspector).IsDisposed) { return null; } return _dbInspector; } } /// Gets Instance. public Form Instance { get { return this; } } /// Gets ToolStrip. [DebuggerNonUserCode] public ToolStrip ToolStrip { get { return toolStripConnection; } } /// The add plugin command. /// public void AddPluginCommand() where TCommand : ICommand, new() { pluginsMenu.DropDownItems.Add(CommandControlBuilder.CreateToolStripMenuItem()); } /// The add tool strip command. /// The index. /// public void AddToolStripCommand(int? index) where TCommand : ICommand, new() { ToolStripButton item = CommandControlBuilder.CreateToolStripButton(); if (index == null) { toolStripConnection.Items.Add(item); } else { toolStripConnection.Items.Insert(index.Value, item); } } /// The add tool strip seperator. /// The index. public void AddToolStripSeperator(int? index) { ToolStripSeparator item = CommandControlBuilder.CreateToolStripMenuItemSeparator(); if (index == null) { toolStripConnection.Items.Add(item); } else { toolStripConnection.Items.Insert(index.Value, item); } } /// The display docked form. /// The frm. public void DisplayDockedForm(DockContent frm) { if (frm != null) { frm.Show(dockPanel, DockState.Document); } } /// The display message box. /// The source. /// The text. /// The caption. /// The buttons. /// The icon. /// The default button. /// The options. /// The help file path. /// The keyword. /// public DialogResult DisplayMessageBox( Form source, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, string helpFilePath, string keyword) { if (helpFilePath == null && keyword == null) { return MessageBox.Show(source, text, caption, buttons, icon, defaultButton, options); } return MessageBox.Show(source, text, caption, buttons, icon, defaultButton, options, helpFilePath, keyword); } /// The display simple message box. /// The source. /// The text. /// The caption. /// public DialogResult DisplaySimpleMessageBox(Form source, string text, string caption) { return MessageBox.Show(source, text, caption); } /// The get menu item. /// The name. /// public ToolStripMenuItem GetMenuItem(string name) { ToolStripMenuItem menuItem = null; foreach (ToolStripMenuItem item in MainMenuStrip.Items) { if (item.Text.Replace("&", string.Empty).ToLower() == name.ToLower()) { menuItem = item; break; } } return menuItem; } /// The set arguments. /// The args. public void SetArguments(string[] args) { _arguements = args; } /// The set pointer state. /// The cursor. public void SetPointerState(Cursor cursor) { Cursor = cursor; Application.DoEvents(); } /// The set status. /// The source. /// The text. public void SetStatus(Form source, string text) { if (source == null || ActiveMdiChild == source) { if (text != null) { text = text.Replace("\r", string.Empty).Replace("\n", " "); } toolStripStatusLabel.Text = text; } } public void SetResultCount(Form source, int? count) { if (source == null || ActiveMdiChild == source) { string result = string.Empty; if (count != null) { if (count.Value == 1) { result = "1 行"; } else { result = count.Value + " 行"; } } toolStripStatusLabelResultCount.Text = result; } } /// The show database inspector. /// The database inspector. /// The dock state. /// public void ShowDatabaseInspector(IDatabaseInspector databaseInspector, DockState dockState) { if (_dbInspector != null && _dbInspector != databaseInspector) { _dbInspector.Close(); } _dbInspector = databaseInspector; DockContent frm = _dbInspector as DockContent; if (frm == null) { throw new InvalidOperationException( "“databaseInspector”必须是“WeifenLuo”。WinFormsUI。对接。基于DockContent的表单。"); } frm.Show(dockPanel, dockState); } /// The show tool window. /// The form. /// The dock state. public void ShowToolWindow(DockContent form, DockState dockState) { form.Show(dockPanel, dockState); } /// The app settings connection definitions changed. /// The sender. /// The e. private void AppSettingsConnectionDefinitionsChanged(object sender, EventArgs e) { LoadUpConnections(); } /// The load up connections. private void LoadUpConnections() { DbConnectionDefinitionList definitionList = _settings.GetConnectionDefinitions(); if (_initialized) // if initialized, just sync the lists { // add missing foreach (var connDef in definitionList.Definitions) { if (!toolStripComboBoxConnection.Items.Contains(connDef)) { toolStripComboBoxConnection.Items.Add(connDef); } } // remove if missing var defList = new List(definitionList.Definitions); for (int i = toolStripComboBoxConnection.Items.Count - 1; i >= 0; i--) { var connDef = (DbConnectionDefinition)toolStripComboBoxConnection.Items[i]; if (!defList.Contains(connDef)) { toolStripComboBoxConnection.Items.RemoveAt(i); } } } else { // first populate toolStripComboBoxConnection.Items.Clear(); foreach (var connDef in definitionList.Definitions) { toolStripComboBoxConnection.Items.Add(connDef); } } // Bug fix - don't automatically refresh as it can try to reconnect to a connection you don't have etc. //foreach (var connDef in definitionList.Definitions) //{ // if (connDef.Name == Settings.Default.NammedConnection) // { // toolStripComboBoxConnection.SelectedItem = connDef; // _settings.ConnectionDefinition = connDef; // SetWindowTitle(connDef.Name); // } //} } /// The main form_ form closing. /// The sender. /// The e. private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (e.Cancel) { return; } if (_settings.ConnectionDefinition != null) { Settings.Default.NammedConnection = _settings.ConnectionDefinition.Name; Settings.Default.Save(); } List plugins = new List(_services.Plugins.Values); plugins.Reverse(); foreach (IPlugIn plugin in plugins) { plugin.UnloadPlugIn(); } _services.Container.Dispose(); } /// The main form_ load. /// The sender. /// The e. private void MainForm_Load(object sender, EventArgs e) { _settings.ConnectionDefinitionsChanged += AppSettingsConnectionDefinitionsChanged; toolStripStatusLabelResultCount.Text = string.Empty; Utility.CreateConnectionStringsIfRequired(); _settings.SetConnectionDefinitions(Utility.LoadDbConnectionDefinitions()); } /// The main form_ mdi child activate. /// The sender. /// The e. private void MainForm_MdiChildActivate(object sender, EventArgs e) { ActiveChildForm = ActiveMdiChild; } /// The main form_ shown. /// The sender. /// The e. private void MainForm_Shown(object sender, EventArgs e) { _services.InitializePlugIns(); DockContent dbInspectorForm = _dbInspector as DockContent; if (dbInspectorForm != null) { // the activate for "DockContent" is different to that of "Form". dbInspectorForm.Activate(); } _initialized = true; SetPointerState(Cursors.Default); SetStatus(null, string.Empty); // now check for command line args that are "command type names" if (_arguements != null && _arguements.Length > 0) { foreach (string arg in _arguements) { if (arg.StartsWith("/cmd:")) { string cmdName = arg.Substring(5); ICommand cmd = CommandManager.GetCommandInstanceByPartialName(cmdName); if (cmd != null) { cmd.Execute(); } } } } else { CommandManager.GetCommandInstance().Execute(); } } /// The set window title. /// The connection name. private void SetWindowTitle(string connectionName) { Text = string.Format("迷你SQL查询 [{0}]", connectionName); } /// The window drag drop. /// The sender. /// The e. private void WindowDragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); IFileEditorResolver resolver = _services.Resolve(); foreach (string filename in filePaths) { // todo: check for file exist file in open windows; IEditor editor = resolver.ResolveEditorInstance(filename); editor.FileName = filename; editor.LoadFile(); DisplayDockedForm(editor as DockContent); } } } /// The window drag enter. /// The sender. /// The e. private void WindowDragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } } /// The exit tool strip menu item_ click. /// The sender. /// The e. private void exitToolStripMenuItem_Click(object sender, EventArgs e) { CommandManager.GetCommandInstance().Execute(); } /// The hide show tool strip menu item_ click. /// The sender. /// The e. private void hideShowToolStripMenuItem_Click(object sender, EventArgs e) { if (WindowState == FormWindowState.Normal) { Hide(); WindowState = FormWindowState.Minimized; } else { Show(); WindowState = FormWindowState.Normal; } } /// The sys icon_ double click. /// The sender. /// The e. private void sysIcon_DoubleClick(object sender, EventArgs e) { if (WindowState == FormWindowState.Normal) { Hide(); WindowState = FormWindowState.Minimized; } else { Show(); WindowState = FormWindowState.Normal; } } /// The tool strip combo box connection_ selected index changed. /// The sender. /// The e. private void toolStripComboBoxConnection_SelectedIndexChanged(object sender, EventArgs e) { if (_initialized) { DbConnectionDefinition dbConnectionDefinition = (DbConnectionDefinition)toolStripComboBoxConnection.SelectedItem; _settings.ConnectionDefinition = dbConnectionDefinition; SetWindowTitle(dbConnectionDefinition.Name); } } private void dockPanel_ActiveContentChanged(object sender, EventArgs e) { } } }