mattercontrol/ControlElements/StyledMessageBoxWindow.cs

195 lines
6.5 KiB
C#
Raw Normal View History

2015-04-08 15:20:10 -07:00
using MatterHackers.Agg;
2014-01-29 19:09:30 -08:00
using MatterHackers.Agg.Font;
2015-04-08 15:20:10 -07:00
using MatterHackers.Agg.UI;
using MatterHackers.Localizations;
2015-04-08 15:20:10 -07:00
using System;
2014-01-29 19:09:30 -08:00
namespace MatterHackers.MatterControl
{
2015-04-08 15:20:10 -07:00
public class StyledMessageBox : SystemWindow
{
private String unwrappedMessage;
private TextWidget messageContainer;
private FlowLayoutWidget middleRowContainer;
private TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory();
private Action<bool> responseCallback;
2015-04-08 15:20:10 -07:00
public enum MessageType { OK, YES_NO };
public static void ShowMessageBox(Action<bool> callback, String message, string caption, MessageType messageType = MessageType.OK, string yesOk = "", string no = "")
2015-04-08 15:20:10 -07:00
{
ShowMessageBox(callback, message, caption, null, messageType, yesOk, no);
}
public static void ShowMessageBox(Action<bool> callback, string message, string caption, GuiWidget[] extraWidgetsToAdd, MessageType messageType, string yesOk = "", string no = "")
2015-04-08 15:20:10 -07:00
{
StyledMessageBox messageBox = new StyledMessageBox(callback, message, caption, messageType, extraWidgetsToAdd, 400, 300, yesOk, no);
messageBox.ShowAsSystemWindow();
}
public StyledMessageBox(Action<bool> callback, String message, string windowTitle, MessageType messageType, GuiWidget[] extraWidgetsToAdd, double width, double height, string yesOk, string no)
2015-04-08 15:20:10 -07:00
: base(width, height)
{
responseCallback = callback;
unwrappedMessage = message;
FlowLayoutWidget topToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom);
topToBottom.AnchorAll();
topToBottom.Padding = new BorderDouble(3, 0, 3, 5);
// Creates Header
FlowLayoutWidget headerRow = new FlowLayoutWidget(FlowDirection.LeftToRight);
headerRow.HAnchor = HAnchor.ParentLeftRight;
headerRow.Margin = new BorderDouble(0, 3, 0, 0);
headerRow.Padding = new BorderDouble(0, 3, 0, 3);
BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
//Creates Text and adds into header
{
TextWidget elementHeader = new TextWidget(windowTitle, pointSize: 14);
elementHeader.TextColor = ActiveTheme.Instance.PrimaryTextColor;
elementHeader.HAnchor = HAnchor.ParentLeftRight;
elementHeader.VAnchor = Agg.UI.VAnchor.ParentBottom;
headerRow.AddChild(elementHeader);
topToBottom.AddChild(headerRow);
}
// Creates container in the middle of window
middleRowContainer = new FlowLayoutWidget(FlowDirection.TopToBottom);
{
middleRowContainer.HAnchor = HAnchor.ParentLeftRight;
middleRowContainer.VAnchor = VAnchor.ParentBottomTop;
// normally the padding for the middle container should be just (5) all around. The has extra top space
middleRowContainer.Padding = new BorderDouble(5, 5, 5, 15);
middleRowContainer.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor;
}
messageContainer = new TextWidget(message, textColor: ActiveTheme.Instance.PrimaryTextColor);
messageContainer.AutoExpandBoundsToText = true;
messageContainer.HAnchor = Agg.UI.HAnchor.ParentLeft;
middleRowContainer.AddChild(messageContainer);
if (extraWidgetsToAdd != null)
{
foreach (GuiWidget widget in extraWidgetsToAdd)
{
middleRowContainer.AddChild(widget);
}
}
topToBottom.AddChild(middleRowContainer);
//Creates button container on the bottom of window
FlowLayoutWidget buttonRow = new FlowLayoutWidget(FlowDirection.LeftToRight);
{
BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
buttonRow.HAnchor = HAnchor.ParentLeftRight;
buttonRow.Padding = new BorderDouble(0, 3);
}
2014-01-29 19:09:30 -08:00
int minButtonWidth = (int)(50 * TextWidget.GlobalPointSizeScaleRatio + .5);
2015-04-08 15:20:10 -07:00
switch (messageType)
{
case MessageType.YES_NO:
{
Title = "MatterControl - " + "Please Confirm".Localize();
Button yesButton = textImageButtonFactory.Generate(yesOk, centerText: true);
if (yesOk == "")
{
yesOk = "Yes".Localize();
textImageButtonFactory.FixedWidth = minButtonWidth;
yesButton = textImageButtonFactory.Generate(yesOk, centerText: true);
textImageButtonFactory.FixedWidth = 0;
}
yesButton.Width = Math.Max(minButtonWidth, yesButton.Width);
yesButton.Click += new EventHandler(okButton_Click);
yesButton.Cursor = Cursors.Hand;
buttonRow.AddChild(yesButton);
//buttonRow.AddChild(new HorizontalSpacer());
Button noButton = textImageButtonFactory.Generate(no, centerText: true);
if (no == "")
{
no = "No".Localize();
textImageButtonFactory.FixedWidth = minButtonWidth;
noButton = textImageButtonFactory.Generate(no, centerText: true);
textImageButtonFactory.FixedWidth = 0;
}
noButton.Width = Math.Max(minButtonWidth, noButton.Width);
noButton.Click += new EventHandler(noButton_Click);
noButton.Cursor = Cursors.Hand;
buttonRow.AddChild(noButton);
}
break;
case MessageType.OK:
{
Title = "MatterControl - " + "Alert".Localize();
Button okButton = textImageButtonFactory.Generate(LocalizedString.Get("Ok"), centerText: true);
if (yesOk == "")
{
yesOk = "Ok".Localize();
textImageButtonFactory.FixedWidth = minButtonWidth;
okButton = textImageButtonFactory.Generate(yesOk, centerText: true);
textImageButtonFactory.FixedWidth = 0;
}
okButton.Width = Math.Max(minButtonWidth, okButton.Width);
okButton.Cursor = Cursors.Hand;
okButton.Click += new EventHandler(okButton_Click);
buttonRow.AddChild(okButton);
}
break;
default:
throw new NotImplementedException();
}
topToBottom.AddChild(buttonRow);
this.AddChild(topToBottom);
IsModal = true;
AdjustTextWrap();
}
public override void OnBoundsChanged(EventArgs e)
{
AdjustTextWrap();
base.OnBoundsChanged(e);
}
private void AdjustTextWrap()
{
if (messageContainer != null)
{
double wrappingSize = middleRowContainer.Width - (middleRowContainer.Padding.Width + messageContainer.Margin.Width);
if (wrappingSize > 0)
{
EnglishTextWrapping wrapper = new EnglishTextWrapping(12);
string wrappedMessage = wrapper.InsertCRs(unwrappedMessage, wrappingSize);
messageContainer.Text = wrappedMessage;
}
}
}
private void noButton_Click(object sender, EventArgs mouseEvent)
{
UiThread.RunOnIdle(Close);
2015-04-08 15:20:10 -07:00
if (responseCallback != null)
{
responseCallback(false);
}
}
private void okButton_Click(object sender, EventArgs mouseEvent)
{
UiThread.RunOnIdle(Close);
2015-04-08 15:20:10 -07:00
if (responseCallback != null)
{
responseCallback(true);
}
}
}
}