// Draws de add-on footer void MReportEngine::drawAddOnFooter( MPageCollection * pages, int level, QPtrList < QMemArray < double > > *gDT, QValueVector < QString > *gDTS ) { MReportSection * footer = findAddOnFooter( 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 ); */ QString value; QDomNamedNodeMap fields = record.attributes(); for ( int i = 0; i < footer->getFieldCount(); i++ ) { value = fields.namedItem( footer->getFieldName( i ) ).nodeValue(); footer->setFieldData( i, value ); } if ( gDT && level > -1 ) footer->setCalcFieldData( gDT, gDTS, &record ); footer->setCalcFieldDataGT( grandTotal, rFooter ); int sectionHeight = footer->getHeight(); footer->draw( p, leftMargin, currY, sectionHeight ); currY += sectionHeight; } }
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; }