using NHSE.WinForms.Properties; using System; using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace NHSE.WinForms; internal static class WinFormsUtil { internal static void TranslateInterface(Control form, string lang) => form.TranslateInterface(lang); #region Message Displays /// /// Displays a dialog showing the details of an error. /// /// User-friendly message about the error. /// The associated with the dialog. internal static DialogResult Error(params string[] lines) { System.Media.SystemSounds.Hand.Play(); string msg = string.Join(Environment.NewLine + Environment.NewLine, lines); return MessageBox.Show(msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } internal static DialogResult Alert(params string[] lines) => Alert(true, lines); internal static DialogResult Alert(bool sound, params string[] lines) { if (sound) System.Media.SystemSounds.Asterisk.Play(); string msg = string.Join(Environment.NewLine + Environment.NewLine, lines); return MessageBox.Show(msg, "Alert", MessageBoxButtons.OK, sound ? MessageBoxIcon.Information : MessageBoxIcon.None); } internal static DialogResult Prompt(MessageBoxButtons btn, params string[] lines) { System.Media.SystemSounds.Asterisk.Play(); string msg = string.Join(Environment.NewLine + Environment.NewLine, lines); return MessageBox.Show(msg, "Prompt", btn, MessageBoxIcon.Question); } #endregion /// /// Searches upwards through the control hierarchy to find the first parent control of type . /// /// Child control to start searching from. /// The first parent control of type , or null if none found. public static bool TryGetUnderlying(object sender, [NotNullWhen(true)] out T? result) where T : class { while (true) { switch (sender) { case T p: result = p; return true; case ToolStripItem { Owner: { } o }: sender = o; continue; case ContextMenuStrip { SourceControl: { } s }: sender = s; continue; default: result = null; return false; } } } /// /// Gets the selected value of the input . If no value is selected, will return 0. /// /// ComboBox to retrieve value for. internal static int GetIndex(ListControl cb) => (int)(cb.SelectedValue ?? 0); public static T? FirstFormOfType() where T : Form => (T?)Application.OpenForms.Cast
().FirstOrDefault(form => form is T); public static void RemoveDropCB(object sender, KeyEventArgs e) => ((ComboBox)sender).DroppedDown = false; /// /// Centers the horizontally and vertically so that its center is the same as the 's center. /// /// /// internal static void CenterToForm(this Control child, Control parent) { int x = parent.Location.X + ((parent.Width - child.Width) / 2); int y = parent.Location.Y + ((parent.Height - child.Height) / 2); child.Location = new Point(Math.Max(x, 0), Math.Max(y, 0)); } /// /// Sets the application color mode based on the passed to it and stores it in the application . /// /// public static void SetApplicationTheme(int theme) { switch (theme) { case 0: Application.SetColorMode(SystemColorMode.Classic); break; case 1: Application.SetColorMode(SystemColorMode.System); break; case 2: Application.SetColorMode(SystemColorMode.Dark); break; } var settings = Settings.Default; settings.DarkMode = theme.ToString(); settings.Save(); } }