ExportsOptions.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Drawing;
  5. namespace FastReport.Utils
  6. {
  7. #if !COMMUNITY
  8. /// <summary>
  9. /// Class for handling Exports visibility in the Preview control.
  10. /// </summary>
  11. public partial class ExportsOptions
  12. {
  13. private static ExportsOptions instance = null;
  14. /// <summary>
  15. /// Gets an instance of ExportOptions.
  16. /// </summary>
  17. /// <returns>An ExportOptions instance.</returns>
  18. public static ExportsOptions GetInstance()
  19. {
  20. if (instance == null)
  21. instance = new ExportsOptions();
  22. return instance;
  23. }
  24. private ExportsTreeNode exportsMenu;
  25. /// <summary>
  26. /// All exports available in the Preview control.
  27. /// </summary>
  28. public ExportsTreeNode ExportsMenu
  29. {
  30. get
  31. {
  32. if (exportsMenu == null)
  33. {
  34. exportsMenu = new ExportsTreeNode() { Name = "Exports" };
  35. CreateDefaultExports();
  36. }
  37. return exportsMenu;
  38. }
  39. }
  40. /// <summary>
  41. /// Occurs once right before restore exports state.
  42. /// </summary>
  43. /// <remarks>
  44. /// Use this event to configure the default exports state or add your own exports.
  45. /// </remarks>
  46. public event EventHandler BeforeRestoreState;
  47. /// <summary>
  48. /// Occurs once right after restore exports state.
  49. /// </summary>
  50. /// <remarks>
  51. /// You may use this event to disable some exports, for example:
  52. /// <code>Config.PreviewSettings.Exports &amp;= ~PreviewExports.PDFExport;</code>
  53. /// Doing so before state is restored may not take an effect.
  54. /// </remarks>
  55. public event EventHandler AfterRestoreState;
  56. internal void SaveState()
  57. {
  58. SaveOptions();
  59. }
  60. private bool isRestored;
  61. internal void RestoreState()
  62. {
  63. if (!isRestored)
  64. {
  65. BeforeRestoreState?.Invoke(this, EventArgs.Empty);
  66. RestoreOptions();
  67. AfterRestoreState?.Invoke(this, EventArgs.Empty);
  68. isRestored = true;
  69. }
  70. }
  71. private void EnumNodes(List<ExportsTreeNode> list, ExportsTreeNode root)
  72. {
  73. list.Add(root);
  74. foreach (var node in root.Nodes)
  75. EnumNodes(list, node);
  76. }
  77. private List<ExportsTreeNode> EnumNodes(ExportsTreeNode root)
  78. {
  79. var list = new List<ExportsTreeNode>();
  80. EnumNodes(list, root);
  81. return list;
  82. }
  83. private ExportsTreeNode FindItem(ExportsTreeNode root, string name, Type exportType)
  84. {
  85. foreach (var node in EnumNodes(root))
  86. {
  87. if (exportType != null && node.ExportType == exportType ||
  88. !string.IsNullOrEmpty(name) && node.Name == name)
  89. {
  90. return node;
  91. }
  92. }
  93. return null;
  94. }
  95. /// <summary>
  96. /// Sets Export category visibility.
  97. /// </summary>
  98. /// <param name="name">Export category name.</param>
  99. /// <param name="enabled">Visibility state.</param>
  100. public void SetExportCategoryEnabled(string name, bool enabled)
  101. {
  102. var node = FindItem(ExportsMenu, name, null);
  103. if (node != null)
  104. {
  105. foreach (var n in EnumNodes(node))
  106. n.Enabled = enabled;
  107. }
  108. }
  109. /// <summary>
  110. /// Sets Export visibility.
  111. /// </summary>
  112. /// <param name="exportType">Export type.</param>
  113. /// <param name="enabled">Visibility state.</param>
  114. public void SetExportEnabled(Type exportType, bool enabled)
  115. {
  116. var node = FindItem(ExportsMenu, null, exportType);
  117. if (node != null)
  118. node.Enabled = enabled;
  119. }
  120. private ExportsOptions()
  121. {
  122. }
  123. /// <summary>
  124. /// Exports menu node.
  125. /// </summary>
  126. public partial class ExportsTreeNode
  127. {
  128. /// <summary>
  129. /// Gets or sets the name.
  130. /// </summary>
  131. public string Name { get; set; }
  132. /// <summary>
  133. /// Gets child nodes.
  134. /// </summary>
  135. public ExportsTreeNodeCollection Nodes { get; }
  136. /// <summary>
  137. /// Gets the parent node.
  138. /// </summary>
  139. public ExportsTreeNode Parent { get; private set; }
  140. /// <summary>
  141. /// Gets the root node.
  142. /// </summary>
  143. public ExportsTreeNode Root
  144. {
  145. get
  146. {
  147. var parent = this;
  148. while (parent.Parent != null)
  149. {
  150. parent = parent.Parent;
  151. }
  152. return parent;
  153. }
  154. }
  155. /// <summary>
  156. /// Gets or sets the type of the export.
  157. /// </summary>
  158. public Type ExportType { get; set; }
  159. /// <summary>
  160. /// Gets or sets the display text.
  161. /// </summary>
  162. public string Text { get; set; }
  163. /// <summary>
  164. /// Gets or sets the image index.
  165. /// </summary>
  166. public int ImageIndex { get; set; } = -1;
  167. /// <summary>
  168. /// Gets or sets the image.
  169. /// </summary>
  170. public Bitmap Image { get; set; }
  171. /// <summary>
  172. /// Gets or sets the tag.
  173. /// </summary>
  174. public ObjectInfo Tag { get; private set; }
  175. /// <summary>
  176. /// Gets or sets a value that indicates whether the node is enabled.
  177. /// </summary>
  178. public bool Enabled { get; set; } = true;
  179. internal ExportsTreeNode()
  180. {
  181. Nodes = new ExportsTreeNodeCollection(this);
  182. }
  183. /// <summary>
  184. /// Adds a category.
  185. /// </summary>
  186. /// <param name="name">The category key name.</param>
  187. /// <param name="imageIndex">The image index.</param>
  188. /// <returns>The category node.</returns>
  189. public ExportsTreeNode AddCategory(string name, int imageIndex = -1)
  190. {
  191. var node = new ExportsTreeNode() { Name = name, ImageIndex = imageIndex };
  192. Nodes.Add(node);
  193. return node;
  194. }
  195. /// <summary>
  196. /// Adds a category.
  197. /// </summary>
  198. /// <param name="name">The category key name.</param>
  199. /// <param name="text">The category display text.</param>
  200. /// <param name="image">The image.</param>
  201. /// <returns>The category node.</returns>
  202. public ExportsTreeNode AddCategory(string name, string text, Bitmap image)
  203. {
  204. var node = new ExportsTreeNode() { Name = name, Text = text, Image = image };
  205. Nodes.Add(node);
  206. return node;
  207. }
  208. /// <summary>
  209. /// Adds an export and registers it.
  210. /// </summary>
  211. /// <param name="type">The export type.</param>
  212. /// <param name="text">The display text.</param>
  213. /// <param name="imageIndex">The image index.</param>
  214. /// <returns>Returns this object to allow method chaining.</returns>
  215. public ExportsTreeNode AddExport(Type type, string text, int imageIndex = -1)
  216. {
  217. var node = new ExportsTreeNode() { Name = type.Name, ExportType = type, Text = text, ImageIndex = imageIndex };
  218. node.Tag = RegisteredObjects.AddExport(node.ExportType, node.ToString(), node.ImageIndex);
  219. Nodes.Add(node);
  220. return this;
  221. }
  222. /// <summary>
  223. /// Adds an export and registers it.
  224. /// </summary>
  225. /// <param name="type">The export type.</param>
  226. /// <param name="text">The display text.</param>
  227. /// <param name="image">The image.</param>
  228. /// <returns>Returns this object to allow method chaining.</returns>
  229. public ExportsTreeNode AddExport(Type type, string text, Bitmap image)
  230. {
  231. var node = new ExportsTreeNode() { Name = type.Name, ExportType = type, Text = text, Image = image };
  232. node.Tag = RegisteredObjects.AddExport(node.ExportType, text, -1);
  233. Nodes.Add(node);
  234. return this;
  235. }
  236. /// <summary>
  237. /// Represents a collection of nodes.
  238. /// </summary>
  239. public class ExportsTreeNodeCollection : Collection<ExportsTreeNode>
  240. {
  241. private ExportsTreeNode Owner { get; }
  242. internal ExportsTreeNodeCollection(ExportsTreeNode owner)
  243. {
  244. Owner = owner;
  245. }
  246. /// <inheritdoc/>
  247. protected override void InsertItem(int index, ExportsTreeNode item)
  248. {
  249. item.Parent?.Nodes.Remove(item);
  250. base.InsertItem(index, item);
  251. item.Parent = Owner;
  252. }
  253. /// <inheritdoc/>
  254. protected override void RemoveItem(int index)
  255. {
  256. var item = Items[index];
  257. item.Parent = null;
  258. base.RemoveItem(index);
  259. }
  260. }
  261. }
  262. }
  263. #endif
  264. }