340 lines
14 KiB
C#
340 lines
14 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
using MetroFramework.Controls;
|
|
|
|
namespace cashew.MessageBox
|
|
{
|
|
public class MetroMessageBoxControl : Form
|
|
{
|
|
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
|
|
private readonly Color _defaultColor = Color.FromArgb(57, 179, 215);
|
|
|
|
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
|
|
private readonly Color _errorColor = Color.FromArgb(210, 50, 45);
|
|
|
|
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
|
|
private readonly Color _question = Color.FromArgb(71, 164, 71);
|
|
|
|
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
|
|
private readonly Color _warningColor = Color.FromArgb(237, 156, 40);
|
|
|
|
private Label _messageLabel;
|
|
private MetroButton _metroButton1;
|
|
private MetroButton _metroButton2;
|
|
private MetroButton _metroButton3;
|
|
private Panel _pnlBottom;
|
|
|
|
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
|
|
private Color _success = Color.FromArgb(71, 164, 71);
|
|
|
|
private Label _titleLabel;
|
|
private TableLayoutPanel _tlpBody;
|
|
|
|
private IContainer components;
|
|
|
|
public MetroMessageBoxControl()
|
|
{
|
|
InitializeComponent();
|
|
Properties = new MetroMessageBoxProperties(this);
|
|
StylizeButton(_metroButton1);
|
|
StylizeButton(_metroButton2);
|
|
StylizeButton(_metroButton3);
|
|
_metroButton1.Click += button_Click;
|
|
_metroButton2.Click += button_Click;
|
|
_metroButton3.Click += button_Click;
|
|
}
|
|
|
|
public Panel Body { get; private set; }
|
|
|
|
public MetroMessageBoxProperties Properties { get; }
|
|
|
|
public DialogResult Result { get; private set; }
|
|
|
|
public void ArrangeApperance()
|
|
{
|
|
_titleLabel.Text = Properties.Title;
|
|
_messageLabel.Text = Properties.Message;
|
|
switch (Properties.Icon)
|
|
{
|
|
case MessageBoxIcon.Hand:
|
|
Body.BackColor = _errorColor;
|
|
break;
|
|
case MessageBoxIcon.Exclamation:
|
|
Body.BackColor = _warningColor;
|
|
break;
|
|
}
|
|
|
|
switch (Properties.Buttons)
|
|
{
|
|
case MessageBoxButtons.OK:
|
|
EnableButton(_metroButton1);
|
|
_metroButton1.Text = "Ok";
|
|
_metroButton1.Location = _metroButton3.Location;
|
|
_metroButton1.Tag = DialogResult.OK;
|
|
EnableButton(_metroButton2, false);
|
|
EnableButton(_metroButton3, false);
|
|
break;
|
|
case MessageBoxButtons.OKCancel:
|
|
EnableButton(_metroButton1);
|
|
_metroButton1.Text = "Ok";
|
|
_metroButton1.Location = _metroButton2.Location;
|
|
_metroButton1.Tag = DialogResult.OK;
|
|
EnableButton(_metroButton2);
|
|
_metroButton2.Text = "Cancel";
|
|
_metroButton2.Location = _metroButton3.Location;
|
|
_metroButton2.Tag = DialogResult.Cancel;
|
|
EnableButton(_metroButton3, false);
|
|
break;
|
|
case MessageBoxButtons.AbortRetryIgnore:
|
|
EnableButton(_metroButton1);
|
|
_metroButton1.Text = "Abort";
|
|
_metroButton1.Tag = DialogResult.Abort;
|
|
EnableButton(_metroButton2);
|
|
_metroButton2.Text = "Retry";
|
|
_metroButton2.Tag = DialogResult.Retry;
|
|
EnableButton(_metroButton3);
|
|
_metroButton3.Text = "Ignore";
|
|
_metroButton3.Tag = DialogResult.Ignore;
|
|
break;
|
|
case MessageBoxButtons.YesNoCancel:
|
|
EnableButton(_metroButton1);
|
|
_metroButton1.Text = "Yes";
|
|
_metroButton1.Tag = DialogResult.Yes;
|
|
EnableButton(_metroButton2);
|
|
_metroButton2.Text = "No";
|
|
_metroButton2.Tag = DialogResult.No;
|
|
EnableButton(_metroButton3);
|
|
_metroButton3.Text = "Cancel";
|
|
_metroButton3.Tag = DialogResult.Cancel;
|
|
break;
|
|
case MessageBoxButtons.YesNo:
|
|
EnableButton(_metroButton1);
|
|
_metroButton1.Text = "Yes";
|
|
_metroButton1.Location = _metroButton2.Location;
|
|
_metroButton1.Tag = DialogResult.Yes;
|
|
EnableButton(_metroButton2);
|
|
_metroButton2.Text = "No";
|
|
_metroButton2.Location = _metroButton3.Location;
|
|
_metroButton2.Tag = DialogResult.No;
|
|
EnableButton(_metroButton3, false);
|
|
break;
|
|
case MessageBoxButtons.RetryCancel:
|
|
EnableButton(_metroButton1);
|
|
_metroButton1.Text = "Retry";
|
|
_metroButton1.Location = _metroButton2.Location;
|
|
_metroButton1.Tag = DialogResult.Retry;
|
|
EnableButton(_metroButton2);
|
|
_metroButton2.Text = "Cancel";
|
|
_metroButton2.Location = _metroButton3.Location;
|
|
_metroButton2.Tag = DialogResult.Cancel;
|
|
EnableButton(_metroButton3, false);
|
|
break;
|
|
}
|
|
|
|
switch (Properties.Icon)
|
|
{
|
|
case MessageBoxIcon.Hand:
|
|
Body.BackColor = _errorColor;
|
|
break;
|
|
case MessageBoxIcon.Question:
|
|
Body.BackColor = _question;
|
|
break;
|
|
case MessageBoxIcon.Exclamation:
|
|
Body.BackColor = _warningColor;
|
|
break;
|
|
case MessageBoxIcon.Asterisk:
|
|
Body.BackColor = _defaultColor;
|
|
break;
|
|
default:
|
|
Body.BackColor = Color.DarkGray;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void EnableButton(MetroButton button)
|
|
{
|
|
EnableButton(button, true);
|
|
}
|
|
|
|
private void EnableButton(MetroButton button, bool enabled)
|
|
{
|
|
button.Enabled = enabled;
|
|
button.Visible = enabled;
|
|
}
|
|
|
|
public void SetDefaultButton()
|
|
{
|
|
switch (Properties.DefaultButton)
|
|
{
|
|
case MessageBoxDefaultButton.Button1:
|
|
if (_metroButton1 == null || !_metroButton1.Enabled)
|
|
break;
|
|
_metroButton1.Focus();
|
|
break;
|
|
case MessageBoxDefaultButton.Button2:
|
|
if (_metroButton2 == null || !_metroButton2.Enabled)
|
|
break;
|
|
_metroButton2.Focus();
|
|
break;
|
|
case MessageBoxDefaultButton.Button3:
|
|
if (_metroButton3 == null || !_metroButton3.Enabled)
|
|
break;
|
|
_metroButton3.Focus();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void button_MouseClick(object sender, MouseEventArgs e)
|
|
{
|
|
}
|
|
|
|
private void button_MouseEnter(object sender, EventArgs e)
|
|
{
|
|
StylizeButton((MetroButton) sender, true);
|
|
}
|
|
|
|
private void button_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
StylizeButton((MetroButton) sender);
|
|
}
|
|
|
|
private void StylizeButton(MetroButton button)
|
|
{
|
|
StylizeButton(button, false);
|
|
}
|
|
|
|
private void StylizeButton(MetroButton button, bool hovered)
|
|
{
|
|
button.Cursor = Cursors.Hand;
|
|
button.MouseClick -= button_MouseClick;
|
|
button.MouseClick += button_MouseClick;
|
|
button.MouseEnter -= button_MouseEnter;
|
|
button.MouseEnter += button_MouseEnter;
|
|
button.MouseLeave -= button_MouseLeave;
|
|
button.MouseLeave += button_MouseLeave;
|
|
}
|
|
|
|
private void button_Click(object sender, EventArgs e)
|
|
{
|
|
MetroButton metroButton = (MetroButton) sender;
|
|
if (!metroButton.Enabled)
|
|
return;
|
|
Result = (DialogResult) metroButton.Tag;
|
|
Hide();
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if (disposing && components != null)
|
|
components.Dispose();
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
Body = new Panel();
|
|
_tlpBody = new TableLayoutPanel();
|
|
_messageLabel = new Label();
|
|
_titleLabel = new Label();
|
|
_metroButton1 = new MetroButton();
|
|
_metroButton3 = new MetroButton();
|
|
_metroButton2 = new MetroButton();
|
|
_pnlBottom = new Panel();
|
|
Body.SuspendLayout();
|
|
_tlpBody.SuspendLayout();
|
|
_pnlBottom.SuspendLayout();
|
|
SuspendLayout();
|
|
Body.BackColor = Color.DarkGray;
|
|
Body.Controls.Add(_tlpBody);
|
|
Body.Dock = DockStyle.Fill;
|
|
Body.Location = new Point(0, 0);
|
|
Body.Margin = new Padding(0);
|
|
Body.Name = "Body";
|
|
Body.Size = new Size(804, 211);
|
|
Body.TabIndex = 2;
|
|
_tlpBody.ColumnCount = 3;
|
|
_tlpBody.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 10f));
|
|
_tlpBody.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 80f));
|
|
_tlpBody.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 10f));
|
|
_tlpBody.Controls.Add(_messageLabel, 1, 2);
|
|
_tlpBody.Controls.Add(_titleLabel, 1, 1);
|
|
_tlpBody.Controls.Add(_pnlBottom, 1, 3);
|
|
_tlpBody.Dock = DockStyle.Fill;
|
|
_tlpBody.Location = new Point(0, 0);
|
|
_tlpBody.Name = "_tlpBody";
|
|
_tlpBody.RowCount = 4;
|
|
_tlpBody.RowStyles.Add(new RowStyle(SizeType.Absolute, 5f));
|
|
_tlpBody.RowStyles.Add(new RowStyle(SizeType.Absolute, 25f));
|
|
_tlpBody.RowStyles.Add(new RowStyle(SizeType.Percent, 100f));
|
|
_tlpBody.RowStyles.Add(new RowStyle(SizeType.Absolute, 40f));
|
|
_tlpBody.Size = new Size(804, 211);
|
|
_tlpBody.TabIndex = 6;
|
|
_messageLabel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
|
_messageLabel.BackColor = Color.Transparent;
|
|
_messageLabel.ForeColor = Color.White;
|
|
_messageLabel.Location = new Point(83, 30);
|
|
_messageLabel.Margin = new Padding(3, 0, 0, 0);
|
|
_messageLabel.Name = "_messageLabel";
|
|
_messageLabel.Size = new Size(640, 141);
|
|
_messageLabel.TabIndex = 0;
|
|
_messageLabel.Text = "message here";
|
|
_titleLabel.AutoSize = true;
|
|
_titleLabel.BackColor = Color.Transparent;
|
|
_titleLabel.Font = new Font("Segoe UI Semibold", 14.25f, FontStyle.Bold, GraphicsUnit.Point, 0);
|
|
_titleLabel.ForeColor = Color.WhiteSmoke;
|
|
_titleLabel.Location = new Point(80, 5);
|
|
_titleLabel.Margin = new Padding(0);
|
|
_titleLabel.Name = "_titleLabel";
|
|
_titleLabel.Size = new Size(125, 25);
|
|
_titleLabel.TabIndex = 1;
|
|
_titleLabel.Text = "message title";
|
|
_metroButton1.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
|
_metroButton1.BackColor = Color.ForestGreen;
|
|
_metroButton1.Location = new Point(357, 1);
|
|
_metroButton1.Name = "_metroButton1";
|
|
_metroButton1.Size = new Size(90, 26);
|
|
_metroButton1.TabIndex = 3;
|
|
_metroButton1.Text = "button 1";
|
|
_metroButton3.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
|
_metroButton3.Location = new Point(553, 1);
|
|
_metroButton3.Name = "_metroButton3";
|
|
_metroButton3.Size = new Size(90, 26);
|
|
_metroButton3.TabIndex = 5;
|
|
_metroButton3.Text = "button 3";
|
|
_metroButton2.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
|
_metroButton2.Location = new Point(455, 1);
|
|
_metroButton2.Name = "_metroButton2";
|
|
_metroButton2.Size = new Size(90, 26);
|
|
_metroButton2.TabIndex = 4;
|
|
_metroButton2.Text = "button 2";
|
|
_pnlBottom.BackColor = Color.Transparent;
|
|
_pnlBottom.Controls.Add(_metroButton2);
|
|
_pnlBottom.Controls.Add(_metroButton1);
|
|
_pnlBottom.Controls.Add(_metroButton3);
|
|
_pnlBottom.Dock = DockStyle.Fill;
|
|
_pnlBottom.Location = new Point(80, 171);
|
|
_pnlBottom.Margin = new Padding(0);
|
|
_pnlBottom.Name = "_pnlBottom";
|
|
_pnlBottom.Size = new Size(643, 40);
|
|
_pnlBottom.TabIndex = 2;
|
|
AutoScaleDimensions = new SizeF(8f, 21f);
|
|
AutoScaleMode = AutoScaleMode.Font;
|
|
ClientSize = new Size(804, 211);
|
|
ControlBox = false;
|
|
Controls.Add(Body);
|
|
Font = new Font("Segoe UI Light", 12f, FontStyle.Regular, GraphicsUnit.Point, 0);
|
|
FormBorderStyle = FormBorderStyle.None;
|
|
Margin = new Padding(4, 5, 4, 5);
|
|
Name = nameof(MetroMessageBoxControl);
|
|
StartPosition = FormStartPosition.Manual;
|
|
Body.ResumeLayout(false);
|
|
_tlpBody.ResumeLayout(false);
|
|
_tlpBody.PerformLayout();
|
|
_pnlBottom.ResumeLayout(false);
|
|
ResumeLayout(false);
|
|
}
|
|
}
|
|
} |