WebReport.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Linq;
  7. using FastReport.Web.Application;
  8. using System.Drawing;
  9. using System.ComponentModel;
  10. #if !WASM
  11. using FastReport.Web.Cache;
  12. #endif
  13. namespace FastReport.Web
  14. {
  15. public enum WebReportMode
  16. {
  17. Preview,
  18. #if DESIGNER
  19. Designer,
  20. #endif
  21. #if DIALOGS
  22. Dialog,
  23. #endif
  24. }
  25. public partial class WebReport
  26. {
  27. private string localizationFile;
  28. #if DIALOGS
  29. internal Dialog Dialog { get; }
  30. #endif
  31. #region Public Properties
  32. /// <summary>
  33. /// Unique ID of this instance.
  34. /// Automatically generates on creation.
  35. /// </summary>
  36. public string ID { get; } = Guid.NewGuid().ToString("N");
  37. /// <summary>
  38. /// Adds "display: inline-*" to html container.
  39. /// Default value: true.
  40. /// </summary>
  41. public bool Inline { get; set; } = true;
  42. /// <summary>
  43. /// Current report
  44. /// </summary>
  45. public Report Report
  46. {
  47. get => Tabs[CurrentTabIndex].Report;
  48. set => Tabs[CurrentTabIndex].Report = value;
  49. }
  50. /// <summary>
  51. /// Gets or sets the WebReport's locale
  52. /// </summary>
  53. public string LocalizationFile
  54. {
  55. get => localizationFile;
  56. set
  57. {
  58. localizationFile = value;
  59. string path = WebUtils.MapPath(localizationFile);
  60. Res.LoadLocale(path);
  61. }
  62. }
  63. internal IWebRes Res { get; } = new WebRes();
  64. /// <summary>
  65. /// Page index of current report
  66. /// </summary>
  67. public int CurrentPageIndex
  68. {
  69. get => CurrentTab?.CurrentPageIndex ?? 0;
  70. set
  71. {
  72. var tab = CurrentTab;
  73. if (tab != null)
  74. tab.CurrentPageIndex = value;
  75. }
  76. }
  77. /// <summary>
  78. /// Is current report prepared(.fpx) or not(.frx)
  79. /// </summary>
  80. public bool ReportPrepared
  81. {
  82. get => CurrentTab?.ReportPrepared ?? false;
  83. set
  84. {
  85. var tab = CurrentTab;
  86. if (tab != null)
  87. tab.ReportPrepared = value;
  88. }
  89. }
  90. /// <summary>
  91. /// Total prepared pages of current report
  92. /// </summary>
  93. public int TotalPages => Report?.PreparedPages?.Count ?? 0;
  94. /// <summary>
  95. /// Switches between Preview and Designer modes
  96. /// </summary>
  97. public WebReportMode Mode { get; set; } = WebReportMode.Preview;
  98. /// <summary>
  99. /// Property to store user data
  100. /// </summary>
  101. public object UserData { get; set; } = null;
  102. public bool SinglePage { get; set; } = false;
  103. public bool Layers { get; set; } = true;
  104. public bool EnableMargins { get; set; } = true;
  105. public string Width { get; set; } = "";
  106. public string Height { get; set; } = "";
  107. public bool Pictures { get; set; } = true;
  108. public bool EmbedPictures { get; set; } = false;
  109. #region ToolbarSettings
  110. /// <summary>
  111. /// Toolbar settings
  112. /// </summary>
  113. public ToolbarSettings Toolbar { get; set; } = ToolbarSettings.Default;
  114. [Obsolete("Please, use Toolbar.Show")]
  115. [EditorBrowsable(EditorBrowsableState.Never)]
  116. public bool ShowToolbar { get => Toolbar.Show; set => Toolbar.Show = value; }
  117. [Obsolete("Please, use Toolbar.ShowPrevButton")]
  118. [EditorBrowsable(EditorBrowsableState.Never)]
  119. public bool ShowPrevButton { get => Toolbar.ShowPrevButton; set => Toolbar.ShowPrevButton = value; }
  120. [Obsolete("Please, use Toolbar.ShowNextButton")]
  121. [EditorBrowsable(EditorBrowsableState.Never)]
  122. public bool ShowNextButton { get => Toolbar.ShowNextButton; set => Toolbar.ShowNextButton = value; }
  123. [Obsolete("Please, use Toolbar.ShowFirstButton")]
  124. [EditorBrowsable(EditorBrowsableState.Never)]
  125. public bool ShowFirstButton { get => Toolbar.ShowFirstButton; set => Toolbar.ShowFirstButton = value; }
  126. [Obsolete("Please, use Toolbar.ShowLastButton")]
  127. [EditorBrowsable(EditorBrowsableState.Never)]
  128. public bool ShowLastButton { get => Toolbar.ShowLastButton; set => Toolbar.ShowLastButton = value; }
  129. [Obsolete("Please, use Toolbar.Exports.Show")]
  130. [EditorBrowsable(EditorBrowsableState.Never)]
  131. public bool ShowExports { get => Toolbar.Exports.Show; set => Toolbar.Exports.Show = value; }
  132. [Obsolete("Please, use Toolbar.ShowRefreshButton")]
  133. [EditorBrowsable(EditorBrowsableState.Never)]
  134. public bool ShowRefreshButton { get => Toolbar.ShowRefreshButton; set => Toolbar.ShowRefreshButton = value; }
  135. [Obsolete("Please, use Toolbar.ShowZoomButton")]
  136. [EditorBrowsable(EditorBrowsableState.Never)]
  137. public bool ShowZoomButton { get => Toolbar.ShowZoomButton; set => Toolbar.ShowZoomButton = value; }
  138. [Obsolete("Please, use Toolbar.ShowPrint")]
  139. [EditorBrowsable(EditorBrowsableState.Never)]
  140. public bool ShowPrint { get => Toolbar.ShowPrint; set => Toolbar.ShowPrint = value; }
  141. [Obsolete("Please, use Toolbar.PrintInHtml")]
  142. [EditorBrowsable(EditorBrowsableState.Never)]
  143. public bool PrintInHtml { get => Toolbar.PrintInHtml; set => Toolbar.PrintInHtml = value; }
  144. #if !OPENSOURCE
  145. [Obsolete("Please, use Toolbar.PrintInPdf")]
  146. [EditorBrowsable(EditorBrowsableState.Never)]
  147. public bool PrintInPdf { get => Toolbar.PrintInPdf; set => Toolbar.PrintInPdf = value; }
  148. #endif
  149. [Obsolete("Please, use Toolbar.Position")]
  150. [EditorBrowsable(EditorBrowsableState.Never)]
  151. public bool ShowBottomToolbar { get => Toolbar.ShowBottomToolbar; set => Toolbar.ShowBottomToolbar = value; }
  152. [Obsolete("Please, use Toolbar.Color")]
  153. [EditorBrowsable(EditorBrowsableState.Never)]
  154. public Color ToolbarColor { get => Toolbar.Color; set => Toolbar.Color = value; }
  155. /// <summary>
  156. /// Toolbar height in pixels
  157. /// </summary>
  158. [Obsolete("Please, use Toolbar.Height")]
  159. [EditorBrowsable(EditorBrowsableState.Never)]
  160. public int ToolbarHeight { get => Toolbar.Height; set => Toolbar.Height = value; }
  161. #endregion
  162. public float Zoom { get; set; } = 1.0f;
  163. public bool Debug { get; set; }
  164. #if DEBUG
  165. = true;
  166. #else
  167. = false;
  168. #endif
  169. internal bool Canceled { get; set; } = false;
  170. /// <summary>
  171. /// Shows sidebar with outline.
  172. /// Default value: true.
  173. /// </summary>
  174. public bool Outline { get; set; } = true;
  175. #endregion
  176. #region Non-public
  177. internal readonly Dictionary<string, byte[]> PictureCache = new Dictionary<string, byte[]>();
  178. internal string InlineStyle
  179. {
  180. get
  181. {
  182. if (Inline)
  183. return "inline-flex";
  184. return "flex";
  185. }
  186. }
  187. #endregion
  188. public WebReport()
  189. {
  190. string path = WebUtils.MapPath(LocalizationFile);
  191. Res.LoadLocale(path);
  192. #if !WASM
  193. WebReportCache.Instance?.Add(this);
  194. #endif
  195. #if DIALOGS
  196. Dialog = new Dialog(this);
  197. #endif
  198. }
  199. static WebReport()
  200. {
  201. ScriptSecurity = new ScriptSecurity(new ScriptChecker());
  202. }
  203. public void LoadPrepared(string filename)
  204. {
  205. Report.LoadPrepared(filename);
  206. }
  207. public void LoadPrepared(Stream stream)
  208. {
  209. Report.LoadPrepared(stream);
  210. }
  211. internal void InternalDispose()
  212. {
  213. //foreach(var picture in PictureCache.Values)
  214. //{
  215. // ArrayPool<byte>.Shared.Return(picture);
  216. //}
  217. PictureCache.Clear();
  218. foreach(var tab in Tabs)
  219. {
  220. tab.Report.Dispose();
  221. }
  222. Res.Dispose();
  223. }
  224. // TODO
  225. // void ReportLoad()
  226. // void RegisterData()
  227. #region Navigation
  228. /// <summary>
  229. /// Force go to next report page
  230. /// </summary>
  231. public void NextPage()
  232. {
  233. if (CurrentPageIndex >= TotalPages - 1)
  234. return;
  235. var curPageIndex = CurrentPageIndex + 1;
  236. if (SplitReportPagesInTabs && Tabs.Count > 1)
  237. {
  238. if (curPageIndex == Tabs[numberNextTab].MinPageIndex)
  239. {
  240. CurrentTabIndex++;
  241. if (numberNextTab < Tabs.Count - 1)
  242. {
  243. numberNextTab++;
  244. }
  245. }
  246. }
  247. CurrentPageIndex = curPageIndex;
  248. }
  249. /// <summary>
  250. /// Force go to previous report page
  251. /// </summary>
  252. public void PrevPage()
  253. {
  254. if (CurrentPageIndex <= 0)
  255. return;
  256. var curPageIndex = CurrentPageIndex - 1;
  257. if (SplitReportPagesInTabs && Tabs.Count > 1)
  258. {
  259. if (CurrentTab.MinPageIndex > curPageIndex)
  260. {
  261. if (numberNextTab != 1 && CurrentTabIndex != numberNextTab)
  262. {
  263. numberNextTab--;
  264. }
  265. CurrentTabIndex--;
  266. }
  267. }
  268. CurrentPageIndex = curPageIndex;
  269. }
  270. /// <summary>
  271. /// Force go to first report page
  272. /// </summary>
  273. public void FirstPage()
  274. {
  275. if (SplitReportPagesInTabs && Tabs.Count > 1)
  276. {
  277. numberNextTab = 1;
  278. CurrentTabIndex = 0;
  279. }
  280. CurrentPageIndex = 0;
  281. }
  282. /// <summary>
  283. /// Force go to last report page
  284. /// </summary>
  285. public void LastPage()
  286. {
  287. if (SplitReportPagesInTabs && Tabs.Count > 1)
  288. {
  289. numberNextTab = Tabs.Count - 1;
  290. CurrentTabIndex = Tabs.Count - 1;
  291. }
  292. CurrentPageIndex = TotalPages - 1;
  293. }
  294. /// <summary>
  295. /// Force go to "value" report page
  296. /// </summary>
  297. public void GotoPage(int value)
  298. {
  299. if (value < 0 || value >= TotalPages)
  300. return;
  301. if (SplitReportPagesInTabs && Tabs.Count > 1)
  302. {
  303. for(int i = 0; i < Tabs.Count; i++)
  304. {
  305. // can be better
  306. if (Tabs[i].MinPageIndex <= value)
  307. {
  308. CurrentTabIndex = i;
  309. if (i != Tabs.Count - 1)
  310. numberNextTab = i + 1;
  311. }
  312. else break;
  313. }
  314. }
  315. CurrentPageIndex = value;
  316. }
  317. #endregion
  318. #region Script Security
  319. private static ScriptSecurity ScriptSecurity = null;
  320. #endregion
  321. }
  322. }