diff --git a/examples/window.cpp b/examples/window.cpp --- a/examples/window.cpp +++ b/examples/window.cpp @@ -98,6 +98,8 @@ preRenderer.setSourceData(m_testData); preRenderer.setName("example_report"); - m_reportView->setDocument(preRenderer.generate()); - m_reportView->moveToFirstPage(); + if (preRenderer.generateDocument()) { + m_reportView->setDocument(preRenderer.document()); + m_reportView->moveToFirstPage(); + } } diff --git a/src/renderer/KReportPage.cpp b/src/renderer/KReportPage.cpp --- a/src/renderer/KReportPage.cpp +++ b/src/renderer/KReportPage.cpp @@ -55,10 +55,8 @@ : QObject(parent), QGraphicsRectItem() , d(new Private(document)) { - //! @todo setAttribute(Qt::WA_NoBackground); - //kreportDebug() << "CREATED PAGE"; - int pageWidth = 0; - int pageHeight = 0; + int pageWidth; + int pageHeight; if (d->reportDocument) { QString pageSize = d->reportDocument->pageOptions().getPageSize(); @@ -74,7 +72,7 @@ pageHeight = d->reportDocument->pageOptions().pixelSize().height(); } } - setRect(0,0,pageWidth, pageHeight); + setRect(0, 0, pageWidth, pageHeight); //kreportDebug() << "PAGE IS " << pageWidth << "x" << pageHeight; d->pixmap = QPixmap(pageWidth, pageHeight); d->renderer = d->factory.createInstance(QLatin1String("screen")); diff --git a/src/renderer/KReportPreRenderer.h b/src/renderer/KReportPreRenderer.h --- a/src/renderer/KReportPreRenderer.h +++ b/src/renderer/KReportPreRenderer.h @@ -55,8 +55,10 @@ void registerScriptObject(QObject*, const QString&); #endif - ORODocument * generate(); + bool generateDocument(); + ORODocument *document(); + /** @brief Set the name of the report so that it can be used internally by the script engine */ diff --git a/src/renderer/KReportPreRenderer.cpp b/src/renderer/KReportPreRenderer.cpp --- a/src/renderer/KReportPreRenderer.cpp +++ b/src/renderer/KReportPreRenderer.cpp @@ -64,6 +64,7 @@ { delete m_reportDocument; delete m_oneRecord; + delete m_document; m_postProcText.clear(); } @@ -399,125 +400,110 @@ delete asyncManager; } - -//===========================KReportPreRenderer=============================== - -KReportPreRenderer::KReportPreRenderer(const QDomElement & document) - : d(new KReportPreRendererPrivate()) -{ - setDocument(document); -} - -KReportPreRenderer::~KReportPreRenderer() +bool KReportPreRendererPrivate::generateDocument() { - delete d; -} - -void KReportPreRenderer::setName(const QString &n) -{ - d->m_reportDocument->setName(n); -} - -ORODocument* KReportPreRenderer::generate() -{ - if (d == 0 || !d->m_valid || d->m_reportDocument == 0 || d->m_kodata == 0) - return 0; + if (!m_valid || !m_reportDocument || !m_kodata) { + return false; + } // Do this check now so we don't have to undo a lot of work later if it fails KReportLabelSizeInfo label; - if (d->m_reportDocument->page.getPageSize() == QLatin1String("Labels")) { - label = KReportLabelSizeInfo::find(d->m_reportDocument->page.getLabelType()); - if (label.isNull()) - return 0; + if (m_reportDocument->page.getPageSize() == QLatin1String("Labels")) { + label = KReportLabelSizeInfo::find(m_reportDocument->page.getLabelType()); + if (label.isNull()) { + return false; + } } //kreportDebug() << "Creating Document"; - d->m_document = new ORODocument(d->m_reportDocument->m_title); + m_document = new ORODocument(m_reportDocument->m_title); - d->m_pageCounter = 0; - d->m_yOffset = 0.0; + m_pageCounter = 0; + m_yOffset = 0.0; //kreportDebug() << "Calculating Margins"; if (!label.isNull()) { - if (d->m_reportDocument->page.isPortrait()) { - d->m_topMargin = (label.startY() / 100.0); - d->m_bottomMargin = 0; - d->m_rightMargin = 0; - d->m_leftMargin = (label.startX() / 100.0); + if (m_reportDocument->page.isPortrait()) { + m_topMargin = (label.startY() / 100.0); + m_bottomMargin = 0; + m_rightMargin = 0; + m_leftMargin = (label.startX() / 100.0); } else { - d->m_topMargin = (label.startX() / 100.0); - d->m_bottomMargin = 0; - d->m_rightMargin = 0; - d->m_leftMargin = (label.startY() / 100.0); + m_topMargin = (label.startX() / 100.0); + m_bottomMargin = 0; + m_rightMargin = 0; + m_leftMargin = (label.startY() / 100.0); } } else { - d->m_topMargin = d->m_reportDocument->page.getMarginTop(); - d->m_bottomMargin = d->m_reportDocument->page.getMarginBottom(); - d->m_rightMargin = d->m_reportDocument->page.getMarginRight(); - d->m_leftMargin = d->m_reportDocument->page.getMarginLeft(); - //kreportDebug() << "Margins:" << d->m_topMargin << d->m_bottomMargin << d->m_rightMargin << d->m_leftMargin; + m_topMargin = m_reportDocument->page.getMarginTop(); + m_bottomMargin = m_reportDocument->page.getMarginBottom(); + m_rightMargin = m_reportDocument->page.getMarginRight(); + m_leftMargin = m_reportDocument->page.getMarginLeft(); + //kreportDebug() << "Margins:" << m_topMargin << m_bottomMargin << m_rightMargin << m_leftMargin; } //kreportDebug() << "Calculating Page Size"; - KReportPageOptions rpo(d->m_reportDocument->page); + KReportPageOptions rpo(m_reportDocument->page); // This should reflect the information of the report page size - if (d->m_reportDocument->page.getPageSize() == QLatin1String("Custom")) { - d->m_maxWidth = d->m_reportDocument->page.getCustomWidth(); - d->m_maxHeight = d->m_reportDocument->page.getCustomHeight(); + if (m_reportDocument->page.getPageSize() == QLatin1String("Custom")) { + m_maxWidth = m_reportDocument->page.getCustomWidth(); + m_maxHeight = m_reportDocument->page.getCustomHeight(); } else { if (!label.isNull()) { - d->m_maxWidth = label.width(); - d->m_maxHeight = label.height(); + m_maxWidth = label.width(); + m_maxHeight = label.height(); rpo.setPageSize(label.paper()); } else { // lookup the correct size information for the specified size paper - QSizeF pageSizePx = d->m_reportDocument->page.pixelSize(); + QSizeF pageSizePx = m_reportDocument->page.pixelSize(); - d->m_maxWidth = pageSizePx.width(); - d->m_maxHeight = pageSizePx.height(); + m_maxWidth = pageSizePx.width(); + m_maxHeight = pageSizePx.height(); } } - if (!d->m_reportDocument->page.isPortrait()) { - qreal tmp = d->m_maxWidth; - d->m_maxWidth = d->m_maxHeight; - d->m_maxHeight = tmp; + if (!m_reportDocument->page.isPortrait()) { + qreal tmp = m_maxWidth; + m_maxWidth = m_maxHeight; + m_maxHeight = tmp; } - //kreportDebug() << "Page Size:" << d->m_maxWidth << d->m_maxHeight; + //kreportDebug() << "Page Size:" << m_maxWidth << m_maxHeight; - d->m_document->setPageOptions(rpo); - d->m_kodata->setSorting(d->m_reportDocument->m_detailSection->m_sortedFields); - d->m_kodata->open(); + m_document->setPageOptions(rpo); + m_kodata->setSorting(m_reportDocument->m_detailSection->m_sortedFields); + if (!m_kodata->open()) { + return false; + } -#ifdef KREPORT_SCRIPTING - d->initEngine(); - connect(d->m_scriptHandler, SIGNAL(groupChanged(QMap)), + #ifdef KREPORT_SCRIPTING + initEngine(); + connect(m_scriptHandler, SIGNAL(groupChanged(QMap)), this, SIGNAL(groupChanged(QMap))); //Loop through all abjects that have been registered, and register them with the script handler - if (d->m_scriptHandler) { - QMapIterator i(d->m_scriptObjects); + if (m_scriptHandler) { + QMapIterator i(m_scriptObjects); while (i.hasNext()) { i.next(); - d->m_scriptHandler->registerScriptObject(i.value(), i.key()); + m_scriptHandler->registerScriptObject(i.value(), i.key()); } //execute the script, if it fails, abort and return the empty document - if (!d->m_scriptHandler->trigger()) { - d->m_scriptHandler->displayErrors(); - return d->m_document; + if (!m_scriptHandler->trigger()) { + m_scriptHandler->displayErrors(); + return m_document; } } -#endif + #endif - d->createNewPage(); + createNewPage(); if (!label.isNull()) { -// Label Print Run + // Label Print Run // remember the initial margin setting as we will be modifying // the value and restoring it as we move around - qreal margin = d->m_leftMargin; + qreal margin = m_leftMargin; - d->m_yOffset = d->m_topMargin; + m_yOffset = m_topMargin; qreal w = (label.width() / 100.0); qreal wg = (label.xGap() / 100.0); @@ -528,92 +514,135 @@ qreal tmp; // flip the value around if we are printing landscape - if (!d->m_reportDocument->page.isPortrait()) { + if (!m_reportDocument->page.isPortrait()) { w = (label.height() / 100.0); wg = (label.yGap() / 100.0); h = (label.width() / 100.0); hg = (label.xGap() / 100.0); numCols = label.rows(); numRows = label.columns(); } - KReportDetailSectionData * detailData = d->m_reportDocument->m_detailSection; + KReportDetailSectionData * detailData = m_reportDocument->m_detailSection; if (detailData->m_detailSection) { - KReportData *mydata = d->m_kodata; + KReportData *mydata = m_kodata; if (mydata && mydata->recordCount() > 0) { /* && !((query = orqThis->getQuery())->eof()))*/ - mydata->moveFirst(); + if (!mydata->moveFirst()) { + return false; + } int row = 0; int col = 0; do { - tmp = d->m_yOffset; // store the value as renderSection changes it - d->renderSection(*(detailData->m_detailSection)); - d->m_yOffset = tmp; // restore the value that renderSection modified + tmp = m_yOffset; // store the value as renderSection changes it + renderSection(*(detailData->m_detailSection)); + m_yOffset = tmp; // restore the value that renderSection modified col++; - d->m_leftMargin += w + wg; + m_leftMargin += w + wg; if (col >= numCols) { - d->m_leftMargin = margin; // reset back to original value + m_leftMargin = margin; // reset back to original value col = 0; row++; - d->m_yOffset += h + hg; + m_yOffset += h + hg; if (row >= numRows) { - d->m_yOffset = d->m_topMargin; + m_yOffset = m_topMargin; row = 0; - d->createNewPage(); + createNewPage(); } } } while (mydata->moveNext()); } } } else { -// Normal Print Run - if (d->m_reportDocument->m_reportHeader) { - d->renderSection(*(d->m_reportDocument->m_reportHeader)); + // Normal Print Run + if (m_reportDocument->m_reportHeader) { + renderSection(*(m_reportDocument->m_reportHeader)); } - if (d->m_reportDocument->m_detailSection) { - d->renderDetailSection(d->m_reportDocument->m_detailSection); + if (m_reportDocument->m_detailSection) { + renderDetailSection(m_reportDocument->m_detailSection); } - if (d->m_reportDocument->m_reportFooter) { - if (d->renderSectionSize(*(d->m_reportDocument->m_reportFooter)) + d->finishCurPageSize(true) + d->m_bottomMargin + d->m_yOffset >= d->m_maxHeight) { - d->createNewPage(); + if (m_reportDocument->m_reportFooter) { + if (renderSectionSize(*(m_reportDocument->m_reportFooter)) + finishCurPageSize(true) + m_bottomMargin + m_yOffset >= m_maxHeight) { + createNewPage(); } - d->renderSection(*(d->m_reportDocument->m_reportFooter)); + renderSection(*(m_reportDocument->m_reportFooter)); } } - d->finishCurPage(true); + finishCurPage(true); -#ifdef KREPORT_SCRIPTING + #ifdef KREPORT_SCRIPTING // _postProcText contains those text boxes that need to be updated // with information that wasn't available at the time it was added to the document - d->m_scriptHandler->setPageTotal(d->m_document->pages()); + m_scriptHandler->setPageTotal(m_document->pages()); - for (int i = 0; i < d->m_postProcText.size(); i++) { - OROTextBox * tb = d->m_postProcText.at(i); + for (int i = 0; i < m_postProcText.size(); i++) { + OROTextBox * tb = m_postProcText.at(i); - d->m_scriptHandler->setPageNumber(tb->page()->page() + 1); + m_scriptHandler->setPageNumber(tb->page()->page() + 1); - tb->setText(d->m_scriptHandler->evaluate(tb->text()).toString()); + tb->setText(m_scriptHandler->evaluate(tb->text()).toString()); } -#endif + #endif - d->asyncManager->startRendering(); + asyncManager->startRendering(); -#ifdef KREPORT_SCRIPTING - d->m_scriptHandler->displayErrors(); -#endif + #ifdef KREPORT_SCRIPTING + m_scriptHandler->displayErrors(); + #endif - d->m_kodata->close(); -#ifdef KREPORT_SCRIPTING - delete d->m_scriptHandler; - d->m_scriptHandler = 0; -#endif - //! @todo check ownership delete d->m_kodata; - d->m_postProcText.clear(); + if (!m_kodata->close()) { + return false; + } + #ifdef KREPORT_SCRIPTING + delete m_scriptHandler; + #endif + //delete m_kodata; + m_postProcText.clear(); + + return true; +} + +//===========================KReportPreRenderer=============================== + +KReportPreRenderer::KReportPreRenderer(const QDomElement & document) + : d(new KReportPreRendererPrivate()) +{ + setDocument(document); +} + +KReportPreRenderer::~KReportPreRenderer() +{ + delete d; +} + +void KReportPreRenderer::setName(const QString &n) +{ + d->m_reportDocument->setName(n); +} +bool KReportPreRenderer::isValid() const +{ + if (d && d->m_valid) + return true; + return false; +} + +ORODocument* KReportPreRenderer::document() +{ + return d->m_document; +} + +bool KReportPreRenderer::generateDocument() +{ +// delete d->m_document; + if (!d->generateDocument()) { + delete d->m_document; + d->m_document = 0; + } return d->m_document; } @@ -639,13 +668,6 @@ return isValid(); } -bool KReportPreRenderer::isValid() const -{ - if (d && d->m_valid) - return true; - return false; -} - #ifdef KREPORT_SCRIPTING void KReportPreRenderer::registerScriptObject(QObject* obj, const QString& name) { diff --git a/src/renderer/KReportPreRenderer_p.h b/src/renderer/KReportPreRenderer_p.h --- a/src/renderer/KReportPreRenderer_p.h +++ b/src/renderer/KReportPreRenderer_p.h @@ -81,6 +81,10 @@ void initEngine(); #endif + //! Generates m_document. Returns true on success. + //! @note m_document is not removed on failure, caller should remove it. + bool generateDocument(); + KReportPrivate::AsyncItemManager* asyncManager; private Q_SLOTS: