#ifndef CANVBOX_H
#define CANVBOX_H

#include <map>
#include <qcanvas.h>
/**/
//#include <pair> 
#include <utility>
/**/

#include "canvdefs.h"

class QString;
class QStringList;
class CanvasDetailHeader;
class CanvasDetailFooter;
class CanvasDetail;
class CanvasReportHeader;
class CanvasReportFooter;
class CanvasPageHeader;
class CanvasPageFooter;
/**/
using namespace std;
/**/

class CanvasBox: public QCanvasRectangle{
public:
    CanvasBox(int x, int y, int width, int height, QCanvas * canvas):
	    QCanvasRectangle(x, y, width, height, canvas) {}
    
    virtual int rtti() const { return RttiCanvasBox; }
    virtual void draw(QPainter &painter);
    void scale(int scale);
    virtual QString getXml() { return ""; }
    
    map<QString, pair<QString, QStringList> > props;
    /*
      properties format
      map<key_name, pair<key_value, key_description> >
      key_description << key_hint -- to display helpful tips
                      << key_type (string, int, int_from_list, color, font)
                         -- to organize appropriate input
		      << probably_key_value << ... -- values
    */
};

class CanvasSection: public CanvasBox{
public:
    CanvasSection(int x, int y, int width, int height, QCanvas * canvas):
	    CanvasBox(x, y, width, height, canvas) {}
    virtual QString getXml() { return ""; }
    virtual void draw(QPainter &painter);
    virtual int rtti() const { return RttiCanvasSection; }
};

class CanvasBand: public CanvasSection{
public:
    CanvasBand(int x, int y, int width, int height, QCanvas * canvas):
	    CanvasSection(x, y, width, height, canvas)
    {
	setZ(10);
    }
    ~CanvasBand();
    virtual void draw(QPainter &painter);
    virtual int rtti() const { return RttiCanvasBand; }
    virtual QString getXml();
    void arrange(int base, bool destructive = TRUE);
    
    QCanvasItemList items;
};

typedef pair< pair<CanvasDetailHeader*, CanvasDetailFooter*>, CanvasDetail*>  DetailBand;

class CanvasKugarTemplate: public CanvasSection{
public:
    CanvasKugarTemplate(int x, int y, int width, int height, QCanvas * canvas);
    ~CanvasKugarTemplate();
    virtual int rtti() const { return RttiKugarTemplate; }
    virtual void draw(QPainter &painter);
    void arrangeSections(bool destructive=TRUE);
    
    QString fileName() const { return reportFileName; }
    void setFileName(QString fName) { reportFileName = fName; }
    
    virtual QString getXml();
    
    void removeSection(CanvasBand *section, CanvasDetailHeader **header,
		       CanvasDetailFooter **footer);
    
    CanvasReportHeader *reportHeader;
    CanvasReportFooter *reportFooter;
    CanvasPageHeader *pageHeader;
    CanvasPageFooter *pageFooter;
    map<int, DetailBand> details;
    unsigned int detailsCount;
private:
    QString reportFileName;
};

class CanvasReportHeader: public CanvasBand{
public:
    CanvasReportHeader(int x, int y, int width, int height, QCanvas * canvas);
    virtual int rtti() const { return RttiReportHeader; }
    virtual void draw(QPainter &painter);
    virtual QString getXml();
};

class CanvasReportFooter: public CanvasBand{
public:
    CanvasReportFooter(int x, int y, int width, int height, QCanvas * canvas);
    virtual int rtti() const { return RttiReportFooter; }
    virtual void draw(QPainter &painter);
    virtual QString getXml();
};

class CanvasPageHeader: public CanvasBand{
public:
    CanvasPageHeader(int x, int y, int width, int height, QCanvas * canvas);
    virtual void draw(QPainter &painter);
    virtual int rtti() const { return RttiPageHeader; }
    virtual QString getXml();
};

class CanvasPageFooter: public CanvasBand{
public:
    CanvasPageFooter(int x, int y, int width, int height, QCanvas * canvas);
    virtual int rtti() const { return RttiPageFooter; }
    virtual void draw(QPainter &painter);
    virtual QString getXml();
};

class CanvasDetailHeader: public CanvasBand{
public:
    CanvasDetailHeader(int x, int y, int width, int height, QCanvas * canvas);
    virtual int rtti() const { return RttiDetailHeader; }
    virtual void draw(QPainter &painter);
    virtual QString getXml();
};

class CanvasDetail: public CanvasBand{
public:
    CanvasDetail(int x, int y, int width, int height, QCanvas * canvas);
    virtual int rtti() const { return RttiDetail; }
    virtual void draw(QPainter &painter);
    virtual QString getXml();
};

class CanvasDetailFooter: public CanvasBand{
public:
    CanvasDetailFooter(int x, int y, int width, int height, QCanvas * canvas);
    virtual int rtti() const { return RttiDetailFooter; }
    virtual void draw(QPainter &painter);
    virtual QString getXml();
};

#endif
