MessageBox supports MessageBoxOptions

This commit is contained in:
Antony Male 2014-05-23 12:47:42 +01:00
parent 97258d1511
commit 6d72e2d525
3 changed files with 96 additions and 29 deletions

View File

@ -25,12 +25,17 @@ namespace Stylet
/// <param name="icon">Icon to display to the left of the text. This also determines the sound played when the MessageBox is shown</param>
/// <param name="defaultButton">Button pressed when the user presses Enter. Defaults to the leftmost button</param>
/// <param name="cancelButton">Button pressed when the user preses Esc or clicks the red X on the titlebar. Defaults to the rightmost button</param>
/// <param name="buttonTextOverrides">You may override the text for individual buttons on a case-by-case basis</param>
/// <param name="options">Additional options</param>
/// <param name="buttonLabels">You may override the text for individual buttons on a case-by-case basis</param>
/// <returns>Which button the user clicked</returns>
public static MessageBoxResult ShowMessageBox(this IWindowManager windowManager, string text, string title = null, MessageBoxButton buttons = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultButton = MessageBoxResult.None, MessageBoxResult cancelButton = MessageBoxResult.None, IDictionary<MessageBoxResult, string> buttonTextOverrides = null)
public static MessageBoxResult ShowMessageBox(this IWindowManager windowManager, string text, string title = null,
MessageBoxButton buttons = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None,
MessageBoxResult defaultButton = MessageBoxResult.None, MessageBoxResult cancelButton = MessageBoxResult.None,
MessageBoxOptions options = MessageBoxOptions.None,
IDictionary<MessageBoxResult, string> buttonLabels = null)
{
var vm = IoC.Get<IMessageBoxViewModel>();
vm.Setup(text, title, buttons, icon, defaultButton, cancelButton, buttonTextOverrides);
vm.Setup(text, title, buttons, icon, defaultButton, cancelButton, options, buttonLabels);
windowManager.ShowDialog(vm);
return vm.ClickedButton;
}
@ -50,8 +55,11 @@ namespace Stylet
/// <param name="icon">Icon to display to the left of the text. This also determines the sound played when the MessageBox is shown</param>
/// <param name="defaultButton">Button pressed when the user presses Enter. Defaults to the leftmost button</param>
/// <param name="cancelButton">Button pressed when the user preses Esc or clicks the red X on the titlebar. Defaults to the rightmost button</param>
/// <param name="buttonTextOverrides">You may override the text for individual buttons on a case-by-case basis</param>
void Setup(string text, string title, MessageBoxButton buttons, MessageBoxImage icon, MessageBoxResult defaultButton, MessageBoxResult cancelButton, IDictionary<MessageBoxResult, string> buttonTextOverrides = null);
/// <param name="options">Additional options</param>
/// <param name="buttonLabels">You may override the text for individual buttons on a case-by-case basis</param>
void Setup(string text, string title, MessageBoxButton buttons, MessageBoxImage icon,
MessageBoxResult defaultButton, MessageBoxResult cancelButton, MessageBoxOptions options,
IDictionary<MessageBoxResult, string> buttonLabels = null);
/// <summary>
/// After the user has clicked a button, holds which button was clicked
@ -128,8 +136,11 @@ namespace Stylet
/// <param name="icon">Icon to display to the left of the text. This also determines the sound played when the MessageBox is shown</param>
/// <param name="defaultButton">Button pressed when the user presses Enter. Defaults to the leftmost button</param>
/// <param name="cancelButton">Button pressed when the user preses Esc or clicks the red X on the titlebar. Defaults to the rightmost button</param>
/// <param name="buttonTextOverrides">You may override the text for individual buttons on a case-by-case basis</param>
public void Setup(string text, string title, MessageBoxButton buttons, MessageBoxImage icon, MessageBoxResult defaultButton, MessageBoxResult cancelButton, IDictionary<MessageBoxResult, string> buttonTextOverrides)
/// <param name="options">Additional options</param>
/// <param name="buttonLabels">You may override the text for individual buttons on a case-by-case basis</param>
public void Setup(string text, string title, MessageBoxButton buttons, MessageBoxImage icon,
MessageBoxResult defaultButton, MessageBoxResult cancelButton, MessageBoxOptions options,
IDictionary<MessageBoxResult, string> buttonLabels)
{
this.Text = text;
this.DisplayName = title;
@ -140,7 +151,7 @@ namespace Stylet
foreach (var val in ButtonToResults[buttons])
{
string label;
if (buttonTextOverrides == null || !buttonTextOverrides.TryGetValue(val, out label))
if (buttonLabels == null || !buttonLabels.TryGetValue(val, out label))
label = ButtonLabels[val];
var lbv = new LabelledValue<MessageBoxResult>(label, val);
@ -165,6 +176,9 @@ namespace Stylet
else
throw new ArgumentException("CancelButton set to a button which doesn't appear in Buttons");
}
this.FlowDirection = options.HasFlag(MessageBoxOptions.RtlReading) ? FlowDirection.RightToLeft : FlowDirection.LeftToRight;
this.TextAlignment = (options.HasFlag(MessageBoxOptions.RightAlign) == options.HasFlag(MessageBoxOptions.RtlReading)) ? TextAlignment.Left : TextAlignment.Right;
}
/// <summary>
@ -175,22 +189,22 @@ namespace Stylet
/// <summary>
/// Item in ButtonList which is the Default button
/// </summary>
public LabelledValue<MessageBoxResult> DefaultButton { get; set; }
public LabelledValue<MessageBoxResult> DefaultButton { get; protected set; }
/// <summary>
/// Item in ButtonList which is the Cancel button
/// </summary>
public LabelledValue<MessageBoxResult> CancelButton { get; set; }
public LabelledValue<MessageBoxResult> CancelButton { get; protected set; }
/// <summary>
/// Text which is shown in the body of the MessageBox
/// </summary>
public virtual string Text { get; set; }
public virtual string Text { get; protected set; }
/// <summary>
/// Icon which the user specified
/// </summary>
public virtual MessageBoxImage Icon { get; set; }
public virtual MessageBoxImage Icon { get; protected set; }
/// <summary>
/// Icon which is shown next to the text in the View
@ -200,10 +214,20 @@ namespace Stylet
get { return IconMapping[this.Icon]; }
}
/// <summary>
/// Which way the document should flow
/// </summary>
public virtual FlowDirection FlowDirection { get; protected set; }
/// <summary>
/// Text alignment of the message
/// </summary>
public virtual TextAlignment TextAlignment { get; protected set; }
/// <summary>
/// Which button the user clicked, once they've clicked a button
/// </summary>
public virtual MessageBoxResult ClickedButton { get; private set; }
public virtual MessageBoxResult ClickedButton { get; protected set; }
protected override void OnViewLoaded()
{

View File

@ -7,6 +7,7 @@
mc:Ignorable="d"
ResizeMode="NoResize"
SizeToContent="WidthAndHeight"
FlowDirection="{Binding FlowDirection}"
WindowStartupLocation="CenterScreen"
ShowInTaskbar="False"
MinWidth="160" MaxWidth="485"
@ -27,11 +28,11 @@
Visibility="{Binding ImageIcon, Converter={x:Static s:BoolToVisibilityConverter.Instance}}">
</Image>
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Text}" Margin="8,30,30,30" TextWrapping="Wrap"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Text}" Margin="8,30,15,30" TextWrapping="Wrap" TextAlignment="{Binding TextAlignment}"/>
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">
<ItemsControl Grid.Row="1" ItemsSource="{Binding ButtonList}"
HorizontalAlignment="Right" VerticalAlignment="Center">
HorizontalAlignment="Right" VerticalAlignment="Center" Margin="43,0,0,0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>

View File

@ -46,7 +46,7 @@ namespace StyletUnitTests
vm.SetupGet(x => x.ClickedButton).Returns(MessageBoxResult.OK);
var result = MessageBoxWindowManagerExtensions.ShowMessageBox(windowManager.Object, "this is the text", "this is the title", MessageBoxButton.OKCancel, MessageBoxImage.Exclamation, MessageBoxResult.OK, MessageBoxResult.Cancel);
vm.Verify(x => x.Setup("this is the text", "this is the title", MessageBoxButton.OKCancel, MessageBoxImage.Exclamation, MessageBoxResult.OK, MessageBoxResult.Cancel, null));
vm.Verify(x => x.Setup("this is the text", "this is the title", MessageBoxButton.OKCancel, MessageBoxImage.Exclamation, MessageBoxResult.OK, MessageBoxResult.Cancel, MessageBoxOptions.None, null));
windowManager.Verify(x => x.ShowDialog(vm.Object));
Assert.AreEqual(MessageBoxResult.OK, result);
@ -55,21 +55,21 @@ namespace StyletUnitTests
[Test]
public void SetsTextCorrectly()
{
this.vm.Setup("this is the text", null, MessageBoxButton.OK, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, null);
this.vm.Setup("this is the text", null, MessageBoxButton.OK, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual("this is the text", this.vm.Text);
}
[Test]
public void SetsTitleCorrectly()
{
this.vm.Setup(null, "this is the title", MessageBoxButton.OK, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, null);
this.vm.Setup(null, "this is the title", MessageBoxButton.OK, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual("this is the title", this.vm.DisplayName);
}
[Test]
public void DisplaysRequestedButtons()
{
this.vm.Setup(null, null, MessageBoxButton.OKCancel, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, null);
this.vm.Setup(null, null, MessageBoxButton.OKCancel, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
var buttons = vm.ButtonList.ToList();
Assert.AreEqual(2, buttons.Count);
Assert.AreEqual("OK", buttons[0].Label);
@ -81,47 +81,47 @@ namespace StyletUnitTests
[Test]
public void SetsDefaultButtonToTheRequestedButton()
{
this.vm.Setup(null, null, MessageBoxButton.OKCancel, System.Windows.MessageBoxImage.None, MessageBoxResult.Cancel, MessageBoxResult.None, null);
this.vm.Setup(null, null, MessageBoxButton.OKCancel, System.Windows.MessageBoxImage.None, MessageBoxResult.Cancel, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual(this.vm.ButtonList.ElementAt(1), this.vm.DefaultButton);
}
[Test]
public void SetsDefaultToLeftmostButtonIfDefaultRequested()
{
this.vm.Setup(null, null, MessageBoxButton.YesNoCancel, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, null);
this.vm.Setup(null, null, MessageBoxButton.YesNoCancel, System.Windows.MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual(this.vm.ButtonList.ElementAt(0), this.vm.DefaultButton);
}
[Test]
public void ThrowsIfTheRequestedDefaultButtonIsNotDisplayed()
{
Assert.Throws<ArgumentException>(() => this.vm.Setup(null, null, MessageBoxButton.OKCancel, MessageBoxImage.None, MessageBoxResult.Yes, MessageBoxResult.None, null));
Assert.Throws<ArgumentException>(() => this.vm.Setup(null, null, MessageBoxButton.OKCancel, MessageBoxImage.None, MessageBoxResult.Yes, MessageBoxResult.None, MessageBoxOptions.None, null));
}
[Test]
public void SetsCancelButtonToTheRequestedButton()
{
this.vm.Setup(null, null, MessageBoxButton.YesNoCancel, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.No, null);
this.vm.Setup(null, null, MessageBoxButton.YesNoCancel, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.No, MessageBoxOptions.None, null);
Assert.AreEqual(this.vm.ButtonList.ElementAt(1), this.vm.CancelButton);
}
[Test]
public void SetsCancelToRighmostButtonIfDefaultRequested()
{
this.vm.Setup(null, null, MessageBoxButton.OKCancel, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, null);
this.vm.Setup(null, null, MessageBoxButton.OKCancel, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual(this.vm.ButtonList.ElementAt(1), this.vm.CancelButton);
}
[Test]
public void ThrowsIfRequestedCancelButtonIsNotDisplayed()
{
Assert.Throws<ArgumentException>(() => this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.No, null));
Assert.Throws<ArgumentException>(() => this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.No, MessageBoxOptions.None, null));
}
[Test]
public void SetsIconCorrectly()
{
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.Exclamation, MessageBoxResult.None, MessageBoxResult.None, null);
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.Exclamation, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual(SystemIcons.Exclamation, this.vm.ImageIcon);
}
@ -130,7 +130,7 @@ namespace StyletUnitTests
{
var parent = new Mock<IChildDelegate>();
this.vm.Parent = parent.Object;
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, null);
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
this.vm.ButtonClicked(MessageBoxResult.No);
@ -143,19 +143,61 @@ namespace StyletUnitTests
{
var vm = new MyMessageBoxViewModel();
// Can't test it actually playing the sound
vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, null);
vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.DoesNotThrow(() => vm.OnViewLoaded());
}
[Test]
public void ButtonTextOverridesWork()
{
this.vm.Setup(null, null, MessageBoxButton.OKCancel, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, new Dictionary<MessageBoxResult, string>()
this.vm.Setup(null, null, MessageBoxButton.OKCancel, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, new Dictionary<MessageBoxResult, string>()
{
{ MessageBoxResult.Cancel, "YAY!" },
});
Assert.AreEqual("OK", this.vm.ButtonList.ElementAt(0).Label);
Assert.AreEqual("YAY!", this.vm.ButtonList.ElementAt(1).Label);
}
[Test]
public void FlowsLeftToRightByDefault()
{
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual(FlowDirection.LeftToRight, this.vm.FlowDirection);
}
[Test]
public void FlowsRightToLeftIfRequested()
{
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.RtlReading, null);
Assert.AreEqual(FlowDirection.RightToLeft, this.vm.FlowDirection);
}
[Test]
public void AlignsLeftIfLeftToRightByDefault()
{
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.None, null);
Assert.AreEqual(TextAlignment.Left, this.vm.TextAlignment);
}
[Test]
public void AlignsRightIfLeftToRightAndRequested()
{
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.RightAlign, null);
Assert.AreEqual(TextAlignment.Right, this.vm.TextAlignment);
}
[Test]
public void AlignsRightIfRightToLeftByDefault()
{
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.RtlReading, null);
Assert.AreEqual(TextAlignment.Right, this.vm.TextAlignment);
}
[Test]
public void AlignsLeftIfRightToLeftAndRequested()
{
this.vm.Setup(null, null, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxResult.None, MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading, null);
Assert.AreEqual(TextAlignment.Left, this.vm.TextAlignment);
}
}
}