ExportsOptions.BaseExt.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. using System;
  2. using System.Collections.Generic;
  3. using FastReport.Export.Image;
  4. using FastReport.Export.RichText;
  5. using FastReport.Export.Xml;
  6. using FastReport.Export.Html;
  7. using FastReport.Export.Mht;
  8. using FastReport.Export.Odf;
  9. using FastReport.Export.Pdf;
  10. using FastReport.Export.Csv;
  11. using FastReport.Export.Dbf;
  12. using FastReport.Export.Dxf;
  13. using FastReport.Export.XAML;
  14. using FastReport.Export.Svg;
  15. using FastReport.Export.Ppml;
  16. using FastReport.Export.PS;
  17. using FastReport.Export.BIFF8;
  18. using FastReport.Export.OoXML;
  19. using FastReport.Export.Json;
  20. using FastReport.Export.LaTeX;
  21. using FastReport.Export.Text;
  22. using FastReport.Export.Zpl;
  23. using FastReport.Cloud.StorageClient;
  24. using FastReport.Messaging;
  25. using FastReport.Export;
  26. using FastReport.Cloud.StorageClient.Ftp;
  27. using FastReport.Cloud.StorageClient.Box;
  28. using FastReport.Cloud.StorageClient.Dropbox;
  29. using FastReport.Cloud.StorageClient.GoogleDrive;
  30. using FastReport.Cloud.StorageClient.SkyDrive;
  31. namespace FastReport.Utils
  32. {
  33. #if !COMMUNITY
  34. public partial class ExportsOptions
  35. {
  36. public partial class ExportsTreeNode
  37. {
  38. private const string CLOUD_ITEM_PREFIX = "Cloud,";
  39. private const string MESSENGER_ITEM_PREFIX = "Messaging,";
  40. public override string ToString()
  41. {
  42. string resPath;
  43. if (exportType == null)
  44. {
  45. resPath = CATEGORY_PREFIX + name;
  46. }
  47. else
  48. {
  49. if (exportType.IsSubclassOf(typeof(ExportBase)))
  50. {
  51. resPath = EXPORT_ITEM_PREFIX + name + EXPORT_ITEM_POSTFIX;
  52. }
  53. else
  54. {
  55. resPath = (exportType.IsSubclassOf(typeof(CloudStorageClient))
  56. ? CLOUD_ITEM_PREFIX : MESSENGER_ITEM_PREFIX) + name + ITEM_POSTFIX;
  57. }
  58. }
  59. return Res.Get(resPath);
  60. }
  61. }
  62. /// <summary>
  63. /// Default Exports menu
  64. /// </summary>
  65. /// <returns>Tree that contains default Exports menu</returns>
  66. public List<ExportsTreeNode> DefaultExports()
  67. {
  68. List<ExportsTreeNode> defaultMenu = new List<ExportsTreeNode>();
  69. defaultMenu.Add(new ExportsTreeNode("Pdf", typeof(PDFExport), 201, true, RegisteredObjects.FindExport(typeof(PDFExport))));
  70. defaultMenu.Add(new ExportsTreeNode("Office", 190, true));
  71. defaultMenu[1].Nodes.Add(new ExportsTreeNode("RichText", typeof(RTFExport), 190, true, RegisteredObjects.FindExport(typeof(RTFExport))));
  72. defaultMenu[1].Nodes.Add(new ExportsTreeNode("Xlsx", typeof(Excel2007Export), 191, true, RegisteredObjects.FindExport(typeof(Excel2007Export))));
  73. defaultMenu[1].Nodes.Add(new ExportsTreeNode("Xls", typeof(Excel2003Document), 191, true, RegisteredObjects.FindExport(typeof(Excel2003Document))));
  74. defaultMenu[1].Nodes.Add(new ExportsTreeNode("Docx", typeof(Word2007Export), 190, true, RegisteredObjects.FindExport(typeof(Word2007Export))));
  75. defaultMenu[1].Nodes.Add(new ExportsTreeNode("Pptx", typeof(PowerPoint2007Export), true, RegisteredObjects.FindExport(typeof(PowerPoint2007Export))));
  76. defaultMenu[1].Nodes.Add(new ExportsTreeNode("Ods", typeof(ODSExport), true, RegisteredObjects.FindExport(typeof(ODSExport))));
  77. defaultMenu[1].Nodes.Add(new ExportsTreeNode("Odt", typeof(ODTExport), true, RegisteredObjects.FindExport(typeof(ODTExport))));
  78. defaultMenu.Add(new ExportsTreeNode("XML", 191, true));
  79. defaultMenu[2].Nodes.Add(new ExportsTreeNode("Xml", typeof(XMLExport), true, RegisteredObjects.FindExport(typeof(XMLExport))));
  80. defaultMenu[2].Nodes.Add(new ExportsTreeNode("Xaml", typeof(XAMLExport), true, RegisteredObjects.FindExport(typeof(XAMLExport))));
  81. defaultMenu.Add(new ExportsTreeNode("Web", 246, true));
  82. defaultMenu[3].Nodes.Add(new ExportsTreeNode("Html", typeof(HTMLExport), true, RegisteredObjects.FindExport(typeof(HTMLExport))));
  83. defaultMenu[3].Nodes.Add(new ExportsTreeNode("Mht", typeof(MHTExport), true, RegisteredObjects.FindExport(typeof(MHTExport))));
  84. defaultMenu.Add(new ExportsTreeNode("Image", 103, true));
  85. defaultMenu[4].Nodes.Add(new ExportsTreeNode("Image", typeof(ImageExport), true, RegisteredObjects.FindExport(typeof(ImageExport))));
  86. defaultMenu[4].Nodes.Add(new ExportsTreeNode("Svg", typeof(SVGExport), true, RegisteredObjects.FindExport(typeof(SVGExport))));
  87. defaultMenu.Add(new ExportsTreeNode("DataBase", 53, true));
  88. defaultMenu[5].Nodes.Add(new ExportsTreeNode("Csv", typeof(CSVExport), true, RegisteredObjects.FindExport(typeof(CSVExport))));
  89. defaultMenu[5].Nodes.Add(new ExportsTreeNode("Dbf", typeof(DBFExport), true, RegisteredObjects.FindExport(typeof(DBFExport))));
  90. defaultMenu[5].Nodes.Add(new ExportsTreeNode("Json", typeof(JsonExport), true, RegisteredObjects.FindExport(typeof(JsonExport))));
  91. defaultMenu.Add(new ExportsTreeNode("Print", 195, true));
  92. defaultMenu[6].Nodes.Add(new ExportsTreeNode("Text", typeof(TextExport), true, RegisteredObjects.FindExport(typeof(TextExport))));
  93. defaultMenu[6].Nodes.Add(new ExportsTreeNode("Zpl", typeof(ZplExport), true, RegisteredObjects.FindExport(typeof(ZplExport))));
  94. defaultMenu[6].Nodes.Add(new ExportsTreeNode("Ppml", typeof(PPMLExport), true, RegisteredObjects.FindExport(typeof(PPMLExport))));
  95. defaultMenu[6].Nodes.Add(new ExportsTreeNode("PS", typeof(PSExport), true, RegisteredObjects.FindExport(typeof(PSExport))));
  96. defaultMenu.Add(new ExportsTreeNode("Other", true));
  97. defaultMenu[7].Nodes.Add(new ExportsTreeNode("Xps", typeof(XPSExport), true, RegisteredObjects.FindExport(typeof(XPSExport))));
  98. defaultMenu[7].Nodes.Add(new ExportsTreeNode("LaTeX", typeof(LaTeXExport), true, RegisteredObjects.FindExport(typeof(LaTeXExport))));
  99. defaultMenu[7].Nodes.Add(new ExportsTreeNode("Dxf", typeof(DxfExport), true, RegisteredObjects.FindExport(typeof(DBFExport))));
  100. return defaultMenu;
  101. }
  102. private ExportsTreeNode cloudNodes;
  103. private ExportsTreeNode messengerNodes = new ExportsTreeNode("Messengers", false);
  104. /// <summary>
  105. /// All cloud exports available in the preview.
  106. /// </summary>
  107. public ExportsTreeNode CloudMenu
  108. {
  109. get
  110. {
  111. if (cloudNodes.Nodes.Count <= 0)
  112. RestoreOptionsFor("Cloud");
  113. return cloudNodes;
  114. }
  115. }
  116. /// <summary>
  117. /// All messengers exports available in the preview.
  118. /// </summary>
  119. public ExportsTreeNode MessengerMenu
  120. {
  121. get
  122. {
  123. if (messengerNodes.Nodes.Count <= 0)
  124. RestoreOptionsFor("Messenger");
  125. return messengerNodes;
  126. }
  127. }
  128. /// <summary>
  129. /// Default cloud exports menu.
  130. /// </summary>
  131. /// <returns>Tree that contains default cloud exports menu.</returns>
  132. public ExportsTreeNode DefaultCloud()
  133. {
  134. cloudNodes = new ExportsTreeNode("Cloud", 238, false);
  135. cloudNodes.Nodes.Add(new ExportsTreeNode("Ftp", typeof(FtpStorageClient), false, RegisteredObjects.FindObject(typeof(FtpStorageClient))));
  136. cloudNodes.Nodes.Add(new ExportsTreeNode("Box", typeof(BoxStorageClient), 238, false, RegisteredObjects.FindObject(typeof(BoxStorageClient))));
  137. cloudNodes.Nodes.Add(new ExportsTreeNode("Dropbox", typeof(DropboxStorageClient), 238, false, RegisteredObjects.FindObject(typeof(DropboxStorageClient))));
  138. cloudNodes.Nodes.Add(new ExportsTreeNode("GoogleDrive", typeof(GoogleDriveStorageClient), 238, false, RegisteredObjects.FindObject(typeof(GoogleDriveStorageClient))));
  139. cloudNodes.Nodes.Add(new ExportsTreeNode("SkyDrive", typeof(SkyDriveStorageClient), 238, false, RegisteredObjects.FindObject(typeof(SkyDriveStorageClient))));
  140. return cloudNodes;
  141. }
  142. /// <summary>
  143. /// Default messengers.
  144. /// </summary>
  145. /// <returns></returns>
  146. public ExportsTreeNode DefaultMessengers()
  147. {
  148. messengerNodes = new ExportsTreeNode("Messengers", false);
  149. //messengerNodes.Nodes.Add(new ExportsTreeNode("Xmpp", typeof(XmppMessenger), false));
  150. return messengerNodes;
  151. }
  152. /// <summary>
  153. /// Register all clouds.
  154. /// </summary>
  155. public void RegisterClouds()
  156. {
  157. foreach (ExportsTreeNode node in cloudNodes.Nodes)
  158. {
  159. var tag = RegisteredObjects.AddCloud(node.ExportType, node.ToString(), node.ImageIndex);
  160. node.Tag = tag;
  161. }
  162. }
  163. /// <summary>
  164. /// Register all messengers.
  165. /// </summary>
  166. public void RegisterMessengers()
  167. {
  168. foreach (ExportsTreeNode node in messengerNodes.Nodes)
  169. {
  170. var tag = RegisteredObjects.InternalAddMessenger(node.ExportType, node.ToString());
  171. node.Tag = tag;
  172. }
  173. }
  174. private XmlItem SaveItem(ExportsTreeNode node)
  175. {
  176. XmlItem newItem = new XmlItem();
  177. newItem.Name = node.Name;
  178. if (node.ExportType != null)
  179. {
  180. newItem.SetProp("ExportType", node.ExportType.FullName);
  181. }
  182. if (node.ImageIndex != -1)
  183. {
  184. newItem.SetProp("Icon", node.ImageIndex.ToString());
  185. }
  186. newItem.SetProp("Enabled", node.Enabled.ToString());
  187. return newItem;
  188. }
  189. private void SaveMenuTree(XmlItem xi, List<ExportsTreeNode> nodes)
  190. {
  191. xi.Items.Clear();
  192. foreach (ExportsTreeNode node in nodes)
  193. {
  194. if (node.ContainsIn(DefaultExports()) || node.Equals(DefaultCloud()) || node.ContainsIn(DefaultCloud()))
  195. continue;
  196. XmlItem newItem = SaveItem(node);
  197. xi.Items.Add(newItem);
  198. if (node.Nodes.Count != 0)
  199. {
  200. SaveMenuTree(newItem, node.Nodes);
  201. }
  202. }
  203. }
  204. private void UpdateExportItemInConfig(XmlItem item)
  205. {
  206. Type exportType = Type.GetType(item.GetProp("ExportType"));
  207. bool isExport = exportType != null && item.Name != "Cloud" && item.Name != "Messengers" &&
  208. !exportType.IsSubclassOf(typeof(CloudStorageClient)) &&
  209. !exportType.IsSubclassOf(typeof(MessengerBase));
  210. if (isExport && item.GetProp("Enabled").ToLower() == "true")
  211. {
  212. PreviewExports type;
  213. bool parsed = Enum.TryParse(exportType.Name, out type);
  214. if (parsed)
  215. Config.PreviewSettings.Exports |= type;
  216. }
  217. }
  218. /// <summary>
  219. /// Update Config.PreviewSettings.Exports property.
  220. /// </summary>
  221. private void UpdateExportsInConfig(XmlItem exportsItem)
  222. {
  223. if ((Config.PreviewSettings.Exports & PreviewExports.Prepared) != 0)
  224. {
  225. Config.PreviewSettings.Exports = PreviewExports.Prepared;
  226. }
  227. else
  228. {
  229. Config.PreviewSettings.Exports = PreviewExports.None;
  230. }
  231. foreach (XmlItem item in exportsItem.Items)
  232. {
  233. if (item.Items.Count > 0)
  234. {
  235. foreach (XmlItem subItem in item.Items)
  236. {
  237. UpdateExportItemInConfig(subItem);
  238. }
  239. }
  240. else
  241. {
  242. UpdateExportItemInConfig(item);
  243. }
  244. }
  245. }
  246. /// <summary>
  247. /// Update Config.PreviewSettings.Clouds property.
  248. /// </summary>
  249. private void UpdateCloudsInConfig(XmlItem cloudsItem)
  250. {
  251. Config.PreviewSettings.Clouds = PreviewClouds.None;
  252. Type exportType;
  253. bool isCloud;
  254. foreach (XmlItem item in cloudsItem.Items)
  255. {
  256. exportType = Type.GetType(item.GetProp("ExportType"));
  257. isCloud = item.Name != "Cloud" && item.Name != "Messengers" &&
  258. exportType != null && exportType.IsSubclassOf(typeof(CloudStorageClient));
  259. if (isCloud && item.GetProp("Enabled").ToLower() == "true")
  260. {
  261. PreviewClouds type;
  262. bool parsed = Enum.TryParse(exportType.Name.Replace("StorageClient", ""), out type);
  263. if (parsed)
  264. {
  265. Config.PreviewSettings.Clouds |= type;
  266. }
  267. }
  268. }
  269. }
  270. /// <summary>
  271. /// Update Config.PreviewSettings.Messengers property.
  272. /// </summary>
  273. private void UpdateMessengersInConfig(XmlItem messengersItem)
  274. {
  275. Config.PreviewSettings.Messengers = PreviewMessengers.None;
  276. Type exportType;
  277. bool isMessenger;
  278. foreach (XmlItem item in messengersItem.Items)
  279. {
  280. exportType = Type.GetType(item.GetProp("ExportType"));
  281. isMessenger = item.Name != "Cloud" && item.Name != "Messengers" &&
  282. exportType != null && exportType.IsSubclassOf(typeof(MessengerBase));
  283. if (isMessenger && item.GetProp("Enabled").ToLower() == "true")
  284. {
  285. PreviewMessengers type;
  286. bool parsed = Enum.TryParse(exportType.Name.Replace("Messenger", ""), out type);
  287. if (parsed)
  288. {
  289. Config.PreviewSettings.Messengers |= type;
  290. }
  291. }
  292. }
  293. }
  294. /// <summary>
  295. /// Update availability of exports, clouds and messengers in Config.
  296. /// </summary>
  297. public void UpdateConfig()
  298. {
  299. UpdateExportsInConfig(Config.Root.FindItem("ExportOptions"));
  300. UpdateCloudsInConfig(Config.Root.FindItem("Cloud"));
  301. UpdateMessengersInConfig(Config.Root.FindItem("Messengers"));
  302. }
  303. private void SaveExportOption(string option)
  304. {
  305. XmlItem options = Config.Root.FindItem(option);
  306. List<ExportsTreeNode> nodes;
  307. if (option == "ExportOptions")
  308. {
  309. RemoveCloudsAndMessengersDuplicatesInMenuNodes();
  310. nodes = menuNodes;
  311. }
  312. else if (option == "Cloud")
  313. {
  314. if (Config.PreviewSettings.Clouds != PreviewClouds.None)
  315. {
  316. cloudNodes.Enabled = true;
  317. }
  318. options.SetProp("Enabled", cloudNodes.Enabled.ToString());
  319. options.SetProp("Icon", cloudNodes.ImageIndex.ToString());
  320. nodes = cloudNodes.Nodes;
  321. }
  322. else
  323. {
  324. if (Config.PreviewSettings.Messengers != PreviewMessengers.None)
  325. {
  326. messengerNodes.Enabled = true;
  327. }
  328. //options.SetProp("Enabled", messengerNodes.Enabled.ToString());
  329. options.SetProp("Enabled", "false");
  330. nodes = messengerNodes.Nodes;
  331. }
  332. SaveMenuTree(options, nodes);
  333. }
  334. private ExportsTreeNode RestoreItem(XmlItem item)
  335. {
  336. Type exportType = null;
  337. string typeProp = item.GetProp("ExportType");
  338. if (!string.IsNullOrEmpty(typeProp))
  339. {
  340. exportType = Type.GetType(typeProp);
  341. }
  342. string imageIndexProp = item.GetProp("Icon");
  343. int imageIndex = -1;
  344. if (!string.IsNullOrEmpty(imageIndexProp))
  345. {
  346. int.TryParse(imageIndexProp, out imageIndex);
  347. }
  348. string enabledProp = item.GetProp("Enabled");
  349. bool enabled = true;
  350. if (!string.IsNullOrEmpty(enabledProp) && Config.PreviewSettings.Exports != PreviewExports.All)
  351. {
  352. bool.TryParse(enabledProp, out enabled);
  353. }
  354. bool isExport = item.Name != "Cloud" && item.Name != "Messengers" &&
  355. (exportType != null && !exportType.IsSubclassOf(typeof(CloudStorageClient)) &&
  356. !exportType.IsSubclassOf(typeof(MessengerBase)) || exportType == null);
  357. if (isExport && Config.PreviewSettings.Exports != PreviewExports.All && exportType != null)
  358. {
  359. enabled = Config.PreviewSettings.Exports.ToString().ToLower().Contains(exportType.Name.ToLower());
  360. }
  361. bool isCloud = item.Name != "Cloud" && item.Name != "Messengers" &&
  362. exportType != null && exportType.IsSubclassOf(typeof(CloudStorageClient));
  363. if (isCloud && Config.PreviewSettings.Clouds != PreviewClouds.All && exportType != null)
  364. {
  365. enabled = Config.PreviewSettings.Clouds.ToString().Contains(exportType.Name.Replace("StorageClient", ""));
  366. }
  367. bool isMessenger = item.Name != "Cloud" && item.Name != "Messengers" &&
  368. exportType != null && exportType.IsSubclassOf(typeof(MessengerBase));
  369. if (isMessenger && Config.PreviewSettings.Messengers != PreviewMessengers.All && exportType != null)
  370. {
  371. enabled = false;//Config.PreviewSettings.Messengers.ToString().Contains(exportType.Name.Replace("Messenger", ""));
  372. }
  373. return new ExportsTreeNode(item.Name, exportType, imageIndex, enabled, isExport);
  374. }
  375. private void RestoreMenuTree(XmlItem xi, List<ExportsTreeNode> nodes)
  376. {
  377. foreach (XmlItem item in xi.Items)
  378. {
  379. ExportsTreeNode currentNode = RestoreItem(item);
  380. if (item.Items.Count > 0)
  381. {
  382. RestoreMenuTree(item, currentNode.Nodes);
  383. currentNode.Enabled = false;
  384. foreach (ExportsTreeNode subNode in currentNode.Nodes)
  385. {
  386. if (subNode.Enabled)
  387. {
  388. currentNode.Enabled = true;
  389. break;
  390. }
  391. }
  392. foreach (ExportsTreeNode node in nodes)
  393. {
  394. if (node.Name == currentNode.Name && !node.Equals(currentNode))
  395. {
  396. foreach(ExportsTreeNode subNode in node.Nodes)
  397. foreach(ExportsTreeNode currentSubNode in currentNode.Nodes)
  398. if (subNode.Name == currentSubNode.Name)
  399. subNode.Enabled = currentSubNode.Enabled;
  400. }
  401. }
  402. }
  403. if (currentNode.ContainsIn(DefaultExports()) || currentNode.Equals(DefaultCloud()) || currentNode.ContainsIn(DefaultCloud()))
  404. {
  405. continue;
  406. }
  407. nodes.Add(currentNode);
  408. }
  409. }
  410. private void RestoreOptionsFor(string option)
  411. {
  412. XmlItem options = Config.Root.FindItem(option);
  413. List<ExportsTreeNode> nodes = null;
  414. if (option == "ExportOptions")
  415. {
  416. nodes = menuNodes;
  417. menuNodes.AddRange(DefaultExports());
  418. }
  419. else if (option == "Cloud")
  420. {
  421. cloudNodes = DefaultCloud();
  422. cloudNodes.Enabled = RestoreItem(options).Enabled;
  423. nodes = cloudNodes.Nodes;
  424. if (Config.PreviewSettings.Clouds == PreviewClouds.None)
  425. {
  426. cloudNodes.Enabled = false;
  427. }
  428. }
  429. //else
  430. //{
  431. // messengerNodes = RestoreItem(options);
  432. // nodes = messengerNodes.Nodes;
  433. // if (options.Items.Count == 0)
  434. // {
  435. // messengerNodes = DefaultMessengers();
  436. // }
  437. // if (Config.PreviewSettings.Messengers == PreviewMessengers.None)
  438. // {
  439. // messengerNodes.Enabled = false;
  440. // }
  441. //}
  442. if (options.Items.Count != 0)
  443. {
  444. RestoreMenuTree(options, nodes);
  445. }
  446. }
  447. private void RestoreOptions()
  448. {
  449. RestoreOptionsFor("ExportOptions");
  450. RestoreOptionsFor("Cloud");
  451. //RestoreOptionsFor("Messengers");
  452. }
  453. private void SaveOptions()
  454. {
  455. SaveExportOption("ExportOptions");
  456. SaveExportOption("Cloud");
  457. //SaveExportOption("Messengers");
  458. UpdateConfig();
  459. }
  460. }
  461. #endif
  462. }