285 lines
9.4 KiB
C++
285 lines
9.4 KiB
C++
#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
|