MessagesWindow.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. using FastReport.Controls;
  2. using FastReport.Utils;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Windows.Forms;
  6. namespace FastReport.Design.ToolWindows
  7. {
  8. /// <summary>
  9. /// Represents the "Messages" window.
  10. /// </summary>
  11. /// <remarks>
  12. /// To get this window, use the following code:
  13. /// <code>
  14. /// Designer designer;
  15. /// MessagesWindow window = designer.Plugins.FindType("MessagesWindow") as MessagesWindow;
  16. /// </code>
  17. /// </remarks>
  18. public class MessagesWindow : ToolWindowBase
  19. {
  20. private List<MessageItem> errors;
  21. private List<MessageItem> warnings;
  22. private ToolbarBase toolbar;
  23. private ToolbarButton btnErrors;
  24. private ToolbarButton btnWarnings;
  25. private ToolbarButton btnValidate;
  26. private ToolbarButton btnClose;
  27. private StyledListView list;
  28. private void ShowMessageItems(List<MessageItem> items, bool isError)
  29. {
  30. for (int i = 0; i < items.Count && i < 100; i++)
  31. {
  32. var messageItem = items[i];
  33. if (string.IsNullOrEmpty(messageItem.ObjName))
  34. {
  35. // script error with line/column info
  36. ListViewItem item = new ListViewItem();
  37. item.Text = " " + messageItem.Message;
  38. item.ImageIndex = 80;
  39. ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem();
  40. if (messageItem.Line != -1)
  41. subItem.Text = messageItem.Line.ToString();
  42. subItem.Tag = messageItem.Line;
  43. item.SubItems.Add(subItem);
  44. subItem = new ListViewItem.ListViewSubItem();
  45. if (messageItem.Column != -1)
  46. subItem.Text = messageItem.Column.ToString();
  47. subItem.Tag = messageItem.Column;
  48. item.SubItems.Add(subItem);
  49. list.Items.Add(item);
  50. }
  51. else
  52. {
  53. // other message with object name info
  54. ListViewItem item = new ListViewItem();
  55. item.ImageIndex = isError ? 80 : 211;
  56. item.Text = " " + messageItem.Message;
  57. item.Tag = messageItem.ObjName;
  58. list.Items.Add(item);
  59. }
  60. }
  61. }
  62. private void UpdateListView()
  63. {
  64. list.Items.Clear();
  65. if (btnErrors.Checked)
  66. ShowMessageItems(errors, true);
  67. if (btnWarnings.Checked)
  68. ShowMessageItems(warnings, false);
  69. UpdateButtonsText();
  70. }
  71. private void UpdateButtonsText()
  72. {
  73. MyRes res = new MyRes("Designer,ToolWindow,Messages");
  74. btnErrors.Text = String.Format(res.Get("Errors"), errors.Count > 99 ? "99+" : errors.Count.ToString());
  75. btnWarnings.Text = String.Format(res.Get("Warnings"), warnings.Count > 99 ? "99+" : warnings.Count.ToString());
  76. }
  77. private void btnValidate_Click(object sender, EventArgs e)
  78. {
  79. if (Designer.cmdReportValidation.Enabled)
  80. Designer.cmdReportValidation.Invoke(this, new EventArgs());
  81. }
  82. private void btnWarnings_Click(object sender, EventArgs e)
  83. {
  84. UpdateListView();
  85. }
  86. private void btnErrors_Click(object sender, EventArgs e)
  87. {
  88. UpdateListView();
  89. }
  90. private void btnClose_Click(object sender, EventArgs e)
  91. {
  92. #if !MONO
  93. Close();
  94. #else
  95. Designer.MessageWindowEnabled = false;
  96. #endif
  97. }
  98. private void list_DoubleClick(object sender, EventArgs e)
  99. {
  100. ListViewItem item = list.SelectedItems[0];
  101. if (item.SubItems.Count > 1)
  102. {
  103. Designer.ActiveReportTab.SwitchToCode();
  104. Designer.ActiveReport.CodeHelper.Locate((int)item.SubItems[1].Tag, (int)item.SubItems[2].Tag);
  105. }
  106. else
  107. {
  108. Base obj = Designer.ActiveReport.FindObject((string)item.Tag);
  109. if (obj != null)
  110. {
  111. Designer.ActiveReportTab.ActivePage = obj.Page;
  112. Designer.SelectedObjects.Clear();
  113. Designer.SelectedObjects.Add(obj);
  114. Designer.SelectionChanged(null);
  115. }
  116. }
  117. }
  118. /// <summary>
  119. /// Clears the message list.
  120. /// </summary>
  121. public void ClearMessages()
  122. {
  123. errors.Clear();
  124. warnings.Clear();
  125. UpdateListView();
  126. }
  127. /// <summary>
  128. /// Adds a new message.
  129. /// </summary>
  130. /// <param name="description">The message text.</param>
  131. /// <param name="objName">The name of object related to a message.</param>
  132. /// <param name="isError">Determines whether the message is an error or a warning.</param>
  133. public void AddMessage(string description, string objName, bool isError = true)
  134. {
  135. var messageItem = new MessageItem() { Message = description, ObjName = objName };
  136. if (isError)
  137. errors.Add(messageItem);
  138. else
  139. warnings.Add(messageItem);
  140. }
  141. /// <summary>
  142. /// Adds a new script-related message.
  143. /// </summary>
  144. /// <param name="description">The message text.</param>
  145. /// <param name="line">The line of the script.</param>
  146. /// <param name="column">The column of the script.</param>
  147. public void AddMessage(string description, int line, int column)
  148. {
  149. var messageItem = new MessageItem() { Message = description, Line = line, Column = column };
  150. errors.Add(messageItem);
  151. }
  152. public new void Show()
  153. {
  154. UpdateListView();
  155. #if MONO
  156. Designer.MessageWindowEnabled = true;
  157. #else
  158. base.Show();
  159. #endif
  160. }
  161. /// <inheritdoc/>
  162. public override void UpdateUIStyle()
  163. {
  164. base.UpdateUIStyle();
  165. toolbar.UpdateUIStyle();
  166. list.SetStyle(Designer.UIStyle);
  167. }
  168. /// <inheritdoc/>
  169. public override void UpdateDpiDependencies()
  170. {
  171. base.UpdateDpiDependencies();
  172. Image = Designer.GetImage(70);
  173. list.SmallImageList = Designer.GetImages();
  174. toolbar.Font = Designer.LogicalToDevice(DrawUtils.DefaultFont);
  175. toolbar.Height = Designer.LogicalToDevice(26);
  176. toolbar.UpdateDpiDependencies();
  177. }
  178. /// <inheritdoc/>
  179. public override void Localize()
  180. {
  181. MyRes res = new MyRes("Designer,ToolWindow,Messages");
  182. Text = res.Get("");
  183. UpdateButtonsText();
  184. btnValidate.Text = res.Get("Refresh");
  185. btnClose.Text = res.Get("Close");
  186. list.Columns.Clear();
  187. list.Columns.Add(res.Get("Description"));
  188. list.Columns.Add(res.Get("Line"));
  189. list.Columns.Add(res.Get("Column"));
  190. list.Columns[0].Width = (600);
  191. }
  192. /// <summary>
  193. /// Initializes a new instance of the <see cref="MessagesWindow"/> class with default settings.
  194. /// </summary>
  195. /// <param name="designer">The report designer.</param>
  196. public MessagesWindow(Designer designer) : base(designer)
  197. {
  198. Name = "MessagesWindow";
  199. errors = new List<MessageItem>();
  200. warnings = new List<MessageItem>();
  201. toolbar = new ToolbarBase(designer);
  202. toolbar.Dock = DockStyle.Top;
  203. toolbar.Fixed = true;
  204. #if (WPF || AVALONIA)
  205. toolbar.BorderThickness = new Padding(0);
  206. #endif
  207. btnErrors = AddButton(80, true, btnErrors_Click);
  208. btnErrors.CheckOnClick = true;
  209. btnErrors.Checked = true;
  210. btnWarnings = AddButton(211, true, btnWarnings_Click);
  211. btnWarnings.BeginGroup = true;
  212. btnWarnings.CheckOnClick = true;
  213. btnWarnings.Checked = true;
  214. btnValidate = AddButton(232, true, btnValidate_Click);
  215. btnValidate.BeginGroup = true;
  216. btnClose = AddButton(212, true, btnClose_Click);
  217. toolbar.AddItems(btnErrors, btnWarnings, btnValidate, btnClose);
  218. list = new StyledListView();
  219. list.Dock = DockStyle.Fill;
  220. list.BorderStyle = BorderStyle.None;
  221. list.FullRowSelect = true;
  222. list.View = View.Details;
  223. list.HideSelection = false;
  224. list.DoubleClick += list_DoubleClick;
  225. Controls.AddRange(new Control[] { list, toolbar });
  226. Localize();
  227. UpdateDpiDependencies();
  228. }
  229. private class MessageItem
  230. {
  231. public string Message { get; set; }
  232. public string ObjName { get; set; }
  233. public int Line { get; set; }
  234. public int Column { get; set; }
  235. }
  236. }
  237. }