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

285 lines
9.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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