diff --git a/src/common/KReportDetailSectionData.cpp b/src/common/KReportDetailSectionData.cpp
index d7561988..873e8f49 100644
--- a/src/common/KReportDetailSectionData.cpp
+++ b/src/common/KReportDetailSectionData.cpp
@@ -1,123 +1,123 @@
/* This file is part of the KDE project
* Copyright (C) 2001-2007 by OpenMFG, LLC (info@openmfg.com)
* Copyright (C) 2007-2008 by Adam Pigg (adam@piggz.co.uk)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*/
#include "KReportDetailSectionData.h"
#include "KReportSectionData.h"
#include "KReportDocument.h"
#include "kreport_debug.h"
#include
KReportDetailSectionData::KReportDetailSectionData(QObject *parent)
: QObject(parent)
{
- m_pageBreak = BreakNone;
- m_detailSection = nullptr;
+ pageBreak = PageBreak::None;
+ detailSection = nullptr;
m_valid = true;
}
KReportDetailSectionData::KReportDetailSectionData(const QDomElement &elemSource, KReportDocument *report)
: QObject(report)
{
- m_pageBreak = BreakNone;
- m_detailSection = nullptr;
+ pageBreak = PageBreak::None;
+ detailSection = nullptr;
m_valid = false;
//kreportDebug() << elemSource.tagName();
if (elemSource.tagName() != QLatin1String("report:detail")) {
return;
}
QDomNodeList sections = elemSource.childNodes();
for (int nodeCounter = 0; nodeCounter < sections.count(); nodeCounter++) {
QDomElement elemThis = sections.item(nodeCounter).toElement();
if (elemThis.tagName() == QLatin1String("report:group")) {
KReportDetailGroupSectionData * dgsd = new KReportDetailGroupSectionData();
if ( elemThis.hasAttribute( QLatin1String("report:group-column") ) ) {
- dgsd->m_column = elemThis.attribute( QLatin1String("report:group-column") );
+ dgsd->column = elemThis.attribute( QLatin1String("report:group-column") );
}
if ( elemThis.hasAttribute( QLatin1String("report:group-page-break") ) ) {
QString s = elemThis.attribute( QLatin1String("report:group-page-break") );
if ( s == QLatin1String("after-footer") ) {
- dgsd->m_pagebreak = KReportDetailGroupSectionData::BreakAfterGroupFooter;
+ dgsd->pagebreak = KReportDetailGroupSectionData::PageBreak::AfterGroupFooter;
} else if ( s == QLatin1String("before-header") ) {
- dgsd->m_pagebreak = KReportDetailGroupSectionData::BreakBeforeGroupHeader;
+ dgsd->pagebreak = KReportDetailGroupSectionData::PageBreak::BeforeGroupHeader;
} else {
- dgsd->m_pagebreak = KReportDetailGroupSectionData::BreakNone;
+ dgsd->pagebreak = KReportDetailGroupSectionData::PageBreak::None;
}
}
if (elemThis.attribute(QLatin1String("report:group-sort"), QLatin1String("ascending")) == QLatin1String("ascending")) {
dgsd->m_sort = Qt::AscendingOrder;
} else {
dgsd->m_sort = Qt::DescendingOrder;
}
for ( QDomElement e = elemThis.firstChildElement( QLatin1String("report:section") ); ! e.isNull(); e = e.nextSiblingElement( QLatin1String("report:section") ) ) {
QString s = e.attribute( QLatin1String("report:section-type") );
if ( s == QLatin1String("group-header") ) {
KReportSectionData * sd = new KReportSectionData(e, report);
if (sd->isValid()) {
- dgsd->m_groupHeader = sd;
+ dgsd->groupHeader = sd;
} else {
delete sd;
}
} else if ( s == QLatin1String("group-footer") ) {
KReportSectionData * sd = new KReportSectionData(e, report);
if (sd->isValid()) {
- dgsd->m_groupFooter = sd;
+ dgsd->groupFooter = sd;
} else {
delete sd;
}
}
}
- m_groupList.append(dgsd);
+ groupList.append(dgsd);
KReportDataSource::SortedField s;
- s.setField(dgsd->m_column);
+ s.setField(dgsd->column);
s.setOrder(dgsd->m_sort);
- m_sortedFields.append(s);
+ sortedFields.append(s);
} else if (elemThis.tagName() == QLatin1String("report:section") && elemThis.attribute(QLatin1String("report:section-type")) == QLatin1String("detail")) {
KReportSectionData * sd = new KReportSectionData(elemThis, report);
if (sd->isValid()) {
- m_detailSection = sd;
+ detailSection = sd;
} else
delete sd;
} else {
kreportWarning() << "While parsing detail section encountered an unknown element: " << elemThis.tagName();
}
}
m_valid = true;
}
KReportDetailSectionData::~KReportDetailSectionData()
{
}
KReportDetailGroupSectionData::KReportDetailGroupSectionData()
{
- m_pagebreak = BreakNone;
+ pagebreak = PageBreak::None;
m_sort = Qt::AscendingOrder;
- m_groupHeader = nullptr;
- m_groupFooter = nullptr;
+ groupHeader = nullptr;
+ groupFooter = nullptr;
}
diff --git a/src/common/KReportDetailSectionData.h b/src/common/KReportDetailSectionData.h
index 1f3d6b09..c2f2ea72 100644
--- a/src/common/KReportDetailSectionData.h
+++ b/src/common/KReportDetailSectionData.h
@@ -1,83 +1,82 @@
/* This file is part of the KDE project
* Copyright (C) 2001-2007 by OpenMFG, LLC (info@openmfg.com)
* Copyright (C) 2007-2008 by Adam Pigg (adam@piggz.co.uk)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*/
#ifndef KREPORTDETAILSECTIONDATA_H
#define KREPORTDETAILSECTIONDATA_H
#include
#include "KReportDataSource.h"
class KReportSectionData;
class KReportDetailGroupSectionData;
class KReportDocument;
class QDomElement;
/**
*/
class KReportDetailSectionData : public QObject
{
Q_OBJECT
public:
explicit KReportDetailSectionData(QObject *parent = nullptr);
KReportDetailSectionData(const QDomElement &elemSource, KReportDocument *report);
~KReportDetailSectionData() override;
- enum PageBreak {
- BreakNone = 0,
- BreakAtEnd = 1
+ enum class PageBreak {
+ None,
+ AtEnd
};
- QString m_name;
- int m_pageBreak;
- QList m_sortedFields;
+ QString name;
+ PageBreak pageBreak;
+ QList sortedFields;
- KReportSectionData * m_detailSection;
+ KReportSectionData *detailSection;
- QList m_groupList;
+ QList groupList;
bool isValid() const {
return m_valid;
}
private:
bool m_valid;
};
class KReportDetailGroupSectionData
{
public:
KReportDetailGroupSectionData();
- enum PageBreak {
- BreakNone = 0,
- BreakAfterGroupFooter = 1,
- BreakBeforeGroupHeader = 2
+ enum class PageBreak {
+ None,
+ AfterGroupFooter,
+ BeforeGroupHeader
};
- //QString name;
- QString m_column;
- PageBreak m_pagebreak;
+ QString column;
+ PageBreak pagebreak;
Qt::SortOrder m_sort;
- KReportSectionData *m_groupHeader;
- KReportSectionData *m_groupFooter;
+ KReportSectionData *groupHeader;
+ KReportSectionData *groupFooter;
};
#endif
diff --git a/src/common/KReportDocument.cpp b/src/common/KReportDocument.cpp
index ac55b12a..8101c273 100644
--- a/src/common/KReportDocument.cpp
+++ b/src/common/KReportDocument.cpp
@@ -1,384 +1,384 @@
/* This file is part of the KDE project
* Copyright (C) 2007-2008 by Adam Pigg (adam@piggz.co.uk)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*/
#include "KReportDocument.h"
#include "KReportUnit.h"
#include "KReportDetailSectionData.h"
#include "KReportItemBase.h"
#include "KReportUtils_p.h"
#include "KReportPageSize.h"
#include
#include
#include "kreport_debug.h"
class Q_DECL_HIDDEN KReportDocument::Private
{
public:
bool valid;
QString title;
QString name;
QString query;
#ifdef KREPORT_SCRIPTING
QString script;
QString interpreter;
#endif
bool externalData;
KReportPrivate::PageLayout pageLayout;
QString pageSize;
QString labelType;
};
void KReportDocument::init()
{
m_pageHeaderFirst = m_pageHeaderOdd = m_pageHeaderEven = m_pageHeaderLast = m_pageHeaderAny = nullptr;
m_pageFooterFirst = m_pageFooterOdd = m_pageFooterEven = m_pageFooterLast = m_pageFooterAny = nullptr;
m_reportHeader = m_reportFooter = nullptr;
}
KReportDocument::KReportDocument(QObject *parent)
: QObject(parent),
m_detailSection(nullptr),
d(new Private())
{
init();
d->valid = true;
}
KReportDocument::KReportDocument(const QDomElement & elemSource, QObject *parent)
: QObject(parent),
m_detailSection(nullptr),
d(new Private())
{
d->valid = false;
init();
//kreportDebug();
if (elemSource.tagName() != QLatin1String("report:content")) {
kreportWarning() << "QDomElement is not tag"
<< elemSource.text();
return;
}
QDomNodeList sections = elemSource.childNodes();
for (int nodeCounter = 0; nodeCounter < sections.count(); nodeCounter++) {
QDomElement elemThis = sections.item(nodeCounter).toElement();
if (elemThis.tagName() == QLatin1String("report:title")) {
d->title = elemThis.text();
#ifdef KREPORT_SCRIPTING
} else if (elemThis.tagName() == QLatin1String("report:script")) {
d->script = elemThis.text();
d->interpreter = elemThis.attribute(QLatin1String("report:script-interpreter"));
#endif
} else if (elemThis.tagName() == QLatin1String("report:page-style")) {
QString pagetype = elemThis.firstChild().nodeValue();
//Full page mode is required to allow margins to be set to whatever the user has specified
d->pageLayout.setMode(QPageLayout::FullPageMode);
if (pagetype == QLatin1String("predefined")) {
setPageSize(elemThis.attribute(QLatin1String("report:page-size"), QLatin1String("A4")));
d->pageLayout.setPageSize(QPageSize(KReportPageSize::pageSize(pageSize())));
} else if (pagetype == QLatin1String("custom")) {
QPageSize custom(QSize(elemThis.attribute(QLatin1String("report:custom-page-width"), QString()).toFloat() , elemThis.attribute(QLatin1String("report:custom-page-height"), QString()).toFloat()), QLatin1String("Custom"));
d->pageLayout.setPageSize(custom);
} else if (pagetype == QLatin1String("label")) {
setLabelType(elemThis.firstChild().nodeValue());
}
//! @todo add config for default margins or add within templates support
d->pageLayout.setUnits(QPageLayout::Point);
d->pageLayout.setLeftMargin(KReportUnit::parseValue(elemThis.attribute(QLatin1String("fo:margin-left"), QLatin1String("1.0cm"))));
d->pageLayout.setRightMargin(KReportUnit::parseValue(elemThis.attribute(QLatin1String("fo:margin-right"), QLatin1String("1.0cm"))));
d->pageLayout.setTopMargin(KReportUnit::parseValue(elemThis.attribute(QLatin1String("fo:margin-top"), QLatin1String("1.0cm"))));
d->pageLayout.setBottomMargin(KReportUnit::parseValue(elemThis.attribute(QLatin1String("fo:margin-bottom"), QLatin1String("1.0cm"))));
d->pageLayout.setOrientation(elemThis.attribute(QLatin1String("report:print-orientation"), QLatin1String("portrait")) == QLatin1String("portrait") ? QPageLayout::Portrait : QPageLayout::Landscape);
} else if (elemThis.tagName() == QLatin1String("report:body")) {
QDomNodeList sectionlist = elemThis.childNodes();
QDomNode sec;
for (int s = 0; s < sectionlist.count(); ++s) {
sec = sectionlist.item(s);
if (sec.isElement()) {
QString sn = sec.nodeName().toLower();
//kreportDebug() << sn;
if (sn == QLatin1String("report:section")) {
KReportSectionData * sd = new KReportSectionData(sec.toElement(), this);
if (!sd->isValid()) {
kreportDebug() << "Invalid section";
delete sd;
} else {
//kreportDebug() << "Adding section of type " << sd->type();
switch (sd->type()) {
case KReportSectionData::PageHeaderFirst:
m_pageHeaderFirst = sd;
break;
case KReportSectionData::PageHeaderOdd:
m_pageHeaderOdd = sd;
break;
case KReportSectionData::PageHeaderEven:
m_pageHeaderEven = sd;
break;
case KReportSectionData::PageHeaderLast:
m_pageHeaderLast = sd;
break;
case KReportSectionData::PageHeaderAny:
m_pageHeaderAny = sd;
break;
case KReportSectionData::ReportHeader:
m_reportHeader = sd;
break;
case KReportSectionData::ReportFooter:
m_reportFooter = sd;
break;
case KReportSectionData::PageFooterFirst:
m_pageFooterFirst = sd;
break;
case KReportSectionData::PageFooterOdd:
m_pageFooterOdd = sd;
break;
case KReportSectionData::PageFooterEven:
m_pageFooterEven = sd;
break;
case KReportSectionData::PageFooterLast:
m_pageFooterLast = sd;
break;
case KReportSectionData::PageFooterAny:
m_pageFooterAny = sd;
break;
default:
;
}
}
} else if (sn == QLatin1String("report:detail")) {
KReportDetailSectionData * dsd = new KReportDetailSectionData(sec.toElement(), this);
if (dsd->isValid()) {
m_detailSection = dsd;
} else {
kreportDebug() << "Invalid detail section";
delete dsd;
}
}
} else {
kreportWarning() << "Encountered an unknown Element: " << elemThis.tagName();
}
}
}
d->valid = true;
}
}
KReportDocument::~KReportDocument()
{
delete d;
}
QList KReportDocument::objects() const
{
QList obs;
for (int i = 1; i <= KReportSectionData::PageFooterAny; i++) {
KReportSectionData *sec = section((KReportSectionData::Section)i);
if (sec) {
obs << sec->objects();
}
}
if (m_detailSection) {
//kreportDebug() << "Number of groups: " << m_detailSection->m_groupList.count();
- foreach(KReportDetailGroupSectionData* g, m_detailSection->m_groupList) {
- if (g->m_groupHeader) {
- obs << g->m_groupHeader->objects();
+ foreach(KReportDetailGroupSectionData* g, m_detailSection->groupList) {
+ if (g->groupHeader) {
+ obs << g->groupHeader->objects();
}
- if (g->m_groupFooter) {
- obs << g->m_groupFooter->objects();
+ if (g->groupFooter) {
+ obs << g->groupFooter->objects();
}
}
- if (m_detailSection->m_detailSection)
- obs << m_detailSection->m_detailSection->objects();
+ if (m_detailSection->detailSection)
+ obs << m_detailSection->detailSection->objects();
}
/*kreportDebug() << "Object List:";
foreach(KReportItemBase* o, obs) {
kreportDebug() << o->entityName();
}*/
return obs;
}
KReportItemBase* KReportDocument::object(const QString& n) const
{
QList obs = objects();
foreach(KReportItemBase* o, obs) {
if (o->entityName() == n) {
return o;
}
}
return nullptr;
}
QList KReportDocument::sections() const
{
QList secs;
for (int i = 0; i < 12 ; ++i) {
KReportSectionData *sec = section((KReportSectionData::Section)(i + 1));
if (sec) {
secs << sec;
}
}
if (m_detailSection) {
//kreportDebug() << "Number of groups: " << m_detailSection->m_groupList.count();
- foreach(KReportDetailGroupSectionData* g, m_detailSection->m_groupList) {
- if (g->m_groupHeader) {
- secs << g->m_groupHeader;
+ foreach(KReportDetailGroupSectionData* g, m_detailSection->groupList) {
+ if (g->groupHeader) {
+ secs << g->groupHeader;
}
- if (g->m_groupFooter) {
- secs << g->m_groupFooter;
+ if (g->groupFooter) {
+ secs << g->groupFooter;
}
}
- if (m_detailSection->m_detailSection)
- secs << m_detailSection->m_detailSection;
+ if (m_detailSection->detailSection)
+ secs << m_detailSection->detailSection;
}
return secs;
}
KReportSectionData* KReportDocument::section(const QString& sn) const
{
QList secs = sections();
foreach(KReportSectionData *sec, secs) {
if (sec->name() == sn) {
return sec;
}
}
return nullptr;
}
KReportSectionData* KReportDocument::section(KReportSectionData::Section s) const
{
KReportSectionData *sec;
switch (s) {
case KReportSectionData::PageHeaderAny:
sec = m_pageHeaderAny;
break;
case KReportSectionData::PageHeaderEven:
sec = m_pageHeaderEven;
break;
case KReportSectionData::PageHeaderOdd:
sec = m_pageHeaderOdd;
break;
case KReportSectionData::PageHeaderFirst:
sec = m_pageHeaderFirst;
break;
case KReportSectionData::PageHeaderLast:
sec = m_pageHeaderLast;
break;
case KReportSectionData::PageFooterAny:
sec = m_pageFooterAny;
break;
case KReportSectionData::PageFooterEven:
sec = m_pageFooterEven;
break;
case KReportSectionData::PageFooterOdd:
sec = m_pageFooterOdd;
break;
case KReportSectionData::PageFooterFirst:
sec = m_pageFooterFirst;
break;
case KReportSectionData::PageFooterLast:
sec = m_pageFooterLast;
break;
case KReportSectionData::ReportHeader:
sec = m_reportHeader;
break;
case KReportSectionData::ReportFooter:
sec = m_reportFooter;
break;
default:
sec = nullptr;
}
return sec;
}
QPageLayout KReportDocument::pageLayout() const
{
return d->pageLayout;
}
bool KReportDocument::isValid() const
{
return d->valid;
}
QString KReportDocument::title() const
{
return d->title;
}
bool KReportDocument::externalData() const
{
return d->externalData;
}
QString KReportDocument::interpreter() const
{
return d->interpreter;
}
QString KReportDocument::name() const
{
return d->name;
}
void KReportDocument::setName(const QString& n)
{
d->name = n;
}
QString KReportDocument::query() const
{
return d->query;
}
QString KReportDocument::script() const
{
return d->script;
}
QString KReportDocument::pageSize()
{
return d->pageSize;
}
void KReportDocument::setPageSize(const QString& size)
{
d->pageSize = size;
}
QString KReportDocument::labelType() const
{
return d->labelType;
}
void KReportDocument::setLabelType(const QString& label)
{
d->labelType = label;
}
diff --git a/src/renderer/KReportPreRenderer.cpp b/src/renderer/KReportPreRenderer.cpp
index e21cd623..56bf0732 100644
--- a/src/renderer/KReportPreRenderer.cpp
+++ b/src/renderer/KReportPreRenderer.cpp
@@ -1,702 +1,702 @@
/* This file is part of the KDE project
* Copyright (C) 2001-2007 by OpenMFG, LLC (info@openmfg.com)
* Copyright (C) 2007-2008 by Adam Pigg (adam@piggz.co.uk)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*/
#include "KReportPreRenderer.h"
#include "KReportPreRenderer_p.h"
#include "KReportAsyncItemManager_p.h"
#include "KReportOneRecordDataSource_p.h"
#include "KReportRenderObjects.h"
#include "KReportDataSource.h"
#include "KReportItemBase.h"
#include "KReportDocument.h"
#include "KReportDetailSectionData.h"
#include "KReportLabelSizeInfo.h"
#include "KReportPageSize.h"
#include "KReportUtils_p.h"
#ifdef KREPORT_SCRIPTING
#include "scripting/KReportScriptHandler.h"
#include "scripting/KReportGroupTracker.h"
#endif
#include
#include
#include "kreport_debug.h"
KReportPreRendererPrivate::KReportPreRendererPrivate(KReportPreRenderer *preRenderer)
: m_preRenderer(preRenderer)
{
m_valid = false;
m_document = nullptr;
m_reportDocument = nullptr;
m_page = nullptr;
m_yOffset = 0.0;
m_topMargin = m_bottomMargin = 0.0;
m_leftMargin = m_rightMargin = 0.0;
m_pageCounter = 0;
m_maxHeight = m_maxWidth = 0.0;
m_oneRecord = new KReportPrivate::OneRecordDataSource();
m_dataSource = nullptr;
#ifdef KREPORT_SCRIPTING
m_scriptHandler = nullptr;
#endif
asyncManager = new KReportPrivate::AsyncItemManager(this);
connect(asyncManager, SIGNAL(finished()), this, SLOT(asyncItemsFinished()));
}
KReportPreRendererPrivate::~KReportPreRendererPrivate()
{
delete m_reportDocument;
delete m_document;
delete m_oneRecord;
m_postProcText.clear();
}
void KReportPreRendererPrivate::createNewPage()
{
//kreportDebug();
if (m_pageCounter > 0)
finishCurPage(false);
m_pageCounter++;
#ifdef KREPORT_SCRIPTING
//Update the page count script value
m_scriptHandler->setPageNumber(m_pageCounter);
m_scriptHandler->newPage();
#endif
m_page = new OROPage(nullptr);
m_document->addPage(m_page);
//! @todo calculate past page
bool lastPage = false;
m_yOffset = m_topMargin;
if (m_pageCounter == 1 && m_reportDocument->m_pageHeaderFirst)
renderSection(*(m_reportDocument->m_pageHeaderFirst));
else if (lastPage == true && m_reportDocument->m_pageHeaderLast)
renderSection(*(m_reportDocument->m_pageHeaderLast));
else if ((m_pageCounter % 2) == 1 && m_reportDocument->m_pageHeaderOdd)
renderSection(*(m_reportDocument->m_pageHeaderOdd));
else if ((m_pageCounter % 2) == 0 && m_reportDocument->m_pageHeaderAny)
renderSection(*(m_reportDocument->m_pageHeaderAny));
else if (m_reportDocument->m_pageHeaderAny)
renderSection(*(m_reportDocument->m_pageHeaderAny));
}
qreal KReportPreRendererPrivate::finishCurPageSize(bool lastPage)
{
qreal retval = 0.0;
if (lastPage && m_reportDocument->m_pageFooterLast)
retval = renderSectionSize(* (m_reportDocument->m_pageFooterLast));
else if (m_pageCounter == 1 && m_reportDocument->m_pageFooterFirst)
retval = renderSectionSize(* (m_reportDocument->m_pageFooterFirst));
else if ((m_pageCounter % 2) == 1 && m_reportDocument->m_pageFooterOdd)
retval = renderSectionSize(* (m_reportDocument->m_pageFooterOdd));
else if ((m_pageCounter % 2) == 0 && m_reportDocument->m_pageFooterEven)
retval = renderSectionSize(* (m_reportDocument->m_pageFooterEven));
else if (m_reportDocument->m_pageFooterAny)
retval = renderSectionSize(* (m_reportDocument->m_pageFooterAny));
//kreportDebug() << retval;
return retval;
}
qreal KReportPreRendererPrivate::finishCurPage(bool lastPage)
{
qreal offset = m_maxHeight - m_bottomMargin;
qreal retval = 0.0;
//kreportDebug() << offset;
if (lastPage && m_reportDocument->m_pageFooterLast) {
//kreportDebug() << "Last Footer";
m_yOffset = offset - renderSectionSize(* (m_reportDocument->m_pageFooterLast));
retval = renderSection(* (m_reportDocument->m_pageFooterLast));
} else if (m_pageCounter == 1 && m_reportDocument->m_pageFooterFirst) {
//kreportDebug() << "First Footer";
m_yOffset = offset - renderSectionSize(* (m_reportDocument->m_pageFooterFirst));
retval = renderSection(* (m_reportDocument->m_pageFooterFirst));
} else if ((m_pageCounter % 2) == 1 && m_reportDocument->m_pageFooterOdd) {
//kreportDebug() << "Odd Footer";
m_yOffset = offset - renderSectionSize(* (m_reportDocument->m_pageFooterOdd));
retval = renderSection(* (m_reportDocument->m_pageFooterOdd));
} else if ((m_pageCounter % 2) == 0 && m_reportDocument->m_pageFooterEven) {
//kreportDebug() << "Even Footer";
m_yOffset = offset - renderSectionSize(* (m_reportDocument->m_pageFooterEven));
retval = renderSection(* (m_reportDocument->m_pageFooterEven));
} else if (m_reportDocument->m_pageFooterAny) {
//kreportDebug() << "Any Footer";
m_yOffset = offset - renderSectionSize(* (m_reportDocument->m_pageFooterAny));
retval = renderSection(* (m_reportDocument->m_pageFooterAny));
}
return retval;
}
void KReportPreRendererPrivate::renderDetailSection(KReportDetailSectionData *detailData)
{
- if (detailData->m_detailSection) {
+ if (detailData->detailSection) {
if (m_dataSource/* && !curs->eof()*/) {
QStringList keys;
QStringList keyValues;
QList shownGroups;
KReportDetailGroupSectionData * grp = nullptr;
bool status = m_dataSource->moveFirst();
int recordCount = m_dataSource->recordCount();
//kreportDebug() << "Record Count:" << recordCount;
- for (int i = 0; i < (int) detailData->m_groupList.count(); ++i) {
- grp = detailData->m_groupList[i];
+ for (int i = 0; i < (int) detailData->groupList.count(); ++i) {
+ grp = detailData->groupList[i];
//If the group has a header or footer, then emit a change of group value
- if(grp->m_groupFooter || grp->m_groupHeader) {
+ if(grp->groupFooter || grp->groupHeader) {
// we get here only if group is *shown*
shownGroups << i;
- keys.append(grp->m_column);
+ keys.append(grp->column);
if (!keys.last().isEmpty())
keyValues.append(m_dataSource->value(m_dataSource->fieldNumber(keys.last())).toString());
else
keyValues.append(QString());
//Tell interested parties we're about to render a header
emit(enteredGroup(keys.last(), keyValues.last()));
}
- if (grp->m_groupHeader)
- renderSection(*(grp->m_groupHeader));
+ if (grp->groupHeader)
+ renderSection(*(grp->groupHeader));
}
while (status) {
const qint64 pos = m_dataSource->at();
//kreportDebug() << "At:" << l << "Y:" << m_yOffset << "Max Height:" << m_maxHeight;
- if ((renderSectionSize(*detailData->m_detailSection)
+ if ((renderSectionSize(*detailData->detailSection)
+ finishCurPageSize((pos + 1 == recordCount))
+ m_bottomMargin + m_yOffset) >= m_maxHeight)
{
//kreportDebug() << "Next section is too big for this page";
if (pos > 0) {
m_dataSource->movePrevious();
createNewPage();
m_dataSource->moveNext();
}
}
- renderSection(*(detailData->m_detailSection));
+ renderSection(*(detailData->detailSection));
status = m_dataSource->moveNext();
if (status == true && keys.count() > 0) {
// check to see where it is we need to start
int pos = -1; // if it's still -1 by the time we are done then no keyValues changed
for (int i = 0; i < keys.count(); ++i) {
if (keyValues[i] != m_dataSource->value(m_dataSource->fieldNumber(keys[i])).toString()) {
pos = i;
break;
}
}
// don't bother if nothing has changed
if (pos != -1) {
// roll back the query and go ahead if all is good
status = m_dataSource->movePrevious();
if (status == true) {
// print the footers as needed
// any changes made in this for loop need to be duplicated
// below where the footers are finished.
bool do_break = false;
for (int i = shownGroups.count() - 1; i >= 0; i--) {
if (do_break)
createNewPage();
do_break = false;
- grp = detailData->m_groupList[shownGroups.at(i)];
+ grp = detailData->groupList[shownGroups.at(i)];
- if (grp->m_groupFooter) {
- if (renderSectionSize(*(grp->m_groupFooter)) + finishCurPageSize(false) + m_bottomMargin + m_yOffset >= m_maxHeight)
+ if (grp->groupFooter) {
+ if (renderSectionSize(*(grp->groupFooter)) + finishCurPageSize(false) + m_bottomMargin + m_yOffset >= m_maxHeight)
createNewPage();
- renderSection(*(grp->m_groupFooter));
+ renderSection(*(grp->groupFooter));
}
- if (KReportDetailGroupSectionData::BreakAfterGroupFooter == grp->m_pagebreak)
+ if (KReportDetailGroupSectionData::PageBreak::AfterGroupFooter == grp->pagebreak)
do_break = true;
}
// step ahead to where we should be and print the needed headers
// if all is good
status = m_dataSource->moveNext();
if (do_break)
createNewPage();
if (status == true) {
for (int i = 0; i < shownGroups.count(); ++i) {
- grp = detailData->m_groupList[shownGroups.at(i)];
+ grp = detailData->groupList[shownGroups.at(i)];
- if (grp->m_groupHeader) {
- if (renderSectionSize(*(grp->m_groupHeader)) + finishCurPageSize(false) + m_bottomMargin + m_yOffset >= m_maxHeight) {
+ if (grp->groupHeader) {
+ if (renderSectionSize(*(grp->groupHeader)) + finishCurPageSize(false) + m_bottomMargin + m_yOffset >= m_maxHeight) {
m_dataSource->movePrevious();
createNewPage();
m_dataSource->moveNext();
}
if (!keys[i].isEmpty())
keyValues[i] = m_dataSource->value(m_dataSource->fieldNumber(keys[i])).toString();
//Tell interested parties thak key values changed
- renderSection(*(grp->m_groupHeader));
+ renderSection(*(grp->groupHeader));
}
}
}
}
}
}
}
if (keys.size() > 0 && m_dataSource->movePrevious()) {
// finish footers
// duplicated changes from above here
for (int i = shownGroups.count() - 1; i >= 0; i--) {
- grp = detailData->m_groupList[shownGroups.at(i)];
+ grp = detailData->groupList[shownGroups.at(i)];
- if (grp->m_groupFooter) {
- if (renderSectionSize(*(grp->m_groupFooter)) + finishCurPageSize(false) + m_bottomMargin + m_yOffset >= m_maxHeight)
+ if (grp->groupFooter) {
+ if (renderSectionSize(*(grp->groupFooter)) + finishCurPageSize(false) + m_bottomMargin + m_yOffset >= m_maxHeight)
createNewPage();
- renderSection(*(grp->m_groupFooter));
+ renderSection(*(grp->groupFooter));
emit(exitedGroup(keys[i], keyValues[i]));
}
}
}
}
- if (KReportDetailSectionData::BreakAtEnd == detailData->m_pageBreak)
+ if (KReportDetailSectionData::PageBreak::AtEnd == detailData->pageBreak)
createNewPage();
}
}
qreal KReportPreRendererPrivate::renderSectionSize(const KReportSectionData & sectionData)
{
qreal intHeight = POINT_TO_INCH(sectionData.height()) * KReportPrivate::dpiX();
if (sectionData.objects().count() == 0)
return intHeight;
QList objects = sectionData.objects();
foreach(KReportItemBase *ob, objects) {
QPointF offset(m_leftMargin, m_yOffset);
//ASync objects cannot alter the section height
KReportAsyncItemBase *async_ob = qobject_cast(ob);
if (!async_ob) {
QVariant itemData;
if (m_dataSource) {
itemData = m_dataSource->value(ob->itemDataSource());
}
const int itemHeight = ob->renderSimpleData(nullptr, nullptr, offset, itemData, m_scriptHandler);
if (itemHeight > intHeight) {
intHeight = itemHeight;
}
}
}
return intHeight;
}
qreal KReportPreRendererPrivate::renderSection(const KReportSectionData & sectionData)
{
qreal sectionHeight = POINT_TO_INCH(sectionData.height()) * KReportPrivate::dpiX();
int itemHeight = 0;
//kreportDebug() << "Name: " << sectionData.name() << " Height: " << sectionHeight
// << "Objects: " << sectionData.objects().count();
emit(renderingSection(const_cast(§ionData), m_page, QPointF(m_leftMargin, m_yOffset)));
//Create a pre-rendered section for this section and add it to the document
OROSection *sec = new OROSection(m_document);
sec->setHeight(sectionData.height());
sec->setBackgroundColor(sectionData.backgroundColor());
sec->setType(sectionData.type());
m_document->addSection(sec);
//Render section background
ORORect* bg = new ORORect();
bg->setPen(QPen(Qt::NoPen));
bg->setBrush(sectionData.backgroundColor());
qreal w = m_page->document()->pageLayout().fullRectPixels(KReportPrivate::dpiX()).width() - m_page->document()->pageLayout().marginsPixels(KReportPrivate::dpiX()).right() - m_leftMargin;
bg->setRect(QRectF(m_leftMargin, m_yOffset, w, sectionHeight));
m_page->insertPrimitive(bg, true);
QList objects = sectionData.objects();
foreach(KReportItemBase *ob, objects) {
QPointF offset(m_leftMargin, m_yOffset);
QVariant itemData = m_dataSource->value(ob->itemDataSource());
if (ob->supportsSubQuery()) {
itemHeight = ob->renderReportData(m_page, sec, offset, m_dataSource, m_scriptHandler);
} else {
KReportAsyncItemBase *async_ob = qobject_cast(ob);
if (async_ob){
//kreportDebug() << "async object";
asyncManager->addItem(async_ob, m_page, sec, offset, async_ob->realItemData(itemData), m_scriptHandler);
} else {
//kreportDebug() << "sync object";
itemHeight = ob->renderSimpleData(m_page, sec, offset, itemData, m_scriptHandler);
}
}
if (itemHeight > sectionHeight) {
sectionHeight = itemHeight;
}
}
for (int i = 0; i < m_page->primitiveCount(); ++i) {
OROPrimitive *prim = m_page->primitive(i);
if (OROTextBox *text = dynamic_cast(prim)) {
if (text->requiresPostProcessing()) {
m_postProcText.append(text);
}
}
}
m_yOffset += sectionHeight;
return sectionHeight;
}
#ifdef KREPORT_SCRIPTING
void KReportPreRendererPrivate::initEngine()
{
delete m_scriptHandler;
m_scriptHandler = new KReportScriptHandler(m_dataSource, scriptSource, m_reportDocument);
connect(this, SIGNAL(enteredGroup(QString,QVariant)), m_scriptHandler, SLOT(slotEnteredGroup(QString,QVariant)));
connect(this, SIGNAL(exitedGroup(QString,QVariant)), m_scriptHandler, SLOT(slotExitedGroup(QString,QVariant)));
connect(this, SIGNAL(renderingSection(KReportSectionData*,OROPage*,QPointF)), m_scriptHandler, SLOT(slotEnteredSection(KReportSectionData*,OROPage*,QPointF)));
}
#endif
void KReportPreRendererPrivate::asyncItemsFinished()
{
//kreportDebug() << "Finished rendering async items";
asyncManager->deleteLater();
emit finishedAllASyncItems();
}
bool KReportPreRendererPrivate::generateDocument()
{
if (!m_dataSource) {
m_dataSource = m_oneRecord;
}
if (!m_valid || !m_reportDocument) {
return false;
}
// Do this check now so we don't have to undo a lot of work later if it fails
KReportLabelSizeInfo label;
if (m_reportDocument->pageSize() == QLatin1String("Labels")) {
label = KReportLabelSizeInfo::find(m_reportDocument->labelType());
if (label.isNull()) {
return false;
}
}
//kreportDebug() << "Creating Document";
m_document = new ORODocument(m_reportDocument->title());
m_pageCounter = 0;
m_yOffset = 0.0;
//kreportDebug() << "Calculating Margins";
if (!label.isNull()) {
if (m_reportDocument->pageLayout().orientation() == QPageLayout::Portrait) {
m_topMargin = (label.startY() / 100.0);
m_bottomMargin = 0;
m_rightMargin = 0;
m_leftMargin = (label.startX() / 100.0);
} else {
m_topMargin = (label.startX() / 100.0);
m_bottomMargin = 0;
m_rightMargin = 0;
m_leftMargin = (label.startY() / 100.0);
}
} else {
m_topMargin = m_reportDocument->pageLayout().marginsPoints().top();
m_bottomMargin = m_reportDocument->pageLayout().marginsPoints().bottom();
m_rightMargin = m_reportDocument->pageLayout().marginsPoints().right();
m_leftMargin = m_reportDocument->pageLayout().marginsPoints().left();
//kreportDebug() << "Margins:" << m_topMargin << m_bottomMargin << m_rightMargin << m_leftMargin;
}
//kreportDebug() << "Calculating Page Size";
QPageLayout layout = m_reportDocument->pageLayout();
// This should reflect the information of the report page size
if (m_reportDocument->pageSize() == QLatin1String("Custom")) {
m_maxWidth = m_reportDocument->pageLayout().fullRectPoints().width();
m_maxHeight = m_reportDocument->pageLayout().fullRectPoints().height();
} else {
if (!label.isNull()) {
m_maxWidth = label.width();
m_maxHeight = label.height();
m_reportDocument->pageLayout().setPageSize(QPageSize(KReportPageSize::pageSize(label.paper())));
} else {
// lookup the correct size information for the specified size paper
QSizeF pageSizePx = m_reportDocument->pageLayout().fullRectPixels(KReportPrivate::dpiX()).size();
m_maxWidth = pageSizePx.width();
m_maxHeight = pageSizePx.height();
}
}
if (m_reportDocument->pageLayout().orientation() == QPageLayout::Landscape) {
qreal tmp = m_maxWidth;
m_maxWidth = m_maxHeight;
m_maxHeight = tmp;
}
//kreportDebug() << "Page Size:" << m_maxWidth << m_maxHeight;
m_document->setPageLayout(m_reportDocument->pageLayout());
- m_dataSource->setSorting(m_reportDocument->m_detailSection->m_sortedFields);
+ m_dataSource->setSorting(m_reportDocument->m_detailSection->sortedFields);
if (!m_dataSource->open()) {
return false;
}
#ifdef KREPORT_SCRIPTING
initEngine();
connect(m_scriptHandler, SIGNAL(groupChanged(QMap)),
m_preRenderer, SIGNAL(groupChanged(QMap)));
//Loop through all abjects that have been registered, and register them with the script handler
if (m_scriptHandler) {
QMapIterator i(m_scriptObjects);
while (i.hasNext()) {
i.next();
m_scriptHandler->registerScriptObject(i.value(), i.key());
}
//execute the script, if it fails, abort and return the empty document
if (!m_scriptHandler->trigger()) {
m_scriptHandler->displayErrors();
return m_document;
}
}
#endif
createNewPage();
if (!label.isNull()) {
// Label Print Run
// remember the initial margin setting as we will be modifying
// the value and restoring it as we move around
qreal margin = m_leftMargin;
m_yOffset = m_topMargin;
qreal w = (label.width() / 100.0);
qreal wg = (label.xGap() / 100.0);
qreal h = (label.height() / 100.0);
qreal hg = (label.yGap() / 100.0);
int numCols = label.columns();
int numRows = label.rows();
qreal tmp;
// flip the value around if we are printing landscape
if (!m_reportDocument->pageLayout().orientation() == QPageLayout::Portrait) {
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 = m_reportDocument->m_detailSection;
- if (detailData->m_detailSection) {
+ if (detailData->detailSection) {
KReportDataSource *mydata = m_dataSource;
if (mydata && mydata->recordCount() > 0) { /* && !((query = orqThis->getQuery())->eof()))*/
if (!mydata->moveFirst()) {
return false;
}
int row = 0;
int col = 0;
do {
tmp = m_yOffset; // store the value as renderSection changes it
- renderSection(*(detailData->m_detailSection));
+ renderSection(*(detailData->detailSection));
m_yOffset = tmp; // restore the value that renderSection modified
col++;
m_leftMargin += w + wg;
if (col >= numCols) {
m_leftMargin = margin; // reset back to original value
col = 0;
row++;
m_yOffset += h + hg;
if (row >= numRows) {
m_yOffset = m_topMargin;
row = 0;
createNewPage();
}
}
} while (mydata->moveNext());
}
}
} else {
// Normal Print Run
if (m_reportDocument->m_reportHeader) {
renderSection(*(m_reportDocument->m_reportHeader));
}
if (m_reportDocument->m_detailSection) {
renderDetailSection(m_reportDocument->m_detailSection);
}
if (m_reportDocument->m_reportFooter) {
if (renderSectionSize(*(m_reportDocument->m_reportFooter)) + finishCurPageSize(true) + m_bottomMargin + m_yOffset >= m_maxHeight) {
createNewPage();
}
renderSection(*(m_reportDocument->m_reportFooter));
}
}
finishCurPage(true);
#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
m_scriptHandler->setPageTotal(m_document->pageCount());
for (int i = 0; i < m_postProcText.size(); i++) {
OROTextBox * tb = m_postProcText.at(i);
m_scriptHandler->setPageNumber(tb->page()->pageNumber() + 1);
tb->setText(m_scriptHandler->evaluate(tb->text()).toString());
}
#endif
asyncManager->startRendering();
#ifdef KREPORT_SCRIPTING
m_scriptHandler->displayErrors();
#endif
if (!m_dataSource->close()) {
return false;
}
#ifdef KREPORT_SCRIPTING
delete m_scriptHandler;
m_scriptHandler = nullptr;
#endif
if (m_dataSource != m_oneRecord) {
delete m_dataSource;
m_dataSource = nullptr;
}
m_postProcText.clear();
return true;
}
//===========================KReportPreRenderer===============================
KReportPreRenderer::KReportPreRenderer(const QDomElement &document) : d(new KReportPreRendererPrivate(this))
{
setDocument(document);
connect(d, &KReportPreRendererPrivate::finishedAllASyncItems, this, &KReportPreRenderer::finishedAllASyncItems);
}
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 = nullptr;
}
return d->m_document;
}
void KReportPreRenderer::setSourceData(KReportDataSource *dataSource)
{
if (d && dataSource != d->m_dataSource) {
delete d->m_dataSource;
d->m_dataSource = dataSource;
}
}
void KReportPreRenderer::setScriptSource(KReportScriptSource *source)
{
if (d) {
d->scriptSource = source;
}
}
bool KReportPreRenderer::setDocument(const QDomElement &document)
{
delete d->m_document;
d->m_valid = false;
if (document.tagName() != QLatin1String("report:content")) {
kreportWarning() << "report schema is invalid";
return false;
}
d->m_reportDocument = new KReportDocument(document);
d->m_valid = d->m_reportDocument->isValid();
return isValid();
}
#ifdef KREPORT_SCRIPTING
void KReportPreRenderer::registerScriptObject(QObject* obj, const QString& name)
{
//kreportDebug() << name;
d->m_scriptObjects[name] = obj;
}
KReportScriptHandler *KReportPreRenderer::scriptHandler()
{
return d->m_scriptHandler;
}
#endif
const KReportDocument* KReportPreRenderer::reportData() const
{
return d->m_reportDocument;
}