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

352 lines
9.8 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// 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
{
/// <summary>
/// Create a new instance of the dialog box with a message and title.
/// </summary>
/// <param name="message">Message text.</param>
/// <param name="title">Dialog Box title.</param>
public MsgBox(string message, string title)
: this(message, title, MessageBoxIcon.None)
{
}
/// <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="icon">Standard system messagebox icon.</param>
public MsgBox(string message, string title, MessageBoxIcon icon)
: this(message, title, getMessageBoxIcon(icon))
{
}
/// <summary>
/// Create a new instance of the dialog box with a message and title and a custom windows icon.
/// </summary>
/// <param name="message">Message text.</param>
/// <param name="title">Dialog Box title.</param>
/// <param name="icon">Custom icon.</param>
public MsgBox(string message, string title, Icon icon)
{
InitializeComponent();
this.messageLbl.Text = message;
this.Text = title;
this.m_sysIcon = icon;
if (this.m_sysIcon == null)
this.messageLbl.Location = new Point(FORM_X_MARGIN, FORM_Y_MARGIN);
}
public void SetMessageToAutoSize()
{
this.messageLbl.AutoSize = true;
this.messageLbl.MaximumSize = new Size(this.MaximumSize.Width - this.m_sysIcon.Width - 25, this.MaximumSize.Height);
}
/// <summary>
/// Get system icon for MessageBoxIcon.
/// </summary>
/// <param name="icon">The MessageBoxIcon value.</param>
/// <returns>SystemIcon type Icon.</returns>
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;
}
}
#region Setup API
/// <summary>
/// Min set width.
/// </summary>
int m_minWidth;
/// <summary>
/// Min set height.
/// </summary>
int m_minHeight;
/// <summary>
/// Sets the min size of the dialog box. If the text or button row needs more size then the dialog box will size to fit the text.
/// </summary>
/// <param name="width">Min width value.</param>
/// <param name="height">Min height value.</param>
public void SetMinSize(int width, int height)
{
m_minWidth = width;
m_minHeight = height;
}
/// <summary>
/// Create up to 3 buttons with no DialogResult values.
/// </summary>
/// <param name="names">Array of button names. Must of length 1-3.</param>
public void SetButtons(params string[] names)
{
DialogResult[] drs = new DialogResult[names.Length];
for (int i = 0; i < names.Length; i++)
drs[i] = DialogResult.None;
this.SetButtons(names, drs);
}
/// <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>
public void SetButtons(string[] names, DialogResult[] results)
{
this.SetButtons(names, results, 1);
}
/// <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>
public void SetButtons(string[] names, DialogResult[] results, int def)
{
if (names == null)
throw new ArgumentNullException("names", "Button Text is null");
int count = names.Length;
if (count < 1 || count > 3)
throw new ArgumentException("Invalid number of buttons. Must be between 1 and 3.");
//---- Set Button 1
m_minButtonRowWidth += setButtonParams(btn1, names[0], def == 1 ? 1 : 2, results[0]);
//---- Set Button 2
if (count > 1)
{
m_minButtonRowWidth += setButtonParams(btn2, names[1], def == 2 ? 1 : 3, results[1]) + BUTTON_SPACE;
}
//---- Set Button 3
if (count > 2)
{
m_minButtonRowWidth += setButtonParams(btn3, names[2], def == 3 ? 1 : 4, results[2]) + BUTTON_SPACE;
}
}
/// <summary>
/// The min required width of the button and checkbox row. Sum of button widths + checkbox width + margins.
/// </summary>
int m_minButtonRowWidth;
/// <summary>
/// Sets button text and returns the width.
/// </summary>
/// <param name="btn">Button object.</param>
/// <param name="text">Text of the button.</param>
/// <param name="tab">TabIndex of the button.</param>
/// <param name="dr">DialogResult of the button.</param>
/// <returns>Width of the button.</returns>
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;
}
/// <summary>
/// Enables the checkbox. By default the checkbox is unchecked.
/// </summary>
/// <param name="text">Text of the checkbox.</param>
public void SetCheckbox(string text)
{
this.SetCheckbox(text, false);
}
/// <summary>
/// Enables the checkbox and the default checked state.
/// </summary>
/// <param name="text">Text of the checkbox.</param>
/// <param name="chcked">Default checked state of the box.</param>
public void SetCheckbox(string text, bool chcked)
{
this.chkBx.Visible = true;
this.chkBx.Text = text;
this.chkBx.Checked = chcked;
this.m_minButtonRowWidth += this.chkBx.Size.Width + CHECKBOX_SPACE;
}
#endregion
#region Sizes and Locations
private void DialogBox_Load(object sender, EventArgs e)
{
if (!btn1.Visible)
this.SetButtons(new string[] { "OK" }, new DialogResult[] { DialogResult.OK });
m_minButtonRowWidth += 2 * FORM_X_MARGIN; //add margin to the ends
this.setDialogSize();
//this.setButtonRowLocations();
}
const int FORM_Y_MARGIN = 10;
const int FORM_X_MARGIN = 16;
const int BUTTON_SPACE = 5;
const int CHECKBOX_SPACE = 15;
const int TEXT_Y_MARGIN = 30;
/// <summary>
/// Auto fits the dialog box to fit the text and the buttons.
/// </summary>
void setDialogSize()
{
int requiredWidth = this.messageLbl.Location.X + this.messageLbl.Size.Width + FORM_X_MARGIN;
requiredWidth = requiredWidth > m_minButtonRowWidth ? requiredWidth : m_minButtonRowWidth;
int requiredHeight = this.messageLbl.Location.Y + this.messageLbl.Size.Height - this.btn2.Location.Y + this.ClientSize.Height + TEXT_Y_MARGIN;
int minSetWidth = this.ClientSize.Width > this.m_minWidth ? this.ClientSize.Width : this.m_minWidth;
int minSetHeight = this.ClientSize.Height > this.m_minHeight ? this.ClientSize.Height : this.m_minHeight;
Size s = new Size();
s.Width = requiredWidth > minSetWidth ? requiredWidth : minSetWidth;
s.Height = requiredHeight > minSetHeight ? requiredHeight : minSetHeight;
this.ClientSize = s;
}
/// <summary>
/// Sets the buttons and checkboxe location.
/// </summary>
void setButtonRowLocations()
{
int formWidth = this.ClientRectangle.Width;
int x = formWidth - FORM_X_MARGIN;
int y = btn1.Location.Y;
if (btn3.Visible)
{
x -= btn3.Size.Width;
btn3.Location = new Point(x, y);
x -= BUTTON_SPACE;
}
if (btn2.Visible)
{
x -= btn2.Size.Width;
btn2.Location = new Point(x, y);
x -= BUTTON_SPACE;
}
x -= btn1.Size.Width;
btn1.Location = new Point(x, y);
if (this.chkBx.Visible)
this.chkBx.Location = new Point(FORM_X_MARGIN, this.chkBx.Location.Y);
}
#endregion
#region Icon Pain
/// <summary>
/// The icon to paint.
/// </summary>
Icon m_sysIcon;
/// <summary>
/// Paint the System Icon in the top left corner.
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
if (m_sysIcon != null)
{
Graphics g = e.Graphics;
g.DrawIconUnstretched(m_sysIcon, new Rectangle(FORM_X_MARGIN, FORM_Y_MARGIN, m_sysIcon.Width, m_sysIcon.Height));
}
base.OnPaint(e);
}
#endregion
#region Result API
/// <summary>
/// If visible checkbox was checked.
/// </summary>
public bool CheckboxChecked
{
get
{
return this.chkBx.Checked;
}
}
DialogBoxResult m_result;
/// <summary>
/// Gets the button that was pressed.
/// </summary>
public DialogBoxResult DialogBoxResult
{
get
{
return m_result;
}
}
private void btn_Click(object sender, EventArgs e)
{
if (sender == btn1)
this.m_result = DialogBoxResult.Button1;
else if (sender == btn2)
this.m_result = DialogBoxResult.Button2;
else if (sender == btn3)
this.m_result = DialogBoxResult.Button3;
if (((Button)sender).DialogResult == DialogResult.None)
this.Close();
}
#endregion
}
public enum DialogBoxResult
{
Button1,
Button2,
Button3
}
}