CrossViewObject.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. using System;
  2. using System.ComponentModel;
  3. using FastReport.Matrix;
  4. using FastReport.Utils;
  5. using FastReport.Data;
  6. using FastReport.Table;
  7. using System.Drawing.Design;
  8. namespace FastReport.CrossView
  9. {
  10. /// <summary>
  11. /// Represents the crossview object that is used to print cube slice or slicegrid.
  12. /// </summary>
  13. public partial class CrossViewObject : TableBase
  14. {
  15. #region Fields
  16. //private FastCubeSource fastCubeSource;
  17. private CubeSourceBase cubeSource;
  18. private bool showTitle;
  19. private bool showXAxisFieldsCaption;
  20. private bool showYAxisFieldsCaption;
  21. private string style;
  22. private CrossViewData data;
  23. private string modifyResultEvent;
  24. private CrossViewHelper helper;
  25. private bool saveVisible;
  26. private MatrixStyleSheet styleSheet;
  27. #endregion
  28. #region Properties
  29. /// <summary>
  30. /// Allows to modify the prepared matrix elements such as cells, rows, columns.
  31. /// </summary>
  32. public event EventHandler ModifyResult;
  33. /// <summary>
  34. /// Gets or sets a value indicating whether to show a title row.
  35. /// </summary>
  36. [DefaultValue(false)]
  37. [Category("Behavior")]
  38. public bool ShowTitle
  39. {
  40. get { return showTitle; }
  41. set
  42. {
  43. showTitle = value;
  44. if (IsDesigning)
  45. {
  46. //Data.CreateDescriptors();
  47. //FHelper.CreateOtherDescriptor();
  48. BuildTemplate();
  49. }
  50. }
  51. }
  52. /// <summary>
  53. /// Gets or sets a value indicating whether to show a X Axis fields Caption.
  54. /// </summary>
  55. [DefaultValue(false)]
  56. [Category("Behavior")]
  57. public bool ShowXAxisFieldsCaption
  58. {
  59. get { return showXAxisFieldsCaption; }
  60. set
  61. {
  62. showXAxisFieldsCaption = value;
  63. if (IsDesigning)
  64. {
  65. //Data.CreateDescriptors();
  66. //FHelper.CreateOtherDescriptor();
  67. BuildTemplate();
  68. }
  69. }
  70. }
  71. /// <summary>
  72. /// Gets or sets a value indicating whether to show a Y Axis fields Caption.
  73. /// </summary>
  74. [DefaultValue(false)]
  75. [Category("Behavior")]
  76. public bool ShowYAxisFieldsCaption
  77. {
  78. get { return showYAxisFieldsCaption; }
  79. set
  80. {
  81. showYAxisFieldsCaption = value;
  82. if (IsDesigning)
  83. {
  84. //Data.CreateDescriptors();
  85. //FHelper.CreateOtherDescriptor();
  86. BuildTemplate();
  87. }
  88. }
  89. }
  90. /// <summary>
  91. /// Gets or sets a matrix style.
  92. /// </summary>
  93. [Category("Appearance")]
  94. [Editor("FastReport.TypeEditors.CrossViewStyleEditor, FastReport", typeof(UITypeEditor))]
  95. public new string Style
  96. {
  97. get { return style; }
  98. set
  99. {
  100. style = value;
  101. Helper.UpdateStyle();
  102. }
  103. }
  104. /// <summary>
  105. /// Gets or sets a script method name that will be used to handle the
  106. /// <see cref="ModifyResult"/> event.
  107. /// </summary>
  108. /// <remarks>
  109. /// See the <see cref="ModifyResult"/> event for more details.
  110. /// </remarks>
  111. [Category("Build")]
  112. public string ModifyResultEvent
  113. {
  114. get { return modifyResultEvent; }
  115. set { modifyResultEvent = value; }
  116. }
  117. /// <summary>
  118. ///
  119. /// </summary>
  120. [Browsable(false)]
  121. public string ColumnDescriptorsIndexes
  122. {
  123. get { return Data.ColumnDescriptorsIndexes; }
  124. set { if (!IsDesigning) Data.ColumnDescriptorsIndexes = value; }
  125. }
  126. /// <summary>
  127. ///
  128. /// </summary>
  129. [Browsable(false)]
  130. public string RowDescriptorsIndexes
  131. {
  132. get { return Data.RowDescriptorsIndexes; }
  133. set { if (!IsDesigning) Data.RowDescriptorsIndexes = value; }
  134. }
  135. /// <summary>
  136. ///
  137. /// </summary>
  138. [Browsable(false)]
  139. public string ColumnTerminalIndexes
  140. {
  141. get { return Data.ColumnTerminalIndexes; }
  142. set { if (!IsDesigning) Data.ColumnTerminalIndexes = value; }
  143. }
  144. /// <summary>
  145. ///
  146. /// </summary>
  147. [Browsable(false)]
  148. public string RowTerminalIndexes
  149. {
  150. get { return Data.RowTerminalIndexes; }
  151. set { if (!IsDesigning) Data.RowTerminalIndexes = value; }
  152. }
  153. /// <summary>
  154. /// Gets or sets a cube source.
  155. /// </summary>
  156. [Category("Data")]
  157. public CubeSourceBase CubeSource
  158. {
  159. get { return cubeSource; }
  160. set
  161. {
  162. if (cubeSource != value)
  163. {
  164. if (cubeSource != null)
  165. {
  166. cubeSource.Disposed -= new EventHandler(CubeSource_Disposed);
  167. cubeSource.OnChanged -= new EventHandler(CubeSource_OnChanged);
  168. }
  169. if (value != null)
  170. {
  171. value.Disposed += new EventHandler(CubeSource_Disposed);
  172. value.OnChanged += new EventHandler(CubeSource_OnChanged);
  173. }
  174. cubeSource = value;
  175. Data.CubeSource = value;
  176. if (IsDesigning)
  177. {
  178. Data.CreateDescriptors();
  179. helper.CreateOtherDescriptor();
  180. BuildTemplate();
  181. }
  182. }
  183. }
  184. }
  185. /// <summary>
  186. /// Gets the object that holds data of Cube
  187. /// </summary>
  188. /// <remarks>
  189. /// See the <see cref="CrossViewData"/> class for more details.
  190. /// </remarks>
  191. [Browsable(false)]
  192. public CrossViewData Data
  193. {
  194. get { return data; }
  195. }
  196. internal MatrixStyleSheet StyleSheet
  197. {
  198. get { return styleSheet; }
  199. }
  200. private CrossViewHelper Helper
  201. {
  202. get { return helper; }
  203. }
  204. private bool IsResultCrossView
  205. {
  206. get { return !IsDesigning /*&& Data.Columns.Count == 0 && Data.Rows.Count == 0 */; }
  207. }
  208. private BandBase ParentBand
  209. {
  210. get
  211. {
  212. BandBase parentBand = this.Band;
  213. if (parentBand is ChildBand)
  214. parentBand = (parentBand as ChildBand).GetTopParentBand;
  215. return parentBand;
  216. }
  217. }
  218. private DataBand FootersDataBand
  219. {
  220. get
  221. {
  222. DataBand dataBand = null;
  223. if (ParentBand is GroupFooterBand)
  224. dataBand = ((ParentBand as GroupFooterBand).Parent as GroupHeaderBand).GroupDataBand;
  225. else if (ParentBand is DataFooterBand)
  226. dataBand = ParentBand.Parent as DataBand;
  227. return dataBand;
  228. }
  229. }
  230. private bool IsOnFooter
  231. {
  232. get
  233. {
  234. DataBand dataBand = FootersDataBand;
  235. if (dataBand != null)
  236. {
  237. // return DataSource == dataBand.DataSource;
  238. }
  239. return false;
  240. }
  241. }
  242. #endregion
  243. #region Private Methods
  244. private void CreateResultTable()
  245. {
  246. SetResultTable(new TableResult());
  247. // assign properties from this object. Do not use Assign method: TableResult is incompatible with MatrixObject.
  248. ResultTable.OriginalComponent = OriginalComponent;
  249. ResultTable.Alias = Alias;
  250. ResultTable.Border = Border.Clone();
  251. ResultTable.Fill = Fill.Clone();
  252. ResultTable.Bounds = Bounds;
  253. ResultTable.PrintOnParent = PrintOnParent;
  254. ResultTable.RepeatHeaders = RepeatHeaders;
  255. ResultTable.RepeatRowHeaders = RepeatRowHeaders;
  256. ResultTable.RepeatColumnHeaders = RepeatColumnHeaders;
  257. ResultTable.Layout = Layout;
  258. ResultTable.WrappedGap = WrappedGap;
  259. ResultTable.AdjustSpannedCellsWidth = AdjustSpannedCellsWidth;
  260. ResultTable.SetReport(Report);
  261. ResultTable.AfterData += new EventHandler(ResultTable_AfterData);
  262. }
  263. private void DisposeResultTable()
  264. {
  265. ResultTable.Dispose();
  266. SetResultTable(null);
  267. }
  268. private void ResultTable_AfterData(object sender, EventArgs e)
  269. {
  270. OnModifyResult(e);
  271. }
  272. private void CubeSource_Disposed(object sender, EventArgs e)
  273. {
  274. Data.CubeSource = null;
  275. }
  276. private void CubeSource_OnChanged(object sender, EventArgs e)
  277. {
  278. Data.CreateDescriptors();
  279. helper.CreateOtherDescriptor();
  280. BuildTemplate();
  281. }
  282. private void WireEvents(bool wire)
  283. {
  284. if (IsOnFooter)
  285. {
  286. DataBand dataBand = FootersDataBand;
  287. if (wire)
  288. dataBand.BeforePrint += new EventHandler(dataBand_BeforePrint);
  289. else
  290. dataBand.BeforePrint -= new EventHandler(dataBand_BeforePrint);
  291. }
  292. }
  293. private void dataBand_BeforePrint(object sender, EventArgs e)
  294. {
  295. /*
  296. bool firstRow = (sender as DataBand).IsFirstRow;
  297. if (firstRow)
  298. Helper.StartPrint();
  299. Helper.AddDataRow();
  300. */
  301. }
  302. #endregion
  303. #region Protected Methods
  304. /// <inheritdoc/>
  305. protected override void DeserializeSubItems(FRReader reader)
  306. {
  307. if (String.Compare(reader.ItemName, "CrossViewColumns", true) == 0)
  308. reader.Read(Data.Columns);
  309. else if (String.Compare(reader.ItemName, "CrossViewRows", true) == 0)
  310. reader.Read(Data.Rows);
  311. else if (String.Compare(reader.ItemName, "CrossViewCells", true) == 0)
  312. reader.Read(Data.Cells);
  313. else
  314. base.DeserializeSubItems(reader);
  315. }
  316. #endregion
  317. #region Public Methods
  318. /// <inheritdoc/>
  319. public override void Assign(Base source)
  320. {
  321. base.Assign(source);
  322. CrossViewObject src = source as CrossViewObject;
  323. CubeSource = src.CubeSource;
  324. ShowTitle = src.ShowTitle;
  325. ShowXAxisFieldsCaption = src.ShowXAxisFieldsCaption;
  326. ShowYAxisFieldsCaption = src.ShowYAxisFieldsCaption;
  327. Style = src.Style;
  328. // MatrixEvenStylePriority = src.MatrixEvenStylePriority;
  329. }
  330. /// <inheritdoc/>
  331. public override void Serialize(FRWriter writer)
  332. {
  333. if (writer.SerializeTo != SerializeTo.SourcePages)
  334. {
  335. writer.Write(Data.Columns);
  336. writer.Write(Data.Rows);
  337. writer.Write(Data.Cells);
  338. }
  339. else
  340. RefreshTemplate(true);
  341. base.Serialize(writer);
  342. CrossViewObject c = writer.DiffObject as CrossViewObject;
  343. if (CubeSource != c.CubeSource)
  344. writer.WriteRef("CubeSource", CubeSource);
  345. if (ColumnDescriptorsIndexes != c.ColumnDescriptorsIndexes)
  346. writer.WriteStr("ColumnDescriptorsIndexes", ColumnDescriptorsIndexes);
  347. if (RowDescriptorsIndexes != c.RowDescriptorsIndexes)
  348. writer.WriteStr("RowDescriptorsIndexes", RowDescriptorsIndexes);
  349. if (ColumnTerminalIndexes != c.ColumnTerminalIndexes)
  350. writer.WriteStr("ColumnTerminalIndexes", ColumnTerminalIndexes);
  351. if (RowTerminalIndexes != c.RowTerminalIndexes)
  352. writer.WriteStr("RowTerminalIndexes", RowTerminalIndexes);
  353. if (ShowTitle != c.ShowTitle)
  354. writer.WriteBool("ShowTitle", ShowTitle);
  355. if (ShowXAxisFieldsCaption != c.ShowXAxisFieldsCaption)
  356. writer.WriteBool("ShowXAxisFieldsCaption", ShowXAxisFieldsCaption);
  357. if (ShowYAxisFieldsCaption != c.ShowYAxisFieldsCaption)
  358. writer.WriteBool("ShowYAxisFieldsCaption", ShowYAxisFieldsCaption);
  359. if (Style != c.Style)
  360. writer.WriteStr("Style", Style);
  361. // if (MatrixEvenStylePriority != c.MatrixEvenStylePriority)
  362. // writer.WriteValue("MatrixEvenStylePriority", MatrixEvenStylePriority);
  363. if (ModifyResultEvent != c.ModifyResultEvent)
  364. writer.WriteStr("ModifyResultEvent", ModifyResultEvent);
  365. }
  366. /// <summary>
  367. /// Creates or updates the matrix template.
  368. /// </summary>
  369. /// <remarks>
  370. /// Call this method after you modify the matrix descriptors using the <see cref="Data"/>
  371. /// object's properties.
  372. /// </remarks>
  373. public void BuildTemplate()
  374. {
  375. Helper.BuildTemplate();
  376. }
  377. #endregion
  378. #region Report Engine
  379. /// <inheritdoc/>
  380. public override void InitializeComponent()
  381. {
  382. base.InitializeComponent();
  383. WireEvents(true);
  384. }
  385. /// <inheritdoc/>
  386. public override void FinalizeComponent()
  387. {
  388. base.FinalizeComponent();
  389. WireEvents(false);
  390. }
  391. /// <inheritdoc/>
  392. public override void SaveState()
  393. {
  394. saveVisible = Visible;
  395. BandBase parent = Parent as BandBase;
  396. if (!Visible || (parent != null && !parent.Visible))
  397. return;
  398. // create the result table that will be rendered in the preview
  399. CreateResultTable();
  400. Visible = false;
  401. if (parent != null)
  402. {
  403. parent.Height = Top;
  404. parent.CanGrow = false;
  405. parent.CanShrink = false;
  406. parent.AfterPrint += new EventHandler(ResultTable.GeneratePages);
  407. }
  408. }
  409. /// <inheritdoc/>
  410. public override void GetData()
  411. {
  412. base.GetData();
  413. if (Data.SourceAssigned)
  414. {
  415. // if (!IsOnFooter)
  416. // {
  417. Helper.StartPrint();
  418. Helper.AddData();
  419. // }
  420. Helper.FinishPrint();
  421. }
  422. }
  423. /// <inheritdoc/>
  424. public override void RestoreState()
  425. {
  426. BandBase parent = Parent as BandBase;
  427. if (!saveVisible || (parent != null && !parent.Visible))
  428. return;
  429. if (parent != null)
  430. parent.AfterPrint -= new EventHandler(ResultTable.GeneratePages);
  431. DisposeResultTable();
  432. Visible = saveVisible;
  433. }
  434. /// <summary>
  435. /// This method fires the <b>ModifyResult</b> event and the script code connected to the <b>ModifyResultEvent</b>.
  436. /// </summary>
  437. /// <param name="e">Event data.</param>
  438. public void OnModifyResult(EventArgs e)
  439. {
  440. if (ModifyResult != null)
  441. ModifyResult(this, e);
  442. InvokeEvent(ModifyResultEvent, e);
  443. }
  444. #endregion
  445. /// <summary>
  446. /// Initializes a new instance of the <see cref="CrossViewObject"/> class.
  447. /// </summary>
  448. public CrossViewObject()
  449. {
  450. //FAutoSize = true;
  451. showXAxisFieldsCaption = true;
  452. showYAxisFieldsCaption = true;
  453. data = new CrossViewData();
  454. helper = new CrossViewHelper(this);
  455. styleSheet = new MatrixStyleSheet();
  456. styleSheet.Load(ResourceLoader.GetStream("cross.frss"));
  457. style = "";
  458. RepeatHeaders = false;
  459. RepeatColumnHeaders = true;
  460. RepeatRowHeaders = true;
  461. //FFilter = "";
  462. }
  463. }
  464. }