import 'dart:math'; import 'package:fis_lib_report/converts/alignment_convert.dart'; import 'package:fis_lib_report/converts/color_convert.dart'; import 'package:fis_lib_report/converts/pt_to_px_converter.dart'; import 'package:fis_lib_report/pages/rt_cell.dart'; import 'package:fis_lib_report/report/cellPostion.dart'; import 'package:fis_lib_report/report/interfaces/block_element.dart'; import 'package:fis_lib_report/report/interfaces/cell.dart'; import 'package:fis_lib_report/report/interfaces/rt_table.dart'; import 'package:fis_lib_report/report/rt_Cell.dart'; import 'package:fis_lib_report/report/rt_border.dart'; import 'package:fis_lib_report/report/rt_table.dart'; import 'package:flutter/cupertino.dart'; class RTTablePage extends StatefulWidget { const RTTablePage({required this.element, Key? key}) : super(key: key); final RTTable element; @override State createState() { return _RTTableState(); } } class _RTTableState extends State { Map? _cells; List? _values = []; int? _column; int? _row; double _width = 0; @override initState() { super.initState(); } @override Widget build(BuildContext context) { initCells(); List widgets = []; for (int i = 0; i < _row! - 1; i++) { final children = _cells!.keys.where((element) => element.row! == i); List childwidgets = []; for (var cellPostion in children) { double width = widget.element.columnDefinitions![cellPostion.column!].width ?? 0.0; if (cellPostion.columnSpan! > 1) { for (int i = 1; i < cellPostion.columnSpan!; i++) { width += widget.element.columnDefinitions![cellPostion.column! + i] .width ?? 0.0; } } double height = widget.element.rowDefinitions![cellPostion.row!].height ?? 0.0; if (cellPostion.rowSpan! > 1) { for (int i = 1; i < cellPostion.rowSpan!; i++) { height += widget .element.rowDefinitions![cellPostion.row! + i - 1].height ?? 0.0; } } final cell = _cells![cellPostion]; RTCell c = cell as RTCell; final borders = c.borders!; final background = c.background; childwidgets.add( Container( decoration: BoxDecoration( color: ColorConvert.colorConvert(background), border: Border( left: BorderSide( style: borders.left.borderStyle == RTBorderStyle.None ? BorderStyle.none : BorderStyle.solid, width: borders.left.thickness, color: ColorConvert.colorConvert(borders.left.color)), right: BorderSide( style: borders.right.borderStyle == RTBorderStyle.None ? BorderStyle.none : BorderStyle.solid, width: borders.right.thickness, color: ColorConvert.colorConvert(borders.right.color)), top: BorderSide( style: borders.top.borderStyle == RTBorderStyle.None ? BorderStyle.none : BorderStyle.solid, width: borders.top.thickness, color: ColorConvert.colorConvert(borders.top.color)), bottom: BorderSide( style: borders.bottom.borderStyle == RTBorderStyle.None ? BorderStyle.none : BorderStyle.solid, width: borders.bottom.thickness, color: ColorConvert.colorConvert(borders.bottom.color)), ), ), width: PtToPxConverter.ptToPx(width), height: PtToPxConverter.ptToPx(height), child: RTCellPage( cell: c, ), ), ); } final row = SizedBox( child: Row( children: childwidgets, ), ); widgets.add(row); } return Container( alignment: AlignmentConvert.horizontalConvert( widget.element.horizontalAlignment), child: Column( mainAxisAlignment: AlignmentConvert.horizontalToMainConvert( widget.element.horizontalAlignment), children: widgets, ), ); } void initCells() { _cells = widget.element.cells ?? {}; List cellPostions = _cells!.keys.toList(); cellPostions.sort(((a, b) => (b.column!).compareTo(a.column!))); // +1 为列数 _column = cellPostions.first.column! + 1; _values = _cells!.values.toList(); for (int i = 0; i < _column! - 1; i++) { _width += widget.element.columnDefinitions![i].width!; } _row = widget.element.rowDefinitions!.length + 1; } }