diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 313c0f4..cff06ca 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -203,7 +203,7 @@ public: void setItemPos(const QPointF &newPos); void setItemPos(qreal x, qreal y); - void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); + virtual void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); ItemMode itemMode() const {return m_itemMode;} virtual void setBorderLinesFlags(LimeReport::BaseDesignIntf::BorderLines flags); diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index ccb52ec..f0904c8 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -49,7 +49,8 @@ PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : ItemsContainerDesignInft("PageItem",owner,parent), m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false), - m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false) + m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), + m_pageFooter(0) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -61,7 +62,8 @@ PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &re ItemsContainerDesignInft("PageItem",owner,parent), m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(pageSize), m_sizeChainging(false), - m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false) + m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), + m_pageFooter(0) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -71,7 +73,8 @@ PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &re PageItemDesignIntf::~PageItemDesignIntf() { - foreach(BandDesignIntf* band,m_bands) band->disconnect(this); + foreach(BandDesignIntf* band, m_bands) + band->disconnect(this); m_bands.clear(); } @@ -81,9 +84,9 @@ void PageItemDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsIte if (itemMode() & DesignMode){ ppainter->save(); ppainter->setOpacity(0.8); - ppainter->fillRect(boundingRect(),pageBorderColor()); + ppainter->fillRect(boundingRect(), pageBorderColor()); ppainter->setOpacity(1); - ppainter->fillRect(pageRect(),Qt::white); + ppainter->fillRect(pageRect(), Qt::white); paintGrid(ppainter); ppainter->setPen(gridColor()); ppainter->drawRect(boundingRect()); @@ -92,7 +95,7 @@ void PageItemDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsIte if (itemMode() & PreviewMode) { ppainter->save(); - ppainter->fillRect(rect(),Qt::white); + ppainter->fillRect(rect(), Qt::white); QPen pen; pen.setColor(Qt::gray); pen.setWidth(2); @@ -113,8 +116,6 @@ BaseDesignIntf *PageItemDesignIntf::createSameTypeItem(QObject *owner, QGraphics void PageItemDesignIntf::geometryChangedEvent(QRectF newRect, QRectF) { -// if (scene()) -// scene()->setSceneRect(newRect); Q_UNUSED(newRect) updateMarginRect(); PageSize oldSize = m_pageSize; @@ -130,16 +131,20 @@ QColor PageItemDesignIntf::selectionColor() const QColor PageItemDesignIntf::pageBorderColor() const { - //return QColor(180,220,150); return QColor(100,150,50); } QColor PageItemDesignIntf::gridColor() const { - //return QColor(240,240,240); return QColor(170,200,150); } +void PageItemDesignIntf::setItemMode(BaseDesignIntf::ItemMode mode) +{ + ItemsContainerDesignInft::setItemMode(mode); + relocateBands(); +} + void PageItemDesignIntf::clear() { foreach(QGraphicsItem* item, childItems()){ @@ -159,7 +164,7 @@ BandDesignIntf *PageItemDesignIntf::bandByType(BandDesignIntf::BandsType bandTyp bool PageItemDesignIntf::isBandExists(BandDesignIntf::BandsType bandType) { - foreach(BandDesignIntf* band,childBands()){ + foreach(BandDesignIntf* band, childBands()){ if (band->bandType()==bandType) return true; } return false; @@ -167,7 +172,7 @@ bool PageItemDesignIntf::isBandExists(BandDesignIntf::BandsType bandType) bool PageItemDesignIntf::isBandExists(const QString &bandType) { - foreach(BandDesignIntf* band, m_bands){ + foreach(BandDesignIntf* band, childBands()){ if (band->bandTitle()==bandType) return true; } return false; @@ -175,7 +180,7 @@ bool PageItemDesignIntf::isBandExists(const QString &bandType) BandDesignIntf* PageItemDesignIntf::bandByIndex(int index) { - foreach(BandDesignIntf* band,m_bands){ + foreach(BandDesignIntf* band, childBands()){ if (band->bandIndex()==index) return band; } return 0; @@ -199,14 +204,14 @@ int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDe QSet groupFooterIgnoredBands; groupFooterIgnoredBands << BandDesignIntf::DataFooter << BandDesignIntf::GroupHeader; - int bandIndex=-1; - qSort(m_bands.begin(),m_bands.end(),bandSortBandLessThenByIndex); + int bandIndex = -1; + qSort(m_bands.begin(), m_bands.end(), bandSortBandLessThenByIndex); if (bandType != BandDesignIntf::Data){ foreach(BandDesignIntf* band,m_bands){ if ((band->bandType() == BandDesignIntf::GroupHeader) && ( band->bandType() > bandType)) break; if ((band->bandType() <= bandType)){ if (bandIndex <= band->bandIndex()) { - bandIndex=band->maxChildIndex(bandType)+1; + bandIndex=band->maxChildIndex(bandType) + 1; } } else { increaseBandIndex = true; break;} } @@ -216,11 +221,11 @@ int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDe if (band->bandType() == BandDesignIntf::Data) maxChildIndex = std::max(maxChildIndex, band->maxChildIndex()); } - bandIndex = std::max(bandIndex, maxChildIndex+1); + bandIndex = std::max(bandIndex, maxChildIndex + 1); } - if (bandIndex==-1) { - bandIndex = (int)(bandType); + if (bandIndex == -1) { + bandIndex = static_cast(bandType); increaseBandIndex = true; } @@ -241,12 +246,12 @@ int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDe increaseBandIndex = true; break; case BandDesignIntf::SubDetailFooter: - bandIndex = parentBand->maxChildIndex()+1; + bandIndex = parentBand->maxChildIndex() + 1; increaseBandIndex = true; break; case BandDesignIntf::GroupHeader: if (parentBand->bandType()==BandDesignIntf::GroupHeader) - bandIndex = parentBand->bandIndex()+1; + bandIndex = parentBand->bandIndex() + 1; else bandIndex = parentBand->minChildIndex(BandDesignIntf::GroupHeader); increaseBandIndex = true; @@ -261,7 +266,7 @@ int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDe increaseBandIndex = true; break; case BandDesignIntf::DataFooter: - bandIndex = parentBand->maxChildIndex()+1; + bandIndex = parentBand->maxChildIndex() + 1; increaseBandIndex = true; break; default : @@ -275,9 +280,9 @@ int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDe void PageItemDesignIntf::increaseBandIndex(int startIndex) { if (bandByIndex(startIndex)){ - foreach(BandDesignIntf* band,m_bands){ - if (band->bandIndex()>=startIndex){ - band->setBandIndex(band->bandIndex()+1); + foreach(BandDesignIntf* band, m_bands){ + if (band->bandIndex() >= startIndex){ + band->setBandIndex(band->bandIndex() + 1); } } } @@ -294,14 +299,13 @@ bool PageItemDesignIntf::isBandRegistred(BandDesignIntf *band) void PageItemDesignIntf::registerBand(BandDesignIntf *band) { if (!isBandRegistred(band)){ - if (band->bandIndex()>childBands().count()-1) + if (band->bandIndex() > childBands().count() - 1) m_bands.append(band); else - m_bands.insert(band->bandIndex(),band); - + m_bands.insert(band->bandIndex(), band); band->setParent(this); band->setParentItem(this); - band->setWidth(pageRect().width()/band->columnsCount()); + band->setWidth(pageRect().width() / band->columnsCount()); connect(band, SIGNAL(destroyed(QObject*)),this,SLOT(bandDeleted(QObject*))); connect(band, SIGNAL(posChanged(QObject*, QPointF, QPointF)), this, SLOT(bandPositionChanged(QObject*, QPointF, QPointF))); @@ -318,6 +322,33 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } + +BandDesignIntf *PageItemDesignIntf::pageFooter() const +{ + return m_pageFooter; +} + +void PageItemDesignIntf::setPageFooter(BandDesignIntf *pageFooter) +{ + m_pageFooter = pageFooter; +} + +void PageItemDesignIntf::placeTearOffBand() +{ + BandDesignIntf* tearOffBand = bandByType(BandDesignIntf::TearOffBand); + if (tearOffBand){ + BandDesignIntf* pf = pageFooter(); + if (pf){ + qreal bottomSpace = pageRect().bottom() - (tearOffBand->height() + pf->height() + bottomMargin()); + tearOffBand->setItemPos(pageRect().x(), + bottomSpace); + } else { + qreal bottomSpace = pageRect().bottom() - (tearOffBand->height() + bottomMargin()); + tearOffBand->setItemPos(pageRect().x(), bottomSpace); + } + } +} + bool PageItemDesignIntf::resetPageNumber() const { return m_resetPageNumber; @@ -373,7 +404,7 @@ void PageItemDesignIntf::relocateBands() QVector posByColumn; - qSort(m_bands.begin(),m_bands.end(),bandSortBandLessThenByIndex); + qSort(m_bands.begin(), m_bands.end(), bandSortBandLessThenByIndex); int bandIndex = 0; if (!(itemMode() & DesignMode)){ @@ -392,10 +423,10 @@ void PageItemDesignIntf::relocateBands() posByColumn[0]+=m_bands[bandIndex]->height()+bandSpace; } - if(m_bands.count()>1){ - for(int i=0;i<(m_bands.count()-1);i++){ - if (((m_bands[i+1]->bandType()!=BandDesignIntf::PageFooter) && - (m_bands[i+1]->bandType()!=BandDesignIntf::TearOffBand)) || (itemMode() & DesignMode)){ + if(m_bands.count()>0){ + for(int i=0; i<(m_bands.count()-1); i++){ + if (((m_bands[i+1]->bandType() != BandDesignIntf::PageFooter) && + (m_bands[i+1]->bandType() != BandDesignIntf::TearOffBand)) || (itemMode() & DesignMode)){ if (m_bands[i+1]->columnsCount()>1 && m_bands[i]->columnsCount() != m_bands[i+1]->columnsCount()) { @@ -425,6 +456,9 @@ void PageItemDesignIntf::relocateBands() if (band->isSelected()) band->updateBandNameLabel(); } } + + if (!(itemMode() & DesignMode)) + placeTearOffBand(); } void PageItemDesignIntf::removeBand(BandDesignIntf *band) diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 2c7ff19..3f728fb 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -39,7 +39,7 @@ namespace LimeReport{ class ReportRender; -class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft +class PageItemDesignIntf : public ItemsContainerDesignInft { Q_OBJECT Q_ENUMS(Orientation) @@ -82,6 +82,7 @@ public: virtual QColor selectionColor() const; virtual QColor pageBorderColor() const; virtual QColor gridColor() const; + void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); void clear(); const BandsList& childBands() const {return m_bands;} BandDesignIntf * bandByType(BandDesignIntf::BandsType bandType) const; @@ -130,6 +131,10 @@ public: QList createBandGroup(int beginIndex, int endIndex); + void placeTearOffBand(); + BandDesignIntf *pageFooter() const; + void setPageFooter(BandDesignIntf *pageFooter); + protected slots: void bandDeleted(QObject* band); void bandPositionChanged(QObject* object, QPointF newPos, QPointF oldPos); @@ -159,6 +164,7 @@ private: bool m_fullPage; bool m_oldPrintMode; bool m_resetPageNumber; + BandDesignIntf* m_pageFooter; }; typedef QList ReportPages; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 10a00be..01b024b 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -630,13 +630,14 @@ void ReportRender::renderPageFooter(PageItemDesignIntf *patternPage) { BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageFooter); if (band){ - BandDesignIntf* bandClone = dynamic_cast(band->cloneItem(PreviewMode, m_renderPageItem,m_renderPageItem)); + BandDesignIntf* bandClone = dynamic_cast(band->cloneItem(PreviewMode, m_renderPageItem, m_renderPageItem)); replaceGroupsFunction(bandClone); bandClone->updateItemSize(m_datasources); bandClone->setItemPos(m_patternPageItem->pageRect().x(),m_patternPageItem->pageRect().bottom()-bandClone->height()); bandClone->setHeight(m_pageFooterHeight); for(int i=0;isetPageFooter(bandClone); registerBand(bandClone); datasources()->clearGroupFunctionValues(band->objectName()); } @@ -981,7 +982,7 @@ bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren) } - foreach(QList* list,m_childBands.values()){ + foreach(QList* list, m_childBands.values()){ if (registerInChildren && band->bandType()!=BandDesignIntf::PageHeader && band->bandType()!=BandDesignIntf::PageFooter && @@ -1268,19 +1269,6 @@ BandDesignIntf* ReportRender::findEnclosingGroup() return result; } -void ReportRender::moveTearOffBand(){ - BandDesignIntf* tearOffBand = m_renderPageItem->bandByType(BandDesignIntf::TearOffBand); - if (tearOffBand){ - BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter); - if (pageFooter){ - tearOffBand->setItemPos(m_patternPageItem->pageRect().x(), - m_patternPageItem->pageRect().bottom()-(tearOffBand->height()+pageFooter->height())); - } else { - tearOffBand->setItemPos(m_patternPageItem->pageRect().x(),m_patternPageItem->pageRect().bottom()-tearOffBand->height()); - } - } -} - void ReportRender::savePage(bool isLast) { @@ -1325,7 +1313,7 @@ void ReportRender::savePage(bool isLast) } } - moveTearOffBand(); + m_renderPageItem->placeTearOffBand(); emit m_patternPageItem->afterRender(); }