mattercontrol/ControlElements/StyledMessageBoxWindow.cs
larsbrubaker 503726ae65 Fixed the problem with downloads not always working.
Made the tab names of tabs be independent of the visible title
Made styled message box have option of custom buttons
More localizations
2014-06-10 11:44:16 -07:00

198 lines
8.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.Agg.Image;
using MatterHackers.Agg.Font;
using MatterHackers.Localizations;
using MatterHackers.MatterControl.CustomWidgets;
namespace MatterHackers.MatterControl
{
public class StyledMessageBox : SystemWindow
{
String unwrappedMessage;
TextWidget messageContainer;
FlowLayoutWidget middleRowContainer;
public EventHandler ClickedOk;
TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory();
public enum MessageType { OK, YES_NO };
public static bool ShowMessageBox(String message, string caption, MessageType messageType = MessageType.OK, string yesOk = "", string no = "")
{
return ShowMessageBox(message, caption, null, messageType, yesOk, no);
}
public static bool ShowMessageBox(string message, string caption, GuiWidget[] extraWidgetsToAdd, MessageType messageType, string yesOk = "", string no = "")
{
StyledMessageBox messageBox = new StyledMessageBox(message, caption, messageType, extraWidgetsToAdd, 400, 300, yesOk, no);
bool okClicked = false;
messageBox.ClickedOk += (sender, e) => { okClicked = true; };
messageBox.ShowAsSystemWindow();
return okClicked;
}
public StyledMessageBox(String message, string windowTitle, MessageType messageType, GuiWidget[] extraWidgetsToAdd, double width, double height, string yesOk, string no)
: base(width, height)
{
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);
this.AddChild(topToBottom);
}
//Creates container in the middle of window
middleRowContainer = new FlowLayoutWidget(FlowDirection.TopToBottom);
{
middleRowContainer.HAnchor = HAnchor.ParentLeftRight;
middleRowContainer.VAnchor = VAnchor.ParentBottomTop;
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);
}
int minButtonWidth = 50;
switch (messageType)
{
case MessageType.YES_NO:
{
Title = "MatterControl - " + "Input Required".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 ButtonBase.ButtonEventHandler(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 ButtonBase.ButtonEventHandler(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 ButtonBase.ButtonEventHandler(okButton_Click);
buttonRow.AddChild(okButton);
}
break;
default:
throw new NotImplementedException();
}
topToBottom.AddChild(buttonRow);
IsModal = true;
AdjustTextWrap();
}
public override void OnBoundsChanged(EventArgs e)
{
AdjustTextWrap();
base.OnBoundsChanged(e);
}
private void AdjustTextWrap()
{
if (messageContainer != null)
{
EnglishTextWrapping wrapper = new EnglishTextWrapping(12);
string wrappedMessage = wrapper.InsertCRs(unwrappedMessage, middleRowContainer.Width - (middleRowContainer.Padding.Width + messageContainer.Margin.Width));
messageContainer.Text = wrappedMessage;
}
}
void noButton_Click(object sender, MouseEventArgs mouseEvent)
{
UiThread.RunOnIdle(CloseOnIdle);
}
void okButton_Click(object sender, MouseEventArgs mouseEvent)
{
if (ClickedOk != null)
{
ClickedOk(this, null);
}
UiThread.RunOnIdle(CloseOnIdle);
}
void CloseOnIdle(object state)
{
Close();
}
}
}