/*************************************************************************** * This file is part of the Lime Report project * * Copyright (C) 2021 by Alexander Arin * * arin_a@bk.ru * * * ** GNU General Public License Usage ** * * * This library is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ** GNU Lesser General Public License ** * * * 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 3 of the * * License, or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public * * License along with this library. * * If not, see . * * * * 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 General Public License for more details. * ****************************************************************************/ #include "lrgroupbands.h" #include "lrdatasourcemanager.h" #include "lrglobal.h" const QString xmlTagHeader = QLatin1String("GroupHeader"); const QString xmlTagFooter = QLatin1String("GroupFooter"); namespace { LimeReport::BaseDesignIntf* createHeader(QObject* owner, LimeReport::BaseDesignIntf* parent) { return new LimeReport::GroupBandHeader(owner, parent); } bool VARIABLE_IS_NOT_USED registredHeader = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagHeader, LimeReport::ItemAttribs(QObject::tr("GroupHeader"), LimeReport::Const::bandTAG), createHeader); LimeReport::BaseDesignIntf* createFooter(QObject* owner, LimeReport::BaseDesignIntf* parent) { return new LimeReport::GroupBandFooter(owner, parent); } bool VARIABLE_IS_NOT_USED registredFooter = LimeReport::DesignElementsFactory::instance().registerCreator( xmlTagFooter, LimeReport::ItemAttribs(QObject::tr("GroupFooter"), LimeReport::Const::bandTAG), createFooter); } // namespace namespace LimeReport { GroupBandHeader::GroupBandHeader(QObject* owner, QGraphicsItem* parent): BandDesignIntf(BandDesignIntf::GroupHeader, xmlTagHeader, owner, parent), m_groupFiledName(""), m_groupStarted(false), m_resetPageNumber(false) { setBandTypeText(tr("GroupHeader")); setFixedPos(false); setMarkerColor(bandColor()); } bool GroupBandHeader::isUnique() const { return false; } // bool GroupBandHeader::tryToKeepTogether() //{ // return m_tryToKeepTogether; //} BaseDesignIntf* GroupBandHeader::createSameTypeItem(QObject* owner, QGraphicsItem* parent) { return new GroupBandHeader(owner, parent); } void GroupBandHeader::startGroup(DataSourceManager* dataManager) { m_groupStarted = true; QString lineVar = QLatin1String("line_") + objectName().toLower(); dataManager->setReportVariable(lineVar, 1); QString datasourceName = findDataSourceName(parentBand()); if (dataManager->containsDatasource(datasourceName)) { IDataSource* ds = dataManager->dataSource(datasourceName); if (ds && ds->columnIndexByName(m_groupFiledName) != -1) m_groupFieldValue = ds->data(m_groupFiledName); } if (!m_condition.isEmpty()) m_conditionValue = calcCondition(dataManager); } QColor GroupBandHeader::bandColor() const { return QColor(Qt::darkBlue); } QString GroupBandHeader::findDataSourceName(BandDesignIntf* parentBand) { if (!parentBand) return ""; if (!parentBand->datasourceName().isEmpty()) return parentBand->datasourceName(); else return findDataSourceName(parentBand->parentBand()); } QString GroupBandHeader::condition() const { return m_condition; } void GroupBandHeader::setCondition(const QString& condition) { m_condition = condition; } QString GroupBandHeader::calcCondition(DataSourceManager* dataManager) { QString result = m_condition; if (!m_condition.isEmpty()) { result = expandUserVariables(result, FirstPass, NoEscapeSymbols, dataManager); result = expandScripts(result, dataManager); result = expandDataFields(result, NoEscapeSymbols, dataManager); } return result; } bool GroupBandHeader::isNeedToClose(DataSourceManager* dataManager) { if (!m_groupStarted) return false; if ((m_groupFiledName.isNull() || m_groupFiledName.isEmpty()) && condition().isEmpty()) { dataManager->putError(tr("Group field not found")); return false; } if (!m_condition.isEmpty()) { return m_conditionValue != calcCondition(dataManager); } else { QString datasourceName = findDataSourceName(parentBand()); if (dataManager->containsDatasource(datasourceName)) { IDataSource* ds = dataManager->dataSource(datasourceName); if (ds) { if (ds->data(m_groupFiledName).isNull() && m_groupFieldValue.isNull()) return false; if (!ds->data(m_groupFiledName).isValid()) return false; return ds->data(m_groupFiledName) != m_groupFieldValue; } } else { dataManager->putError(tr("Datasource \"%1\" not found!").arg(datasourceName)); } } return false; } bool GroupBandHeader::isStarted() { return m_groupStarted; //! m_groupFieldValue.isNull(); } void GroupBandHeader::closeGroup() { m_groupFieldValue = QVariant(); m_conditionValue = ""; m_groupStarted = false; } int GroupBandHeader::index() { return bandIndex(); } bool GroupBandHeader::startNewPage() const { return BandDesignIntf::startNewPage(); } void GroupBandHeader::setStartNewPage(bool startNewPage) { BandDesignIntf::setStartNewPage(startNewPage); } bool GroupBandHeader::resetPageNumber() const { return m_resetPageNumber; } void GroupBandHeader::setResetPageNumber(bool resetPageNumber) { m_resetPageNumber = resetPageNumber; } GroupBandFooter::GroupBandFooter(QObject* owner, QGraphicsItem* parent): BandDesignIntf(BandDesignIntf::GroupFooter, xmlTagFooter, owner, parent) { setBandTypeText(tr("GroupFooter")); setFixedPos(false); setMarkerColor(bandColor()); } bool GroupBandFooter::isUnique() const { return false; } QColor GroupBandFooter::bandColor() const { return QColor(Qt::darkBlue); } BaseDesignIntf* GroupBandFooter::createSameTypeItem(QObject* owner, QGraphicsItem* parent) { return new GroupBandFooter(owner, parent); } } // namespace LimeReport