COMPASSi/trunk/code/3rd/CCSReport_2/include/items/ccscolumn.h

285 lines
9.4 KiB
C
Raw Permalink Normal View History

2025-06-25 15:06:42 +08:00
#ifndef CCSCOLUMN_H
#define CCSCOLUMN_H
#include "QColor"
#include "qglobal.h"
#include "ccsiteminterface.h"
#include "ccsreport_global.h"
#include "common_types.h"
namespace CCS_Report {
class CCSBaseItemInterface;
class CCSItemInterface;
class CCSItemInterfacePrivate;
class CCSColumnPrivate;
class ReportFunPara;
class CCS_COMPASSREPORT_EXPORT CCSColumn:public CCSItemInterface
{
Q_OBJECT
Q_PROPERTY(int width READ width WRITE SetWidth) //列宽
Q_PROPERTY(bool dynamic READ dynamic WRITE SetDynamic) //是否为动态列,缺省为否
Q_PROPERTY(bool colfill READ colfill WRITE SetColFill) //铺满列
Q_PROPERTY(bool breakrow READ breakrow WRITE SetBreakRow) //折行起始
Q_PROPERTY(bool breakflag READ breakflag WRITE SetBreakFlag) //折行标识,针对动态列
Q_PROPERTY(bool colrepeatbreak READ colrepeatbreak WRITE SetColRepeatBreak) //如果有折行,是否重复此列
public:
//列宽类型, 按百分比 还是 绝对宽度
enum WidthType
{
Percent,
Absolute
};
CCSColumn(QObject * parent = 0);
~CCSColumn();
virtual CCSBaseItemInterface * createInstance(QObject * parent) const=0;
virtual CCSBaseItemInterface * clone(bool withChildren = true, bool init = true) const=0;
virtual void exeFunction(ReportFunPara& arg)=0;
int width() const;
void SetWidth(const int &width);
bool dynamic() const;
void SetDynamic(const bool &bdyanamic);
bool colfill() const;
void SetColFill(const bool &bflag);
bool breakrow() const;
void SetBreakRow(const bool &bflag);
bool breakflag() const;
void SetBreakFlag(const bool &bflag);
bool colrepeatbreak() const;
void SetColRepeatBreak(const bool &bflag);
CCS_Report::CCSBaseItemInterface* cell();
QList<CCS_Report::CCSBaseItemInterface*> cells() const;
// CCSColumn* Clone() const;
// CCSColumn* ShallowCopy() const;
void SetText(const QString& text,int iPos=0);
virtual void SetValue(const QString &text,int iPos=0){}
protected:
Q_DECLARE_PRIVATE(CCSColumn)
CCSColumn(CCSColumnPrivate *dd, QObject * parent);
virtual CCSBaseItemInterface * itemClone() const=0;
};
class CCSColumnPrivate:public CCSItemInterfacePrivate
{
public:
CCSColumnPrivate()
:CCSItemInterfacePrivate(),
m_iWidth(100),
m_bColDynamic(false),
m_bColFill(true),
m_bBreakRow(false),
m_bBreakFlag(true),
m_bColRepeatBreak(false)
{}
CCSColumnPrivate(const CCSColumnPrivate& p)
:CCSItemInterfacePrivate(p),
m_iWidth(p.m_iWidth),
m_bColDynamic(p.m_bColDynamic),
m_bColFill(p.m_bColFill),
m_bBreakRow(p.m_bBreakRow),
m_bBreakFlag(p.m_bBreakFlag),
m_bColRepeatBreak(p.m_bColRepeatBreak)
{}
virtual ~CCSColumnPrivate(){}
int m_iWidth; //设置列宽,按百分比进行设置 对于有动态列,且有折行,则为每个列的宽度;如果没有折行,则为总宽度,然后根据动态数据进行平分
bool m_bColDynamic; //是否有动态列
bool m_bColFill; //当动态列小于折行且不够列宽时,是否铺满(仅针对动态列不折行的情况下)
bool m_bBreakFlag; //动态列当记录数过多时是否需要折行
bool m_bBreakRow; //折行起点标志
bool m_bColRepeatBreak; //当折行时,列是否重复,针对动态列
};
/*********************************************************************************/
class CCSColumnHeaderPrivate;
class CCS_COMPASSREPORT_EXPORT CCSColumnHeader:public CCSColumn
{
Q_OBJECT
public:
CCSColumnHeader(QObject * parent = 0);
~CCSColumnHeader();
virtual CCSBaseItemInterface * createInstance(QObject * parent) const;
virtual CCSBaseItemInterface * clone(bool withChildren = true, bool init = true) const;
virtual void SetValue(const QString &text,int iPos=0){}
virtual void exeFunction(ReportFunPara& arg);
/// <summary>
/// 判断列头中是否有动态列,且返回对应的表字段名称
/// </summary>
/// <returns></returns>
void HandleDynamicField(QString& strField);
/// <summary>
/// 判断此列是否有动态列
/// </summary>
/// <returns></returns>
bool HasDynamic();
bool repeatheader() const;
void SetRepeatHeader(const int &icount);
/// <summary>
/// 解析列头中静态表字段
/// </summary>
/// <param name="groupkey"></param>
ReportFunPara ParseColumn(CCSGroup& groupkey);
/// <summary>
/// 解析动态列头中表字段
/// </summary>
/// <param name="groupkey"></param>
void ParseDynamic(int iColIndex,QList<QString> listDynaContent, CCSGroup& groupkey, QList<int> listWidths);
/// <summary>
/// 根据是否动态和折行等信息重新计算列宽
/// </summary>
void ReCalDynamicWidth(int iColIndex,int count,QList<int> listWidths);
CCSColumnHeader* Clone() const;
CCSColumnHeader* ShallowCopy() const;
/// <summary>
/// 重新设置列中的单元格列索引号
/// </summary>
/// <param name="iAdd">增量索引号</param>
void SetColumnHeaderIndex(int iAdd);
protected:
Q_DECLARE_PRIVATE(CCSColumnHeader)
CCSColumnHeader(CCSColumnHeaderPrivate *dd, QObject * parent);
virtual CCSBaseItemInterface * itemClone() const;
};
class CCSColumnHeaderPrivate:public CCSColumnPrivate
{
public:
CCSColumnHeaderPrivate()
:CCSColumnPrivate(),
m_iRepeatCount(1)
{}
CCSColumnHeaderPrivate(const CCSColumnHeaderPrivate& p)
:CCSColumnPrivate(p),
m_iRepeatCount(p.m_iRepeatCount)
{}
virtual ~CCSColumnHeaderPrivate(){}
int m_iRepeatCount;
};
/*********************************************************************************/
class CCSColumnBottomPrivate;
class CCS_COMPASSREPORT_EXPORT CCSColumnBottom:public CCSColumn
{
Q_OBJECT
public:
CCSColumnBottom(QObject * parent = 0);
~CCSColumnBottom();
virtual CCSBaseItemInterface * createInstance(QObject * parent) const;
virtual CCSBaseItemInterface * clone(bool withChildren = true, bool init = true) const;
CCSColumnBottom* Clone() const;
CCSColumnBottom* ShallowCopy() const;
void SetText(const QString& text,int iPos=0);
virtual void SetValue(const QString &text,int iPos=0){}
virtual void exeFunction(ReportFunPara& arg);
protected:
Q_DECLARE_PRIVATE(CCSColumnBottom)
CCSColumnBottom(CCSColumnBottomPrivate *dd, QObject * parent);
virtual CCSBaseItemInterface * itemClone() const;
};
class CCSColumnBottomPrivate:public CCSColumnPrivate
{
public:
CCSColumnBottomPrivate()
:CCSColumnPrivate()
{}
CCSColumnBottomPrivate(const CCSColumnBottomPrivate& p)
:CCSColumnPrivate(p)
{}
virtual ~CCSColumnBottomPrivate(){}
};
/*********************************************************************************/
class CCSColumnContentPrivate;
class CCS_COMPASSREPORT_EXPORT CCSColumnContent:public CCSColumn
{
Q_OBJECT
Q_PROPERTY(bool keycolumn READ keycolumn WRITE SetKeycolumn) //关键字段列
Q_PROPERTY(bool mergerow READ mergerow WRITE SetMergerow) //是否为动态列,缺省为否
public:
QString m_ColField; //当为动态列时列的Key值
public:
//列宽类型, 按百分比 还是 绝对宽度
CCSColumnContent(QObject * parent = 0);
~CCSColumnContent();
virtual CCSBaseItemInterface * createInstance(QObject * parent) const;
virtual CCSBaseItemInterface * clone(bool withChildren = true, bool init = true) const;
virtual void SetValue(const QString &text,int iPos=0){}
virtual void exeFunction(ReportFunPara& arg);
bool keycolumn() const;
void SetKeycolumn(const bool& bflag);
bool mergerow() const;
void SetMergerow(const bool& bflag);
// bool GetNoRecord() const {return m_bNoRecord;}
// void SetNoRecord(const bool &record){m_bNoRecord = record;}
QString GetColField() const {return m_ColField;}
void SetColField(const QString &field) {m_ColField = field;}
void SetColField1(const char* gbk)
{
QString field = QString::fromLocal8Bit(gbk);
m_ColField = field;
}
// bool GetIsMerge() const {return m_bMerge;}
// void SetIsMerge(const bool &bMerge){ m_bMerge = bMerge;}
CCSColumnContent* Clone() const;
CCSColumnContent* ShallowCopy() const;
/// <summary>
/// 解析动态内容表字段
/// </summary>
/// <param name="groupkey"></param>
QList<QString> ParseDynamicTableContent(QMap<QString, QMap<QString, QString>> datasetDyn);
bool IsMerge()
{
return keycolumn() && mergerow(); //当相邻行两个相等时,是否合并
}
protected:
Q_DECLARE_PRIVATE(CCSColumnContent)
CCSColumnContent(CCSColumnContentPrivate *dd, QObject * parent);
virtual CCSBaseItemInterface * itemClone() const;
private:
};
class CCSColumnContentPrivate:public CCSColumnPrivate
{
public:
CCSColumnContentPrivate()
:CCSColumnPrivate(),
m_bNoRecord(true),
m_bKey(false),
m_bMerge(false)
{}
CCSColumnContentPrivate(const CCSColumnContentPrivate& p)
:CCSColumnPrivate(p),
m_bNoRecord(p.m_bNoRecord),
m_bKey(p.m_bKey),
m_bMerge(p.m_bMerge)
{}
virtual ~CCSColumnContentPrivate(){}
bool m_bNoRecord;
bool m_bMerge; //当相邻行两个相等时,是否合并
bool m_bKey; //是否为关键列
};
}
#endif // CCSCOLUMN_H