COMPASSi/trunk/code/3rd/CCSReport_2/include/translation/ccsrendertable.h

118 lines
6.0 KiB
C
Raw Normal View History

2025-06-25 15:06:42 +08:00
#ifndef CCSRENDERTABLE_H
#define CCSRENDERTABLE_H
#include "qmap.h"
#include <QObject>
#include "common_types.h"
namespace CCS_Report {
class CCSRenderTableInfo;
class CCSRenderTableCell;
class CCSPageInterface;
class CCSPageRenderTable;
class CCSRenderTable:public QObject
{
Q_OBJECT
public:
QString m_strName = ""; //表名
bool m_bNewPage = false; //是否在一开始输出就在新页输出
bool m_bRepeatHeader = true; //标题是否重复输出  true 是
CCSTableType::TableTypeFlag m_eTableType = CCSTableType::Fixed; // =0 固定表格 只有m_header变量  动态表格  对于表头的处理
CCSTableType::TableBreakFlag m_iStyle = CCSTableType::NoBreak; //表现样式的区别 
CCSReportType::OrientationFlag m_bOrientation = CCSReportType::Portrait; //缺省是横向
CCSRenderTable* m_pParent; //指向子表的父表
QMap<int,CCSRenderTableInfo*> m_header; //表头每个折行对应一个int如果是普通的动态表则只有一个表头m_header.count() = 1
QMap<int,CCSRenderTableInfo*> m_content;//表内容
QMap<int,CCSRenderTable*> m_subtable; //子表
CCSRenderTableInfo* m_bottom;//表总结
// bool m_bNoRecordShow = true; //对于动态表格,如果没有记录是否显示表头 = true 显示 =false 不显示
CCSRenderTable(QObject * parent = 0,QString objectname="");
CCSRenderTable(QString strName);
CCSRenderTable(QString strName,bool bNewPage,CCSReportType::OrientationFlag Orient,int row,int col);
CCSRenderTable(QString strName, CCSTableType::TableTypeFlag tabletype, CCSTableType::TableBreakFlag style,bool repeatheader=true,bool newpage=false,CCSReportType::OrientationFlag orient = CCSReportType::Portrait);
~CCSRenderTable();
//分配内存
CCSRenderTable* ShalowCopy();
void AllocHeaderTableInfo(int rownum,int colnum,QList<int> listBreakIndex = QList<int>(),int repeatcol = 0);
void AllocContentTableInfo(int rownum,int colnum,QList<int> listBreakIndex=QList<int>(),int repeatcol=0);
void AllocBootomTableInfo(int rownum,int colnum);
void AllocTableInfo(int rownum,int colnum,QMap<int,CCSRenderTableInfo*>& element);
void AllocTableInfo(int index,int rownum,int colnum,QMap<int,CCSRenderTableInfo*>& element);
void AllocTableInfo(int rownum,int colnum,QList<int>& listBreakIndex,int repeatcol,QMap<int,CCSRenderTableInfo*>& element);
CCSRenderTableCell* GetHeaderRenderCell(int row, int col, int index = 0 );
void FreeHeaderTableInfo();
//把子表中的表头合并到父表中,并修改父表表头
void HandleParentTableHeader(CCSRenderTable* parentTable, double dWidth);
void FillRenderCell(CCSRenderTableInfo* infos,int rowstart,int rowcount,int count,QList<qreal> listColumnWidth);
void SetTableinfos(CCSRenderTableInfo* sourceinfos, CCSRenderTableInfo* destinfos,
CCS_Report::MatrixPostion sourceM,CCS_Report::MatrixPostion destM);
void SetTableBorder(int bordertype);
int GetColumnNum();
qreal GetHeaderWidth();
qreal GetContentWidth();
qreal GetTableHeaderHeight();
void AdjustContentWidth(qreal width);
void CalculateArrange();
void UpdateTableBorderFrame(CCSRenderTableCell* cell,CCSFrame::FrameFlags frame);
void HandlePageHeader(CCS_Report::CCSPageInterface * page,qreal& currentY);
void HandlePageFooter(CCS_Report::CCSPageInterface * page,qreal& currentY);
CCS_Report::CCSPageInterface * HandlePage(CCS_Report::CCSPageInterface * page,qreal& currentY);
CCS_Report::CCSPageInterface * HandleFixTablePage(CCS_Report::CCSPageInterface * page,qreal& currentY);
/// <summary>
/// 动态表分3种类型1、普通型 2、带有子表 3、折行的(又分为按记录折行还是按表折行)可以转换成类型1 目前不doing
/// </summary>
/// <returns></returns>
CCS_Report::CCSPageInterface * HandleDynamicTablePage(CCS_Report::CCSPageInterface * page,qreal& currentY, CCSPageRenderTable*& pPageTable,CCSRenderTable* pParentTable = nullptr);
//iNum 要输出的内容的编号;如果不折行,m_content。count只有1个  number=-1 全部输出
CCS_Report::CCSPageInterface * HandleContentPage(CCS_Report::CCSPageInterface * page,qreal startY,qreal endY,qreal& currentY,int iNum, CCSPageRenderTable*& pPageTable,CCSRenderTable* pParentTable = nullptr);
CCS_Report::CCSPageInterface * HandleBottomPage(CCS_Report::CCSPageInterface * page,qreal& currentY, CCSPageRenderTable*& pPageTable);
//
CCS_Report::CCSRenderTableInfo* CreateTableInfos(CCSRenderTableInfo* &infos,int rowNo);
void MergeSubTable(CCSRenderTableInfo*& pMergeInfo, CCSRenderTable* pRendertable, int& iMergeRowCount, int& iMaxColNum, int& iFlag, int index=0);
CCSRenderTableInfo* MergeSubTableToParent(int index=0);
};
/// <summary>
/// 每页中所存放的表格
/// </summary>
class CCSPageRenderTable :public QObject
{
Q_OBJECT
public:
QString m_strName = ""; //表名
/// <summary>
/// 是否在一开始输出就在新页输出
/// </summary>
bool m_bNewPage = false;
/// <summary>
/// 表格所在的纸张方向,缺省是横向
/// </summary>
CCSReportType::OrientationFlag m_bOrientation = CCSReportType::Portrait;
/// <summary>
/// 表格中所有单元格信息
/// </summary>
CCSRenderTableInfo* m_cells = nullptr;
QMap<int, CCSPageRenderTable*> m_mapSubtable;
CCSRenderTableInfo* m_bottomcells = nullptr;
CCSPageRenderTable* m_pParentTable = nullptr; //指向子表中的父表
public:
CCSPageRenderTable(QObject* parent = 0, QString objectname = "",CCSPageRenderTable * pTable = nullptr);
CCSPageRenderTable(CCS_Report::CCSPageInterface*& page,bool newpage = false, CCSReportType::OrientationFlag orient = CCSReportType::Portrait,CCSPageRenderTable * pTable = nullptr);
~CCSPageRenderTable();
CCSPageRenderTable* itemClone();
int SetNewRowInfo();
};
}
#endif // CCSRENDERTABLE_H