BizHawk/BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs

201 lines
5.7 KiB
C#

using System;
using System.Drawing;
using System.Windows.Forms;
using BizHawk.Common;
// http://www.codeproject.com/Articles/154680/A-customizable-NET-WinForms-Message-Box
namespace BizHawk.Client.EmuHawk.CustomControls
{
/// <summary>
/// A customizable Dialog box with 3 buttons, custom icon, and checkbox.
/// </summary>
partial class MsgBox : Form
{
private readonly Icon _msgIcon;
private static readonly int FormYMargin = UIHelper.ScaleY(10);
private static readonly int FormXMargin = UIHelper.ScaleX(16);
private static readonly int ButtonSpace = UIHelper.ScaleX(5);
private static readonly int TextYMargin = UIHelper.ScaleY(30);
// The min required width of the button and checkbox row. Sum of button widths + checkbox width + margins.
private int _minButtonRowWidth;
/// <summary>
/// Create a new instance of the dialog box with a message and title and a standard windows MessageBox icon.
/// </summary>
/// <param name="message">Message text.</param>
/// <param name="title">Dialog Box title.</param>
/// <param name="boxIcon">Standard system MessageBox icon.</param>
public MsgBox(string message, string title, MessageBoxIcon boxIcon)
{
var icon = GetMessageBoxIcon(boxIcon);
InitializeComponent();
ControlBox = false; // Do not set in designer (causes problems with auto scaling)
messageLbl.Text = message;
Text = title;
_msgIcon = icon;
if (_msgIcon == null)
{
messageLbl.Location = new Point(FormXMargin, FormYMargin);
}
}
/// <summary>
/// Gets the button that was pressed.
/// </summary>
public DialogBoxResult DialogBoxResult { get; private set; }
public void SetMessageToAutoSize()
{
messageLbl.AutoSize = true;
messageLbl.MaximumSize = new Size(MaximumSize.Width - _msgIcon.Width - UIHelper.ScaleX(25), MaximumSize.Height);
}
/// <summary>
/// Create up to 3 buttons with given DialogResult values.
/// </summary>
/// <param name="names">Array of button names. Must of length 1-3.</param>
/// <param name="results">Array of DialogResult values. Must be same length as names.</param>
/// <param name="def">Default Button number. Must be 1-3.</param>
/// <exception cref="ArgumentException">length of <paramref name="names"/> is not in range <c>1..3</c></exception>
/// <exception cref="ArgumentNullException"><paramref name="names"/> is null</exception>
public void SetButtons(string[] names, DialogResult[] results, int def = 1)
{
if (names == null)
{
throw new ArgumentNullException(nameof(names), "Button Text is null");
}
int count = names.Length;
if (!1.RangeTo(3).Contains(count))
{
throw new ArgumentException("Invalid number of buttons. Must be between 1 and 3.");
}
//---- Set Button 1
_minButtonRowWidth += SetButtonParams(btn1, names[0], def == 1 ? 1 : 2, results[0]);
//---- Set Button 2
if (count > 1)
{
_minButtonRowWidth += SetButtonParams(btn2, names[1], def == 2 ? 1 : 3, results[1]) + ButtonSpace;
}
//---- Set Button 3
if (count > 2)
{
_minButtonRowWidth += SetButtonParams(btn3, names[2], def == 3 ? 1 : 4, results[2]) + ButtonSpace;
}
}
/// <summary>
/// Paint the System Icon in the top left corner.
/// </summary>
protected override void OnPaint(PaintEventArgs e)
{
if (_msgIcon != null)
{
Graphics g = e.Graphics;
g.DrawIconUnstretched(_msgIcon, new Rectangle(FormXMargin, FormYMargin, _msgIcon.Width, _msgIcon.Height));
}
base.OnPaint(e);
}
// Get system icon for MessageBoxIcon.
private static Icon GetMessageBoxIcon(MessageBoxIcon icon)
{
switch (icon)
{
case MessageBoxIcon.Asterisk:
return SystemIcons.Asterisk;
case MessageBoxIcon.Error:
return SystemIcons.Error;
case MessageBoxIcon.Exclamation:
return SystemIcons.Exclamation;
case MessageBoxIcon.Question:
return SystemIcons.Question;
default:
return null;
}
}
// Sets button text and returns the width.
private static int SetButtonParams(Button btn, string text, int tab, DialogResult dr)
{
btn.Text = text;
btn.Visible = true;
btn.DialogResult = dr;
btn.TabIndex = tab;
return btn.Size.Width;
}
private void DialogBox_Load(object sender, EventArgs e)
{
if (!btn1.Visible)
{
SetButtons(new[] { "OK" }, new[] { DialogResult.OK });
}
_minButtonRowWidth += 2 * FormXMargin; //add margin to the ends
SetDialogSize();
}
// Auto fits the dialog box to fit the text and the buttons.
private void SetDialogSize()
{
int requiredWidth = messageLbl.Location.X + messageLbl.Size.Width + FormXMargin;
requiredWidth = requiredWidth > _minButtonRowWidth ? requiredWidth : _minButtonRowWidth;
int requiredHeight = messageLbl.Location.Y + messageLbl.Size.Height - btn2.Location.Y + ClientSize.Height + TextYMargin;
int minSetWidth = ClientSize.Width;
int minSetHeight = ClientSize.Height;
ClientSize = new Size
{
Width = requiredWidth > minSetWidth
? requiredWidth
: minSetWidth,
Height = requiredHeight > minSetHeight
? requiredHeight
: minSetHeight
};
}
private void ButtonClick(object sender, EventArgs e)
{
if (sender == btn1)
{
DialogBoxResult = DialogBoxResult.Button1;
}
else if (sender == btn2)
{
DialogBoxResult = DialogBoxResult.Button2;
}
else if (sender == btn3)
{
DialogBoxResult = DialogBoxResult.Button3;
}
if (((Button) sender).DialogResult == DialogResult.None)
{
Close();
}
}
}
public enum DialogBoxResult
{
Button1,
Button2,
Button3
}
}