2016-02-17 10:11:00 +03:00
|
|
|
/***************************************************************************
|
|
|
|
* This file is part of the Lime Report project *
|
|
|
|
* Copyright (C) 2015 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 <http://www.gnu.org/licenses/>. *
|
|
|
|
* *
|
|
|
|
** 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 <http://www.gnu.org/licenses/>. *
|
|
|
|
* *
|
|
|
|
* 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 <QPrinter>
|
|
|
|
#include <QPrintDialog>
|
2017-03-05 16:39:50 +03:00
|
|
|
#include <QPrinterInfo>
|
2016-02-17 10:11:00 +03:00
|
|
|
#include <QMessageBox>
|
|
|
|
#include <QApplication>
|
|
|
|
#include <QDesktopWidget>
|
2017-04-20 05:43:48 +03:00
|
|
|
#include <QFileSystemWatcher>
|
2017-11-24 00:13:47 +03:00
|
|
|
#include <QPluginLoader>
|
2018-06-23 00:04:28 +03:00
|
|
|
#include <QFileDialog>
|
2016-02-17 10:11:00 +03:00
|
|
|
|
|
|
|
#include "time.h"
|
|
|
|
|
|
|
|
#include "lrreportengine_p.h"
|
|
|
|
#include "lrreportengine.h"
|
|
|
|
|
|
|
|
#include "lrpagedesignintf.h"
|
|
|
|
#include "lrdatasourcemanager.h"
|
2017-11-24 00:13:47 +03:00
|
|
|
|
2017-11-27 23:14:05 +03:00
|
|
|
#ifdef HAVE_REPORT_DESIGNER
|
|
|
|
#include "lrdatabrowser.h"
|
|
|
|
#include "lrreportdesignwindow.h"
|
|
|
|
#endif
|
2016-02-17 10:11:00 +03:00
|
|
|
|
|
|
|
#include "serializators/lrxmlwriter.h"
|
|
|
|
#include "serializators/lrxmlreader.h"
|
|
|
|
#include "lrreportrender.h"
|
|
|
|
#include "lrpreviewreportwindow.h"
|
2016-03-30 23:21:44 +03:00
|
|
|
#include "lrpreviewreportwidget.h"
|
|
|
|
#include "lrpreviewreportwidget_p.h"
|
2018-06-23 00:04:28 +03:00
|
|
|
#include "lrexporterintf.h"
|
|
|
|
#include "lrexportersfactory.h"
|
2017-11-24 00:13:47 +03:00
|
|
|
|
2018-05-07 22:52:28 +03:00
|
|
|
#ifdef BUILD_WITH_EASY_PROFILER
|
2018-02-28 23:19:04 +03:00
|
|
|
#include "easy/profiler.h"
|
2018-03-22 23:00:51 +03:00
|
|
|
#else
|
|
|
|
# define EASY_BLOCK(...)
|
|
|
|
# define EASY_END_BLOCK
|
|
|
|
#endif
|
2018-02-28 23:19:04 +03:00
|
|
|
|
2017-06-12 13:11:00 +03:00
|
|
|
#ifdef HAVE_STATIC_BUILD
|
|
|
|
#include "lrfactoryinitializer.h"
|
|
|
|
#endif
|
2018-05-08 10:58:43 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
namespace LimeReport{
|
|
|
|
|
|
|
|
QSettings* ReportEngine::m_settings = 0;
|
|
|
|
|
|
|
|
ReportEnginePrivate::ReportEnginePrivate(QObject *parent) :
|
|
|
|
QObject(parent), m_fileName(""), m_settings(0), m_ownedSettings(false),
|
2016-02-17 10:39:17 +03:00
|
|
|
m_printer(new QPrinter(QPrinter::HighResolution)), m_printerSelected(false),
|
2016-04-06 22:03:58 +03:00
|
|
|
m_showProgressDialog(true), m_reportName(""), m_activePreview(0),
|
2017-02-03 14:20:30 +03:00
|
|
|
m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")),
|
2017-04-20 05:43:48 +03:00
|
|
|
m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"),
|
2017-12-20 12:56:02 +03:00
|
|
|
m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage),
|
2018-08-07 23:41:29 +03:00
|
|
|
m_previewLayoutDirection(Qt::LayoutDirectionAuto), m_designerFactory(0),
|
2018-07-11 02:42:43 +03:00
|
|
|
m_previewScaleType(FitWidth), m_previewScalePercent(0)
|
2016-02-17 10:11:00 +03:00
|
|
|
{
|
2017-06-12 13:11:00 +03:00
|
|
|
#ifdef HAVE_STATIC_BUILD
|
2017-06-14 12:07:02 +03:00
|
|
|
initResources();
|
2017-06-12 13:11:00 +03:00
|
|
|
initReportItems();
|
2017-11-27 23:14:05 +03:00
|
|
|
#ifdef HAVE_REPORT_DESIGNER
|
2017-06-12 13:11:00 +03:00
|
|
|
initObjectInspectorProperties();
|
2017-11-27 23:14:05 +03:00
|
|
|
#endif
|
2017-06-12 13:11:00 +03:00
|
|
|
initSerializators();
|
|
|
|
#endif
|
2017-01-28 02:20:15 +03:00
|
|
|
m_datasources = new DataSourceManager(this);
|
|
|
|
m_datasources->setReportSettings(&m_reportSettings);
|
2018-01-26 17:38:23 +03:00
|
|
|
scriptManager()->setDataManager(m_datasources);
|
2016-06-10 18:05:18 +03:00
|
|
|
m_scriptEngineContext = new ScriptEngineContext(this);
|
2017-08-25 18:01:59 +03:00
|
|
|
|
2017-11-04 21:17:49 +03:00
|
|
|
ICallbackDatasource* tableOfContents = m_datasources->createCallbackDatasource("tableofcontents");
|
|
|
|
connect(tableOfContents, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)),
|
|
|
|
m_scriptEngineContext->tableOfContents(), SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&)));
|
2017-08-25 18:01:59 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
m_datasources->setObjectName("datasources");
|
|
|
|
connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString)));
|
2017-04-20 05:43:48 +03:00
|
|
|
connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &)));
|
2017-11-24 00:13:47 +03:00
|
|
|
|
2017-11-30 21:23:11 +03:00
|
|
|
QDir pluginsDir = QCoreApplication::applicationDirPath();
|
|
|
|
pluginsDir.cd("../lib" );
|
2017-11-27 23:14:05 +03:00
|
|
|
if (!pluginsDir.exists()){
|
2017-11-30 21:23:11 +03:00
|
|
|
pluginsDir.cd("./lib");
|
|
|
|
if (!pluginsDir.exists()) pluginsDir.setPath(QCoreApplication::applicationDirPath());
|
2017-11-27 23:14:05 +03:00
|
|
|
}
|
2017-11-24 00:13:47 +03:00
|
|
|
|
2017-11-27 23:14:05 +03:00
|
|
|
foreach( const QString& pluginName, pluginsDir.entryList( QDir::Files ) ) {
|
2017-11-24 00:13:47 +03:00
|
|
|
QPluginLoader loader( pluginsDir.absoluteFilePath( pluginName ) );
|
|
|
|
if( loader.load() ) {
|
2018-06-23 00:04:28 +03:00
|
|
|
#ifndef HAVE_REPORT_DESIGNER
|
2018-06-21 13:38:47 +03:00
|
|
|
if( LimeReportDesignerPluginInterface* designerPlugin = qobject_cast< LimeReportDesignerPluginInterface* >( loader.instance() ) ) {
|
|
|
|
m_designerFactory = designerPlugin;
|
2017-11-27 23:14:05 +03:00
|
|
|
break;
|
2017-11-24 00:13:47 +03:00
|
|
|
}
|
2017-12-07 21:30:32 +03:00
|
|
|
#endif
|
2018-06-23 00:04:28 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
ReportEnginePrivate::~ReportEnginePrivate()
|
|
|
|
{
|
2016-04-21 17:53:31 +03:00
|
|
|
if (m_designerWindow) {
|
|
|
|
m_designerWindow->close();
|
|
|
|
}
|
2016-02-20 13:37:18 +03:00
|
|
|
if (m_activePreview){
|
|
|
|
m_activePreview->close();
|
|
|
|
}
|
2016-02-17 10:11:00 +03:00
|
|
|
foreach(PageDesignIntf* page,m_pages) delete page;
|
|
|
|
m_pages.clear();
|
2017-07-29 00:54:43 +03:00
|
|
|
|
|
|
|
foreach(ReportTranslation* translation, m_translations)
|
|
|
|
delete translation;
|
|
|
|
m_translations.clear();
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
if (m_ownedSettings&&m_settings) delete m_settings;
|
|
|
|
}
|
|
|
|
|
|
|
|
QObject* ReportEnginePrivate::createElement(const QString &, const QString &)
|
|
|
|
{
|
|
|
|
return appendPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
QObject *ReportEnginePrivate::elementAt(const QString &, int index)
|
|
|
|
{
|
|
|
|
return pageAt(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
PageDesignIntf *ReportEnginePrivate::createPage(const QString &pageName)
|
|
|
|
{
|
2016-02-20 13:37:18 +03:00
|
|
|
PageDesignIntf* page =new PageDesignIntf();
|
2016-02-17 10:11:00 +03:00
|
|
|
page->setObjectName(pageName);
|
2017-08-19 00:16:55 +03:00
|
|
|
page->pageItem()->setObjectName("Report"+pageName);
|
2016-02-17 10:11:00 +03:00
|
|
|
page->setReportEditor(this);
|
2016-06-24 23:15:59 +03:00
|
|
|
page->setReportSettings(&m_reportSettings);
|
2016-02-17 10:11:00 +03:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
|
|
|
PageDesignIntf *ReportEnginePrivate::appendPage(const QString &pageName)
|
|
|
|
{
|
|
|
|
PageDesignIntf* page = createPage(pageName);
|
|
|
|
m_pages.append(page);
|
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2016-06-10 18:05:18 +03:00
|
|
|
bool ReportEnginePrivate::deletePage(PageDesignIntf *page){
|
|
|
|
QList<PageDesignIntf*>::iterator it = m_pages.begin();
|
|
|
|
while (it != m_pages.end()){
|
|
|
|
if (*it == page) {
|
|
|
|
it = m_pages.erase(it);
|
|
|
|
return true;
|
|
|
|
} else ++it;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
PageDesignIntf *ReportEnginePrivate::createPreviewPage()
|
|
|
|
{
|
|
|
|
return createPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
int ReportEnginePrivate::elementsCount(const QString &)
|
|
|
|
{
|
|
|
|
return m_pages.count();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::collectionLoadFinished(const QString &)
|
|
|
|
{
|
|
|
|
foreach (PageDesignIntf* page, m_pages) {
|
|
|
|
page->setReportEditor(this);
|
2016-06-24 23:15:59 +03:00
|
|
|
page->setReportSettings(&m_reportSettings);
|
2016-02-17 10:19:50 +03:00
|
|
|
page->setSceneRect(-Const::SCENE_MARGIN,-Const::SCENE_MARGIN,
|
|
|
|
page->pageItem()->width()+Const::SCENE_MARGIN*2,
|
|
|
|
page->pageItem()->height()+Const::SCENE_MARGIN*2);
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
emit pagesLoadFinished();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::saveError(QString message)
|
|
|
|
{
|
|
|
|
m_lastError = message;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::showError(QString message)
|
|
|
|
{
|
|
|
|
QMessageBox::critical(0,tr("Error"),message);
|
|
|
|
}
|
|
|
|
|
2017-08-05 01:38:19 +03:00
|
|
|
void ReportEnginePrivate::updateTranslations()
|
|
|
|
{
|
|
|
|
foreach(ReportTranslation* translation, m_translations.values()){
|
|
|
|
foreach(PageDesignIntf* page, m_pages){
|
|
|
|
translation->updatePageTranslation(page);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
void ReportEnginePrivate::slotDataSourceCollectionLoaded(const QString &collectionName)
|
|
|
|
{
|
|
|
|
emit datasourceCollectionLoadFinished(collectionName);
|
|
|
|
}
|
|
|
|
|
2017-04-20 04:48:37 +03:00
|
|
|
void ReportEnginePrivate::slotPreviewWindowDestroyed(QObject* window)
|
2016-02-20 13:37:18 +03:00
|
|
|
{
|
|
|
|
if (m_activePreview == window){
|
|
|
|
m_activePreview = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-28 23:19:04 +03:00
|
|
|
void ReportEnginePrivate::slotDesignerWindowDestroyed(QObject *window)
|
|
|
|
{
|
|
|
|
Q_UNUSED(window)
|
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
void ReportEnginePrivate::clearReport()
|
|
|
|
{
|
|
|
|
foreach(PageDesignIntf* page,m_pages) delete page;
|
|
|
|
m_pages.clear();
|
2017-07-29 00:54:43 +03:00
|
|
|
foreach(ReportTranslation* reportTranslation, m_translations)
|
|
|
|
delete reportTranslation;
|
|
|
|
m_translations.clear();
|
2016-02-17 10:11:00 +03:00
|
|
|
m_datasources->clear(DataSourceManager::Owned);
|
|
|
|
m_fileName="";
|
2016-06-10 18:05:18 +03:00
|
|
|
m_scriptEngineContext->clear();
|
2016-06-24 23:15:59 +03:00
|
|
|
m_reportSettings.setDefaultValues();
|
2017-07-29 00:54:43 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
emit cleared();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::printReport(ItemsReaderIntf::Ptr reader, QPrinter& printer)
|
|
|
|
{
|
|
|
|
LimeReport::PageDesignIntf renderPage;
|
|
|
|
renderPage.setItemMode(PrintMode);
|
|
|
|
if (reader->first()){
|
|
|
|
reader->readItem(renderPage.pageItem());
|
2016-04-21 00:09:15 +03:00
|
|
|
printer.setFullPage(renderPage.pageItem()->fullPage());
|
2016-02-17 10:11:00 +03:00
|
|
|
printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation());
|
|
|
|
renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect());
|
|
|
|
|
2016-04-21 00:09:15 +03:00
|
|
|
if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){
|
|
|
|
QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)?
|
|
|
|
QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()):
|
|
|
|
renderPage.pageItem()->sizeMM();
|
|
|
|
printer.setPaperSize(pageSize,QPrinter::Millimeter);
|
|
|
|
} else {
|
|
|
|
printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize());
|
|
|
|
}
|
2016-02-17 10:11:00 +03:00
|
|
|
|
|
|
|
QPainter painter(&printer);
|
|
|
|
renderPage.render(&painter);
|
|
|
|
|
|
|
|
while (reader->next()){
|
|
|
|
printer.newPage();
|
|
|
|
renderPage.removeAllItems();
|
|
|
|
reader->readItem(renderPage.pageItem());
|
|
|
|
renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect());
|
|
|
|
renderPage.render(&painter);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-21 23:03:56 +03:00
|
|
|
void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer)
|
2016-02-17 10:11:00 +03:00
|
|
|
{
|
|
|
|
LimeReport::PageDesignIntf renderPage;
|
|
|
|
renderPage.setItemMode(PrintMode);
|
|
|
|
QPainter* painter=0;
|
|
|
|
|
|
|
|
bool isFirst = true;
|
|
|
|
int currenPage = 1;
|
2017-09-08 01:18:35 +03:00
|
|
|
|
|
|
|
|
|
|
|
qreal leftMargin, topMargin, rightMargin, bottomMargin;
|
|
|
|
printer.getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter);
|
|
|
|
|
2017-04-21 23:03:56 +03:00
|
|
|
foreach(PageItemDesignIntf::Ptr page, pages){
|
2016-02-17 10:11:00 +03:00
|
|
|
|
|
|
|
if (
|
2017-04-21 23:03:56 +03:00
|
|
|
(printer.printRange() == QPrinter::AllPages) ||
|
|
|
|
( (printer.printRange()==QPrinter::PageRange) &&
|
|
|
|
(currenPage>=printer.fromPage()) &&
|
|
|
|
(currenPage<=printer.toPage())
|
2016-02-17 10:11:00 +03:00
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
|
|
|
|
QPointF pagePos = page->pos();
|
2017-09-08 01:18:35 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
page->setPos(0,0);
|
|
|
|
renderPage.setPageItem(page);
|
|
|
|
renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect());
|
2016-05-26 22:19:12 +03:00
|
|
|
if (renderPage.pageItem()->oldPrintMode()){
|
|
|
|
printer.setPageMargins(renderPage.pageItem()->leftMargin(),
|
|
|
|
renderPage.pageItem()->topMargin(),
|
|
|
|
renderPage.pageItem()->rightMargin(),
|
|
|
|
renderPage.pageItem()->bottomMargin(),
|
|
|
|
QPrinter::Millimeter);
|
|
|
|
printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation());
|
2016-04-21 00:09:15 +03:00
|
|
|
QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)?
|
2016-05-26 22:19:12 +03:00
|
|
|
QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()):
|
|
|
|
renderPage.pageItem()->sizeMM();
|
2016-04-21 00:09:15 +03:00
|
|
|
printer.setPaperSize(pageSize,QPrinter::Millimeter);
|
|
|
|
} else {
|
2016-05-26 22:19:12 +03:00
|
|
|
printer.setFullPage(renderPage.pageItem()->fullPage());
|
|
|
|
printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation());
|
|
|
|
if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){
|
|
|
|
QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)?
|
|
|
|
QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()):
|
|
|
|
renderPage.pageItem()->sizeMM();
|
2017-11-05 18:40:55 +03:00
|
|
|
if (page->getSetPageSizeToPrinter() || printer.outputFormat() == QPrinter::PdfFormat)
|
2017-09-08 01:18:35 +03:00
|
|
|
printer.setPaperSize(pageSize,QPrinter::Millimeter);
|
2016-05-26 22:19:12 +03:00
|
|
|
} else {
|
2017-11-05 18:40:55 +03:00
|
|
|
if (page->getSetPageSizeToPrinter() || printer.outputFormat() == QPrinter::PdfFormat)
|
2017-09-08 01:18:35 +03:00
|
|
|
printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize());
|
2016-05-26 22:19:12 +03:00
|
|
|
}
|
2016-04-21 00:09:15 +03:00
|
|
|
}
|
2016-02-17 10:11:00 +03:00
|
|
|
|
|
|
|
if (!isFirst){
|
|
|
|
printer.newPage();
|
|
|
|
} else {
|
|
|
|
isFirst=false;
|
|
|
|
painter = new QPainter(&printer);
|
2018-03-15 22:58:08 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter);
|
|
|
|
printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR,
|
|
|
|
(printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR);
|
2017-09-08 01:18:35 +03:00
|
|
|
|
|
|
|
if (printerPageRect.width() < page->geometry().width()){
|
|
|
|
qreal pageWidth = page->geometry().width();
|
|
|
|
QRectF currentPrintingRect = printerPageRect;
|
|
|
|
while (pageWidth>0){
|
|
|
|
renderPage.render(painter, printer.pageRect(), currentPrintingRect);
|
|
|
|
currentPrintingRect.adjust(printerPageRect.size().width(),0,printerPageRect.size().width(),0);
|
|
|
|
pageWidth -= printerPageRect.size().width();
|
|
|
|
if (pageWidth>0) printer.newPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
renderPage.render(painter);
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
2017-09-08 01:18:35 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
page->setPos(pagePos);
|
|
|
|
}
|
|
|
|
|
|
|
|
currenPage++;
|
|
|
|
}
|
2016-02-18 21:09:00 +03:00
|
|
|
delete painter;
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
2017-09-01 02:02:51 +03:00
|
|
|
QStringList ReportEnginePrivate::aviableReportTranslations()
|
|
|
|
{
|
|
|
|
QStringList result;
|
|
|
|
foreach (QLocale::Language language, aviableLanguages()){
|
|
|
|
result << QLocale::languageToString(language);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setReportTranslation(const QString &languageName)
|
|
|
|
{
|
|
|
|
foreach(QLocale::Language language, aviableLanguages()){
|
|
|
|
if (QLocale::languageToString(language).compare(languageName) == 0){
|
|
|
|
setReportLanguage(language);
|
|
|
|
}
|
|
|
|
}
|
2018-02-28 23:19:04 +03:00
|
|
|
}
|
2017-09-01 02:02:51 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
bool ReportEnginePrivate::printReport(QPrinter* printer)
|
|
|
|
{
|
|
|
|
if (!printer&&!m_printerSelected){
|
2017-03-05 16:39:50 +03:00
|
|
|
QPrinterInfo pi;
|
|
|
|
if (!pi.defaultPrinter().isNull())
|
2017-04-19 01:04:14 +03:00
|
|
|
#ifdef HAVE_QT4
|
|
|
|
m_printer.data()->setPrinterName(pi.defaultPrinter().printerName());
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_QT5
|
2017-03-05 16:39:50 +03:00
|
|
|
m_printer.data()->setPrinterName(pi.defaultPrinterName());
|
2017-04-19 01:04:14 +03:00
|
|
|
#endif
|
2016-02-17 10:11:00 +03:00
|
|
|
QPrintDialog dialog(m_printer.data(),QApplication::activeWindow());
|
|
|
|
m_printerSelected = dialog.exec()!=QDialog::Rejected;
|
|
|
|
}
|
|
|
|
if (!printer&&!m_printerSelected) return false;
|
|
|
|
|
|
|
|
printer =(printer)?printer:m_printer.data();
|
|
|
|
if (printer&&printer->isValid()){
|
|
|
|
try{
|
2018-02-28 23:19:04 +03:00
|
|
|
bool designTime = dataManager()->designTime();
|
2016-06-10 18:05:18 +03:00
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
ReportPages pages = renderToPages();
|
2018-02-28 23:19:04 +03:00
|
|
|
dataManager()->setDesignTime(designTime);
|
2016-06-10 18:05:18 +03:00
|
|
|
if (pages.count()>0){
|
2017-04-21 23:03:56 +03:00
|
|
|
printReport(pages,*printer);
|
2016-06-10 18:05:18 +03:00
|
|
|
}
|
|
|
|
} catch(ReportError &exception){
|
|
|
|
saveError(exception.what());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
|
|
|
|
2017-04-21 23:03:56 +03:00
|
|
|
bool ReportEnginePrivate::printPages(ReportPages pages, QPrinter *printer)
|
2016-06-10 18:05:18 +03:00
|
|
|
{
|
|
|
|
if (!printer&&!m_printerSelected){
|
2017-03-05 16:39:50 +03:00
|
|
|
QPrinterInfo pi;
|
|
|
|
if (!pi.defaultPrinter().isNull())
|
2017-04-19 01:04:14 +03:00
|
|
|
#ifdef HAVE_QT4
|
|
|
|
m_printer.data()->setPrinterName(pi.defaultPrinter().printerName());
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_QT5
|
2017-03-05 16:39:50 +03:00
|
|
|
m_printer.data()->setPrinterName(pi.defaultPrinterName());
|
2017-04-19 01:04:14 +03:00
|
|
|
#endif
|
2016-06-10 18:05:18 +03:00
|
|
|
QPrintDialog dialog(m_printer.data(),QApplication::activeWindow());
|
|
|
|
m_printerSelected = dialog.exec()!=QDialog::Rejected;
|
|
|
|
}
|
|
|
|
if (!printer&&!m_printerSelected) return false;
|
|
|
|
|
|
|
|
printer =(printer)?printer:m_printer.data();
|
|
|
|
if (printer&&printer->isValid()){
|
|
|
|
try{
|
|
|
|
if (pages.count()>0){
|
|
|
|
printReport(
|
|
|
|
pages,
|
2017-04-21 23:03:56 +03:00
|
|
|
*printer
|
2016-06-10 18:05:18 +03:00
|
|
|
);
|
|
|
|
}
|
2016-02-17 10:11:00 +03:00
|
|
|
} catch(ReportError &exception){
|
|
|
|
saveError(exception.what());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
} else return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::printToFile(const QString &fileName)
|
|
|
|
{
|
|
|
|
if (!fileName.isEmpty()){
|
|
|
|
QFile file(fileName);
|
|
|
|
if (file.open(QIODevice::WriteOnly)){
|
|
|
|
QTextStream out(&file);
|
|
|
|
try {
|
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
out<<renderToString();
|
|
|
|
dataManager()->setDesignTime(true);
|
|
|
|
} catch( ReportError &exception){
|
|
|
|
saveError(exception.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
file.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:19:50 +03:00
|
|
|
bool ReportEnginePrivate::printToPDF(const QString &fileName)
|
|
|
|
{
|
2018-07-11 13:29:12 +03:00
|
|
|
return exportReport("PDF", fileName);
|
2018-06-23 00:04:28 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEnginePrivate::exportReport(QString exporterName, const QString &fileName, const QMap<QString, QVariant> ¶ms)
|
|
|
|
{
|
|
|
|
QString fn = fileName;
|
|
|
|
if (ExportersFactory::instance().map().contains(exporterName)){
|
|
|
|
ReportExporterInterface* e = ExportersFactory::instance().objectCreator(exporterName)(this);
|
|
|
|
if (fn.isEmpty()){
|
|
|
|
QString filter = QString("%1 (*.%2)").arg(e->exporterName()).arg(e->exporterFileExt());
|
|
|
|
QString fn = QFileDialog::getSaveFileName(0,tr("%1 file name").arg(e->exporterName()),"",filter);
|
2018-10-14 00:06:27 +03:00
|
|
|
}
|
|
|
|
if (!fn.isEmpty()){
|
|
|
|
QFileInfo fi(fn);
|
|
|
|
if (fi.suffix().isEmpty())
|
|
|
|
fn += QString(".%1").arg(e->exporterFileExt());
|
2018-06-23 00:04:28 +03:00
|
|
|
|
2018-10-14 00:06:27 +03:00
|
|
|
bool designTime = dataManager()->designTime();
|
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
ReportPages pages = renderToPages();
|
|
|
|
dataManager()->setDesignTime(designTime);
|
|
|
|
bool result = e->exportPages(pages, fn, params);
|
|
|
|
delete e;
|
|
|
|
return result;
|
2018-06-23 00:04:28 +03:00
|
|
|
}
|
2016-02-17 10:19:50 +03:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-08-02 22:33:33 +03:00
|
|
|
void ReportEnginePrivate::previewReport(PreviewHints hints)
|
2016-02-17 10:11:00 +03:00
|
|
|
{
|
2017-07-29 00:54:43 +03:00
|
|
|
// QTime start = QTime::currentTime();
|
2016-02-17 10:11:00 +03:00
|
|
|
try{
|
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
ReportPages pages = renderToPages();
|
|
|
|
dataManager()->setDesignTime(true);
|
|
|
|
if (pages.count()>0){
|
2017-03-22 14:42:09 +03:00
|
|
|
Q_Q(ReportEngine);
|
|
|
|
PreviewReportWindow* w = new PreviewReportWindow(q,0,settings());
|
2016-04-06 20:41:50 +03:00
|
|
|
w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint);
|
2016-02-17 10:11:00 +03:00
|
|
|
w->setAttribute(Qt::WA_DeleteOnClose,true);
|
|
|
|
w->setWindowModality(Qt::ApplicationModal);
|
2016-04-06 22:03:58 +03:00
|
|
|
//w->setWindowIcon(QIcon(":/report/images/main.ico"));
|
|
|
|
w->setWindowIcon(m_previewWindowIcon);
|
|
|
|
w->setWindowTitle(m_previewWindowTitle);
|
2016-02-17 10:11:00 +03:00
|
|
|
w->setSettings(settings());
|
|
|
|
w->setPages(pages);
|
2017-11-01 22:09:19 +03:00
|
|
|
w->setLayoutDirection(m_previewLayoutDirection);
|
2018-07-11 02:42:43 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
if (!dataManager()->errorsList().isEmpty()){
|
|
|
|
w->setErrorMessages(dataManager()->errorsList());
|
|
|
|
}
|
2016-08-02 22:33:33 +03:00
|
|
|
|
2016-08-08 15:50:04 +03:00
|
|
|
if (!hints.testFlag(PreviewBarsUserSetting)){
|
|
|
|
w->setMenuVisible(!hints.testFlag(HidePreviewMenuBar));
|
|
|
|
w->setStatusBarVisible(!hints.testFlag(HidePreviewStatusBar));
|
|
|
|
w->setToolBarVisible(!hints.testFlag(HidePreviewToolBar));
|
|
|
|
}
|
2016-08-02 22:33:33 +03:00
|
|
|
|
2017-02-03 14:20:30 +03:00
|
|
|
w->setHideResultEditButton(resultIsEditable());
|
2017-12-11 16:48:00 +03:00
|
|
|
w->setStyleSheet(m_styleSheet);
|
2016-02-20 13:37:18 +03:00
|
|
|
m_activePreview = w;
|
2018-07-11 02:42:43 +03:00
|
|
|
|
|
|
|
w->setPreviewScaleType(m_previewScaleType, m_previewScalePercent);
|
|
|
|
|
2017-04-20 04:48:37 +03:00
|
|
|
connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*)));
|
2016-02-17 10:11:00 +03:00
|
|
|
w->exec();
|
|
|
|
}
|
|
|
|
} catch (ReportError &exception){
|
|
|
|
saveError(exception.what());
|
|
|
|
showError(exception.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-27 23:14:05 +03:00
|
|
|
ReportDesignWindowInterface*ReportEnginePrivate::getDesignerWindow()
|
|
|
|
{
|
|
|
|
if (!m_designerWindow) {
|
|
|
|
if (m_designerFactory){
|
|
|
|
m_designerWindow = m_designerFactory->getDesignerWindow(this,QApplication::activeWindow(),settings());
|
|
|
|
m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true);
|
|
|
|
m_designerWindow->setWindowIcon(QIcon(":report/images/logo32"));
|
|
|
|
m_designerWindow->setShowProgressDialog(m_showProgressDialog);
|
|
|
|
} else {
|
|
|
|
#ifdef HAVE_REPORT_DESIGNER
|
|
|
|
m_designerWindow = new LimeReport::ReportDesignWindow(this,QApplication::activeWindow(),settings());
|
|
|
|
m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true);
|
|
|
|
m_designerWindow->setWindowIcon(QIcon(":report/images/logo32"));
|
|
|
|
m_designerWindow->setShowProgressDialog(m_showProgressDialog);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (m_designerWindow){
|
|
|
|
m_datasources->updateDatasourceModel();
|
|
|
|
}
|
|
|
|
return m_designerWindow;
|
|
|
|
}
|
|
|
|
|
2016-03-30 23:21:44 +03:00
|
|
|
PreviewReportWidget* ReportEnginePrivate::createPreviewWidget(QWidget* parent){
|
|
|
|
|
2017-03-22 14:42:09 +03:00
|
|
|
Q_Q(ReportEngine);
|
|
|
|
PreviewReportWidget* widget = new PreviewReportWidget(q, parent);
|
2016-03-30 23:21:44 +03:00
|
|
|
try{
|
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
ReportPages pages = renderToPages();
|
|
|
|
dataManager()->setDesignTime(true);
|
|
|
|
if (pages.count()>0)
|
|
|
|
widget->d_ptr->setPages(pages);
|
|
|
|
} catch (ReportError &exception){
|
|
|
|
saveError(exception.what());
|
|
|
|
showError(exception.what());
|
|
|
|
}
|
|
|
|
return widget;
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
PageDesignIntf* ReportEnginePrivate::createPreviewScene(QObject* parent){
|
|
|
|
PageDesignIntf* result = 0;
|
|
|
|
try {
|
|
|
|
ReportPages pages = renderToPages();
|
|
|
|
result = new PageDesignIntf(parent);
|
|
|
|
result->setPageItems(pages);
|
|
|
|
} catch (ReportError &exception){
|
|
|
|
saveError(exception.what());
|
|
|
|
showError(exception.what());
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2018-05-23 19:01:30 +03:00
|
|
|
bool ReportEnginePrivate::emitSaveReport()
|
2016-02-17 10:39:17 +03:00
|
|
|
{
|
2018-05-23 19:01:30 +03:00
|
|
|
bool result = false;
|
|
|
|
emit onSave(result);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEnginePrivate::emitSaveReportAs()
|
|
|
|
{
|
|
|
|
bool result = false;
|
|
|
|
emit onSaveAs(result);
|
|
|
|
return result;
|
2016-02-17 10:39:17 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEnginePrivate::emitLoadReport()
|
|
|
|
{
|
|
|
|
bool result = false;
|
|
|
|
emit onLoad(result);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2016-04-21 17:44:58 +03:00
|
|
|
void ReportEnginePrivate::emitSaveFinished()
|
|
|
|
{
|
|
|
|
emit saveFinished();
|
|
|
|
}
|
|
|
|
|
2018-05-23 19:01:30 +03:00
|
|
|
void ReportEnginePrivate::emitLoadFinished()
|
|
|
|
{
|
|
|
|
emit loadFinished();
|
|
|
|
}
|
|
|
|
|
2018-05-08 16:30:10 +03:00
|
|
|
void ReportEnginePrivate::emitPrintedToPDF(QString fileName)
|
|
|
|
{
|
|
|
|
emit printedToPDF(fileName);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:39:17 +03:00
|
|
|
bool ReportEnginePrivate::isSaved()
|
|
|
|
{
|
|
|
|
foreach (PageDesignIntf* page, m_pages) {
|
|
|
|
if (!page->isSaved()) return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setCurrentReportsDir(const QString &dirName)
|
|
|
|
{
|
|
|
|
if (QDir(dirName).exists())
|
|
|
|
m_reportsDir = dirName;
|
|
|
|
}
|
|
|
|
|
2017-04-20 05:43:48 +03:00
|
|
|
bool ReportEnginePrivate::slotLoadFromFile(const QString &fileName)
|
|
|
|
{
|
2018-02-28 23:19:04 +03:00
|
|
|
EASY_BLOCK("ReportEnginePrivate::slotLoadFromFile")
|
2017-04-20 05:43:48 +03:00
|
|
|
PreviewReportWindow *currentPreview = qobject_cast<PreviewReportWindow *>(m_activePreview);
|
|
|
|
|
|
|
|
if (!QFile::exists(fileName))
|
|
|
|
{
|
|
|
|
if ( hasActivePreview() )
|
|
|
|
{
|
|
|
|
QMessageBox::information( NULL,
|
|
|
|
tr( "Report File Change" ),
|
|
|
|
tr( "The report file \"%1\" has changed names or been deleted.\n\nThis preview is no longer valid." ).arg( fileName )
|
|
|
|
);
|
|
|
|
|
|
|
|
clearReport();
|
|
|
|
|
|
|
|
currentPreview->close();
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
clearReport();
|
|
|
|
|
|
|
|
ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName);
|
|
|
|
reader->setPassPhrase(m_passPhrase);
|
|
|
|
if (reader->first()){
|
|
|
|
if (reader->readItem(this)){
|
|
|
|
m_fileName=fileName;
|
|
|
|
QFileInfo fi(fileName);
|
|
|
|
m_reportName = fi.fileName();
|
|
|
|
|
|
|
|
QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db";
|
|
|
|
if (QFile::exists(dbSettingFileName)){
|
|
|
|
QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat);
|
|
|
|
foreach (ConnectionDesc* connection, dataManager()->conections()) {
|
|
|
|
if (!connection->keepDBCredentials()){
|
|
|
|
dbcredentals.beginGroup(connection->name());
|
|
|
|
connection->setUserName(dbcredentals.value("user").toString());
|
|
|
|
connection->setPassword(dbcredentals.value("password").toString());
|
|
|
|
dbcredentals.endGroup();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-02-28 23:19:04 +03:00
|
|
|
EASY_BLOCK("Connect auto connections")
|
2017-04-20 05:43:48 +03:00
|
|
|
dataManager()->connectAutoConnections();
|
2018-02-28 23:19:04 +03:00
|
|
|
EASY_END_BLOCK;
|
2017-04-20 05:43:48 +03:00
|
|
|
|
|
|
|
if ( hasActivePreview() )
|
|
|
|
{
|
|
|
|
currentPreview->reloadPreview();
|
|
|
|
}
|
2018-02-28 23:19:04 +03:00
|
|
|
EASY_END_BLOCK;
|
2017-04-20 05:43:48 +03:00
|
|
|
return true;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
m_lastError = reader->lastError();
|
2018-02-28 23:19:04 +03:00
|
|
|
EASY_END_BLOCK;
|
2017-04-20 05:43:48 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
void ReportEnginePrivate::cancelRender()
|
|
|
|
{
|
|
|
|
if (m_reportRender)
|
|
|
|
m_reportRender->cancelRender();
|
2016-12-13 12:47:46 +03:00
|
|
|
m_reportRendering = false;
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
2016-06-10 18:05:18 +03:00
|
|
|
PageDesignIntf* ReportEngine::createPreviewScene(QObject* parent){
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->createPreviewScene(parent);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
void ReportEnginePrivate::designReport()
|
|
|
|
{
|
2017-11-27 23:14:05 +03:00
|
|
|
ReportDesignWindowInterface* designerWindow = getDesignerWindow();
|
|
|
|
if (designerWindow){
|
2018-02-28 23:19:04 +03:00
|
|
|
dataManager()->setDesignTime(true);
|
|
|
|
connect(designerWindow, SIGNAL(destroyed(QObject*)), this, SLOT(slotDesignerWindowDestroyed(QObject*)));
|
2016-04-21 17:53:31 +03:00
|
|
|
#ifdef Q_OS_WIN
|
2017-11-27 23:14:05 +03:00
|
|
|
designerWindow->setWindowModality(Qt::ApplicationModal);
|
2016-02-17 10:11:00 +03:00
|
|
|
#endif
|
2017-11-27 23:14:05 +03:00
|
|
|
if (QApplication::activeWindow()==0){
|
|
|
|
designerWindow->show();;
|
|
|
|
} else {
|
|
|
|
designerWindow->showModal();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
qDebug()<<(tr("Designer not found!"));
|
|
|
|
}
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setSettings(QSettings* value)
|
|
|
|
{
|
|
|
|
if (value){
|
|
|
|
if (m_ownedSettings&&m_settings)
|
|
|
|
delete m_settings;
|
|
|
|
m_settings = value;
|
|
|
|
m_ownedSettings = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QSettings*ReportEnginePrivate::settings()
|
|
|
|
{
|
|
|
|
if (m_settings){
|
|
|
|
return m_settings;
|
|
|
|
} else {
|
|
|
|
m_settings = new QSettings("LimeReport",QApplication::applicationName());
|
|
|
|
m_ownedSettings=true;
|
|
|
|
return m_settings;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-20 05:43:48 +03:00
|
|
|
bool ReportEnginePrivate::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange)
|
2016-02-17 10:11:00 +03:00
|
|
|
{
|
2017-04-20 05:43:48 +03:00
|
|
|
// only watch one file at a time
|
2018-02-28 23:19:04 +03:00
|
|
|
|
2017-04-20 05:43:48 +03:00
|
|
|
if ( !m_fileWatcher->files().isEmpty() )
|
|
|
|
{
|
|
|
|
m_fileWatcher->removePaths( m_fileWatcher->files() );
|
|
|
|
}
|
2016-03-19 13:33:49 +03:00
|
|
|
|
2017-04-20 05:43:48 +03:00
|
|
|
if ( autoLoadPreviewOnChange )
|
|
|
|
{
|
|
|
|
m_fileWatcher->addPath( fileName );
|
|
|
|
}
|
2017-02-16 04:11:39 +03:00
|
|
|
|
2018-05-08 10:58:43 +03:00
|
|
|
bool result = slotLoadFromFile( fileName );
|
|
|
|
if (result) {
|
2018-05-23 19:01:30 +03:00
|
|
|
emit loadFinished();
|
2018-05-08 10:58:43 +03:00
|
|
|
}
|
|
|
|
return result;
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
2016-02-17 10:39:17 +03:00
|
|
|
bool ReportEnginePrivate::loadFromByteArray(QByteArray* data, const QString &name){
|
2016-02-17 10:11:00 +03:00
|
|
|
clearReport();
|
2016-02-17 10:39:17 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
ItemsReaderIntf::Ptr reader = ByteArrayXMLReader::create(data);
|
2017-02-16 04:11:39 +03:00
|
|
|
reader->setPassPhrase(m_passPhrase);
|
2016-02-17 10:11:00 +03:00
|
|
|
if (reader->first()){
|
|
|
|
if (reader->readItem(this)){
|
2016-02-17 10:39:17 +03:00
|
|
|
m_fileName = "";
|
|
|
|
m_reportName = name;
|
2018-05-23 19:01:30 +03:00
|
|
|
emit loadFinished();
|
2016-02-17 10:39:17 +03:00
|
|
|
return true;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEnginePrivate::loadFromString(const QString &report, const QString &name)
|
|
|
|
{
|
|
|
|
clearReport();
|
|
|
|
|
|
|
|
ItemsReaderIntf::Ptr reader = StringXMLreader::create(report);
|
2017-02-16 04:11:39 +03:00
|
|
|
reader->setPassPhrase(m_passPhrase);
|
2016-02-17 10:39:17 +03:00
|
|
|
if (reader->first()){
|
|
|
|
if (reader->readItem(this)){
|
|
|
|
m_fileName = "";
|
|
|
|
m_reportName = name;
|
2018-05-23 19:01:30 +03:00
|
|
|
emit loadFinished();
|
2016-02-17 10:11:00 +03:00
|
|
|
return true;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEnginePrivate::saveToFile(const QString &fileName)
|
|
|
|
{
|
2018-02-07 22:43:31 +03:00
|
|
|
if (fileName.isEmpty() & m_fileName.isEmpty()) return false;
|
|
|
|
QString fn = fileName.isEmpty() ? m_fileName : fileName;
|
|
|
|
QFileInfo fi(fn);
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
if (fi.suffix().isEmpty())
|
|
|
|
fn+=".lrxml";
|
|
|
|
|
2017-02-16 04:11:39 +03:00
|
|
|
QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db";
|
|
|
|
QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat);
|
|
|
|
|
|
|
|
foreach (ConnectionDesc* connection, dataManager()->conections()) {
|
|
|
|
if (!connection->keepDBCredentials()){
|
|
|
|
dbcredentals.beginGroup(connection->name());
|
|
|
|
dbcredentals.setValue("user",connection->userName());
|
|
|
|
dbcredentals.setValue("password",connection->password());
|
|
|
|
dbcredentals.endGroup();
|
|
|
|
connection->setPassword("");
|
|
|
|
connection->setUserName("");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
|
2017-02-16 04:11:39 +03:00
|
|
|
writer->setPassPhrase(m_passPhrase);
|
2016-02-17 10:11:00 +03:00
|
|
|
writer->putItem(this);
|
2017-02-16 04:11:39 +03:00
|
|
|
m_fileName=fn;
|
2016-02-17 10:11:00 +03:00
|
|
|
bool saved = writer->saveToFile(fn);
|
2017-02-16 04:11:39 +03:00
|
|
|
|
|
|
|
foreach (ConnectionDesc* connection, dataManager()->conections()) {
|
|
|
|
if (!connection->keepDBCredentials()){
|
|
|
|
dbcredentals.beginGroup(connection->name());
|
|
|
|
connection->setUserName(dbcredentals.value("user").toString());
|
|
|
|
connection->setPassword(dbcredentals.value("password").toString());
|
|
|
|
dbcredentals.endGroup();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
if (saved){
|
|
|
|
foreach(PageDesignIntf* page, m_pages){
|
|
|
|
page->setToSaved();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return saved;
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:39:17 +03:00
|
|
|
QByteArray ReportEnginePrivate::saveToByteArray()
|
|
|
|
{
|
|
|
|
QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
|
2017-02-16 04:11:39 +03:00
|
|
|
writer->setPassPhrase(m_passPhrase);
|
2016-02-17 10:39:17 +03:00
|
|
|
writer->putItem(this);
|
|
|
|
QByteArray result = writer->saveToByteArray();
|
|
|
|
if (!result.isEmpty()){
|
|
|
|
foreach(PageDesignIntf* page, m_pages){
|
|
|
|
page->setToSaved();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ReportEnginePrivate::saveToString(){
|
|
|
|
QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
|
2017-02-16 04:11:39 +03:00
|
|
|
writer->setPassPhrase(m_passPhrase);
|
2016-02-17 10:39:17 +03:00
|
|
|
writer->putItem(this);
|
|
|
|
QString result = writer->saveToString();
|
|
|
|
if (!result.isEmpty()){
|
|
|
|
foreach(PageDesignIntf* page, m_pages){
|
|
|
|
page->setToSaved();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
bool ReportEnginePrivate::isNeedToSave()
|
|
|
|
{
|
|
|
|
foreach(PageDesignIntf* page, m_pages){
|
|
|
|
if (page->isHasChanges()) return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ReportEnginePrivate::renderToString()
|
|
|
|
{
|
|
|
|
LimeReport::ReportRender render;
|
2018-09-01 12:36:25 +03:00
|
|
|
updateTranslations();
|
2016-02-17 10:11:00 +03:00
|
|
|
dataManager()->connectAllDatabases();
|
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
if (m_pages.count()){
|
|
|
|
render.setDatasources(dataManager());
|
2016-06-10 18:05:18 +03:00
|
|
|
render.setScriptContext(scriptContext());
|
2018-03-07 19:54:57 +03:00
|
|
|
return render.renderPageToString(m_pages.at(0)->pageItem());
|
2018-07-11 02:42:43 +03:00
|
|
|
} else return QString();
|
2018-07-11 03:05:55 +03:00
|
|
|
|
2018-07-11 02:42:43 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
ScaleType ReportEnginePrivate::previewScaleType()
|
|
|
|
{
|
|
|
|
return m_previewScaleType;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ReportEnginePrivate::previewScalePercent()
|
|
|
|
{
|
|
|
|
return m_previewScalePercent;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setPreviewScaleType(const ScaleType &scaleType, int percent)
|
|
|
|
{
|
|
|
|
m_previewScaleType = scaleType;
|
|
|
|
m_previewScalePercent = percent;
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
2018-03-07 19:54:57 +03:00
|
|
|
PageItemDesignIntf* ReportEnginePrivate::getPageByName(const QString& pageName)
|
2017-07-29 00:54:43 +03:00
|
|
|
{
|
2018-03-07 19:54:57 +03:00
|
|
|
foreach(PageItemDesignIntf* page, m_renderingPages){
|
2017-07-29 00:54:43 +03:00
|
|
|
if ( page->objectName().compare(pageName, Qt::CaseInsensitive) == 0)
|
|
|
|
return page;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-11-01 22:09:19 +03:00
|
|
|
Qt::LayoutDirection ReportEnginePrivate::previewLayoutDirection()
|
|
|
|
{
|
|
|
|
return m_previewLayoutDirection;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setPreviewLayoutDirection(const Qt::LayoutDirection& layoutDirection)
|
|
|
|
{
|
|
|
|
m_previewLayoutDirection = layoutDirection;
|
|
|
|
}
|
|
|
|
|
2017-02-16 04:11:39 +03:00
|
|
|
void ReportEnginePrivate::setPassPhrase(const QString &passPhrase)
|
|
|
|
{
|
|
|
|
m_passPhrase = passPhrase;
|
|
|
|
}
|
|
|
|
|
2017-08-19 00:16:55 +03:00
|
|
|
void ReportEnginePrivate::reorderPages(const QList<PageDesignIntf *>& reorderedPages)
|
|
|
|
{
|
|
|
|
m_pages.clear();
|
|
|
|
foreach(PageDesignIntf* page, reorderedPages){
|
|
|
|
m_pages.append(page);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-21 22:02:13 +03:00
|
|
|
void ReportEnginePrivate::clearSelection()
|
|
|
|
{
|
|
|
|
foreach (PageDesignIntf* page, m_pages) {
|
|
|
|
foreach(QGraphicsItem* item, page->selectedItems()){
|
|
|
|
item->setSelected(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-29 00:54:43 +03:00
|
|
|
bool ReportEnginePrivate::addTranslationLanguage(QLocale::Language language)
|
|
|
|
{
|
|
|
|
if (!m_translations.keys().contains(language)){
|
2017-08-16 01:18:56 +03:00
|
|
|
ReportTranslation* translation = 0;
|
|
|
|
if (!m_translations.contains(QLocale::AnyLanguage)){
|
|
|
|
translation = new ReportTranslation(QLocale::AnyLanguage,m_pages);
|
|
|
|
m_translations.insert(QLocale::AnyLanguage,translation);
|
|
|
|
}
|
|
|
|
translation = new ReportTranslation(language,m_pages);
|
2017-07-29 00:54:43 +03:00
|
|
|
m_translations.insert(language, translation);
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
m_lastError = tr("Language %1 already exists").arg(QLocale::languageToString(language));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-16 01:18:56 +03:00
|
|
|
bool ReportEnginePrivate::removeTranslationLanguage(QLocale::Language language)
|
|
|
|
{
|
|
|
|
return m_translations.remove(language) != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::activateLanguage(QLocale::Language language)
|
|
|
|
{
|
|
|
|
if (!m_translations.keys().contains(language)) return;
|
2017-07-29 00:54:43 +03:00
|
|
|
ReportTranslation* translation = m_translations.value(language);
|
|
|
|
|
|
|
|
foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){
|
2018-03-07 19:54:57 +03:00
|
|
|
PageItemDesignIntf* page = getPageByName(pageTranslation->pageName);
|
2017-07-29 00:54:43 +03:00
|
|
|
if (page){
|
2017-08-05 01:38:19 +03:00
|
|
|
foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){
|
2018-03-07 19:54:57 +03:00
|
|
|
BaseDesignIntf* item = page->childByName(itemTranslation->itemName);
|
2017-07-29 00:54:43 +03:00
|
|
|
if (item) {
|
2017-08-05 01:38:19 +03:00
|
|
|
foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){
|
2018-09-06 23:07:19 +03:00
|
|
|
if (propertyTranslation->checked)
|
|
|
|
item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value);
|
2017-07-29 00:54:43 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-08-16 01:18:56 +03:00
|
|
|
}
|
|
|
|
|
2018-05-15 22:14:17 +03:00
|
|
|
QList<QLocale::Language> ReportEnginePrivate::designerLanguages()
|
2018-04-10 16:28:48 +03:00
|
|
|
{
|
|
|
|
|
2018-05-15 22:14:17 +03:00
|
|
|
QList<QLocale::Language> result;
|
|
|
|
emit getAviableLanguages(&result);
|
|
|
|
return result;
|
2018-04-10 16:28:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
QLocale::Language ReportEnginePrivate::currentDesignerLanguage()
|
|
|
|
{
|
2018-05-15 22:14:17 +03:00
|
|
|
QLocale::Language result = emit getCurrentDefaultLanguage();
|
|
|
|
return result;
|
2018-04-10 16:28:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setCurrentDesignerLanguage(QLocale::Language language)
|
|
|
|
{
|
|
|
|
m_currentDesignerLanguage = language;
|
2018-05-15 22:14:17 +03:00
|
|
|
emit currentDefaulLanguageChanged(language);
|
2018-04-10 16:28:48 +03:00
|
|
|
}
|
|
|
|
|
2017-12-11 16:48:00 +03:00
|
|
|
QString ReportEnginePrivate::styleSheet() const
|
|
|
|
{
|
|
|
|
return m_styleSheet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setStyleSheet(const QString &styleSheet)
|
|
|
|
{
|
|
|
|
m_styleSheet = styleSheet;
|
|
|
|
}
|
|
|
|
|
2017-08-16 01:18:56 +03:00
|
|
|
bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){
|
|
|
|
m_reportLanguage = language;
|
|
|
|
if (!m_translations.keys().contains(language)) return false;
|
2017-12-11 16:48:00 +03:00
|
|
|
// activateLanguage(language);
|
2017-07-29 00:54:43 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<QLocale::Language> ReportEnginePrivate::aviableLanguages()
|
|
|
|
{
|
|
|
|
return m_translations.keys();
|
|
|
|
}
|
|
|
|
|
|
|
|
ReportTranslation*ReportEnginePrivate::reportTranslation(QLocale::Language language)
|
|
|
|
{
|
|
|
|
return m_translations.value(language);
|
|
|
|
}
|
|
|
|
|
2017-02-03 14:20:30 +03:00
|
|
|
bool ReportEnginePrivate::resultIsEditable() const
|
|
|
|
{
|
|
|
|
return m_resultIsEditable;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setResultEditable(bool value)
|
|
|
|
{
|
|
|
|
m_resultIsEditable = value;
|
|
|
|
}
|
|
|
|
|
2016-06-24 23:15:59 +03:00
|
|
|
bool ReportEnginePrivate::suppressFieldAndVarError() const
|
|
|
|
{
|
|
|
|
return m_reportSettings.suppressAbsentFieldsAndVarsWarnings();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setSuppressFieldAndVarError(bool suppressFieldAndVarError)
|
|
|
|
{
|
|
|
|
m_reportSettings.setSuppressAbsentFieldsAndVarsWarnings(suppressFieldAndVarError);
|
|
|
|
}
|
|
|
|
|
2016-12-13 12:47:46 +03:00
|
|
|
bool ReportEnginePrivate::isBusy()
|
|
|
|
{
|
|
|
|
return m_reportRendering;
|
|
|
|
}
|
|
|
|
|
2016-04-06 22:03:58 +03:00
|
|
|
QString ReportEnginePrivate::previewWindowTitle() const
|
|
|
|
{
|
|
|
|
return m_previewWindowTitle;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setPreviewWindowTitle(const QString &previewWindowTitle)
|
|
|
|
{
|
|
|
|
m_previewWindowTitle = previewWindowTitle;
|
|
|
|
}
|
|
|
|
|
|
|
|
QIcon ReportEnginePrivate::previewWindowIcon() const
|
|
|
|
{
|
|
|
|
return m_previewWindowIcon;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::setPreviewWindowIcon(const QIcon &previewWindowIcon)
|
|
|
|
{
|
|
|
|
m_previewWindowIcon = previewWindowIcon;
|
|
|
|
}
|
|
|
|
|
2018-03-07 19:54:57 +03:00
|
|
|
PageItemDesignIntf* ReportEnginePrivate::createRenderingPage(PageItemDesignIntf* page){
|
|
|
|
PageItemDesignIntf* result = dynamic_cast<PageItemDesignIntf*>(page->cloneItem(page->itemMode()));
|
|
|
|
ICollectionContainer* co = dynamic_cast<ICollectionContainer*>(result);
|
|
|
|
if (co) co->collectionLoadFinished("children");
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2018-12-12 22:55:03 +03:00
|
|
|
void ReportEnginePrivate::initReport()
|
|
|
|
{
|
|
|
|
for(int index = 0; index < pageCount(); ++index){
|
|
|
|
PageDesignIntf* page = pageAt(index);
|
|
|
|
if (page != 0){
|
|
|
|
foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()) {
|
|
|
|
IPainterProxy *proxyItem = dynamic_cast<IPainterProxy *>(item);
|
|
|
|
if (proxyItem){
|
|
|
|
proxyItem->setExternalPainter(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem* options)
|
|
|
|
{
|
|
|
|
emit externalPaint(objectName, painter, options);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
ReportPages ReportEnginePrivate::renderToPages()
|
|
|
|
{
|
2016-12-13 12:47:46 +03:00
|
|
|
if (m_reportRendering) return ReportPages();
|
2018-12-12 22:55:03 +03:00
|
|
|
initReport();
|
2016-02-17 10:11:00 +03:00
|
|
|
m_reportRender = ReportRender::Ptr(new ReportRender);
|
2018-09-01 12:36:25 +03:00
|
|
|
updateTranslations();
|
2016-02-17 10:11:00 +03:00
|
|
|
connect(m_reportRender.data(),SIGNAL(pageRendered(int)),
|
|
|
|
this, SIGNAL(renderPageFinished(int)));
|
2017-04-20 23:34:32 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
if (m_pages.count()){
|
2018-03-07 19:54:57 +03:00
|
|
|
|
2017-04-20 23:34:32 +03:00
|
|
|
#ifdef HAVE_UI_LOADER
|
|
|
|
m_scriptEngineContext->initDialogs();
|
|
|
|
#endif
|
2016-06-10 18:05:18 +03:00
|
|
|
ReportPages result;
|
2016-12-13 12:47:46 +03:00
|
|
|
m_reportRendering = true;
|
2017-04-20 23:34:32 +03:00
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
m_reportRender->setDatasources(dataManager());
|
2016-06-10 18:05:18 +03:00
|
|
|
m_reportRender->setScriptContext(scriptContext());
|
|
|
|
|
2017-04-20 23:34:32 +03:00
|
|
|
foreach (PageDesignIntf* page, m_pages) {
|
2018-03-07 19:54:57 +03:00
|
|
|
PageItemDesignIntf* rp = createRenderingPage(page->pageItem());
|
|
|
|
m_renderingPages.append(rp);
|
|
|
|
scriptContext()->baseDesignIntfToScript(rp->objectName(), rp);
|
2016-09-16 01:59:56 +03:00
|
|
|
}
|
|
|
|
|
2017-09-01 02:02:51 +03:00
|
|
|
scriptContext()->qobjectToScript("engine",this);
|
|
|
|
|
2017-04-20 23:34:32 +03:00
|
|
|
if (m_scriptEngineContext->runInitScript()){
|
2017-09-01 02:02:51 +03:00
|
|
|
|
2018-09-06 23:07:19 +03:00
|
|
|
dataManager()->clearErrors();
|
|
|
|
dataManager()->connectAllDatabases();
|
|
|
|
dataManager()->setDesignTime(false);
|
|
|
|
dataManager()->updateDatasourceModel();
|
|
|
|
|
2017-09-01 02:02:51 +03:00
|
|
|
activateLanguage(m_reportLanguage);
|
2017-04-20 23:34:32 +03:00
|
|
|
emit renderStarted();
|
|
|
|
|
2018-03-07 19:54:57 +03:00
|
|
|
foreach(PageItemDesignIntf* page , m_renderingPages){
|
|
|
|
if (!page->isTOC() && page->isPrintable()){
|
2017-08-18 22:55:29 +03:00
|
|
|
page->setReportSettings(&m_reportSettings);
|
|
|
|
result.append(m_reportRender->renderPageToPages(page));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-07 19:54:57 +03:00
|
|
|
for (int i=0; i<m_renderingPages.count(); ++i){
|
|
|
|
PageItemDesignIntf* page = m_renderingPages.at(i);
|
|
|
|
if (page->isTOC()){
|
2017-08-18 22:55:29 +03:00
|
|
|
page->setReportSettings(&m_reportSettings);
|
2017-08-31 02:53:34 +03:00
|
|
|
if (i==0){
|
2018-03-07 19:54:57 +03:00
|
|
|
PageItemDesignIntf* secondPage = 0;
|
|
|
|
if (m_pages.count()>1) secondPage = m_renderingPages.at(1);
|
2017-08-31 02:53:34 +03:00
|
|
|
ReportPages pages = m_reportRender->renderTOC(
|
|
|
|
page,
|
|
|
|
true,
|
2018-03-07 19:54:57 +03:00
|
|
|
secondPage && secondPage->resetPageNumber()
|
2017-08-31 02:53:34 +03:00
|
|
|
);
|
|
|
|
for (int j=0; j<pages.count(); ++j){
|
|
|
|
result.insert(j,pages.at(j));
|
2017-08-18 22:55:29 +03:00
|
|
|
}
|
2017-08-31 02:53:34 +03:00
|
|
|
|
|
|
|
} else {
|
2017-08-18 22:55:29 +03:00
|
|
|
result.append(m_reportRender->renderPageToPages(page));
|
2017-08-31 02:53:34 +03:00
|
|
|
}
|
2017-08-18 22:55:29 +03:00
|
|
|
}
|
2017-04-20 23:34:32 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
m_reportRender->secondRenderPass(result);
|
2017-08-25 18:01:59 +03:00
|
|
|
|
2017-04-20 23:34:32 +03:00
|
|
|
emit renderFinished();
|
|
|
|
m_reportRender.clear();
|
2018-03-07 19:54:57 +03:00
|
|
|
|
|
|
|
foreach(PageItemDesignIntf* page, m_renderingPages){
|
|
|
|
delete page;
|
|
|
|
}
|
|
|
|
m_renderingPages.clear();
|
2017-04-20 23:34:32 +03:00
|
|
|
}
|
2017-08-18 22:55:29 +03:00
|
|
|
m_reportRendering = false;
|
2018-03-07 19:54:57 +03:00
|
|
|
//activateLanguage(QLocale::AnyLanguage);
|
2016-02-17 10:11:00 +03:00
|
|
|
return result;
|
2016-06-10 18:05:18 +03:00
|
|
|
} else {
|
2016-02-20 12:05:57 +03:00
|
|
|
return ReportPages();
|
|
|
|
}
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
QString ReportEnginePrivate::lastError()
|
|
|
|
{
|
|
|
|
return m_lastError;
|
|
|
|
}
|
|
|
|
|
|
|
|
ReportEngine::ReportEngine(QObject *parent)
|
|
|
|
: QObject(parent), d_ptr(new ReportEnginePrivate())
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->q_ptr=this;
|
|
|
|
connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted()));
|
|
|
|
connect(d, SIGNAL(renderPageFinished(int)),
|
|
|
|
this, SIGNAL(renderPageFinished(int)));
|
|
|
|
connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished()));
|
2018-05-23 19:01:30 +03:00
|
|
|
connect(d, SIGNAL(onSave(bool&)), this, SIGNAL(onSave(bool&)));
|
|
|
|
connect(d, SIGNAL(onSaveAs(bool&)), this, SIGNAL(onSaveAs(bool&)));
|
2016-02-17 10:39:17 +03:00
|
|
|
connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&)));
|
2016-04-21 17:44:58 +03:00
|
|
|
connect(d, SIGNAL(saveFinished()), this, SIGNAL(saveFinished()));
|
2018-05-23 19:01:30 +03:00
|
|
|
connect(d, SIGNAL(loadFinished()), this, SIGNAL(loadFinished()));
|
2018-06-04 22:31:03 +03:00
|
|
|
connect(d, SIGNAL(cleared()), this, SIGNAL(cleared()));
|
2018-05-08 16:30:10 +03:00
|
|
|
connect(d, SIGNAL(printedToPDF(QString)), this, SIGNAL(printedToPDF(QString)));
|
2018-05-15 22:17:56 +03:00
|
|
|
|
2018-05-15 22:14:17 +03:00
|
|
|
connect(d, SIGNAL(getAviableLanguages(QList<QLocale::Language>*)),
|
|
|
|
this, SIGNAL(getAviableLanguages(QList<QLocale::Language>*)));
|
|
|
|
connect(d, SIGNAL(currentDefaulLanguageChanged(QLocale::Language)),
|
|
|
|
this, SIGNAL(currentDefaulLanguageChanged(QLocale::Language)));
|
|
|
|
connect(d, SIGNAL(getCurrentDefaultLanguage()),
|
|
|
|
this, SIGNAL(getCurrentDefaultLanguage()));
|
2018-05-15 22:17:56 +03:00
|
|
|
|
2018-12-12 22:55:03 +03:00
|
|
|
connect(d, SIGNAL(externalPaint(const QString&, QPainter*, const QStyleOptionGraphicsItem*)),
|
|
|
|
this, SIGNAL(externalPaint(const QString&, QPainter*, const QStyleOptionGraphicsItem*)));
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
ReportEngine::~ReportEngine()
|
|
|
|
{
|
2016-02-18 21:09:00 +03:00
|
|
|
delete d_ptr;
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEngine::printReport(QPrinter *printer)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->printReport(printer);
|
|
|
|
}
|
|
|
|
|
2017-04-21 23:03:56 +03:00
|
|
|
bool ReportEngine::printPages(ReportPages pages, QPrinter *printer){
|
2016-06-10 18:05:18 +03:00
|
|
|
Q_D(ReportEngine);
|
2017-04-21 23:03:56 +03:00
|
|
|
return d->printPages(pages,printer);
|
2016-06-10 18:05:18 +03:00
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
void ReportEngine::printToFile(const QString &fileName)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->printToFile(fileName);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:19:50 +03:00
|
|
|
bool ReportEngine::printToPDF(const QString &fileName)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->printToPDF(fileName);
|
|
|
|
}
|
|
|
|
|
2018-06-23 00:04:28 +03:00
|
|
|
bool ReportEngine::exportReport(QString exporterName, const QString &fileName, const QMap<QString, QVariant> ¶ms)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->exportReport(exporterName, fileName, params);
|
|
|
|
}
|
|
|
|
|
2016-08-02 22:33:33 +03:00
|
|
|
void ReportEngine::previewReport(PreviewHints hints)
|
2016-02-17 10:11:00 +03:00
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
if (m_settings)
|
|
|
|
d->setSettings(m_settings);
|
2016-08-02 22:33:33 +03:00
|
|
|
d->previewReport(hints);
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEngine::designReport()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
if (m_settings)
|
|
|
|
d->setSettings(m_settings);
|
|
|
|
d->designReport();
|
|
|
|
}
|
|
|
|
|
2018-05-08 10:58:43 +03:00
|
|
|
ReportDesignWindowInterface* ReportEngine::getDesignerWindow()
|
2017-11-27 23:14:05 +03:00
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->getDesignerWindow();
|
|
|
|
}
|
|
|
|
|
2016-03-30 23:21:44 +03:00
|
|
|
PreviewReportWidget* ReportEngine::createPreviewWidget(QWidget *parent)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->createPreviewWidget(parent);
|
|
|
|
}
|
|
|
|
|
2016-04-06 22:03:58 +03:00
|
|
|
void ReportEngine::setPreviewWindowTitle(const QString &title)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->setPreviewWindowTitle(title);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEngine::setPreviewWindowIcon(const QIcon &icon)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->setPreviewWindowIcon(icon);
|
|
|
|
}
|
|
|
|
|
2017-02-03 14:20:30 +03:00
|
|
|
void ReportEngine::setResultEditable(bool value)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->setResultEditable(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEngine::resultIsEditable()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->resultIsEditable();
|
|
|
|
}
|
|
|
|
|
2016-12-13 12:47:46 +03:00
|
|
|
bool ReportEngine::isBusy()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->isBusy();
|
|
|
|
}
|
|
|
|
|
2017-02-16 04:11:39 +03:00
|
|
|
void ReportEngine::setPassPharse(QString &passPharse)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->setPassPhrase(passPharse);
|
|
|
|
}
|
|
|
|
|
2017-07-29 00:54:43 +03:00
|
|
|
QList<QLocale::Language> ReportEngine::aviableLanguages()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->aviableLanguages();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEngine::setReportLanguage(QLocale::Language language)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->setReportLanguage(language);
|
|
|
|
}
|
|
|
|
|
2018-05-15 22:14:17 +03:00
|
|
|
Qt::LayoutDirection ReportEngine::previewLayoutDirection()
|
2018-04-10 16:28:48 +03:00
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
2018-05-15 22:14:17 +03:00
|
|
|
return d->previewLayoutDirection();
|
2018-04-10 16:28:48 +03:00
|
|
|
}
|
|
|
|
|
2018-05-15 22:14:17 +03:00
|
|
|
void ReportEngine::setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection)
|
2018-04-10 16:28:48 +03:00
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
2018-05-15 22:14:17 +03:00
|
|
|
d->setPreviewLayoutDirection(previewLayoutDirection);
|
2018-04-10 16:28:48 +03:00
|
|
|
}
|
|
|
|
|
2018-05-15 22:14:17 +03:00
|
|
|
QList<QLocale::Language> ReportEngine::designerLanguages()
|
2018-04-10 16:28:48 +03:00
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->designerLanguages();
|
|
|
|
}
|
|
|
|
|
|
|
|
QLocale::Language ReportEngine::currentDesignerLanguage()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->currentDesignerLanguage();
|
|
|
|
}
|
|
|
|
|
2018-07-11 02:42:43 +03:00
|
|
|
ScaleType ReportEngine::previewScaleType()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->previewScaleType();
|
|
|
|
}
|
|
|
|
|
|
|
|
int ReportEngine::previewScalePercent()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->previewScalePercent();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEngine::setPreviewScaleType(const ScaleType &previewScaleType, int percent)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->setPreviewScaleType(previewScaleType, percent);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
void ReportEngine::setShowProgressDialog(bool value)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->setShowProgressDialog(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
IDataSourceManager *ReportEngine::dataManager()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->dataManagerIntf();
|
|
|
|
}
|
|
|
|
|
2016-11-01 20:42:45 +03:00
|
|
|
IScriptEngineManager *ReportEngine::scriptManager()
|
2016-02-17 10:11:00 +03:00
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->scriptManagerIntf();
|
|
|
|
}
|
|
|
|
|
2017-04-20 05:43:48 +03:00
|
|
|
bool ReportEngine::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange)
|
2016-02-17 10:11:00 +03:00
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
2017-04-20 05:43:48 +03:00
|
|
|
return d->loadFromFile(fileName, autoLoadPreviewOnChange);
|
2016-02-17 10:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool ReportEngine::loadFromByteArray(QByteArray* data){
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->loadFromByteArray(data);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:39:17 +03:00
|
|
|
bool ReportEngine::loadFromString(const QString &data)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->loadFromString(data);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
QString ReportEngine::reportFileName()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->reportFileName();
|
|
|
|
}
|
|
|
|
|
2016-04-21 14:58:21 +03:00
|
|
|
void ReportEngine::setReportFileName(const QString &fileName)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->setReportFileName(fileName);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
bool ReportEngine::saveToFile(const QString &fileName)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->saveToFile(fileName);
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:39:17 +03:00
|
|
|
QByteArray ReportEngine::saveToByteArray()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->saveToByteArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ReportEngine::saveToString()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->saveToString();
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
QString ReportEngine::lastError()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->lastError();
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:39:17 +03:00
|
|
|
void ReportEngine::setCurrentReportsDir(const QString &dirName)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->setCurrentReportsDir(dirName);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReportEngine::setReportName(const QString &name)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->setReportName(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ReportEngine::reportName()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
return d->reportName();
|
|
|
|
}
|
|
|
|
|
2016-02-17 10:11:00 +03:00
|
|
|
void ReportEngine::cancelRender()
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->cancelRender();
|
|
|
|
}
|
|
|
|
|
|
|
|
ReportEngine::ReportEngine(ReportEnginePrivate &dd, QObject *parent)
|
|
|
|
:QObject(parent),d_ptr(&dd)
|
|
|
|
{
|
|
|
|
Q_D(ReportEngine);
|
|
|
|
d->q_ptr=this;
|
|
|
|
connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted()));
|
|
|
|
connect(d, SIGNAL(renderPageFinished(int)),
|
|
|
|
this, SIGNAL(renderPageFinished(int)));
|
|
|
|
connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished()));
|
|
|
|
}
|
|
|
|
|
2017-08-18 22:55:29 +03:00
|
|
|
ScriptEngineManager*LimeReport::ReportEnginePrivate::scriptManager(){
|
2017-08-25 18:01:59 +03:00
|
|
|
ScriptEngineManager::instance().setContext(scriptContext());
|
2017-08-18 22:55:29 +03:00
|
|
|
ScriptEngineManager::instance().setDataManager(dataManager());
|
|
|
|
return &ScriptEngineManager::instance();
|
|
|
|
}
|
|
|
|
|
2017-07-29 00:54:43 +03:00
|
|
|
}// namespace LimeReport
|
2016-02-17 10:11:00 +03:00
|
|
|
|