PageRenderTime 52ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/src/MarkPad/Infrastructure/DialogService/DialogMessageService.cs

https://github.com/bcott/DownmarkerWPF
C# | 235 lines | 202 code | 33 blank | 0 comment | 43 complexity | a2ad6b88c21d42ee823942169d327b10 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows;
  5. using Ookii.Dialogs.Wpf;
  6. namespace MarkPad.Infrastructure.DialogService
  7. {
  8. enum DialogMessageResult
  9. {
  10. None,
  11. OK,
  12. Cancel,
  13. Retry,
  14. Yes,
  15. No,
  16. Close,
  17. CustomButtonClicked,
  18. }
  19. [Flags]
  20. enum DialogMessageButtons
  21. {
  22. None = 0x0000,
  23. Ok = 0x0001,
  24. Yes = 0x0002,
  25. No = 0x0004,
  26. Cancel = 0x0008,
  27. Retry = 0x0010,
  28. Close = 0x0020
  29. }
  30. enum DialogMessageIcon
  31. {
  32. None,
  33. Error,
  34. Question,
  35. Warning,
  36. Information,
  37. Shield
  38. }
  39. internal class DialogMessageService
  40. {
  41. private readonly Window owner;
  42. public DialogMessageService(Window owner)
  43. {
  44. this.owner = owner;
  45. }
  46. private DialogMessageResult DoOokiiMsgBox()
  47. {
  48. var td = new TaskDialog();
  49. if ((Buttons & DialogMessageButtons.Ok) != 0) td.Buttons.Add(new TaskDialogButton(ButtonType.Ok));
  50. if ((Buttons & DialogMessageButtons.Cancel) != 0) td.Buttons.Add(new TaskDialogButton(ButtonType.Cancel));
  51. if ((Buttons & DialogMessageButtons.Yes) != 0) td.Buttons.Add(new TaskDialogButton(ButtonType.Yes));
  52. if ((Buttons & DialogMessageButtons.No) != 0) td.Buttons.Add(new TaskDialogButton(ButtonType.No));
  53. if ((Buttons & DialogMessageButtons.Close) != 0) td.Buttons.Add(new TaskDialogButton(ButtonType.Close));
  54. if ((Buttons & DialogMessageButtons.Retry) != 0) td.Buttons.Add(new TaskDialogButton(ButtonType.Retry));
  55. switch (Icon)
  56. {
  57. case DialogMessageIcon.Error:
  58. td.MainIcon = TaskDialogIcon.Error;
  59. break;
  60. case DialogMessageIcon.Question:
  61. td.MainIcon = TaskDialogIcon.Warning;
  62. break;
  63. case DialogMessageIcon.Warning:
  64. td.MainIcon = TaskDialogIcon.Warning;
  65. break;
  66. case DialogMessageIcon.Information:
  67. td.MainIcon = TaskDialogIcon.Information;
  68. break;
  69. case DialogMessageIcon.Shield:
  70. td.MainIcon = TaskDialogIcon.Shield;
  71. break;
  72. }
  73. td.WindowTitle = Title;
  74. td.MainInstruction = Text;
  75. td.Content = Extra;
  76. var translation = new Dictionary<TaskDialogButton, ButtonType>();
  77. if (ButtonExtras != null && ButtonExtras.Any())
  78. {
  79. td.ButtonStyle = TaskDialogButtonStyle.CommandLinks;
  80. var buttonSet = td.Buttons.ToArray();
  81. td.Buttons.Clear();
  82. foreach (var extra in ButtonExtras)
  83. {
  84. foreach (var button in buttonSet.Where(b => b.ButtonType == extra.ButtonType))
  85. {
  86. button.ButtonType = ButtonType.Custom;
  87. button.Text = extra.Text;
  88. button.CommandLinkNote = extra.Note;
  89. translation.Add(button, extra.ButtonType);
  90. td.Buttons.Add(button);
  91. }
  92. }
  93. foreach (var button in buttonSet.Where(b => b.ButtonType != ButtonType.Custom))
  94. {
  95. td.Buttons.Add(button);
  96. }
  97. }
  98. TaskDialogButton result = null;
  99. if (owner == null)
  100. result = td.ShowDialog();
  101. else
  102. {
  103. var dispatcher = owner.Dispatcher;
  104. result = (TaskDialogButton)dispatcher.Invoke(
  105. new Func<TaskDialogButton>(() => td.ShowDialog(owner)),
  106. System.Windows.Threading.DispatcherPriority.Normal);
  107. }
  108. var resultButtonType = result.ButtonType;
  109. if (resultButtonType == ButtonType.Custom)
  110. {
  111. if (ButtonExtras != null)
  112. {
  113. var button = ButtonExtras.SingleOrDefault(b => b.ButtonType == ButtonType.Custom && b.Text == result.Text);
  114. if (button != null)
  115. button.WasClicked = true;
  116. }
  117. resultButtonType = translation[result];
  118. }
  119. switch (resultButtonType)
  120. {
  121. case ButtonType.Cancel:
  122. return DialogMessageResult.Cancel;
  123. case ButtonType.Close:
  124. return DialogMessageResult.Close;
  125. case ButtonType.No:
  126. return DialogMessageResult.No;
  127. case ButtonType.Ok:
  128. return DialogMessageResult.OK;
  129. case ButtonType.Retry:
  130. return DialogMessageResult.Retry;
  131. case ButtonType.Yes:
  132. return DialogMessageResult.Yes;
  133. }
  134. return DialogMessageResult.None;
  135. }
  136. private DialogMessageResult DoWin32MsgBox()
  137. {
  138. MessageBoxButton button = MessageBoxButton.OK;
  139. if (Buttons == (DialogMessageButtons.Ok | DialogMessageButtons.Cancel))
  140. button = MessageBoxButton.OKCancel;
  141. else if (Buttons == (DialogMessageButtons.Yes | DialogMessageButtons.No))
  142. button = MessageBoxButton.YesNo;
  143. else if (Buttons == (DialogMessageButtons.Yes | DialogMessageButtons.No | DialogMessageButtons.Cancel))
  144. button = MessageBoxButton.YesNoCancel;
  145. MessageBoxImage icon = MessageBoxImage.None;
  146. switch (Icon)
  147. {
  148. case DialogMessageIcon.Error:
  149. icon = MessageBoxImage.Error;
  150. break;
  151. case DialogMessageIcon.Question:
  152. icon = MessageBoxImage.Question;
  153. break;
  154. case DialogMessageIcon.Warning:
  155. case DialogMessageIcon.Shield:
  156. icon = MessageBoxImage.Warning;
  157. break;
  158. case DialogMessageIcon.Information:
  159. icon = MessageBoxImage.Information;
  160. break;
  161. }
  162. MessageBoxResult result = MessageBoxResult.None;
  163. if (owner == null)
  164. result = MessageBox.Show(string.Format("{0}{1}{1}{2}", Text, Environment.NewLine, Extra), Title, button, icon);
  165. else
  166. {
  167. var dispatcher = owner.Dispatcher;
  168. result = (MessageBoxResult)dispatcher.Invoke(
  169. new Func<MessageBoxResult>(() => MessageBox.Show(owner, string.Format("{0}{1}{1}{2}", Text, Environment.NewLine, Extra), Title, button, icon)),
  170. System.Windows.Threading.DispatcherPriority.Normal);
  171. }
  172. switch (result)
  173. {
  174. case MessageBoxResult.Cancel:
  175. return DialogMessageResult.Cancel;
  176. case MessageBoxResult.No:
  177. return DialogMessageResult.No;
  178. case MessageBoxResult.None:
  179. return DialogMessageResult.None;
  180. case MessageBoxResult.OK:
  181. return DialogMessageResult.OK;
  182. case MessageBoxResult.Yes:
  183. return DialogMessageResult.Yes;
  184. }
  185. return DialogMessageResult.None;
  186. }
  187. public string Title { get; set; }
  188. public string Extra { get; set; }
  189. public string Text { get; set; }
  190. public DialogMessageButtons Buttons { get; set; }
  191. public DialogMessageIcon Icon { get; set; }
  192. public ButtonExtras[] ButtonExtras { get; set; }
  193. public DialogMessageResult Show()
  194. {
  195. if (TaskDialog.OSSupportsTaskDialogs)
  196. {
  197. return DoOokiiMsgBox();
  198. }
  199. return DoWin32MsgBox();
  200. }
  201. }
  202. }