0
0
mirror of https://github.com/fralx/LimeReport.git synced 2024-12-24 16:44:39 +03:00

Pages are cloned before generation to prevent them from changing by init script

This commit is contained in:
Arin Alex 2018-03-07 19:54:57 +03:00
parent c406920206
commit 3019f239f0
6 changed files with 52 additions and 31 deletions

View File

@ -858,13 +858,13 @@ QString ReportEnginePrivate::renderToString()
if (m_pages.count()){ if (m_pages.count()){
render.setDatasources(dataManager()); render.setDatasources(dataManager());
render.setScriptContext(scriptContext()); render.setScriptContext(scriptContext());
return render.renderPageToString(m_pages.at(0)); return render.renderPageToString(m_pages.at(0)->pageItem());
}else return QString(); }else return QString();
} }
PageDesignIntf* ReportEnginePrivate::getPageByName(const QString& pageName) PageItemDesignIntf* ReportEnginePrivate::getPageByName(const QString& pageName)
{ {
foreach(PageDesignIntf* page, m_pages){ foreach(PageItemDesignIntf* page, m_renderingPages){
if ( page->objectName().compare(pageName, Qt::CaseInsensitive) == 0) if ( page->objectName().compare(pageName, Qt::CaseInsensitive) == 0)
return page; return page;
} }
@ -931,10 +931,10 @@ void ReportEnginePrivate::activateLanguage(QLocale::Language language)
ReportTranslation* translation = m_translations.value(language); ReportTranslation* translation = m_translations.value(language);
foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){ foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){
PageDesignIntf* page = getPageByName(pageTranslation->pageName); PageItemDesignIntf* page = getPageByName(pageTranslation->pageName);
if (page){ if (page){
foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){ foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){
BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation->itemName); BaseDesignIntf* item = page->childByName(itemTranslation->itemName);
if (item) { if (item) {
foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){
item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value); item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value);
@ -1017,6 +1017,13 @@ void ReportEnginePrivate::setPreviewWindowIcon(const QIcon &previewWindowIcon)
m_previewWindowIcon = previewWindowIcon; m_previewWindowIcon = previewWindowIcon;
} }
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;
}
ReportPages ReportEnginePrivate::renderToPages() ReportPages ReportEnginePrivate::renderToPages()
{ {
if (m_reportRendering) return ReportPages(); if (m_reportRendering) return ReportPages();
@ -1031,6 +1038,7 @@ ReportPages ReportEnginePrivate::renderToPages()
this, SIGNAL(renderPageFinished(int))); this, SIGNAL(renderPageFinished(int)));
if (m_pages.count()){ if (m_pages.count()){
#ifdef HAVE_UI_LOADER #ifdef HAVE_UI_LOADER
m_scriptEngineContext->initDialogs(); m_scriptEngineContext->initDialogs();
#endif #endif
@ -1041,7 +1049,9 @@ ReportPages ReportEnginePrivate::renderToPages()
m_reportRender->setScriptContext(scriptContext()); m_reportRender->setScriptContext(scriptContext());
foreach (PageDesignIntf* page, m_pages) { foreach (PageDesignIntf* page, m_pages) {
scriptContext()->baseDesignIntfToScript(page->pageItem()->objectName(), page->pageItem()); PageItemDesignIntf* rp = createRenderingPage(page->pageItem());
m_renderingPages.append(rp);
scriptContext()->baseDesignIntfToScript(rp->objectName(), rp);
} }
scriptContext()->qobjectToScript("engine",this); scriptContext()->qobjectToScript("engine",this);
@ -1051,27 +1061,25 @@ ReportPages ReportEnginePrivate::renderToPages()
activateLanguage(m_reportLanguage); activateLanguage(m_reportLanguage);
emit renderStarted(); emit renderStarted();
foreach(PageDesignIntf* page , m_pages){ foreach(PageItemDesignIntf* page , m_renderingPages){
if (!page->pageItem()->isTOC()){ if (!page->isTOC() && page->isPrintable()){
page->setReportSettings(&m_reportSettings); page->setReportSettings(&m_reportSettings);
result.append(m_reportRender->renderPageToPages(page)); result.append(m_reportRender->renderPageToPages(page));
} }
} }
// m_reportRender->secondRenderPass(result); for (int i=0; i<m_renderingPages.count(); ++i){
PageItemDesignIntf* page = m_renderingPages.at(i);
for (int i=0; i<m_pages.count(); ++i){ if (page->isTOC()){
PageDesignIntf* page = m_pages.at(i);
if (page->pageItem()->isTOC()){
page->setReportSettings(&m_reportSettings); page->setReportSettings(&m_reportSettings);
if (i==0){ if (i==0){
PageDesignIntf* secondPage = 0; PageItemDesignIntf* secondPage = 0;
if (m_pages.count()>1) secondPage = m_pages.at(1); if (m_pages.count()>1) secondPage = m_renderingPages.at(1);
ReportPages pages = m_reportRender->renderTOC( ReportPages pages = m_reportRender->renderTOC(
page, page,
true, true,
secondPage && secondPage->pageItem()->resetPageNumber() secondPage && secondPage->resetPageNumber()
); );
for (int j=0; j<pages.count(); ++j){ for (int j=0; j<pages.count(); ++j){
result.insert(j,pages.at(j)); result.insert(j,pages.at(j));
@ -1087,9 +1095,14 @@ ReportPages ReportEnginePrivate::renderToPages()
emit renderFinished(); emit renderFinished();
m_reportRender.clear(); m_reportRender.clear();
foreach(PageItemDesignIntf* page, m_renderingPages){
delete page;
}
m_renderingPages.clear();
} }
m_reportRendering = false; m_reportRendering = false;
activateLanguage(QLocale::AnyLanguage); //activateLanguage(QLocale::AnyLanguage);
return result; return result;
} else { } else {
return ReportPages(); return ReportPages();

View File

@ -214,10 +214,12 @@ private:
//ITranslationContainer //ITranslationContainer
ReportPages renderToPages(); ReportPages renderToPages();
QString renderToString(); QString renderToString();
PageDesignIntf* getPageByName(const QString& pageName); PageItemDesignIntf *getPageByName(const QString& pageName);
ATranslationProperty fakeTranslationReader(){ return ATranslationProperty();} ATranslationProperty fakeTranslationReader(){ return ATranslationProperty();}
PageItemDesignIntf *createRenderingPage(PageItemDesignIntf *page);
private: private:
QList<PageDesignIntf*> m_pages; QList<PageDesignIntf*> m_pages;
QList<PageItemDesignIntf*> m_renderingPages;
DataSourceManager* m_datasources; DataSourceManager* m_datasources;
ScriptEngineContext* m_scriptEngineContext; ScriptEngineContext* m_scriptEngineContext;
ReportRender::Ptr m_reportRender; ReportRender::Ptr m_reportRender;

View File

@ -187,10 +187,10 @@ void ReportRender::initDatasource(const QString& name){
} }
} }
void ReportRender::renderPage(PageDesignIntf* patternPage, bool isTOC, bool isFirst, bool resetPageNumbers) void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool isFirst, bool resetPageNumbers)
{ {
m_curentNameIndex = 0; m_curentNameIndex = 0;
m_patternPageItem = patternPage->pageItem(); m_patternPageItem = patternPage;
m_renderingFirstTOC = isTOC && isFirst; m_renderingFirstTOC = isTOC && isFirst;
if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) {
@ -269,19 +269,19 @@ PageItemDesignIntf::Ptr ReportRender::pageAt(int index)
else return m_renderedPages.at(index); else return m_renderedPages.at(index);
} }
QString ReportRender::renderPageToString(PageDesignIntf *patternPage) QString ReportRender::renderPageToString(PageItemDesignIntf *patternPage)
{ {
renderPage(patternPage); renderPage(patternPage);
return toString(); return toString();
} }
ReportPages ReportRender::renderPageToPages(PageDesignIntf *patternPage) ReportPages ReportRender::renderPageToPages(PageItemDesignIntf *patternPage)
{ {
renderPage(patternPage); renderPage(patternPage);
return m_renderedPages; return m_renderedPages;
} }
ReportPages ReportRender::renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages){ ReportPages ReportRender::renderTOC(PageItemDesignIntf* patternPage, bool first, bool resetPages){
renderPage(patternPage, true, first, resetPages); renderPage(patternPage, true, first, resetPages);
return m_renderedPages; return m_renderedPages;
} }
@ -1134,7 +1134,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand)
{ {
BandDesignIntf* bandClone = dynamic_cast<BandDesignIntf*>(patternBand->cloneItem(PreviewMode)); BandDesignIntf* bandClone = dynamic_cast<BandDesignIntf*>(patternBand->cloneItem(PreviewMode));
m_scriptEngineContext->baseDesignIntfToScript(patternBand->page()->pageItem()->objectName(), bandClone); m_scriptEngineContext->baseDesignIntfToScript(patternBand->parent()->objectName(), bandClone);
m_scriptEngineContext->setCurrentBand(bandClone); m_scriptEngineContext->setCurrentBand(bandClone);
emit(patternBand->beforeRender()); emit(patternBand->beforeRender());

View File

@ -80,9 +80,9 @@ public:
DataSourceManager* datasources(){return m_datasources;} DataSourceManager* datasources(){return m_datasources;}
int pageCount(); int pageCount();
PageItemDesignIntf::Ptr pageAt(int index); PageItemDesignIntf::Ptr pageAt(int index);
QString renderPageToString(PageDesignIntf *patternPage); QString renderPageToString(PageItemDesignIntf *patternPage);
ReportPages renderPageToPages(PageDesignIntf *patternPage); ReportPages renderPageToPages(PageItemDesignIntf *patternPage);
ReportPages renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages); ReportPages renderTOC(PageItemDesignIntf *patternPage, bool first, bool resetPages);
void secondRenderPass(ReportPages renderedPages); void secondRenderPass(ReportPages renderedPages);
signals: signals:
void pageRendered(int renderedPageCount); void pageRendered(int renderedPageCount);
@ -96,7 +96,7 @@ private:
void initGroups(); void initGroups();
void clearPageMap(); void clearPageMap();
void renderPage(PageDesignIntf *patternPage, bool isTOC = false, bool isFirst = false, bool resetPageNumbers = false); void renderPage(PageItemDesignIntf *patternPage, bool isTOC = false, bool isFirst = false, bool resetPageNumbers = false);
BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false); BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false);
void renderDataBand(BandDesignIntf* dataBand); void renderDataBand(BandDesignIntf* dataBand);
void renderPageHeader(PageItemDesignIntf* patternPage); void renderPageHeader(PageItemDesignIntf* patternPage);

View File

@ -32,7 +32,7 @@ ReportTranslation::~ReportTranslation()
PageTranslation* ReportTranslation::createPageTranslation(PageDesignIntf* page) PageTranslation* ReportTranslation::createPageTranslation(PageDesignIntf* page)
{ {
PageTranslation* pageTranslation = new PageTranslation; PageTranslation* pageTranslation = new PageTranslation;
pageTranslation->pageName = page->objectName(); pageTranslation->pageName = page->pageItem()->objectName();
foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){ foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){
createItemTranslation(item, pageTranslation); createItemTranslation(item, pageTranslation);
} }

View File

@ -78,8 +78,14 @@ void TranslationEditor::updateUi()
ui->lvLanguages->addItem(QLocale::languageToString(language)); ui->lvLanguages->addItem(QLocale::languageToString(language));
} }
if (!translations->keys().isEmpty()){ if (!translations->keys().isEmpty()){
ui->lvLanguages->item(0)->setSelected(true); if (ui->lvLanguages->count()!=0){
activateLanguage(getLanguageByName(ui->lvLanguages->item(0)->text())); ui->lvLanguages->item(0)->setSelected(true);
activateLanguage(getLanguageByName(ui->lvLanguages->item(0)->text()));
} else {
//activateLanguage(QLocale::AnyLanguage);
ui->twPages->clear();
ui->tbStrings->setRowCount(0);
}
} }
} }
} }