PageRenderTime 41ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Plugins/ExportToHtmlPlugin/Analects/DialogService/DialogServiceImplementation.cs

https://github.com/bcott/DownmarkerWPF
C# | 227 lines | 194 code | 33 blank | 0 comment | 36 complexity | 82d60a8b2d99b7668d198956bc660f6a 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 Analects.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 DialogServiceImplementation
  40. {
  41. private Window owner;
  42. public DialogServiceImplementation(Window owner)
  43. {
  44. this.owner = owner;
  45. }
  46. private DialogMessageResult DoOokiiMsgBox()
  47. {
  48. TaskDialog 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. resultButtonType = translation[result];
  111. switch (resultButtonType)
  112. {
  113. case ButtonType.Cancel:
  114. return DialogMessageResult.Cancel;
  115. case ButtonType.Close:
  116. return DialogMessageResult.Close;
  117. case ButtonType.No:
  118. return DialogMessageResult.No;
  119. case ButtonType.Ok:
  120. return DialogMessageResult.OK;
  121. case ButtonType.Retry:
  122. return DialogMessageResult.Retry;
  123. case ButtonType.Yes:
  124. return DialogMessageResult.Yes;
  125. }
  126. return DialogMessageResult.None;
  127. }
  128. private DialogMessageResult DoWin32MsgBox()
  129. {
  130. MessageBoxButton button = MessageBoxButton.OK;
  131. if (Buttons == (DialogMessageButtons.Ok | DialogMessageButtons.Cancel))
  132. button = MessageBoxButton.OKCancel;
  133. else if (Buttons == (DialogMessageButtons.Yes | DialogMessageButtons.No))
  134. button = MessageBoxButton.YesNo;
  135. else if (Buttons == (DialogMessageButtons.Yes | DialogMessageButtons.No | DialogMessageButtons.Cancel))
  136. button = MessageBoxButton.YesNoCancel;
  137. MessageBoxImage icon = MessageBoxImage.None;
  138. switch (Icon)
  139. {
  140. case DialogMessageIcon.Error:
  141. icon = MessageBoxImage.Error;
  142. break;
  143. case DialogMessageIcon.Question:
  144. icon = MessageBoxImage.Question;
  145. break;
  146. case DialogMessageIcon.Warning:
  147. case DialogMessageIcon.Shield:
  148. icon = MessageBoxImage.Warning;
  149. break;
  150. case DialogMessageIcon.Information:
  151. icon = MessageBoxImage.Information;
  152. break;
  153. }
  154. MessageBoxResult result = MessageBoxResult.None;
  155. if (owner == null)
  156. result = MessageBox.Show(string.Format("{0}{1}{1}{2}", Text, Environment.NewLine, Extra), Title, button, icon);
  157. else
  158. {
  159. var dispatcher = owner.Dispatcher;
  160. result = (MessageBoxResult)dispatcher.Invoke(
  161. new Func<MessageBoxResult>(() => MessageBox.Show(owner, string.Format("{0}{1}{1}{2}", Text, Environment.NewLine, Extra), Title, button, icon)),
  162. System.Windows.Threading.DispatcherPriority.Normal);
  163. }
  164. switch (result)
  165. {
  166. case MessageBoxResult.Cancel:
  167. return DialogMessageResult.Cancel;
  168. case MessageBoxResult.No:
  169. return DialogMessageResult.No;
  170. case MessageBoxResult.None:
  171. return DialogMessageResult.None;
  172. case MessageBoxResult.OK:
  173. return DialogMessageResult.OK;
  174. case MessageBoxResult.Yes:
  175. return DialogMessageResult.Yes;
  176. }
  177. return DialogMessageResult.None;
  178. }
  179. public string Title { get; set; }
  180. public string Extra { get; set; }
  181. public string Text { get; set; }
  182. public DialogMessageButtons Buttons { get; set; }
  183. public DialogMessageIcon Icon { get; set; }
  184. public ButtonExtras[] ButtonExtras { get; set; }
  185. public DialogMessageResult Show()
  186. {
  187. if (TaskDialog.OSSupportsTaskDialogs)
  188. {
  189. return DoOokiiMsgBox();
  190. }
  191. return DoWin32MsgBox();
  192. }
  193. }
  194. }