CrossViewHelper.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. using FastReport.Table;
  2. using FastReport.Utils;
  3. using System.Drawing;
  4. namespace FastReport.CrossView
  5. {
  6. internal partial class CrossViewHelper
  7. {
  8. private CrossViewObject crossView;
  9. private int headerWidth;
  10. private int headerHeight;
  11. private int templateBodyWidth;
  12. private int templateBodyHeight;
  13. private bool designTime;
  14. private TableResult resultTable;
  15. private CrossViewDescriptor titleDescriptor;
  16. private CrossViewDescriptor xAxisFieldCaptionDescriptor;
  17. private CrossViewDescriptor yAxisFieldCaptionDescriptor;
  18. private CrossViewHeaderDescriptor noColumnsDescriptor;
  19. private CrossViewHeaderDescriptor noRowsDescriptor;
  20. private CrossViewCellDescriptor noCellsDescriptor;
  21. private int resultBodyWidth;
  22. private int resultBodyHeight;
  23. #region Properties
  24. public CrossViewObject CrossView
  25. {
  26. get { return crossView; }
  27. }
  28. public Report Report
  29. {
  30. get { return CrossView.Report; }
  31. }
  32. public TableResult ResultTable
  33. {
  34. get { return designTime ? resultTable : CrossView.ResultTable; }
  35. }
  36. public int HeaderHeight
  37. {
  38. get { return headerHeight; }
  39. }
  40. public int HeaderWidth
  41. {
  42. get { return headerWidth; }
  43. }
  44. public int TemplateBodyWidth
  45. {
  46. get { return templateBodyWidth; }
  47. }
  48. public int TemplateBodyHeight
  49. {
  50. get { return templateBodyHeight; }
  51. }
  52. public int ResultBodyWidth
  53. {
  54. get { return resultBodyWidth; }
  55. }
  56. public int ResultBodyHeight
  57. {
  58. get { return resultBodyHeight; }
  59. }
  60. #endregion
  61. #region Private Methods
  62. /// <summary>
  63. /// Updates HeaderWidth, HeaderHeight, BodyWidth, BodyHeight properties.
  64. /// </summary>
  65. private void UpdateTemplateSizes()
  66. {
  67. if (CrossView.Data.SourceAssigned)
  68. {
  69. headerWidth = CrossView.Data.YAxisFieldsCount;
  70. headerHeight = CrossView.Data.XAxisFieldsCount;
  71. }
  72. else
  73. {
  74. headerWidth = 1;
  75. headerHeight = 1;
  76. }
  77. if (CrossView.ShowXAxisFieldsCaption)
  78. headerHeight++;
  79. if (CrossView.ShowTitle)
  80. headerHeight++;
  81. if (headerHeight == 0)
  82. if (CrossView.ShowYAxisFieldsCaption)
  83. headerHeight = 1;
  84. templateBodyWidth = 1 + CrossView.Data.XAxisFieldsCount;
  85. if (CrossView.Data.MeasuresInXAxis)
  86. templateBodyWidth = (templateBodyWidth - 1) * CrossView.Data.MeasuresCount;
  87. templateBodyHeight = 1 + CrossView.Data.YAxisFieldsCount;
  88. if (CrossView.Data.MeasuresInYAxis)
  89. templateBodyHeight = (templateBodyHeight - 1) * CrossView.Data.MeasuresCount;
  90. }
  91. private void UpdateColumnDescriptors()
  92. {
  93. int left = HeaderWidth;
  94. int top = 0;
  95. if (CrossView.ShowTitle)
  96. top++;
  97. if (CrossView.ShowXAxisFieldsCaption)
  98. top++;
  99. foreach (CrossViewHeaderDescriptor descr in CrossView.Data.Columns)
  100. {
  101. descr.TemplateColumn = CrossView.Columns[left + descr.cell];
  102. descr.TemplateRow = CrossView.Rows[top + descr.level];
  103. descr.TemplateCell = CrossView[left + descr.cell, top + descr.level];
  104. }
  105. }
  106. private void UpdateRowDescriptors()
  107. {
  108. int left = 0;
  109. int top = HeaderHeight;
  110. foreach (CrossViewHeaderDescriptor descr in CrossView.Data.Rows)
  111. {
  112. descr.TemplateColumn = CrossView.Columns[left + descr.level];
  113. descr.TemplateRow = CrossView.Rows[top + descr.cell];
  114. descr.TemplateCell = CrossView[left + descr.level, top + descr.cell];
  115. }
  116. }
  117. private void UpdateCellDescriptors()
  118. {
  119. int x = HeaderWidth;
  120. int y = HeaderHeight;
  121. foreach (CrossViewCellDescriptor descr in CrossView.Data.Cells)
  122. {
  123. descr.TemplateColumn = CrossView.Columns[x + descr.x];
  124. descr.TemplateRow = CrossView.Rows[y + descr.y];
  125. descr.TemplateCell = CrossView[x + descr.x, y + descr.y];
  126. }
  127. }
  128. private void UpdateOtherDescriptors()
  129. {
  130. titleDescriptor.TemplateColumn = null;
  131. titleDescriptor.TemplateRow = null;
  132. titleDescriptor.TemplateCell = null;
  133. if (CrossView.ShowTitle)
  134. {
  135. titleDescriptor.TemplateColumn = CrossView.Columns[HeaderWidth];
  136. titleDescriptor.TemplateRow = CrossView.Rows[0];
  137. titleDescriptor.TemplateCell = CrossView[HeaderWidth, 0];
  138. }
  139. xAxisFieldCaptionDescriptor.TemplateColumn = null;
  140. xAxisFieldCaptionDescriptor.TemplateRow = null;
  141. xAxisFieldCaptionDescriptor.TemplateCell = null;
  142. if (CrossView.ShowXAxisFieldsCaption)
  143. {
  144. xAxisFieldCaptionDescriptor.TemplateColumn = CrossView.Columns[HeaderWidth];
  145. xAxisFieldCaptionDescriptor.TemplateRow = CrossView.Rows[(CrossView.ShowTitle ? 1 : 0)];
  146. xAxisFieldCaptionDescriptor.TemplateCell = CrossView[HeaderWidth, (CrossView.ShowTitle ? 1 : 0)];
  147. }
  148. }
  149. private void ApplyStyle(TableCell cell, string styleName)
  150. {
  151. Style style = null;
  152. int styleIndex = CrossView.StyleSheet.IndexOf(CrossView.Style);
  153. if (styleIndex != -1)
  154. {
  155. StyleCollection styles = CrossView.StyleSheet[styleIndex];
  156. style = styles[styles.IndexOf(styleName)];
  157. }
  158. if (style != null)
  159. cell.ApplyStyle(style);
  160. }
  161. private TableCell CreateCell(string text)
  162. {
  163. TableCell cell = new TableCell();
  164. cell.AllowExpressions = false;
  165. cell.Font = DrawUtils.DefaultReportFont;
  166. cell.Text = text;
  167. cell.HorzAlign = HorzAlign.Center;
  168. cell.VertAlign = VertAlign.Center;
  169. ApplyStyle(cell, "Header");
  170. return cell;
  171. }
  172. private TableCell CreateDataCell()
  173. {
  174. TableCell cell = new TableCell();
  175. cell.AllowExpressions = false;
  176. cell.Font = DrawUtils.DefaultReportFont;
  177. cell.HorzAlign = HorzAlign.Right;
  178. cell.VertAlign = VertAlign.Center;
  179. ApplyStyle(cell, "Body");
  180. return cell;
  181. }
  182. private void SetHint(TableCell cell, string text)
  183. {
  184. cell.Assign(CrossView.Styles.DefaultStyle);
  185. cell.Text = text;
  186. cell.Font = DrawUtils.DefaultReportFont;
  187. cell.TextFill = new SolidFill(Color.Gray);
  188. cell.HorzAlign = HorzAlign.Center;
  189. cell.VertAlign = VertAlign.Center;
  190. cell.SetFlags(Flags.CanEdit, false);
  191. }
  192. private void InitTemplateTable()
  193. {
  194. TableColumn column;
  195. CrossViewDescriptor descr;
  196. for (int i = 0; i < headerWidth + templateBodyWidth; i++)
  197. {
  198. column = new TableColumn();
  199. descr = CrossView.Data.GetColumnDescriptor(i);
  200. if (descr.TemplateColumn != null)
  201. column.Assign(descr.TemplateColumn);
  202. ResultTable.Columns.Add(column);
  203. }
  204. TableRow row;
  205. for (int i = 0; i < headerHeight + templateBodyHeight; i++)
  206. {
  207. row = new TableRow();
  208. int rowindex = i;
  209. if (crossView.ShowTitle)
  210. rowindex--;
  211. if (crossView.ShowXAxisFieldsCaption)
  212. rowindex--;
  213. if (rowindex >= 0)
  214. {
  215. descr = CrossView.Data.GetRowDescriptor(rowindex);
  216. }
  217. else
  218. {
  219. if (crossView.ShowTitle)
  220. {
  221. if (i == 0)
  222. {
  223. descr = titleDescriptor;
  224. }
  225. else
  226. {
  227. descr = xAxisFieldCaptionDescriptor;
  228. }
  229. }
  230. else
  231. {
  232. descr = xAxisFieldCaptionDescriptor;
  233. }
  234. }
  235. if (descr.TemplateRow != null)
  236. row.Assign(descr.TemplateRow);
  237. ResultTable.Rows.Add(row);
  238. }
  239. }
  240. private void InitResultTable()
  241. {
  242. //todo
  243. TableColumn column;
  244. CrossViewDescriptor descr;
  245. for (int i = 0; i < headerWidth + resultBodyWidth; i++)
  246. {
  247. column = new TableColumn();
  248. descr = CrossView.Data.GetColumnDescriptor(0); // temp 0 !!!
  249. if (descr.TemplateColumn != null)
  250. column.Assign(descr.TemplateColumn);
  251. ResultTable.Columns.Add(column);
  252. }
  253. TableRow row;
  254. for (int i = 0; i < headerHeight + resultBodyHeight; i++)
  255. {
  256. row = new TableRow();
  257. int rowindex = i;
  258. if (crossView.ShowTitle)
  259. rowindex--;
  260. if (crossView.ShowXAxisFieldsCaption)
  261. rowindex--;
  262. if (rowindex >= 0)
  263. {
  264. descr = CrossView.Data.GetRowDescriptor(0); // temp 0 !!! (rowindex)
  265. }
  266. else
  267. {
  268. if (crossView.ShowTitle)
  269. {
  270. if (i == 0)
  271. {
  272. descr = titleDescriptor;
  273. }
  274. else
  275. {
  276. descr = xAxisFieldCaptionDescriptor;
  277. }
  278. }
  279. else
  280. {
  281. descr = xAxisFieldCaptionDescriptor;
  282. }
  283. }
  284. if (descr.TemplateRow != null)
  285. row.Assign(descr.TemplateRow);
  286. ResultTable.Rows.Add(row);
  287. }
  288. }
  289. private void PrintHeaders()
  290. {
  291. if (CrossView.ShowTitle)
  292. PrintTitle();
  293. PrintCorner();
  294. if (CrossView.ShowXAxisFieldsCaption)
  295. PrintXAxisFieldsCaption();
  296. }
  297. private void PrintTitle()
  298. {
  299. TableCell templateCell = titleDescriptor.TemplateCell;
  300. if (titleDescriptor.TemplateCell == null)
  301. templateCell = CreateCell(Res.Get("ComponentsMisc,Matrix,Title"));
  302. TableCellData resultCell = ResultTable.GetCellData(HeaderWidth, 0);
  303. templateCell.SaveState();
  304. templateCell.GetData();
  305. resultCell.RunTimeAssign(templateCell, true);
  306. resultCell.ColSpan = ResultTable.ColumnCount - HeaderWidth;
  307. templateCell.RestoreState();
  308. // print left-top cell
  309. if (titleDescriptor.TemplateCell == null)
  310. templateCell.Text = "";
  311. else
  312. templateCell = CrossView[0, 0];
  313. resultCell = ResultTable.GetCellData(0, 0);
  314. templateCell.SaveState();
  315. templateCell.GetData();
  316. resultCell.RunTimeAssign(templateCell, true);
  317. templateCell.RestoreState();
  318. resultCell.ColSpan = HeaderWidth;
  319. }
  320. private void PrintCorner()
  321. {
  322. int left = 0;
  323. int top = (CrossView.ShowTitle ? 1 : 0);
  324. int templateTop = titleDescriptor.TemplateRow != null ? 1 : 0;
  325. if (CrossView.ShowYAxisFieldsCaption)
  326. {
  327. for (int i = 0; i < HeaderWidth; i++)
  328. {
  329. TableCell templateCell = null;
  330. CrossViewHeaderDescriptor descr = crossView.Data.GetColumnDescriptor(i);
  331. if (descr.TemplateColumn != null)
  332. templateCell = CrossView[0, templateTop];
  333. else
  334. templateCell = CreateCell(descr.GetName());
  335. TableCellData resultCell = ResultTable.GetCellData(left, top);
  336. templateCell.SaveState();
  337. templateCell.GetData();
  338. resultCell.RunTimeAssign(templateCell, true);
  339. templateCell.RestoreState();
  340. resultCell.RowSpan = HeaderHeight - top;
  341. resultCell.Text = descr.GetName();
  342. left++;
  343. }
  344. }
  345. else
  346. {
  347. TableCell templateCell = CreateCell("");
  348. TableCellData resultCell = ResultTable.GetCellData(left, top);
  349. templateCell.SaveState();
  350. templateCell.GetData();
  351. resultCell.RunTimeAssign(templateCell, true);
  352. templateCell.RestoreState();
  353. resultCell.ColSpan = HeaderWidth;
  354. resultCell.RowSpan = HeaderHeight - top;
  355. }
  356. }
  357. private void PrintXAxisFieldsCaption()
  358. {
  359. int top = (CrossView.ShowTitle ? 1 : 0);
  360. int templateTop = titleDescriptor.TemplateRow != null ? 1 : 0;
  361. string captions = "";
  362. for (int i = 0; i < CrossView.Data.XAxisFieldsCount; i++)
  363. {
  364. CrossViewHeaderDescriptor descr = crossView.Data.GetRowDescriptor(i);
  365. if (captions != "")
  366. captions += ", ";
  367. captions += descr.GetName();
  368. }
  369. TableCell templateCell = xAxisFieldCaptionDescriptor.TemplateCell;
  370. if (xAxisFieldCaptionDescriptor.TemplateCell == null)
  371. templateCell = CreateCell(captions);
  372. TableCellData resultCell = ResultTable.GetCellData(HeaderWidth, top);
  373. templateCell.SaveState();
  374. templateCell.GetData();
  375. resultCell.RunTimeAssign(templateCell, true);
  376. resultCell.ColSpan = ResultTable.ColumnCount - HeaderWidth;
  377. templateCell.RestoreState();
  378. }
  379. private void PrintXAxisTemplate()
  380. {
  381. int left = headerWidth;
  382. int top = (CrossView.ShowTitle ? 1 : 0) + (CrossView.ShowXAxisFieldsCaption ? 1 : 0);
  383. for (int i = 0; i < CrossView.Data.Columns.Count; i++)
  384. {
  385. CrossViewHeaderDescriptor crossViewHeaderDescriptor = CrossView.Data.Columns[i];
  386. TableCellData resultCell = ResultTable.GetCellData(left + crossViewHeaderDescriptor.cell, top + crossViewHeaderDescriptor.level);
  387. resultCell.ColSpan = crossViewHeaderDescriptor.cellsize;
  388. resultCell.RowSpan = crossViewHeaderDescriptor.levelsize;
  389. TableCell templateCell = crossViewHeaderDescriptor.TemplateCell;
  390. if (templateCell != null)
  391. templateCell.Text = "[" + crossViewHeaderDescriptor.GetName() + "]";
  392. else
  393. templateCell = CreateCell("[" + crossViewHeaderDescriptor.GetName() + "]");
  394. resultCell.RunTimeAssign(templateCell, true);
  395. }
  396. }
  397. private void PrintYAxisTemplate()
  398. {
  399. int left = 0;
  400. int top = headerHeight;
  401. for (int i = 0; i < CrossView.Data.Rows.Count; i++)
  402. {
  403. CrossViewHeaderDescriptor crossViewHeaderDescriptor = CrossView.Data.Rows[i];
  404. TableCellData resultCell = ResultTable.GetCellData(left + crossViewHeaderDescriptor.level, top + crossViewHeaderDescriptor.cell);
  405. resultCell.ColSpan = crossViewHeaderDescriptor.levelsize;
  406. resultCell.RowSpan = crossViewHeaderDescriptor.cellsize;
  407. TableCell templateCell = crossViewHeaderDescriptor.TemplateCell;
  408. if (templateCell != null)
  409. templateCell.Text = "[" + crossViewHeaderDescriptor.GetName() + "]";
  410. else
  411. templateCell = CreateCell("[" + crossViewHeaderDescriptor.GetName() + "]");
  412. resultCell.RunTimeAssign(templateCell, true);
  413. }
  414. }
  415. private void PrintDataTemplate()
  416. {
  417. CrossViewCellDescriptor crossViewCellDescriptor;
  418. int top = headerHeight;
  419. int left = headerWidth;
  420. TableCell templateCell = null;
  421. TableCellData resultCell = null;
  422. for (int i = 0; i < CrossView.Data.columnTerminalIndexes.Length; i++)
  423. {
  424. for (int j = 0; j < CrossView.Data.rowTerminalIndexes.Length; j++)
  425. {
  426. crossViewCellDescriptor = CrossView.Data.Cells[i * CrossView.Data.rowTerminalIndexes.Length + j];
  427. resultCell = ResultTable.GetCellData(left + i, top + j);
  428. templateCell = crossViewCellDescriptor.TemplateCell;
  429. if (templateCell == null)
  430. templateCell = CreateDataCell();
  431. templateCell.Text = "0";
  432. resultCell.RunTimeAssign(templateCell, true);
  433. }
  434. }
  435. }
  436. #endregion
  437. #region Public Methods
  438. public void BuildTemplate()
  439. {
  440. // create temporary descriptors
  441. if (!CrossView.Data.SourceAssigned)
  442. {
  443. CrossView.Data.columnDescriptorsIndexes = new int[] { 0 };
  444. CrossView.Data.rowDescriptorsIndexes = new int[] { 0 };
  445. CrossView.Data.columnTerminalIndexes = new int[] { 0 };
  446. CrossView.Data.rowTerminalIndexes = new int[] { 0 };
  447. CrossView.Data.Columns.Add(noColumnsDescriptor);
  448. CrossView.Data.Rows.Add(noRowsDescriptor);
  449. CrossView.Data.Cells.Add(noCellsDescriptor);
  450. }
  451. UpdateTemplateSizes();
  452. // create the result table
  453. designTime = true;
  454. resultTable = new TableResult();
  455. InitTemplateTable();
  456. PrintHeaders();
  457. PrintXAxisTemplate();
  458. PrintYAxisTemplate();
  459. PrintDataTemplate();
  460. // copy the result table to the Matrix
  461. CrossView.ColumnCount = ResultTable.ColumnCount;
  462. CrossView.RowCount = ResultTable.RowCount;
  463. CrossView.FixedColumns = HeaderWidth;
  464. CrossView.FixedRows = HeaderHeight;
  465. CrossView.CreateUniqueNames();
  466. for (int x = 0; x < CrossView.ColumnCount; x++)
  467. {
  468. CrossView.Columns[x].Assign(ResultTable.Columns[x]);
  469. }
  470. for (int y = 0; y < CrossView.RowCount; y++)
  471. {
  472. CrossView.Rows[y].Assign(ResultTable.Rows[y]);
  473. }
  474. for (int x = 0; x < CrossView.ColumnCount; x++)
  475. {
  476. for (int y = 0; y < CrossView.RowCount; y++)
  477. {
  478. TableCell cell = CrossView[x, y];
  479. cell.AssignAll(ResultTable[x, y]);
  480. cell.SetFlags(Flags.CanEdit, true);
  481. }
  482. }
  483. UpdateDescriptors();
  484. resultTable.Dispose();
  485. // clear temporary descriptors, set hints
  486. if (!CrossView.Data.SourceAssigned)
  487. {
  488. SetHint(CrossView[HeaderWidth, (CrossView.ShowTitle ? 1 : 0) + (CrossView.ShowXAxisFieldsCaption ? 1 : 0)], Res.Get("ComponentsMisc,CrossView,SetSource"));
  489. CrossView.Data.Columns.Clear();
  490. SetHint(CrossView[0, HeaderHeight], Res.Get("ComponentsMisc,CrossView,SetSource"));
  491. CrossView.Data.Rows.Clear();
  492. SetHint(CrossView[HeaderWidth, HeaderHeight], Res.Get("ComponentsMisc,CrossView,SetSource"));
  493. CrossView.Data.Cells.Clear();
  494. CrossView.Data.columnDescriptorsIndexes = new int[0];
  495. CrossView.Data.rowDescriptorsIndexes = new int[0];
  496. CrossView.Data.columnTerminalIndexes = new int[0];
  497. CrossView.Data.rowTerminalIndexes = new int[0];
  498. }
  499. else
  500. {
  501. noColumnsDescriptor.TemplateColumn = CrossView.Data.Columns[0].TemplateColumn;
  502. noColumnsDescriptor.TemplateRow = CrossView.Data.Columns[0].TemplateRow;
  503. noColumnsDescriptor.TemplateCell = CrossView.Data.Columns[0].TemplateCell;
  504. noRowsDescriptor.TemplateColumn = CrossView.Data.Rows[0].TemplateColumn;
  505. noRowsDescriptor.TemplateRow = CrossView.Data.Rows[0].TemplateRow;
  506. noRowsDescriptor.TemplateCell = CrossView.Data.Rows[0].TemplateCell;
  507. noCellsDescriptor.TemplateColumn = CrossView.Data.Cells[0].TemplateColumn;
  508. noCellsDescriptor.TemplateRow = CrossView.Data.Cells[0].TemplateRow;
  509. noCellsDescriptor.TemplateCell = CrossView.Data.Cells[0].TemplateCell;
  510. }
  511. }
  512. public void UpdateDescriptors()
  513. {
  514. bool needClearTemporaryDescriptors = false;
  515. if (!CrossView.Data.SourceAssigned && (CrossView.Data.Columns.Count == 0))
  516. {
  517. needClearTemporaryDescriptors = true;
  518. CrossView.Data.columnDescriptorsIndexes = new int[] { 0 };
  519. CrossView.Data.rowDescriptorsIndexes = new int[] { 0 };
  520. CrossView.Data.columnTerminalIndexes = new int[] { 0 };
  521. CrossView.Data.rowTerminalIndexes = new int[] { 0 };
  522. CrossView.Data.Columns.Add(noColumnsDescriptor);
  523. CrossView.Data.Rows.Add(noRowsDescriptor);
  524. CrossView.Data.Cells.Add(noCellsDescriptor);
  525. }
  526. UpdateTemplateSizes();
  527. CrossView.FixedColumns = HeaderWidth;
  528. CrossView.FixedRows = HeaderHeight;
  529. UpdateColumnDescriptors();
  530. UpdateRowDescriptors();
  531. UpdateCellDescriptors();
  532. UpdateOtherDescriptors();
  533. // clear temporary descriptors
  534. if (needClearTemporaryDescriptors)
  535. {
  536. CrossView.Data.Columns.Clear();
  537. CrossView.Data.Rows.Clear();
  538. CrossView.Data.Cells.Clear();
  539. CrossView.Data.columnDescriptorsIndexes = new int[0];
  540. CrossView.Data.rowDescriptorsIndexes = new int[0];
  541. CrossView.Data.columnTerminalIndexes = new int[0];
  542. CrossView.Data.rowTerminalIndexes = new int[0];
  543. }
  544. }
  545. public void UpdateStyle()
  546. {
  547. for (int y = 0; y < CrossView.RowCount; y++)
  548. {
  549. for (int x = 0; x < CrossView.ColumnCount; x++)
  550. {
  551. string style = x < HeaderWidth || y < HeaderHeight ? "Header" : "Body";
  552. ApplyStyle(CrossView[x, y], style);
  553. }
  554. }
  555. }
  556. public void StartPrint()
  557. {
  558. //todo
  559. /*
  560. if ((Matrix.Data.Columns.Count == 0 && Matrix.Data.Rows.Count == 0) || Matrix.Data.Cells.Count == 0)
  561. throw new Exception(String.Format(Res.Get("Messages,MatrixError"), Matrix.Name));
  562. */
  563. designTime = false;
  564. /*
  565. FNoColumns = Matrix.Data.Columns.Count == 0;
  566. FNoRows = Matrix.Data.Rows.Count == 0;
  567. // create temporary descriptors
  568. if (FNoColumns)
  569. Matrix.Data.Columns.Add(FNoColumnsDescriptor);
  570. if (FNoRows)
  571. Matrix.Data.Rows.Add(FNoRowsDescriptor);
  572. */
  573. OnProgressInternal();
  574. /*
  575. Matrix.Data.Clear();
  576. Matrix.OnManualBuild(EventArgs.Empty);
  577. */
  578. resultBodyHeight = CrossView.Data.DataRowCount;
  579. resultBodyWidth = CrossView.Data.DataColumnCount;
  580. }
  581. public void AddData()
  582. {
  583. }
  584. public void FinishPrint()
  585. {
  586. //todo
  587. UpdateDescriptors();
  588. ResultTable.FixedColumns = HeaderWidth;
  589. ResultTable.FixedRows = HeaderHeight;
  590. InitResultTable();
  591. //todo
  592. //temp
  593. PrintHeaders();
  594. PrintXAxisResult();
  595. PrintYAxisResult();
  596. PrintResultData();
  597. // PrintData();
  598. /*
  599. // clear temporary descriptors
  600. if (FNoColumns)
  601. Matrix.Data.Columns.Clear();
  602. if (FNoRows)
  603. Matrix.Data.Rows.Clear();
  604. */
  605. }
  606. private int axisLeft;
  607. private int axisTop;
  608. public bool XAxisDrawCellHandler(CrossViewAxisDrawCell crossViewAxisDrawCell)
  609. {
  610. CrossViewHeaderDescriptor crossViewHeaderDescriptor = CrossView.Data.Columns[0]; // temp - 0 todoCUBE
  611. TableCellData resultCell = ResultTable.GetCellData(axisLeft + crossViewAxisDrawCell.Cell, axisTop + crossViewAxisDrawCell.Level);
  612. resultCell.ColSpan = crossViewAxisDrawCell.SizeCell;
  613. resultCell.RowSpan = crossViewAxisDrawCell.SizeLevel;
  614. TableCell templateCell = crossViewHeaderDescriptor.TemplateCell;
  615. if (templateCell != null)
  616. templateCell.Text = crossViewAxisDrawCell.Text;
  617. else
  618. templateCell = CreateCell(crossViewAxisDrawCell.Text);
  619. resultCell.RunTimeAssign(templateCell, true);
  620. return false;
  621. }
  622. private void PrintXAxisResult()
  623. {
  624. axisLeft = headerWidth;
  625. axisTop = (CrossView.ShowTitle ? 1 : 0) + (CrossView.ShowXAxisFieldsCaption ? 1 : 0);
  626. CrossView.CubeSource.TraverseXAxis(XAxisDrawCellHandler);
  627. }
  628. public bool YAxisDrawCellHandler(CrossViewAxisDrawCell crossViewAxisDrawCell)
  629. {
  630. CrossViewHeaderDescriptor crossViewHeaderDescriptor = CrossView.Data.Rows[0]; // temp - 0 todoCUBE
  631. TableCellData resultCell = ResultTable.GetCellData(axisLeft + crossViewAxisDrawCell.Level, axisTop + crossViewAxisDrawCell.Cell);
  632. resultCell.ColSpan = crossViewAxisDrawCell.SizeLevel;
  633. resultCell.RowSpan = crossViewAxisDrawCell.SizeCell;
  634. TableCell templateCell = crossViewHeaderDescriptor.TemplateCell;
  635. if (templateCell != null)
  636. templateCell.Text = crossViewAxisDrawCell.Text;
  637. else
  638. templateCell = CreateCell(crossViewAxisDrawCell.Text);
  639. resultCell.RunTimeAssign(templateCell, true);
  640. return false;
  641. }
  642. private void PrintYAxisResult()
  643. {
  644. axisLeft = 0;
  645. axisTop = headerHeight;
  646. CrossView.CubeSource.TraverseYAxis(YAxisDrawCellHandler);
  647. }
  648. private void PrintResultData()
  649. {
  650. CrossViewCellDescriptor crossViewCellDescriptor;
  651. int top = headerHeight;
  652. int left = headerWidth;
  653. TableCell templateCell = null;
  654. TableCellData resultCell = null;
  655. CrossViewMeasureCell cubeMeasureCell;
  656. for (int i = 0; i < CrossView.Data.DataColumnCount; i++)
  657. {
  658. for (int j = 0; j < CrossView.Data.DataRowCount; j++)
  659. {
  660. cubeMeasureCell = CrossView.CubeSource.GetMeasureCell(i, j);
  661. crossViewCellDescriptor = CrossView.Data.Cells[0]; // todoCUBE temp 0 !!!
  662. resultCell = ResultTable.GetCellData(left + i, top + j);
  663. templateCell = crossViewCellDescriptor.TemplateCell;
  664. if (templateCell == null)
  665. templateCell = CreateDataCell();
  666. templateCell.Text = cubeMeasureCell.Text;
  667. resultCell.RunTimeAssign(templateCell, true);
  668. }
  669. }
  670. }
  671. internal void CreateOtherDescriptor()
  672. {
  673. titleDescriptor = new CrossViewDescriptor();
  674. xAxisFieldCaptionDescriptor = new CrossViewDescriptor();
  675. yAxisFieldCaptionDescriptor = new CrossViewDescriptor();
  676. noColumnsDescriptor = new CrossViewHeaderDescriptor();
  677. noColumnsDescriptor.cell = 0;
  678. noColumnsDescriptor.cellsize = 1;
  679. noColumnsDescriptor.level = 0;
  680. noColumnsDescriptor.levelsize = 1;
  681. noRowsDescriptor = new CrossViewHeaderDescriptor();
  682. noRowsDescriptor.cell = 0;
  683. noRowsDescriptor.cellsize = 1;
  684. noRowsDescriptor.level = 0;
  685. noRowsDescriptor.levelsize = 1;
  686. noCellsDescriptor = new CrossViewCellDescriptor();
  687. }
  688. #endregion
  689. public CrossViewHelper(CrossViewObject crossView)
  690. {
  691. this.crossView = crossView;
  692. CreateOtherDescriptor();
  693. }
  694. }
  695. }