243 lines
7.8 KiB
C#
243 lines
7.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Immutable;
|
|
using System.Collections.ObjectModel;
|
|
using System.Collections.Specialized;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using Dashboard.Drawing;
|
|
using Dashboard.Windowing;
|
|
|
|
namespace Dashboard.Controls
|
|
{
|
|
public enum MessageBoxIcon
|
|
{
|
|
Info,
|
|
Question,
|
|
Warning,
|
|
Error,
|
|
Custom,
|
|
}
|
|
|
|
public enum MessageBoxButtons
|
|
{
|
|
AbortRetryIgnore,
|
|
CancelRetryContinue,
|
|
Ok,
|
|
OkCancel,
|
|
RetryCancel,
|
|
YesNo,
|
|
YesNoCancel,
|
|
Custom,
|
|
}
|
|
|
|
/// <summary>
|
|
/// A simple message box dialog.
|
|
/// </summary>
|
|
public class MessageBox : Form
|
|
{
|
|
private MessageBoxIcon _icon;
|
|
private MessageBoxButtons _buttons;
|
|
private ImageBox _iconBox = new ImageBox();
|
|
private Label _label = new Label();
|
|
private Container _main = new Container();
|
|
private Container _buttonsContainer = new Container();
|
|
|
|
private Image? IconImage
|
|
{
|
|
get => _iconBox.Image;
|
|
set => _iconBox.Image = value;
|
|
}
|
|
|
|
public MessageBoxIcon Icon
|
|
{
|
|
get => _icon;
|
|
set
|
|
{
|
|
IconImage = value switch
|
|
{
|
|
MessageBoxIcon.Question => s_questionIcon,
|
|
MessageBoxIcon.Info => s_infoIcon,
|
|
MessageBoxIcon.Warning => s_warningIcon,
|
|
MessageBoxIcon.Error => s_errorIcon,
|
|
_ => null,
|
|
};
|
|
|
|
_icon = value;
|
|
}
|
|
}
|
|
|
|
public Image? CustomImage
|
|
{
|
|
get => Icon == MessageBoxIcon.Custom ? IconImage : null;
|
|
set
|
|
{
|
|
if (IconImage == null)
|
|
return;
|
|
Icon = MessageBoxIcon.Custom;
|
|
IconImage = value;
|
|
}
|
|
}
|
|
|
|
public string? Message
|
|
{
|
|
get => _label.Text;
|
|
set => _label.Text = value ?? String.Empty;
|
|
}
|
|
|
|
public MessageBoxButtons Buttons
|
|
{
|
|
get => _buttons;
|
|
set
|
|
{
|
|
_buttons = value;
|
|
UpdateButtons();
|
|
}
|
|
}
|
|
public ObservableCollection<string> CustomButtons { get; } = new ObservableCollection<string>();
|
|
public int Result { get; private set; } = -1;
|
|
|
|
public MessageBox(IWindow window) : base(window)
|
|
{
|
|
// Layout.Rows.Clear();
|
|
// Layout.Rows.Add(-1);
|
|
// Layout.Rows.Add(48);
|
|
//
|
|
// Add(_main);
|
|
// _main.Layout.Columns.Clear();
|
|
// _main.Layout.Columns.Add(48);
|
|
// _main.Layout.Columns.Add(-1);
|
|
|
|
_main.Add(_iconBox);
|
|
_main.Add(_label);
|
|
_label.Layout.Column = 1;
|
|
|
|
Add(_buttonsContainer);
|
|
_buttonsContainer.Layout.Row = 1;
|
|
|
|
CustomButtons.CollectionChanged += (sender, ea) => UpdateButtons();
|
|
|
|
UpdateButtons();
|
|
}
|
|
|
|
private void UpdateButtons()
|
|
{
|
|
foreach (Control button in _buttonsContainer)
|
|
{
|
|
Remove(button);
|
|
}
|
|
|
|
IList<string> list = Buttons switch
|
|
{
|
|
MessageBoxButtons.Custom => CustomButtons,
|
|
MessageBoxButtons.AbortRetryIgnore => s_abortRetryContinue,
|
|
MessageBoxButtons.CancelRetryContinue => s_cancelRetryContinue,
|
|
MessageBoxButtons.OkCancel => s_okCancel,
|
|
MessageBoxButtons.RetryCancel => s_retryCancel,
|
|
MessageBoxButtons.YesNo => s_yesNo,
|
|
MessageBoxButtons.YesNoCancel => s_yesNoCancel,
|
|
_ => s_ok,
|
|
};
|
|
|
|
// _buttonsContainer.Clear();
|
|
// _buttonsContainer.Layout.Columns.Clear();
|
|
// for (int i = 0; i < list.Count; i++)
|
|
// {
|
|
// _buttonsContainer.Layout.Columns.Add(-1);
|
|
// string str = list[i];
|
|
//
|
|
// Button button = new Button() { Text = str };
|
|
// button.Clicked += (sender, ea) => ButtonClicked(sender, ea, i);
|
|
// button.Layout.Column = i;
|
|
// _buttonsContainer.Add(button);
|
|
// Add(button);
|
|
// }
|
|
}
|
|
|
|
private void ButtonClicked(object? sender, EventArgs ea, int i)
|
|
{
|
|
Result = i;
|
|
Dispose();
|
|
}
|
|
|
|
public static readonly Image s_questionIcon;
|
|
public static readonly Image s_infoIcon;
|
|
public static readonly Image s_warningIcon;
|
|
public static readonly Image s_errorIcon;
|
|
|
|
private static readonly ImmutableList<string> s_abortRetryContinue = ["Abort", "Retry", "Continue"];
|
|
private static readonly ImmutableList<string> s_cancelRetryContinue = ["Cancel", "Retry", "Continue"];
|
|
private static readonly ImmutableList<string> s_ok = ["OK"];
|
|
private static readonly ImmutableList<string> s_okCancel = ["OK", "Cancel"];
|
|
private static readonly ImmutableList<string> s_retryCancel = ["Retry", "Cancel"];
|
|
private static readonly ImmutableList<string> s_yesNo = ["Yes", "No"];
|
|
private static readonly ImmutableList<string> s_yesNoCancel = ["Yes", "No", "Cancel"];
|
|
|
|
static MessageBox()
|
|
{
|
|
Assembly asm = typeof(MessageBox).Assembly;
|
|
using (Stream str = asm.GetManifestResourceStream("Dashboard.Resources.question.png")!)
|
|
s_questionIcon = Image.Load(str);
|
|
using (Stream str = asm.GetManifestResourceStream("Dashboard.Resources.info.png")!)
|
|
s_infoIcon = Image.Load(str);
|
|
using (Stream str = asm.GetManifestResourceStream("Dashboard.Resources.warning.png")!)
|
|
s_warningIcon = Image.Load(str);
|
|
using (Stream str = asm.GetManifestResourceStream("Dashboard.Resources.error.png")!)
|
|
s_errorIcon = Image.Load(str);
|
|
}
|
|
|
|
public static MessageBox Create(IWindow window, string message, string title, MessageBoxIcon icon, MessageBoxButtons buttons)
|
|
{
|
|
return new MessageBox(window)
|
|
{
|
|
Message = message,
|
|
Title = title,
|
|
Icon = icon,
|
|
Buttons = buttons,
|
|
};
|
|
}
|
|
|
|
// public static MessageBox Create(IWindow window, string message, string title, Image icon, IEnumerable<string> buttons)
|
|
// {
|
|
// throw new NotImplementedException();
|
|
// }
|
|
|
|
private static string GetDefaultTitle(MessageBoxIcon icon)
|
|
{
|
|
return icon switch
|
|
{
|
|
MessageBoxIcon.Error => "Error",
|
|
MessageBoxIcon.Info => "Info",
|
|
MessageBoxIcon.Question => "Question",
|
|
MessageBoxIcon.Warning => "Warning",
|
|
_ => "Message Box",
|
|
};
|
|
}
|
|
|
|
private static Image GetDefaultIcon(MessageBoxIcon icon)
|
|
{
|
|
return icon switch
|
|
{
|
|
MessageBoxIcon.Error => s_errorIcon,
|
|
MessageBoxIcon.Question => s_questionIcon,
|
|
MessageBoxIcon.Warning => s_warningIcon,
|
|
_ => s_infoIcon,
|
|
};
|
|
}
|
|
|
|
private static ImmutableList<string> GetDefaultButtons(MessageBoxButtons buttons)
|
|
{
|
|
return buttons switch
|
|
{
|
|
MessageBoxButtons.AbortRetryIgnore => s_abortRetryContinue,
|
|
MessageBoxButtons.CancelRetryContinue => s_cancelRetryContinue,
|
|
MessageBoxButtons.OkCancel => s_okCancel,
|
|
MessageBoxButtons.RetryCancel => s_retryCancel,
|
|
MessageBoxButtons.YesNo => s_yesNo,
|
|
MessageBoxButtons.YesNoCancel => s_yesNoCancel,
|
|
_ => s_ok,
|
|
};
|
|
}
|
|
}
|
|
}
|