/// <summary>Returns a message box result</summary> /// <param name="viewName">Name of the view (ignored if the view is not found).</param> /// <param name="messageBoxText">Message box text message (plain text)</param> /// <param name="caption">Message box caption (title)</param> /// <param name="buttons">Standard buttons displayed by the message box</param> /// <param name="icon">Standard icon displayed by the message box.</param> /// <param name="defaultResult">Default standard button</param> /// <param name="actions">Custom actions to be added to the message box as buttons. (Note: If this parameter is not null, the 'buttons' parameter is ignored)</param> /// <param name="model">Custom message box view model. (Note: Only used in exceptional scenarios where the standard view model .</param> /// <returns>Message box result</returns> protected virtual MessageBoxResult MessageBox(string viewName = "", string messageBoxText = "", string caption = "Message", MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxImages icon = MessageBoxImages.Information, MessageBoxResults defaultResult = MessageBoxResults.OK, IEnumerable<IViewAction> actions = null, MessageBoxViewModel model = null) { bool mustAddButtons = false; if (model == null) { model = new MessageBoxViewModel {Text = messageBoxText, Caption = caption, Icon = icon}; mustAddButtons = true; } if (actions == null && mustAddButtons) switch (buttons) { case MessageBoxButtons.OK: model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_OK, execute: (a, o) => { model.Result = MessageBoxResults.OK; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.OK), IsCancel = true}); break; case MessageBoxButtons.OKCancel: model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_OK, execute: (a, o) => { model.Result = MessageBoxResults.OK; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.OK)}); model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_Cancel, execute: (a, o) => { model.Result = MessageBoxResults.Cancel; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.Cancel), IsCancel = true}); break; case MessageBoxButtons.YesNo: model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_Yes, execute: (a, o) => { model.Result = MessageBoxResults.Yes; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.OK || defaultResult == MessageBoxResults.Yes)}); model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_No, execute: (a, o) => { model.Result = MessageBoxResults.No; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.No), IsCancel = true}); break; case MessageBoxButtons.YesNoCancel: model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_Yes, execute: (a, o) => { model.Result = MessageBoxResults.Yes; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.OK || defaultResult == MessageBoxResults.Yes)}); model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_No, execute: (a, o) => { model.Result = MessageBoxResults.No; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.No)}); model.Actions.Add(new ViewAction(Properties.Resources.MessageBox_Cancel, execute: (a, o) => { model.Result = MessageBoxResults.Cancel; CloseViewForModel(model); }) {IsDefault = (defaultResult == MessageBoxResults.Cancel), IsCancel = true}); break; } else if (actions != null) foreach (var action in actions) model.Actions.Add(action); foreach (var messageAction in model.Actions.OfType<MessageBoxViewAction>()) messageAction.Model = model; return MessageBox(model, viewName); }
/// <summary>Returns a message box result with an attached model (and potentially an optional view)</summary> /// <param name="model">Message box specific view model</param> /// <returns>Message box result</returns> protected virtual MessageBoxResult MessageBox(MessageBoxViewModel model) { string viewName = "Index"; if (RequestContext.RouteData.Data.ContainsKey("action")) viewName = RequestContext.RouteData.Data["action"].ToString(); return MessageBox(model, viewName); }
/// <summary>Returns a message box result with an attached model (and potentially an optional view)</summary> /// <param name="model">Message box specific view model</param> /// <param name="viewName">Name of the view (ignored if no custom view is found)</param> /// <returns>Message box result</returns> protected virtual MessageBoxResult MessageBox(MessageBoxViewModel model, string viewName) { var result = new MessageBoxResult {Model = model, ViewTitle = model.Caption}; if (_messageBoxResultQueue == null || _messageBoxResultQueue.Count == 0) // We are attempting to find the view (and attach it to the result context), but if we can't find it, we are OK with it. FindView(viewName, ViewLevel.Popup, result); else { MessageBoxResultQueueItem nextResult; lock (_messageBoxResultQueue) nextResult = _messageBoxResultQueue.Dequeue(); model.Result = nextResult.Result; if (nextResult.CustomAction != null) nextResult.CustomAction(model); if (model.OnComplete != null) model.OnComplete(result); } return result; }
/// <summary>Displays a message box</summary> /// <param name="messageBoxText">Message box text message (plain text)</param> /// <param name="caption">Message box caption (title)</param> /// <param name="buttons">Standard buttons displayed by the message box</param> /// <param name="icon">Standard icon displayed by the message box.</param> /// <param name="defaultResult">Default standard button</param> /// <param name="onComplete">Code to run when the message box closes.</param> /// <param name="actions">Custom actions to be added to the message box as buttons. (Note: If this parameter is not null, the 'buttons' parameter is ignored)</param> /// <param name="model">Custom message box view model. (Note: Only used in exceptional scenarios where the standard view model .</param> /// <param name="viewName">Name of a custom view to be used by the message box (optional).</param> /// <param name="controllerType">Type of the controller (used as a context to find views)</param> public static void Message(string messageBoxText = "", string caption = "Message", MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxImages icon = MessageBoxImages.Information, MessageBoxResults defaultResult = MessageBoxResults.OK, Action<MessageBoxResult> onComplete = null, IEnumerable<IViewAction> actions = null, MessageBoxViewModel model = null, string viewName = "", Type controllerType = null) { var context = new RequestContext(new RouteData("MessageBox", new {viewName = string.Empty, messageBoxText, caption, buttons, icon, defaultResult})); // If a controller type was specified, we try to use it, which provides a context to find views Controller controller; if (controllerType == null) controller = new Controller(); else controller = Activator.CreateInstance(controllerType) as Controller; if (controller == null) controller = new Controller(); context.ProcessingController = controller; if (model != null && onComplete != null) model.OnComplete = onComplete; // Could be used later, especially for test scenarios where queued results simulate closing of message boxes bool mustHandle = _messageBoxResultQueue == null || _messageBoxResultQueue.Count == 0; context.Result = controller.MessageBox(viewName, messageBoxText, caption, buttons, icon, defaultResult, actions, model); var result = context.Result as MessageBoxResult; if (result != null && onComplete != null) result.ViewClosed += (o, e) => onComplete(result); if (mustHandle) // By default, we let view handlers handle the message box, unless simulated results are queued up. ExecuteViewHandlers(context); }