ExportsOptions.BaseExt.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. using FastReport.Cloud.StorageClient;
  2. using FastReport.Cloud.StorageClient.Dropbox;
  3. using FastReport.Cloud.StorageClient.Ftp;
  4. using FastReport.Cloud.StorageClient.S3;
  5. #if !AVALONIA
  6. using FastReport.Cloud.StorageClient.Box;
  7. using FastReport.Cloud.StorageClient.GoogleDrive;
  8. using FastReport.Cloud.StorageClient.SkyDrive;
  9. #endif
  10. using FastReport.Export;
  11. using FastReport.Export.BIFF8;
  12. using FastReport.Export.Csv;
  13. using FastReport.Export.Dbf;
  14. using FastReport.Export.Dxf;
  15. using FastReport.Export.Html;
  16. using FastReport.Export.Image;
  17. using FastReport.Export.Json;
  18. using FastReport.Export.LaTeX;
  19. using FastReport.Export.Mht;
  20. using FastReport.Export.Odf;
  21. using FastReport.Export.OoXML;
  22. using FastReport.Export.Pdf;
  23. using FastReport.Export.Ppml;
  24. using FastReport.Export.PS;
  25. using FastReport.Export.RichText;
  26. using FastReport.Export.Svg;
  27. using FastReport.Export.Text;
  28. using FastReport.Export.XAML;
  29. using FastReport.Export.Xml;
  30. using FastReport.Export.Zpl;
  31. using FastReport.Messaging;
  32. using System;
  33. namespace FastReport.Utils
  34. {
  35. #if !COMMUNITY
  36. public partial class ExportsOptions
  37. {
  38. private void CreateDefaultExports()
  39. {
  40. var root = ExportsMenu;
  41. root.AddExport(typeof(PDFExport), "Pdf", 201);
  42. root.AddCategory("Office", 190)
  43. .AddExport(typeof(Excel2007Export), "Xlsx", 191)
  44. .AddExport(typeof(Word2007Export), "Docx", 190)
  45. .AddExport(typeof(PowerPoint2007Export), "Pptx")
  46. .AddExport(typeof(ODSExport), "Ods")
  47. .AddExport(typeof(ODTExport), "Odt")
  48. .AddExport(typeof(RTFExport), "RichText", 190)
  49. .AddExport(typeof(Excel2003Document), "Xls")
  50. .AddExport(typeof(XMLExport), "Xml");
  51. root.AddCategory("Web", 153)
  52. .AddExport(typeof(HTMLExport), "Html")
  53. .AddExport(typeof(MHTExport), "Mht");
  54. root.AddCategory("Image", 103)
  55. .AddExport(typeof(ImageExport), "Image")
  56. .AddExport(typeof(SVGExport), "Svg");
  57. root.AddCategory("DataBase", 53)
  58. .AddExport(typeof(CSVExport), "Csv")
  59. .AddExport(typeof(DBFExport), "Dbf")
  60. .AddExport(typeof(JsonExport), "Json");
  61. root.AddCategory("Print", 195)
  62. .AddExport(typeof(TextExport), "Text")
  63. .AddExport(typeof(ZplExport), "Zpl")
  64. .AddExport(typeof(PPMLExport), "Ppml")
  65. .AddExport(typeof(PSExport), "PS")
  66. .AddExport(typeof(XPSExport), "Xps");
  67. root.AddCategory("Other")
  68. .AddExport(typeof(LaTeXExport), "LaTeX")
  69. .AddExport(typeof(DxfExport), "Dxf")
  70. .AddExport(typeof(XAMLExport), "Xaml");
  71. }
  72. private ExportsTreeNode cloudMenu;
  73. /// <summary>
  74. /// All cloud exports available in the preview.
  75. /// </summary>
  76. public ExportsTreeNode CloudMenu
  77. {
  78. get
  79. {
  80. if (cloudMenu == null)
  81. {
  82. cloudMenu = new ExportsTreeNode() { Name = "Cloud", ImageIndex = 238 };
  83. cloudMenu
  84. .AddCloud(typeof(FtpStorageClient), "Ftp")
  85. .AddCloud(typeof(DropboxStorageClient), "Dropbox", 238)
  86. #if !AVALONIA
  87. .AddCloud(typeof(BoxStorageClient), "Box", 238)
  88. .AddCloud(typeof(GoogleDriveStorageClient), "GoogleDrive", 238)
  89. .AddCloud(typeof(SkyDriveStorageClient), "SkyDrive", 238)
  90. #endif
  91. .AddCloud(typeof(S3StorageClient), "S3", 238);
  92. }
  93. return cloudMenu;
  94. }
  95. }
  96. private ExportsTreeNode messengerMenu;
  97. /// <summary>
  98. /// All messengers exports available in the preview.
  99. /// </summary>
  100. public ExportsTreeNode MessengerMenu
  101. {
  102. get
  103. {
  104. if (messengerMenu == null)
  105. {
  106. messengerMenu = new ExportsTreeNode() { Name = "Messengers" };
  107. //messengerMenu.AddMessenger("Xmpp", typeof(Messaging.Xmpp.XmppMessenger));
  108. }
  109. return messengerMenu;
  110. }
  111. }
  112. internal PreviewExports Exports
  113. {
  114. get
  115. {
  116. var result = PreviewExports.None;
  117. foreach (var node in EnumNodes(ExportsMenu))
  118. {
  119. if (node.Enabled && node.GetEnum<PreviewExports>(out var res))
  120. result |= res;
  121. }
  122. return result;
  123. }
  124. set
  125. {
  126. foreach (var node in EnumNodes(ExportsMenu))
  127. {
  128. if (node.GetEnum<PreviewExports>(out var res))
  129. node.Enabled = (value & res) != 0;
  130. }
  131. }
  132. }
  133. internal PreviewClouds Clouds
  134. {
  135. get
  136. {
  137. var result = PreviewClouds.None;
  138. foreach (var node in EnumNodes(CloudMenu))
  139. {
  140. if (node.Enabled && node.GetEnum<PreviewClouds>(out var res))
  141. result |= res;
  142. }
  143. return result;
  144. }
  145. set
  146. {
  147. foreach (var node in EnumNodes(CloudMenu))
  148. {
  149. if (node.GetEnum<PreviewClouds>(out var res))
  150. node.Enabled = (value & res) != 0;
  151. }
  152. }
  153. }
  154. internal PreviewMessengers Messengers
  155. {
  156. get
  157. {
  158. var result = PreviewMessengers.None;
  159. foreach (var node in EnumNodes(MessengerMenu))
  160. {
  161. if (node.Enabled && node.GetEnum<PreviewMessengers>(out var res))
  162. result |= res;
  163. }
  164. return result;
  165. }
  166. set
  167. {
  168. foreach (var node in EnumNodes(MessengerMenu))
  169. {
  170. if (node.GetEnum<PreviewMessengers>(out var res))
  171. node.Enabled = (value & res) != 0;
  172. }
  173. }
  174. }
  175. private void SaveMenuTree(XmlItem item, ExportsTreeNode root)
  176. {
  177. item.Items.Clear();
  178. item.Name = root.Name;
  179. if (!root.Enabled)
  180. item.SetProp("Enabled", "false");
  181. foreach (ExportsTreeNode node in root.Nodes)
  182. {
  183. SaveMenuTree(item.Add(), node);
  184. }
  185. }
  186. private XmlItem SaveMenuTree(ExportsTreeNode root)
  187. {
  188. var item = new XmlItem();
  189. SaveMenuTree(item, root);
  190. return item;
  191. }
  192. private void SaveMenuTree(string name, ExportsTreeNode root)
  193. {
  194. SaveMenuTree(Config.Root.FindItem("PreviewSettings").FindItem(name), root);
  195. }
  196. private void RestoreMenuTree(XmlItem item, ExportsTreeNode root)
  197. {
  198. for (int i = 0; i < item.Count; i++)
  199. {
  200. var xi = item[i];
  201. var name = xi.Name;
  202. var node = FindItem(root.Root, name, null) ?? new ExportsTreeNode() { Name = name };
  203. if (i < root.Nodes.Count)
  204. root.Nodes.Insert(i, node);
  205. else
  206. root.Nodes.Add(node);
  207. node.Enabled = string.Compare(xi.GetProp("Enabled"), "false", true) != 0;
  208. RestoreMenuTree(xi, node);
  209. }
  210. }
  211. private void RestoreMenuTree(string name, ExportsTreeNode root)
  212. {
  213. RestoreMenuTree(Config.Root.FindItem("PreviewSettings").FindItem(name), root);
  214. }
  215. private XmlItem defaultExports;
  216. private XmlItem defaultClouds;
  217. private XmlItem defaultMessengers;
  218. private void RestoreOptions()
  219. {
  220. // save current state as default one
  221. defaultExports = SaveMenuTree(ExportsMenu);
  222. defaultClouds = SaveMenuTree(CloudMenu);
  223. defaultMessengers = SaveMenuTree(MessengerMenu);
  224. RestoreMenuTree("Exports", ExportsMenu);
  225. RestoreMenuTree("Cloud", CloudMenu);
  226. RestoreMenuTree("Messengers", MessengerMenu);
  227. }
  228. private void SaveOptions()
  229. {
  230. SaveMenuTree("Exports", ExportsMenu);
  231. SaveMenuTree("Cloud", CloudMenu);
  232. SaveMenuTree("Messengers", MessengerMenu);
  233. }
  234. /// <summary>
  235. /// Resets the export nodes to default state.
  236. /// </summary>
  237. public void ResetToDefault()
  238. {
  239. if (defaultExports != null)
  240. RestoreMenuTree(defaultExports, ExportsMenu);
  241. if (defaultClouds != null)
  242. RestoreMenuTree(defaultClouds, CloudMenu);
  243. if (defaultMessengers != null)
  244. RestoreMenuTree(defaultMessengers, MessengerMenu);
  245. }
  246. public partial class ExportsTreeNode
  247. {
  248. /// <summary>
  249. /// Returns true if the node is a category.
  250. /// </summary>
  251. public bool IsCategory => ExportType == null;
  252. /// <summary>
  253. /// Returns true if the node is an export.
  254. /// </summary>
  255. public bool IsExport => ExportType != null && ExportType.IsSubclassOf(typeof(ExportBase));
  256. /// <summary>
  257. /// Returns true if the node is a cloud export.
  258. /// </summary>
  259. public bool IsCloud => ExportType != null && ExportType.IsSubclassOf(typeof(CloudStorageClient));
  260. /// <summary>
  261. /// Returns true if the node is a category.
  262. /// </summary>
  263. public bool IsMessenger => ExportType != null && ExportType.IsSubclassOf(typeof(MessengerBase));
  264. /// <summary>
  265. /// Adds a cloud export and registers it.
  266. /// </summary>
  267. /// <param name="type">The export type.</param>
  268. /// <param name="text">The display text.</param>
  269. /// <param name="imageIndex">The image index.</param>
  270. /// <returns>Returns this object to allow method chaining.</returns>
  271. public ExportsTreeNode AddCloud(Type type, string text, int imageIndex = -1)
  272. {
  273. var node = new ExportsTreeNode() { Name = type.Name, ExportType = type, Text = text, ImageIndex = imageIndex };
  274. node.Tag = RegisteredObjects.AddCloud(node.ExportType, node.ToString(), node.ImageIndex);
  275. Nodes.Add(node);
  276. return this;
  277. }
  278. /// <summary>
  279. /// Adds a messenger and registers it.
  280. /// </summary>
  281. /// <param name="type">The export type.</param>
  282. /// <param name="text">The display text.</param>
  283. /// <param name="imageIndex">The image index.</param>
  284. /// <returns>Returns this object to allow method chaining.</returns>
  285. public ExportsTreeNode AddMessenger(Type type, string text, int imageIndex = -1)
  286. {
  287. var node = new ExportsTreeNode() { Name = type.Name, ExportType = type, Text = text, ImageIndex = imageIndex };
  288. node.Tag = RegisteredObjects.AddMessenger(node.ExportType, node.ToString(), node.ImageIndex);
  289. Nodes.Add(node);
  290. return this;
  291. }
  292. internal bool GetEnum<T>(out T res) where T : struct => Enum.TryParse(Name, out res);
  293. /// <inheritdoc/>
  294. public override string ToString()
  295. {
  296. string resPath;
  297. if (IsCategory)
  298. {
  299. resPath = "Export,ExportGroups," + Name;
  300. }
  301. else
  302. {
  303. if (IsExport)
  304. {
  305. resPath = "Export," + Text + ",File";
  306. }
  307. else
  308. {
  309. resPath = (IsCloud ? "Cloud," : "Messaging,") + Text + ",Name";
  310. }
  311. }
  312. string result = Res.TryGet(resPath);
  313. if (result == resPath)
  314. return Text;
  315. return result;
  316. }
  317. }
  318. }
  319. #endif
  320. }