//copyright : (C) 2002-2004 InfoSiAL S.L. //email : [email protected] void MReportEngine::drawAddOnHeader(MPageCollection *pages, int level, QPtrList<QMemArray<double> > *gDT, QValueVector<QString> *gDTS) { MReportSection *header = findAddOnHeader(level); if (header) { QDomNode record = records.item(currRecord_); if (!header->mustBeDrawed(&record)) return; header->setPageNumber(currPage); header->setReportDate(currDate); if ((currY + header->getHeight()) > currHeight) newPage(pages); QString value; QDomNamedNodeMap fields = record.attributes(); for (int i = 0; i < header->getFieldCount(); i++) { value = fields.namedItem(header->getFieldName(i)).nodeValue(); header->setFieldData(i, value, &record, fillRecords_); } if (gDT && level > -1) header->setCalcFieldData(gDT, gDTS, &record, fillRecords_); header->setCalcFieldDataGT(grandTotal); int sectionHeight = header->getHeight(); header->draw(p, leftMargin, currY, sectionHeight); currY += sectionHeight; } }
//copyright : (C) 2002-2004 InfoSiAL S.L. //email : [email protected] void MReportEngine::drawDetailHeader(MPageCollection *pages, int level) { MReportSection *header = findDetailHeader(level); if (header) { QDomNode record = records.item(currRecord_); if (!header->mustBeDrawed(&record)) return; header->setPageNumber(currPage); header->setReportDate(currDate); if ((currY + header->getHeight()) > currHeight) newPage(pages); QString value; QDomNamedNodeMap fields = record.attributes(); for (int i = 0; i < header->getFieldCount(); i++) { value = fields.namedItem(header->getFieldName(i)).nodeValue(); header->setFieldData(i, value, &record, fillRecords_); } header->setCalcFieldData(0, 0, &record, fillRecords_); int sectionHeight = header->getHeight(); header->draw(p, leftMargin, currY, sectionHeight); header->setLastPageIndex(pages->getCurrentIndex()); header->setOnPage((QPicture *) p->painter()->device()); currY += sectionHeight; } }
//copyright : (C) 2002-2004 InfoSiAL S.L. //email : [email protected] void MReportEngine::drawDetailFooter( MPageCollection * pages, int level, QPtrList < QMemArray < double > > *gDT, QValueVector < QString > *gDTS ) { MReportSection * footer = findDetailFooter( level ); MReportSection * header = findDetailHeader( level ); if ( footer ) { QDomNode record = records.item( currRecord_ ); if ( !footer->mustBeDrawed( &record ) ) return ; footer->setPageNumber( currPage ); footer->setReportDate( currDate ); if (( currY + footer->getHeight() ) > currHeight ) newPage( pages ); if ( gDT ) footer->setCalcFieldData( gDT, gDTS, &record ); if ( header ) footer->drawHeaderObjects( p, pages, header ); int sectionHeight = footer->getHeight(); if ( footer->placeAtBottom() ) footer->draw( p, leftMargin, ( pageHeight - bottomMargin - pFooter->getHeight() ) - footer->getHeight(), sectionHeight ); else footer->draw( p, leftMargin, currY, sectionHeight ); currY += sectionHeight; } }
bool MReportEngine::canDrawDetailHeader(uint level, uint currRecord, uint yPos) { int headerHeight = 0; MReportSection *header = findDetailHeader(level); if (header) headerHeight = header->getHeight(); if (!canDrawDetail(level, currRecord, (yPos + headerHeight))) return false; return true; }
bool MReportEngine::canDrawDetail(uint level, uint currRecord, uint yPos) { QDomNode nextRecord; QString detailValue; uint nextLevel; QDomNode record = records.item(currRecord); if ((currRecord + 1) < records.count()) { nextRecord = records.item(currRecord + 1); QDomNamedNodeMap nextFields = nextRecord.attributes(); detailValue = nextFields.namedItem("level").nodeValue(); nextLevel = detailValue.toInt(); } else nextLevel = 0; int detailHeight = 0; MReportSection *detail = findDetail(level); if (detail) { QDomNamedNodeMap fields = record.attributes(); setFieldValues(&fields, level, detail, &record, true); detailHeight = detail->getHeight(p); } int addOnFooterHeight = 0; MReportSection *addOnFooter = findAddOnFooter(level); if (addOnFooter) addOnFooterHeight = addOnFooter->getHeight(); // Control de fin de página if (level == nextLevel) { if ((yPos + detailHeight + addOnFooterHeight) > currHeight) { return false; } } else if (level > nextLevel) { // El siguiente nivel es inferior: Se comprueba que es posible incluir un detalle del nivel actual // más todas los pies de detalle desde el nivel actual hasta el siguiente nivel, // más el addOnFooter del siguiente nivel int footersHeight = 0; for (int levelFooter = level; levelFooter > nextLevel; levelFooter--) { MReportSection *footerAux = findDetailFooter(levelFooter); if (footerAux) footersHeight += footerAux->getHeight(); } int addOnFooterAuxHeight = 0; MReportSection *addOnFooterAux = findAddOnFooter(nextLevel); if (addOnFooterAux) addOnFooterAuxHeight = addOnFooterAux->getHeight(); if ((yPos + detailHeight + footersHeight + addOnFooterAuxHeight) > currHeight) { return false; } } else if (level < nextLevel) { // El siguiente nivel es superior: Se comprueba que es posible incluir un detalle del nivel actual // más todas las cabeceras de detalle desde el nivel actual hasta el siguiente nivel // más un detalle del siguiente nivel más el addOnFooter del siguiente nivel int headersHeight = 0; for (int levelFooter = (level + 1); levelFooter <= nextLevel; levelFooter++) { MReportSection *headerAux = findDetailHeader(levelFooter); if (headerAux) headersHeight += headerAux->getHeight(); } MReportSection *detailAux = findDetail(nextLevel); if (detailAux) headersHeight += detailAux->getHeight(); int addOnFooterAuxHeight = 0; MReportSection *addOnFooterAux = findAddOnFooter(nextLevel); if (addOnFooterAux) addOnFooterAuxHeight = addOnFooterAux->getHeight(); if ((currY + detailHeight + headersHeight + addOnFooterAuxHeight) > currHeight) { return false; } } return true; }
//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); }