diff --git a/include/lrreportengine.h b/include/lrreportengine.h index b9e6e94..d786dde 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -65,6 +65,17 @@ class PageItemDesignIntf; typedef QList< QSharedPointer > ReportPages; +class LIMEREPORT_EXPORT IPreparedPages{ +public: + virtual ~IPreparedPages(); + virtual bool loadFromFile(const QString& fileName) = 0; + virtual bool loadFromString(const QString data) = 0; + virtual bool loadFromByteArray(QByteArray* data) = 0; + virtual bool saveToFile(const QString& fileName) = 0; + virtual QString saveToString() = 0; + virtual QByteArray saveToByteArray() = 0; +}; + class LIMEREPORT_EXPORT ReportEngine : public QObject{ Q_OBJECT public: @@ -113,6 +124,9 @@ public: ScaleType previewScaleType(); int previewScalePercent(); void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); + IPreparedPages* preparedPages(); + bool showPreparedPages(PreviewHints hints = PreviewBarsUserSetting); + bool prepareReportPages(); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 898c9a7..170102c 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1306,7 +1306,9 @@ QObject *BaseDesignIntf::createElement(const QString& /*collectionName*/, const try{ if (LimeReport::DesignElementsFactory::instance().objectCreator(elementType)){ obj = LimeReport::DesignElementsFactory::instance().objectCreator(elementType)(this, this); - connect(obj,SIGNAL(propertyChanged(QString,QVariant,QVariant)),page(),SLOT(slotItemPropertyChanged(QString,QVariant,QVariant))); + if (page()) + connect(obj, SIGNAL(propertyChanged(QString,QVariant,QVariant)), + page(), SLOT(slotItemPropertyChanged(QString,QVariant,QVariant))); } } catch (ReportError error){ qDebug()<0){ + PreviewReportWindow* w = new PreviewReportWindow(this,0,settings()); + w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); + w->setAttribute(Qt::WA_DeleteOnClose,true); + w->setWindowModality(Qt::ApplicationModal); + //w->setWindowIcon(QIcon(":/report/images/main.ico")); + w->setWindowIcon(m_previewWindowIcon); + w->setWindowTitle(m_previewWindowTitle); + w->setSettings(settings()); + w->setPages(pages); + w->setLayoutDirection(m_previewLayoutDirection); + + if (!dataManager()->errorsList().isEmpty()){ + w->setErrorMessages(dataManager()->errorsList()); + } + + if (!hints.testFlag(PreviewBarsUserSetting)){ + w->setMenuVisible(!hints.testFlag(HidePreviewMenuBar)); + w->setStatusBarVisible(!hints.testFlag(HidePreviewStatusBar)); + w->setToolBarVisible(!hints.testFlag(HidePreviewToolBar)); + } + + w->setHideResultEditButton(resultIsEditable()); + w->setHidePrintButton(printIsVisible()); + w->setHideSaveToFileButton(saveToFileIsVisible()); + w->setHidePrintToPdfButton(printToPdfIsVisible()); + w->setEnablePrintMenu(printIsVisible() || printToPdfIsVisible()); + + m_activePreview = w; + + w->setPreviewScaleType(m_previewScaleType, m_previewScalePercent); + + connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*))); + w->exec(); + return true; + } + return false; +} + void ReportEnginePrivate::previewReport(PreviewHints hints) { // QTime start = QTime::currentTime(); @@ -372,41 +413,7 @@ void ReportEnginePrivate::previewReport(PreviewHints hints) dataManager()->setDesignTime(false); ReportPages pages = renderToPages(); dataManager()->setDesignTime(true); - if (pages.count()>0){ - PreviewReportWindow* w = new PreviewReportWindow(this,0,settings()); - w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); - w->setAttribute(Qt::WA_DeleteOnClose,true); - w->setWindowModality(Qt::ApplicationModal); - //w->setWindowIcon(QIcon(":/report/images/main.ico")); - w->setWindowIcon(m_previewWindowIcon); - w->setWindowTitle(m_previewWindowTitle); - w->setSettings(settings()); - w->setPages(pages); - w->setLayoutDirection(m_previewLayoutDirection); - - if (!dataManager()->errorsList().isEmpty()){ - w->setErrorMessages(dataManager()->errorsList()); - } - - if (!hints.testFlag(PreviewBarsUserSetting)){ - w->setMenuVisible(!hints.testFlag(HidePreviewMenuBar)); - w->setStatusBarVisible(!hints.testFlag(HidePreviewStatusBar)); - w->setToolBarVisible(!hints.testFlag(HidePreviewToolBar)); - } - - w->setHideResultEditButton(resultIsEditable()); - w->setHidePrintButton(printIsVisible()); - w->setHideSaveToFileButton(saveToFileIsVisible()); - w->setHidePrintToPdfButton(printToPdfIsVisible()); - w->setEnablePrintMenu(printIsVisible() || printToPdfIsVisible()); - - m_activePreview = w; - - w->setPreviewScaleType(m_previewScaleType, m_previewScalePercent); - - connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*))); - w->exec(); - } + showPreviewWindow(pages, hints); } catch (ReportError &exception){ saveError(exception.what()); showError(exception.what()); @@ -749,6 +756,25 @@ void ReportEnginePrivate::setPreviewScaleType(const ScaleType &scaleType, int pe m_previewScalePercent = percent; } +bool ReportEnginePrivate::showPreparedPages(PreviewHints hints) +{ + return showPreviewWindow(m_preparedPages, hints); +} + +bool ReportEnginePrivate::prepareReportPages() +{ + try{ + dataManager()->setDesignTime(false); + m_preparedPages = renderToPages(); + dataManager()->setDesignTime(true); + } catch (ReportError &exception){ + saveError(exception.what()); + showError(exception.what()); + return false; + } + return !m_preparedPages.isEmpty(); +} + Qt::LayoutDirection ReportEnginePrivate::previewLayoutDirection() { return m_previewLayoutDirection; @@ -1061,6 +1087,24 @@ void ReportEngine::setPreviewScaleType(const ScaleType &previewScaleType, int pe d->setPreviewScaleType(previewScaleType, percent); } +IPreparedPages *ReportEngine::preparedPages() +{ + Q_D(ReportEngine); + return d->preparedPages(); +} + +bool ReportEngine::showPreparedPages(PreviewHints hints) +{ + Q_D(ReportEngine); + return d->showPreparedPages(hints); +} + +bool ReportEngine::prepareReportPages() +{ + Q_D(ReportEngine); + return d->prepareReportPages(); +} + void ReportEngine::setShowProgressDialog(bool value) { @@ -1174,6 +1218,78 @@ ReportEngine::ReportEngine(ReportEnginePrivate &dd, QObject *parent) connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); } +IPreparedPages::~IPreparedPages(){} +bool PreparedPages::loadFromFile(const QString &fileName) +{ + ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName); + return readPages(reader); +} + +bool PreparedPages::loadFromString(const QString data) +{ + ItemsReaderIntf::Ptr reader = StringXMLreader::create(data); + return readPages(reader); +} + +bool PreparedPages::loadFromByteArray(QByteArray *data) +{ + ItemsReaderIntf::Ptr reader = ByteArrayXMLReader::create(data); + return readPages(reader); +} + +bool PreparedPages::saveToFile(const QString &fileName) +{ + if (!fileName.isEmpty()){ + QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + foreach (PageItemDesignIntf::Ptr page, *m_pages){ + writer->putItem(page.data()); + } + return writer->saveToFile(fileName); + } + return false; +} + +QString PreparedPages::saveToString() +{ + QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + foreach (PageItemDesignIntf::Ptr page, *m_pages){ + writer->putItem(page.data()); + } + return writer->saveToString(); +} + +QByteArray PreparedPages::saveToByteArray() +{ + QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + foreach (PageItemDesignIntf::Ptr page, *m_pages){ + writer->putItem(page.data()); + } + return writer->saveToByteArray(); +} + +bool PreparedPages::readPages(ItemsReaderIntf::Ptr reader) +{ + if (reader->first()){ + PageItemDesignIntf::Ptr page = PageItemDesignIntf::create(0); + if (!reader->readItem(page.data())) + return false; + else { + m_pages->append(page); + while (reader->next()){ + page = PageItemDesignIntf::create(0); + if (!reader->readItem(page.data())){ + m_pages->clear(); + return false; + } else { + m_pages->append(page); + } + } + } + + return true; + } + return false; +} } diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index b9e6e94..d786dde 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -65,6 +65,17 @@ class PageItemDesignIntf; typedef QList< QSharedPointer > ReportPages; +class LIMEREPORT_EXPORT IPreparedPages{ +public: + virtual ~IPreparedPages(); + virtual bool loadFromFile(const QString& fileName) = 0; + virtual bool loadFromString(const QString data) = 0; + virtual bool loadFromByteArray(QByteArray* data) = 0; + virtual bool saveToFile(const QString& fileName) = 0; + virtual QString saveToString() = 0; + virtual QByteArray saveToByteArray() = 0; +}; + class LIMEREPORT_EXPORT ReportEngine : public QObject{ Q_OBJECT public: @@ -113,6 +124,9 @@ public: ScaleType previewScaleType(); int previewScalePercent(); void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); + IPreparedPages* preparedPages(); + bool showPreparedPages(PreviewHints hints = PreviewBarsUserSetting); + bool prepareReportPages(); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index e9ea8dd..e945ea8 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -50,7 +50,22 @@ class PageDesignIntf; class PrintRange; class ReportDesignWindow; -//TODO: Add on render callback +class PreparedPages: public IPreparedPages{ +public: + PreparedPages(ReportPages* pages):m_pages(pages){} + ~PreparedPages(){} +// IPreviewPages interface +private: + bool loadFromFile(const QString &fileName); + bool loadFromString(const QString data); + bool loadFromByteArray(QByteArray *data); + bool saveToFile(const QString &fileName); + QString saveToString(); + QByteArray saveToByteArray(); +private: + bool readPages(ItemsReaderIntf::Ptr reader); + ReportPages* m_pages; +}; class ReportEnginePrivate : public QObject, public ICollectionContainer { @@ -141,7 +156,9 @@ public: ScaleType previewScaleType(); int previewScalePercent(); void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); - + IPreparedPages* preparedPages(){return &m_preparedPagesManager;} + bool showPreparedPages(PreviewHints hints); + bool prepareReportPages(); signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); @@ -157,6 +174,7 @@ public slots: void cancelRender(); protected: PageDesignIntf* createPage(const QString& pageName=""); + bool showPreviewWindow(ReportPages pages, PreviewHints hints); protected slots: void slotDataSourceCollectionLoaded(const QString& collectionName); private slots: @@ -174,6 +192,8 @@ private: QString renderToString(); private: QList m_pages; + ReportPages m_preparedPages; + PreparedPages m_preparedPagesManager; DataSourceManager* m_datasources; ScriptEngineContext* m_scriptEngineContext; ReportRender::Ptr m_reportRender;