/** Renders the report as a page collection - the caller * is responsible for de-allocating the returned * collection * * copyright : (C) 2002-2008 InfoSiAL S.L. * email : [email protected] * */ MPageCollection * MReportEngine::renderReport( int initRow, int initCol ) { cancelRender = false; csvData_ = ""; p->setStyleName( styleName_ ); // Create the page collection MPageCollection *pages = new MPageCollection; // Initialize the basic page data currHeight = pageHeight - ( bottomMargin + pFooter->getHeight() ); currPage = 0; currDate = QDate::currentDate(); // Initialize the grand total array grandTotal->clear(); for ( int i = 0; i < rFooter->getCalcFieldCount(); i++ ) grandTotal->append( new QMemArray < double > ); // Create the first page startPage( pages ); unsigned int rowCount = records.length(); if ( rowCount <= 1 ) rowCount = 2; uint nRecord = 0; // Draw the details drawDetail( pages, 0, nRecord, initRow, initCol ); // Finish the last page of the report endPage( pages ); // Destroy the page painter p->painter()->end(); // Set the page collection attributes pages->setPageDimensions( QSize( pageWidth, pageHeight ) ); pages->setPageSize( pageSize ); pages->setPageOrientation( pageOrientation ); pages->setPrintToPos( printToPos ); // Send final status emit signalRenderStatus( rowCount / 2 ); return pages; }
//copyright : (C) 2002-2004 InfoSiAL S.L. //email : [email protected] void MReportEngine::drawDetail(MPageCollection *pages, int level, uint &currRecord, const int initRow, const int initCol) { currRecord_ = currRecord; QString detailValue; int nextLevel; int detailHeight = 0; MReportSection *detail = findDetail(level); MReportSection *footer; if (detail) detailHeight = detail->getHeight(); if (!canDrawDetailHeader(level, currRecord, currY)) { if (level > 0) drawAddOnFooter(pages, (level - 1), gDTFooters[(level - 1)], gDTSFooters[(level - 1)]); newPage(pages, level); // Sólo dibujamos el detail header si no hemos dibujado ya el addOnHeader if (!findAddOnHeader(level)) drawDetailHeader(pages, level); } else { drawDetailHeader(pages, level); } if (!detail) { drawDetailFooter(pages, level); return; } gDTFooters[level]->clear(); gDTSFooters[level]->clear(); int currLevel; int chkRow = 0; int loops = 0; if (initCol != 0) currX = leftMargin + (detail->getWidth() * (initCol - 1)); if (initRow != 0) currY = topMargin + (detail->getHeight() * (initRow - 1)); currLevel = level; do { QDomNode record = records.item(currRecord); if (record.nodeType() == QDomNode::ElementNode) { if (currLevel == level) { if ((chkRow = (currRecord / 2) % 20) == 0) emit signalRenderStatus(currRecord / 2); if (cancelRender) { MLabelObject lblCancel; lblCancel.setFont("Arial", 20, MLabelObject::Bold, false); lblCancel.setText(tr("INFORME INCOMPLETO\nCANCELADO POR EL USUARIO")); lblCancel.setGeometry(20, pageHeight / 2, 450, 70); lblCancel.setHorizontalAlignment(MLabelObject::Center); lblCancel.setVerticalAlignment(MLabelObject::Middle); lblCancel.draw(p); return; } QDomNamedNodeMap fields = record.attributes(); reserveSizeForCalcFields(&fields, level); detail->setPageNumber(currPage); detail->setReportDate(currDate); if (!canDrawDetail(level, currRecord, currY)) { if (loops) { drawAddOnFooter(pages, level, gDTFooters[level], gDTSFooters[level]); } else { if (level > 0) { drawAddOnFooter(pages, (level - 1), gDTFooters[(level - 1)], gDTSFooters[(level - 1)]); } } newPage(pages, level); } QDomNode record = records.item(currRecord); QDomNode *ptrRecord = &record; setFieldValues(&fields, level, detail, ptrRecord); if (detail->mustBeDrawed(ptrRecord)) { detail->setCalcFieldData(0, 0, ptrRecord, fillRecords_); int sectionHeight = detail->getHeight(); detail->draw(p, currX, currY, sectionHeight); detailHeight = sectionHeight; currX += detail->getWidth(); if (currX >= (pageWidth - rightMargin - leftMargin)) { currX = leftMargin; currY += sectionHeight; } MReportSection *rS = findDetail(level + 1); if (!rS) { for (uint i = 0; i <= level; i++) { rS = findDetailHeader(i); if (rS) csvData_ += rS->csvData(); rS = findDetail(i); if (rS) csvData_ += rS->csvData(); } csvData_ += "\n"; } } ++currRecord; } else { drawDetail(pages, currLevel, currRecord); } if (currRecord < records.count()) { record = records.item(currRecord); QDomNamedNodeMap fields = record.attributes(); detailValue = fields.namedItem("level").nodeValue(); currLevel = detailValue.toInt(); } if (cancelRender) { MLabelObject lblCancel; lblCancel.setFont("Arial", 20, MLabelObject::Bold, false); lblCancel.setText(tr("INFORME INCOMPLETO\nCANCELADO POR EL USUARIO")); lblCancel.setGeometry(20, pageHeight / 2, 450, 70); lblCancel.setHorizontalAlignment(MLabelObject::Center); lblCancel.setVerticalAlignment(MLabelObject::Middle); lblCancel.draw(p); return; } } loops++; } while (level <= currLevel && currRecord < records.count()); drawDetailFooter(pages, level, gDTFooters[level], gDTSFooters[level]); footer = findDetailFooter(level); if (footer && currRecord < records.count()) if (footer->newPage()) newPage(pages); }
/** Renders the report as a page collection - the caller * is responsible for de-allocating the returned * collection * * copyright : (C) 2002-2008 InfoSiAL S.L. * email : [email protected] * */ MPageCollection *MReportEngine::renderReport(int initRow, int initCol, MPageCollection *pages, uint flags) { fillRecords_ = flags & MReportEngine::FillRecords; bool pageBreak = flags & MReportEngine::PageBreak; bool append = flags & MReportEngine::Append; cancelRender = false; currRecord_ = 0; csvData_ = QString::null; p->setStyleName(styleName_); // Create the page collection QPicture *currentPage = 0; QPicture *currentPageCopy = 0; bool lastPageFound = false; if (pages == 0) { pages = new MPageCollection(this); currPage = 0; } else { if (append && !pageBreak) { currX = leftMargin ; lastPageFound = true; currentPage = pages->getLastPage(); p->painter()->end(); currentPageCopy = new QPicture(*currentPage); p->painter()->begin(currentPage); currentPageCopy->play(p->painter()); delete currentPageCopy; } } // Initialize the basic page data currHeight = pageHeight - (bottomMargin + pFooter->getHeight()); currDate = QDate::currentDate(); // Initialize the grand total array clearGrantTotals(); for (int i = 0; i < rFooter->getCalcFieldCount(); i++) grandTotal->append(new QMemArray<double>); // Create the first page if (!lastPageFound) startPage(pages); unsigned int rowCount = records.length(); if (rowCount <= 1) rowCount = 2; uint nRecord = 0; // Draw the details drawDetail(pages, 0, nRecord, initRow, initCol); // Finish the last page of the report endPage(pages); // Destroy the page painter p->painter()->end(); // Set the page collection attributes pages->setPageDimensions(QSize(pageWidth, pageHeight)); pages->setPageSize(pageSize); pages->setPageOrientation(pageOrientation); pages->setPrintToPos(printToPos); fillRecords_ = false; // Send final status emit signalRenderStatus(rowCount / 2); return pages; }