rt_table.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import 'dart:math';
  2. import 'package:fis_lib_report/converts/alignment_convert.dart';
  3. import 'package:fis_lib_report/converts/color_convert.dart';
  4. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  5. import 'package:fis_lib_report/pages/rt_cell.dart';
  6. import 'package:fis_lib_report/report/cellPostion.dart';
  7. import 'package:fis_lib_report/report/interfaces/block_element.dart';
  8. import 'package:fis_lib_report/report/interfaces/cell.dart';
  9. import 'package:fis_lib_report/report/interfaces/rt_table.dart';
  10. import 'package:fis_lib_report/report/rt_Cell.dart';
  11. import 'package:fis_lib_report/report/rt_border.dart';
  12. import 'package:fis_lib_report/report/rt_table.dart';
  13. import 'package:flutter/cupertino.dart';
  14. class RTTablePage extends StatefulWidget {
  15. const RTTablePage({required this.element, Key? key}) : super(key: key);
  16. final RTTable element;
  17. @override
  18. State<StatefulWidget> createState() {
  19. return _RTTableState();
  20. }
  21. }
  22. class _RTTableState extends State<RTTablePage> {
  23. Map<CellPostion, ICell>? _cells;
  24. List<ICell>? _values = [];
  25. int? _column;
  26. int? _row;
  27. double _width = 0;
  28. @override
  29. initState() {
  30. super.initState();
  31. }
  32. @override
  33. Widget build(BuildContext context) {
  34. initCells();
  35. List<Widget> widgets = [];
  36. for (int i = 0; i < _row! - 1; i++) {
  37. final children = _cells!.keys.where((element) => element.row! == i);
  38. List<Widget> childwidgets = [];
  39. for (var cellPostion in children) {
  40. double width =
  41. widget.element.columnDefinitions![cellPostion.column!].width ?? 0.0;
  42. if (cellPostion.columnSpan! > 1) {
  43. for (int i = 1; i < cellPostion.columnSpan!; i++) {
  44. width += widget.element.columnDefinitions![cellPostion.column! + i]
  45. .width ??
  46. 0.0;
  47. }
  48. }
  49. double height =
  50. widget.element.rowDefinitions![cellPostion.row!].height ?? 0.0;
  51. if (cellPostion.rowSpan! > 1) {
  52. for (int i = 1; i < cellPostion.rowSpan!; i++) {
  53. height += widget
  54. .element.rowDefinitions![cellPostion.row! + i - 1].height ??
  55. 0.0;
  56. }
  57. }
  58. final cell = _cells![cellPostion];
  59. RTCell c = cell as RTCell;
  60. final borders = c.borders!;
  61. final background = c.background;
  62. childwidgets.add(
  63. Container(
  64. decoration: BoxDecoration(
  65. color: ColorConvert.colorConvert(background),
  66. border: Border(
  67. left: BorderSide(
  68. style: borders.left.borderStyle == RTBorderStyle.None
  69. ? BorderStyle.none
  70. : BorderStyle.solid,
  71. width: borders.left.thickness,
  72. color: ColorConvert.colorConvert(borders.left.color)),
  73. right: BorderSide(
  74. style: borders.right.borderStyle == RTBorderStyle.None
  75. ? BorderStyle.none
  76. : BorderStyle.solid,
  77. width: borders.right.thickness,
  78. color: ColorConvert.colorConvert(borders.right.color)),
  79. top: BorderSide(
  80. style: borders.top.borderStyle == RTBorderStyle.None
  81. ? BorderStyle.none
  82. : BorderStyle.solid,
  83. width: borders.top.thickness,
  84. color: ColorConvert.colorConvert(borders.top.color)),
  85. bottom: BorderSide(
  86. style: borders.bottom.borderStyle == RTBorderStyle.None
  87. ? BorderStyle.none
  88. : BorderStyle.solid,
  89. width: borders.bottom.thickness,
  90. color: ColorConvert.colorConvert(borders.bottom.color)),
  91. ),
  92. ),
  93. width: PtToPxConverter.ptToPx(width),
  94. height: PtToPxConverter.ptToPx(height),
  95. child: RTCellPage(
  96. cell: c,
  97. ),
  98. ),
  99. );
  100. }
  101. final row = SizedBox(
  102. child: Row(
  103. children: childwidgets,
  104. ),
  105. );
  106. widgets.add(row);
  107. }
  108. return Container(
  109. alignment: AlignmentConvert.horizontalConvert(
  110. widget.element.horizontalAlignment),
  111. child: Column(
  112. mainAxisAlignment: AlignmentConvert.horizontalToMainConvert(
  113. widget.element.horizontalAlignment),
  114. children: widgets,
  115. ),
  116. );
  117. }
  118. void initCells() {
  119. _cells = widget.element.cells ?? {};
  120. List<CellPostion> cellPostions = _cells!.keys.toList();
  121. cellPostions.sort(((a, b) => (b.column!).compareTo(a.column!)));
  122. // +1 为列数
  123. _column = cellPostions.first.column! + 1;
  124. _values = _cells!.values.toList();
  125. for (int i = 0; i < _column! - 1; i++) {
  126. _width += widget.element.columnDefinitions![i].width!;
  127. }
  128. _row = widget.element.rowDefinitions!.length + 1;
  129. }
  130. }