diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 23627f0..dbf89f7 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -210,7 +210,10 @@ namespace LimeReport { void multiItemsSelected(QList* objectsList); void miltiItemsSelectionFinished(); void commandHistoryChanged(); - void itemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant& oldValue, const QVariant& newValue); + void itemPropertyChanged(const QString& objectName, + const QString& propertyName, + const QVariant& oldValue, + const QVariant& newValue); void itemAdded(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item); void itemRemoved(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item); void bandAdded(LimeReport::PageDesignIntf* page, LimeReport::BandDesignIntf* band); @@ -247,7 +250,9 @@ namespace LimeReport { void setBorders(const BaseDesignIntf::BorderLines& border); private slots: void slotPageGeometryChanged(QObject*, QRectF, QRectF ); - void slotItemPropertyChanged(QString propertyName, const QVariant &oldValue, const QVariant &newValue); + void slotItemPropertyChanged(QString propertyName, + const QVariant &oldValue, + const QVariant &newValue); void slotItemPropertyObjectNameChanged(const QString& oldName, const QString& newName); void bandDeleted(QObject* band); void slotPageItemLoaded(QObject *); @@ -262,7 +267,10 @@ namespace LimeReport { void checkSizeOrPosChanges(); CommandIf::Ptr createChangePosCommand(); CommandIf::Ptr createChangeSizeCommand(); - void saveChangeProppertyCommand(const QString& objectName, const QString& propertyName, const QVariant& oldPropertyValue, const QVariant& newPropertyValue); + void saveChangeProppertyCommand(const QString& objectName, + const QString& propertyName, + const QVariant& oldPropertyValue, + const QVariant& newPropertyValue); void changeSelectedGroupProperty(const QString& name,const QVariant& value); private: diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index b3c5d39..dde790f 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -82,7 +82,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), m_previewLayoutDirection(Qt::LayoutDirectionAuto), m_designerFactory(0), - m_previewScaleType(FitWidth), m_previewScalePercent(0) + m_previewScaleType(FitWidth), m_previewScalePercent(0), m_startTOCPage(0) { #ifdef HAVE_STATIC_BUILD initResources(); @@ -1147,6 +1147,9 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai ReportPages ReportEnginePrivate::renderToPages() { + int startTOCPage = -1; + int pageAfterTOCIndex = -1; + if (m_reportRendering) return ReportPages(); initReport(); m_reportRender = ReportRender::Ptr(new ReportRender); @@ -1183,10 +1186,15 @@ ReportPages ReportEnginePrivate::renderToPages() activateLanguage(m_reportLanguage); emit renderStarted(); - foreach(PageItemDesignIntf* page , m_renderingPages){ + for(int i = 0; i < m_renderingPages.count(); ++i){ + PageItemDesignIntf* page = m_renderingPages.at(i); if (!page->isTOC() && page->isPrintable()){ page->setReportSettings(&m_reportSettings); result.append(m_reportRender->renderPageToPages(page)); + } else { + startTOCPage = result.count(); + pageAfterTOCIndex = i+1; + m_reportRender->createTOCMarker(page->resetPageNumber()); } } @@ -1194,16 +1202,17 @@ ReportPages ReportEnginePrivate::renderToPages() PageItemDesignIntf* page = m_renderingPages.at(i); if (page->isTOC()){ page->setReportSettings(&m_reportSettings); - if (i==0){ + if (i < m_renderingPages.count()){ PageItemDesignIntf* secondPage = 0; - if (m_pages.count()>1) secondPage = m_renderingPages.at(1); + if ( m_renderingPages.count() > (pageAfterTOCIndex)) + secondPage = m_renderingPages.at(pageAfterTOCIndex); ReportPages pages = m_reportRender->renderTOC( page, true, secondPage && secondPage->resetPageNumber() ); for (int j=0; j exporters; ScaleType m_previewScaleType; int m_previewScalePercent; + int m_startTOCPage; }; } diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index a2d1c7f..6f01c71 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -148,7 +148,7 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){ ReportRender::ReportRender(QObject *parent) :QObject(parent), m_renderPageItem(0), m_pageCount(0), - m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false), m_renderingFirstTOC(false) + m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false) { initColumns(); } @@ -192,18 +192,13 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool { m_currentNameIndex = 0; m_patternPageItem = patternPage; - m_renderingFirstTOC = isTOC && isFirst; if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { resetPageNumber(PageReset); } - if (m_renderingFirstTOC && resetPageNumbers){ - PagesRange range; - range.firstPage = 0; - range.lastPage = 0; - m_ranges.insert(0,range); - m_pageCount = 0; + if (m_patternPageItem->resetPageNumber() && !isTOC && m_pageCount == 0){ + m_pagesRanges.startNewRange(); } m_renderCanceled = false; @@ -248,11 +243,6 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool savePage(true); - if (m_renderingFirstTOC && resetPageNumbers && m_ranges.count()>1){ - m_ranges[1].firstPage = m_ranges.at(0).lastPage+1; - m_ranges[1].lastPage += m_ranges.at(0).lastPage+1; - } - #ifndef USE_QJSENGINE ScriptEngineManager::instance().scriptEngine()->popContext(); #endif @@ -1138,21 +1128,26 @@ void ReportRender::secondRenderPass(ReportPages renderedPages) for(int i=0; ichildBaseItems()){ - updateTOC(item, findPageNumber(i)); + updateTOC(item, m_pagesRanges.findPageNumber(i)); } } } for(int i=0; isetReportVariable("#PAGE",findPageNumber(i)); - m_datasources->setReportVariable("#PAGE_COUNT",findLastPageNumber(i)); + m_datasources->setReportVariable("#PAGE",m_pagesRanges.findPageNumber(i)); + m_datasources->setReportVariable("#PAGE_COUNT",m_pagesRanges.findLastPageNumber(i)); foreach(BaseDesignIntf* item, page->childBaseItems()){ item->updateItemSize(m_datasources, SecondPass); } } } +void ReportRender::createTOCMarker(bool startNewRange) +{ + m_pagesRanges.addTOCMarker(startNewRange); +} + BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf* patternBand) { int sliceHeight = height; @@ -1256,37 +1251,11 @@ void ReportRender::startNewPage(bool isFirst) void ReportRender::resetPageNumber(ResetPageNuberType resetType) { - PagesRange range; - if (!m_ranges.isEmpty()){ - currentRange().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1; - range.firstPage = m_pageCount+((resetType == BandReset)? 1 : 0); - } else { - range.firstPage = m_pageCount; - } - range.lastPage = (resetType == BandReset)? 0 : m_pageCount; - m_ranges.append(range); + m_pagesRanges.startNewRange(); if (resetType == PageReset) m_datasources->setReportVariable("#PAGE",1); } -int ReportRender::findLastPageNumber(int currentPage) -{ - foreach (PagesRange range, m_ranges) { - if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) ) - return (range.lastPage-(range.firstPage))+1; - } - return 0; -} - -int ReportRender::findPageNumber(int currentPage) -{ - foreach (PagesRange range, m_ranges) { - if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) ) - return (currentPage - range.firstPage)+1; - } - return 0; -} - void ReportRender::cutGroups() { m_popupedExpression.clear(); @@ -1406,6 +1375,10 @@ void ReportRender::moveTearOffBand(){ void ReportRender::savePage(bool isLast) { + if (m_renderPageItem->isTOC()) + m_pagesRanges.addTOCPage(); + else + m_pagesRanges.addPage(); m_datasources->setReportVariable("#IS_LAST_PAGEFOOTER",isLast); m_datasources->setReportVariable("#IS_FIRST_PAGEFOOTER",m_datasources->variable("#PAGE").toInt()==1); @@ -1427,14 +1400,12 @@ void ReportRender::savePage(bool isLast) } } - if (currentRange(m_renderingFirstTOC).lastPage==0 && m_ranges.count()>1) { + if (m_pagesRanges.currentRange(m_patternPageItem->isTOC()).firstPage == 0) { m_datasources->setReportVariable("#PAGE",1); } else { m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1); } - currentRange(m_renderingFirstTOC).lastPage = m_pageCount; - BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter); if (pageFooter) pageFooter->setBandIndex(++m_currentIndex); m_renderedPages.append(PageItemDesignIntf::Ptr(m_renderPageItem)); @@ -1478,4 +1449,96 @@ void ReportRender::cancelRender(){ m_renderCanceled = true; } +int PagesRanges::findLastPageNumber(int index) +{ + index++; + foreach (PagesRange range, m_ranges) { + if ( range.firstPage <= (index) && range.lastPage>= (index) ) + return (range.lastPage-(range.firstPage))+1; + } + return 0; +} + +int PagesRanges::findPageNumber(int index) +{ + index++; + foreach (PagesRange range, m_ranges) { + if ( range.firstPage <= (index) && range.lastPage >= (index) ) + return (index - range.firstPage)+1; + } + return 0; +} + +PagesRange&PagesRanges::currentRange(bool isTOC) +{ + Q_ASSERT( (isTOC && m_TOCRangeIndex!=-1) || !isTOC); + if (isTOC && m_TOCRangeIndex !=-1) return m_ranges[m_TOCRangeIndex]; + return m_ranges.last(); +} + +void PagesRanges::startNewRange(bool isTOC) +{ + PagesRange range; + if (!m_ranges.isEmpty()){ + range.firstPage = 0; + range.lastPage = m_ranges.last().lastPage + 1; + } else { + range.firstPage = 0; + range.lastPage = 0; + } + range.isTOC = isTOC; + m_ranges.append(range); + if (isTOC) m_TOCRangeIndex = m_ranges.size()-1; +} + +void PagesRanges::addTOCMarker(bool addNewRange) +{ + if ( addNewRange || m_ranges.isEmpty()){ + startNewRange(true); + } else { + m_TOCRangeIndex = m_ranges.size()-1; + m_ranges.last().isTOC = true; + } +} + +void PagesRanges::addPage() +{ + if (m_ranges.isEmpty()) startNewRange(); + if (m_ranges.last().firstPage == 0){ + m_ranges.last().firstPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; + m_ranges.last().lastPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; + } else { + m_ranges.last().lastPage++; + } +} + +void PagesRanges::shiftRangesNextToTOC(){ + for(int i = m_TOCRangeIndex+1; i < m_ranges.size(); ++i){ + m_ranges[i].firstPage++; + m_ranges[i].lastPage++; + } +} + +void PagesRanges::addTOCPage() +{ + Q_ASSERT(m_TOCRangeIndex != -1); + if (m_TOCRangeIndex != -1){ + PagesRange& tocRange = m_ranges[m_TOCRangeIndex]; + if (tocRange.firstPage == 0) { + tocRange.firstPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; + tocRange.lastPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; + if (tocRange.lastPage == 1 && tocRange.lastPage == 1) + shiftRangesNextToTOC(); + } else { + tocRange.lastPage++; + shiftRangesNextToTOC(); + } + } +} + +void PagesRanges::clear() +{ + m_ranges.clear(); +} + } // namespace LimeReport diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 6c14bda..8cbbc0f 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -61,6 +61,25 @@ private: struct PagesRange{ int firstPage; int lastPage; + bool isTOC; +}; + +class PagesRanges{ +public: + PagesRanges(): m_TOCRangeIndex(-1) {} + int findLastPageNumber(int index); + int findPageNumber(int index); + PagesRange& currentRange(bool isTOC); + void startNewRange(bool isTOC = false); + void addTOCMarker(bool addNewRange); + void addPage(); + void addTOCPage(); + void clear(); +private: + void shiftRangesNextToTOC(); +private: + QVector m_ranges; + int m_TOCRangeIndex; }; class ReportRender: public QObject @@ -84,6 +103,7 @@ public: ReportPages renderPageToPages(PageItemDesignIntf *patternPage); ReportPages renderTOC(PageItemDesignIntf *patternPage, bool first, bool resetPages); void secondRenderPass(ReportPages renderedPages); + void createTOCMarker(bool startNewRange); signals: void pageRendered(int renderedPageCount); public slots: @@ -147,8 +167,8 @@ private: void startNewColumn(); void startNewPage(bool isFirst = false); void resetPageNumber(ResetPageNuberType resetType); - int findLastPageNumber(int currentPage); - int findPageNumber(int currentPage); + //int findLastPageNumber(int currentPage); + //int findPageNumber(int currentPage); void savePage(bool isLast = false); QString toString(); void initColumns(); @@ -161,7 +181,7 @@ private: void renameChildItems(BaseDesignIntf *item); void renderGroupFooterByHeader(BandDesignIntf *groupHeader); void updateTOC(BaseDesignIntf* item, int pageNumber); - PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();} + //PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();} void placeBandOnPage(BandDesignIntf *band, int columnIndex); private: DataSourceManager* m_datasources; @@ -190,11 +210,10 @@ private: QVector m_maxHeightByColumn; QVector m_currentStartDataPos; int m_currentColumn; - QList m_ranges; + PagesRanges m_pagesRanges; QVector m_columnedBandItems; unsigned long long m_currentNameIndex; bool m_newPageStarted; - bool m_renderingFirstTOC; }; } // namespace LimeReport