diff --git a/common.pri b/common.pri index df0e70f..4799742 100644 --- a/common.pri +++ b/common.pri @@ -11,6 +11,7 @@ CONFIG(release, debug|release){ } BUILD_DIR = $$PWD/build/$${QT_VERSION} +DEST_INCLUDE_DIR = $$PWD/include/ unix:!macx { ARCH_DIR = $${OUT_PWD}/unix diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h new file mode 100644 index 0000000..94e9936 --- /dev/null +++ b/include/lrpreviewreportwidget.h @@ -0,0 +1,53 @@ +#ifndef LRPREVIEWREPORTWIDGET_H +#define LRPREVIEWREPORTWIDGET_H + +#include +#include "lrglobal.h" + +namespace LimeReport { + +namespace Ui { +class PreviewReportWidget; +} + +class PreviewReportWidgetPrivate; +class ReportEnginePrivate; + +class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget +{ + Q_OBJECT + friend class ReportEnginePrivate; + friend class PreviewReportWindow; + friend class PreviewReportWidgetPrivate; +public: + explicit PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent = 0); + ~PreviewReportWidget(); + void initPreview(); + void setErrorsMesagesVisible(bool visible); + void setErrorMessages(const QStringList &value); + void refreshPages(); +public slots: + void slotZoomIn(); + void slotZoomOut(); + + void slotFirstPage(); + void slotPriorPage(); + void slotNextPage(); + void slotLastPage(); + + void slotPrint(); + void slotPrintToPDF(); + void slotPageNavigatorChanged(int value); + void slotSaveToFile(); +signals: + void pageChanged(int page); +private slots: + void slotSliderMoved(int value); + void reportEngineDestroyed(QObject* object); +private: + Ui::PreviewReportWidget *ui; + PreviewReportWidgetPrivate* d_ptr; +}; + +} // namespace LimeReport +#endif // LRPREVIEWREPORTWIDGET_H diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 1eb4966..3506f1b 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -37,6 +37,7 @@ #include "lrglobal.h" #include "lrdatasourcemanagerintf.h" #include "lrscriptenginemanagerintf.h" +#include "lrpreviewreportwidget.h" class QPrinter; @@ -75,7 +76,6 @@ public: void setShowProgressDialog(bool value); IDataSourceManager* dataManager(); IScriptEngineManager* scriptManager(); - bool loadFromFile(const QString& fileName); bool loadFromByteArray(QByteArray *data); bool loadFromString(const QString& data); @@ -88,6 +88,7 @@ public: void setCurrentReportsDir(const QString& dirName); void setReportName(const QString& name); QString reportName(); + PreviewReportWidget *createPreviewWidget(QWidget *parent = 0); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/limereport.pri b/limereport/limereport.pri index e47b1c9..8b82707 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -81,6 +81,8 @@ SOURCES += \ $$REPORT_PATH/lrreportrender.cpp \ $$REPORT_PATH/lrscriptenginemanager.cpp \ $$REPORT_PATH/lrpreviewreportwindow.cpp \ + $$REPORT_PATH/lrpreviewreportwidget.cpp \ + $$REPORT_PATH/lrgraphicsviewzoom.cpp \ $$REPORT_PATH/lrvariablesholder.cpp \ $$REPORT_PATH/lrgroupfunctions.cpp \ $$REPORT_PATH/lrsimplecrypt.cpp \ @@ -157,6 +159,8 @@ HEADERS += \ $$REPORT_PATH/bands/lrsubdetailband.h \ $$REPORT_PATH/lrreportrender.h \ $$REPORT_PATH/lrpreviewreportwindow.h \ + $$REPORT_PATH/lrpreviewreportwidget.h \ + $$REPORT_PATH/lrgraphicsviewzoom.h \ $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ $$REPORT_PATH/items/lrimageitem.h \ @@ -178,7 +182,8 @@ HEADERS += \ $$REPORT_PATH/lrsimplecrypt.h \ $$REPORT_PATH/lraboutdialog.h \ $$REPORT_PATH/lrcallbackdatasourceintf.h \ - $$REPORT_PATH/lrsettingdialog.h + $$REPORT_PATH/lrsettingdialog.h \ + $$PWD/lrpreviewreportwidget_p.h contains(CONFIG,zint){ HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h @@ -191,6 +196,7 @@ FORMS += \ $$REPORT_PATH/databrowser/lrvariabledialog.ui \ $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ $$REPORT_PATH/lrpreviewreportwindow.ui \ + $$REPORT_PATH/lrpreviewreportwidget.ui \ $$REPORT_PATH/items/lrtextitemeditor.ui \ $$REPORT_PATH/lraboutdialog.ui \ $$REPORT_PATH/lrsettingdialog.ui diff --git a/limereport/limereport.pro b/limereport/limereport.pro index c44d9b1..77c25ad 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -23,31 +23,27 @@ EXTRA_FILES += \ include(limereport.pri) -DEST_DIR = $$PWD/../include/ - unix { - DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib - - QMAKE_POST_LINK += mkdir -p $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t) - - #for(FILE,EXTRA_FILES){ - # QMAKE_POST_LINK += $$quote($$QMAKE_COPY $${FILE} $${DEST_DIR}) $$escape_expand(\\n\\t) - #} + DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib + #QMAKE_POST_LINK += mkdir -p $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t) for(FILE,EXTRA_FILES){ - QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DESTDIR}/include/) $$escape_expand(\\n\\t) + QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}/include/) $$escape_expand(\\n\\t) } + QMAKE_POST_LINK += $(COPY_DIR) $$quote($${DEST_INCLUDE_DIR}*) $$quote($${DEST_DIR}) } win32 { EXTRA_FILES ~= s,/,\\,g - DEST_DIR ~= s,/,\\,g BUILD_DIR ~= s,/,\\,g - - DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib + DESTDIR = $${BUILD_DIR}/$${BUILD_TYPE}/lib + DEST_DIR = $$DESTDIR/include/ + DEST_DIR ~= s,/,\\,g + DEST_INCLUDE_DIR ~= s,/,\\,g for(FILE,EXTRA_FILES){ - QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t) + QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) } + QMAKE_POST_LINK += $(COPY_DIR) $$quote($${DEST_INCLUDE_DIR}*) $$quote($${DEST_DIR}) } contains(CONFIG,zint){ diff --git a/limereport/lrgraphicsviewzoom.cpp b/limereport/lrgraphicsviewzoom.cpp new file mode 100644 index 0000000..58fc752 --- /dev/null +++ b/limereport/lrgraphicsviewzoom.cpp @@ -0,0 +1,58 @@ +#include "lrgraphicsviewzoom.h" +#include +#include +#include + +namespace LimeReport{ + +GraphicsViewZoomer::GraphicsViewZoomer(QGraphicsView* view) + : QObject(view), m_view(view) +{ + m_view->viewport()->installEventFilter(this); + m_view->setMouseTracking(true); + m_modifiers = Qt::ControlModifier; + m_zoomFactorBase = 1.0015; +} + +void GraphicsViewZoomer::gentleZoom(double factor) { + m_view->scale(factor, factor); + m_view->centerOn(m_targetScenePos); + QPointF delta_viewport_pos = m_targetViewportPos - QPointF(m_view->viewport()->width() / 2.0, + m_view->viewport()->height() / 2.0); + QPointF viewport_center = m_view->mapFromScene(m_targetScenePos) - delta_viewport_pos; + m_view->centerOn(m_view->mapToScene(viewport_center.toPoint())); + emit zoomed(); +} + +void GraphicsViewZoomer::setModifiers(Qt::KeyboardModifiers modifiers) { + m_modifiers = modifiers; +} + +void GraphicsViewZoomer::setZoomFactorBase(double value) { + m_zoomFactorBase = value; +} + +bool GraphicsViewZoomer::eventFilter(QObject *object, QEvent *event) { + if (event->type() == QEvent::MouseMove) { + QMouseEvent* mouse_event = static_cast(event); + QPointF delta = m_targetViewportPos - mouse_event->pos(); + if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5) { + m_targetViewportPos = mouse_event->pos(); + m_targetScenePos = m_view->mapToScene(mouse_event->pos()); + } + } else if (event->type() == QEvent::Wheel) { + QWheelEvent* wheel_event = static_cast(event); + if (QApplication::keyboardModifiers() == m_modifiers) { + if (wheel_event->orientation() == Qt::Vertical) { + double angle = wheel_event->delta(); + double factor = qPow(m_zoomFactorBase, angle); + gentleZoom(factor); + return true; + } + } + } + Q_UNUSED(object) + return false; +} + +} //namespace LimeReport diff --git a/limereport/lrgraphicsviewzoom.h b/limereport/lrgraphicsviewzoom.h new file mode 100644 index 0000000..9d0a714 --- /dev/null +++ b/limereport/lrgraphicsviewzoom.h @@ -0,0 +1,28 @@ +#ifndef GRAPHICSVIEWZOOM_H +#define GRAPHICSVIEWZOOM_H + +#include +#include + +namespace LimeReport { + +class GraphicsViewZoomer : public QObject { + Q_OBJECT +public: + GraphicsViewZoomer(QGraphicsView* view); + void gentleZoom(double factor); + void setModifiers(Qt::KeyboardModifiers modifiers); + void setZoomFactorBase(double value); +private: + QGraphicsView* m_view; + Qt::KeyboardModifiers m_modifiers; + double m_zoomFactorBase; + QPointF m_targetScenePos, m_targetViewportPos; + bool eventFilter(QObject* object, QEvent* event); +signals: + void zoomed(); +}; + +} // namespace LimeReport + +#endif // GRAPHICSVIEWZOOM_H diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp new file mode 100644 index 0000000..7becc8d --- /dev/null +++ b/limereport/lrpreviewreportwidget.cpp @@ -0,0 +1,259 @@ +#include "lrpreviewreportwidget.h" +#include "ui_lrpreviewreportwidget.h" + +#include +#include +#include +#include + +#include "lrpagedesignintf.h" +#include "lrreportrender.h" +#include "lrreportengine_p.h" +#include "lrpreviewreportwidget_p.h" +#include "serializators/lrxmlwriter.h" + +namespace LimeReport { + +bool PreviewReportWidgetPrivate::pageIsVisible(){ + QGraphicsView* view = q_ptr->ui->graphicsView; + PageItemDesignIntf::Ptr page = m_reportPages.at(m_currentPage-1); + return page->mapToScene(page->rect()).boundingRect().intersects( + view->mapToScene(view->viewport()->geometry()).boundingRect() + ); +} + +QRectF PreviewReportWidgetPrivate::calcPageShift(){ + QGraphicsView *view = q_ptr->ui->graphicsView; + PageItemDesignIntf::Ptr page = m_reportPages.at(m_currentPage-1); + qreal pageHeight = page->mapToScene(page->boundingRect()).boundingRect().height(); + qreal viewHeight = view->mapToScene( + 0, view->viewport()->height() + ).y() - view->mapToScene(0,0).y(); + viewHeight = (pageHeightmapRectToScene( + m_reportPages.at(m_currentPage-1)->rect() + ); + return QRectF(0,pageStartPos.y(),0,viewHeight); +} + +void PreviewReportWidgetPrivate::setPages(ReportPages pages) +{ + m_reportPages = pages; + if (!m_reportPages.isEmpty()){ + m_previewPage->setPageItems(m_reportPages); + m_changingPage = true; + m_currentPage = 1; + if (pages.at(0)) pages.at(0)->setSelected(true); + m_changingPage = false; + q_ptr->initPreview(); + } +} + +PreviewReportWidget::PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent) : + QWidget(parent), + ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)) +{ + ui->setupUi(this); + d_ptr->m_previewPage = report->createPreviewPage(); + d_ptr->m_previewPage->setItemMode( LimeReport::PreviewMode ); + d_ptr->m_report = report; + + ui->errorsView->setVisible(false); + connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int))); + connect(d_ptr->m_report, SIGNAL(destroyed(QObject*)), this, SLOT(reportEngineDestroyed(QObject*))); + d_ptr->m_zoomer = new GraphicsViewZoomer(ui->graphicsView); +} + +PreviewReportWidget::~PreviewReportWidget() +{ + delete d_ptr->m_previewPage; + d_ptr->m_previewPage = 0; + delete d_ptr->m_zoomer; + delete d_ptr; + delete ui; +} + +void PreviewReportWidget::initPreview() +{ + ui->graphicsView->setScene(d_ptr->m_previewPage); + ui->graphicsView->centerOn(0, 0); + ui->graphicsView->scale(0.5,0.5); +} + +void PreviewReportWidget::setErrorsMesagesVisible(bool visible) +{ + ui->errorsView->setVisible(visible); +} + +void PreviewReportWidget::slotZoomIn() +{ + ui->graphicsView->scale(1.2,1.2); +} + +void PreviewReportWidget::slotZoomOut() +{ + ui->graphicsView->scale(1/1.2,1/1.2); +} + +void PreviewReportWidget::slotFirstPage() +{ + d_ptr->m_changingPage=true; + if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){ + d_ptr->m_currentPage=1; + ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); + emit pageChanged(d_ptr->m_currentPage); + } + d_ptr->m_changingPage=false; +} + +void PreviewReportWidget::slotPriorPage() +{ + d_ptr->m_changingPage=true; + if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){ + d_ptr->m_currentPage--; + ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); + emit pageChanged(d_ptr->m_currentPage); + } + d_ptr->m_changingPage=false; +} + +void PreviewReportWidget::slotNextPage() +{ + d_ptr->m_changingPage=true; + if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){ + d_ptr->m_currentPage++; + ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); + emit pageChanged(d_ptr->m_currentPage); + } + d_ptr->m_changingPage=false; +} + +void PreviewReportWidget::slotLastPage() +{ + d_ptr->m_changingPage=true; + if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){ + d_ptr->m_currentPage=d_ptr->m_reportPages.count(); + ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); + emit pageChanged(d_ptr->m_currentPage); + } + d_ptr->m_changingPage=false; +} + +void PreviewReportWidget::slotPrint() +{ + QPrinter printer(QPrinter::HighResolution); + QPrintDialog dialog(&printer,QApplication::activeWindow()); + if (dialog.exec()==QDialog::Accepted){ + if (!d_ptr->m_reportPages.isEmpty()) + ReportEnginePrivate::printReport( + d_ptr->m_reportPages, + printer, + PrintRange(dialog.printRange(),dialog.fromPage(),dialog.toPage()) + ); + } +} + +void PreviewReportWidget::slotPrintToPDF() +{ + QString fileName = QFileDialog::getSaveFileName(this,tr("PDF file name"),"","PDF(*.pdf)" ); + if (!fileName.isEmpty()){ + QPrinter printer; + printer.setOutputFileName(fileName); + printer.setOutputFormat(QPrinter::PdfFormat); + if (!d_ptr->m_reportPages.isEmpty()){ + ReportEnginePrivate::printReport(d_ptr->m_reportPages,printer,PrintRange()); + } + foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){ + d_ptr->m_previewPage->reactivatePageItem(pageItem); + } + } +} + +void PreviewReportWidget::slotPageNavigatorChanged(int value) +{ + if (d_ptr->m_changingPage) return; + d_ptr->m_changingPage = true; + if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count() >= value) && value>0){ + d_ptr->m_currentPage = value; + ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); + } + d_ptr->m_changingPage=false; +} + +void PreviewReportWidget::slotSaveToFile() +{ + QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name")); + if (!fileName.isEmpty()){ + QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + foreach (PageItemDesignIntf::Ptr page, d_ptr->m_reportPages){ + writer->putItem(page.data()); + } + writer->saveToFile(fileName); + } +} + +void PreviewReportWidget::setErrorMessages(const QStringList &value) +{ + foreach (QString line, value) { + ui->errorsView->append(line); + } +} + +void PreviewReportWidget::refreshPages() +{ + if (d_ptr->m_report){ + try{ + d_ptr->m_report->dataManager()->setDesignTime(false); + ReportPages pages = d_ptr->m_report->renderToPages(); + d_ptr->m_report->dataManager()->setDesignTime(true); + if (pages.count()>0){ + d_ptr->m_reportPages = pages; + if (!d_ptr->m_reportPages.isEmpty()){ + d_ptr->m_previewPage->setPageItems(d_ptr->m_reportPages); + d_ptr->m_changingPage = true; + d_ptr->m_currentPage = 1; + if (pages.at(0)) pages.at(0)->setSelected(true); + d_ptr->m_changingPage = false; + } + ui->graphicsView->centerOn(0, 0); + } + } catch (ReportError &exception){ + d_ptr->m_report->saveError(exception.what()); + d_ptr->m_report->showError(exception.what()); + } + } +} + +void PreviewReportWidget::slotSliderMoved(int value) +{ + if (ui->graphicsView->verticalScrollBar()->minimum()==value){ + d_ptr->m_currentPage = 1; + } else if (ui->graphicsView->verticalScrollBar()->maximum()==value){ + d_ptr->m_currentPage = d_ptr->m_reportPages.count(); + } + + if (!d_ptr->pageIsVisible()){ + if (value>d_ptr->m_priorScrolValue){ + d_ptr->m_currentPage++; + } else { + d_ptr->m_currentPage--; + } + } + + d_ptr->m_changingPage = true; + emit pageChanged(d_ptr->m_currentPage); + + d_ptr->m_changingPage = false; + d_ptr->m_priorScrolValue = value; +} + +void PreviewReportWidget::reportEngineDestroyed(QObject *object) +{ + if (object == d_ptr->m_report){ + d_ptr->m_report = 0; + } +} + + + +} diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h new file mode 100644 index 0000000..220843b --- /dev/null +++ b/limereport/lrpreviewreportwidget.h @@ -0,0 +1,54 @@ +#ifndef LRPREVIEWREPORTWIDGET_H +#define LRPREVIEWREPORTWIDGET_H + +#include +#include "lrglobal.h" + +namespace LimeReport { + +namespace Ui { +class PreviewReportWidget; +} + +class PreviewReportWidgetPrivate; +class ReportEnginePrivate; + +class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget +{ + Q_OBJECT + friend class ReportEnginePrivate; + friend class PreviewReportWindow; + friend class PreviewReportWidgetPrivate; +public: + explicit PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent = 0); + ~PreviewReportWidget(); +public slots: + void refreshPages(); + void slotZoomIn(); + void slotZoomOut(); + + void slotFirstPage(); + void slotPriorPage(); + void slotNextPage(); + void slotLastPage(); + + void slotPrint(); + void slotPrintToPDF(); + void slotPageNavigatorChanged(int value); + void slotSaveToFile(); +signals: + void pageChanged(int page); +private slots: + void slotSliderMoved(int value); + void reportEngineDestroyed(QObject* object); +private: + void initPreview(); + void setErrorsMesagesVisible(bool visible); + void setErrorMessages(const QStringList &value); +private: + Ui::PreviewReportWidget *ui; + PreviewReportWidgetPrivate* d_ptr; +}; + +} // namespace LimeReport +#endif // LRPREVIEWREPORTWIDGET_H diff --git a/limereport/lrpreviewreportwidget.ui b/limereport/lrpreviewreportwidget.ui new file mode 100644 index 0000000..9580fc9 --- /dev/null +++ b/limereport/lrpreviewreportwidget.ui @@ -0,0 +1,39 @@ + + + LimeReport::PreviewReportWidget + + + + 0 + 0 + 740 + 418 + + + + Form + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + + + + + diff --git a/limereport/lrpreviewreportwidget_p.h b/limereport/lrpreviewreportwidget_p.h new file mode 100644 index 0000000..6d2a8b9 --- /dev/null +++ b/limereport/lrpreviewreportwidget_p.h @@ -0,0 +1,33 @@ +#ifndef LRPREVIEWREPORTWIDGET_P_H +#define LRPREVIEWREPORTWIDGET_P_H + +#include "lrpagedesignintf.h" +#include "lrreportrender.h" +#include "lrgraphicsviewzoom.h" + +namespace LimeReport{ + +class PreviewReportWidget; + +class PreviewReportWidgetPrivate +{ +public: + PreviewReportWidgetPrivate(PreviewReportWidget* previewReportWidget): q_ptr(previewReportWidget), + m_currentPage(1), m_changingPage(false), m_priorScrolValue(0){} + bool pageIsVisible(); + QRectF calcPageShift(); + void setPages( ReportPages pages); +public: + PageDesignIntf* m_previewPage; + ReportPages m_reportPages; + ReportEnginePrivate* m_report; + GraphicsViewZoomer* m_zoomer; + int m_currentPage; + bool m_changingPage; + int m_priorScrolValue; + PreviewReportWidget* q_ptr; + +}; + +} +#endif // LRPREVIEWREPORTWIDGET_P_H diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 0619fde..b4ec3ac 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -32,6 +32,8 @@ #include "serializators/lrxmlreader.h" #include "serializators/lrxmlwriter.h" #include "lrreportengine_p.h" +#include "lrpreviewreportwidget.h" +#include "lrpreviewreportwidget_p.h" #include #include @@ -43,24 +45,22 @@ namespace LimeReport{ PreviewReportWindow::PreviewReportWindow(ReportEnginePrivate *report,QWidget *parent, QSettings *settings, Qt::WindowFlags flags) : QMainWindow(parent,flags), - ui(new Ui::PreviewReportWindow), m_currentPage(1), m_changingPage(false), m_settings(settings), m_ownedSettings(false), - m_priorScrolValue(0) + ui(new Ui::PreviewReportWindow), m_settings(settings), m_ownedSettings(false) { ui->setupUi(this); setWindowTitle("Lime Report Preview"); - m_previewPage = report->createPreviewPage(); - m_previewPage->setItemMode( LimeReport::PreviewMode ); m_pagesNavigator = new QSpinBox(this); m_pagesNavigator->setMaximum(10000000); m_pagesNavigator->setPrefix(tr("Page: ")); m_pagesNavigator->setMinimumWidth(120); ui->toolBar->insertWidget(ui->actionNextPage,m_pagesNavigator); - m_simpleScene = new QGraphicsScene(this); ui->actionShowMessages->setVisible(false); - ui->errorsView->setVisible(false); + connect(m_pagesNavigator,SIGNAL(valueChanged(int)),this,SLOT(slotPageNavigatorChanged(int))); - connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int))); - connect(ui->actionShowMessages, SIGNAL(triggered()), this, SLOT(slotShowErrors())); + m_previewReportWidget = new PreviewReportWidget(report,this); + setCentralWidget(m_previewReportWidget); + layout()->setContentsMargins(1,1,1,1); + connect(m_previewReportWidget,SIGNAL(pageChanged(int)), this,SLOT(slotPageChanged(int)) ); restoreSetting(); } @@ -102,7 +102,7 @@ PreviewReportWindow::~PreviewReportWindow() { if (m_ownedSettings) delete m_settings; - delete m_previewPage; + //delete m_previewPage; delete ui; } @@ -111,11 +111,7 @@ void PreviewReportWindow::initPreview(int pagesCount) m_pagesNavigator->setSuffix(tr(" of %1").arg(pagesCount)); m_pagesNavigator->setMinimum(1); m_pagesNavigator->setMaximum(pagesCount); - ui->graphicsView->setScene(m_previewPage); - ui->graphicsView->centerOn(0, 0); - ui->graphicsView->scale(0.5,0.5); - m_currentPage=1; - m_pagesNavigator->setValue(m_currentPage); + m_pagesNavigator->setValue(1); } void PreviewReportWindow::setSettings(QSettings* value) @@ -129,9 +125,7 @@ void PreviewReportWindow::setSettings(QSettings* value) void PreviewReportWindow::setErrorMessages(const QStringList &value){ ui->actionShowMessages->setVisible(true); - foreach (QString line, value) { - ui->errorsView->append(line); - } + m_previewReportWidget->setErrorMessages(value); } QSettings*PreviewReportWindow::settings() @@ -147,26 +141,20 @@ QSettings*PreviewReportWindow::settings() void PreviewReportWindow::setReportReader(ItemsReaderIntf::Ptr reader) { - m_reader=reader; - if (!reader.isNull()){ - if (reader->first()) reader->readItem(m_previewPage->pageItem()); - int pagesCount = reader->firstLevelItemsCount(); - m_previewPage->pageItem()->setItemMode(PreviewMode); - initPreview(pagesCount); - } +// m_reader=reader; +// if (!reader.isNull()){ +// if (reader->first()) reader->readItem(m_previewPage->pageItem()); +// int pagesCount = reader->firstLevelItemsCount(); +// m_previewPage->pageItem()->setItemMode(PreviewMode); +// initPreview(pagesCount); +// } } void PreviewReportWindow::setPages(ReportPages pages) { - m_reportPages = pages; - if (!m_reportPages.isEmpty()){ - //m_previewPage->setPageItem(m_reportPages.at(0)); - m_previewPage->setPageItems(m_reportPages); - m_changingPage = true; - initPreview(m_reportPages.count()); - m_currentPage = 1; - if (pages.at(0)) pages.at(0)->setSelected(true); - m_changingPage = false; + m_previewReportWidget->d_ptr->setPages(pages); + if (!pages.isEmpty()){ + initPreview(pages.count()); } } @@ -215,104 +203,37 @@ void PreviewReportWindow::moveEvent(QMoveEvent* e) void PreviewReportWindow::slotPrint() { - QPrinter printer(QPrinter::HighResolution); - QPrintDialog dialog(&printer,QApplication::activeWindow()); - if (dialog.exec()==QDialog::Accepted){ - if (!m_reportPages.isEmpty()) - ReportEnginePrivate::printReport( - m_reportPages, - printer, - PrintRange(dialog.printRange(),dialog.fromPage(),dialog.toPage()) - ); - else ReportEnginePrivate::printReport(m_reader,printer); - foreach(PageItemDesignIntf::Ptr pageItem, m_reportPages){ - m_previewPage->reactivatePageItem(pageItem); - } - - } + m_previewReportWidget->slotPrint(); } void PreviewReportWindow::slotPriorPage() { - m_changingPage=true; - if ((!m_reportPages.isEmpty())&&(m_currentPage>1)){ - m_currentPage--; - //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); - ui->graphicsView->ensureVisible( - calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 - ); - m_pagesNavigator->setValue(m_currentPage); - } else { - if (reader() && reader()->prior()){ - m_previewPage->removeAllItems(); - reader()->readItem(m_previewPage->pageItem()); - m_currentPage--; - m_pagesNavigator->setValue(m_currentPage); - } - } - m_changingPage=false; + m_previewReportWidget->slotPriorPage(); } void PreviewReportWindow::slotNextPage() { - m_changingPage=true; - if ((!m_reportPages.isEmpty())&&(m_reportPages.count()>(m_currentPage))){ - m_currentPage++; - //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); - ui->graphicsView->ensureVisible( - calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 - ); - m_pagesNavigator->setValue(m_currentPage); - } else { - if (reader() && reader()->next()){ - m_previewPage->removeAllItems(); - reader()->readItem(m_previewPage->pageItem()); - m_currentPage++; - m_pagesNavigator->setValue(m_currentPage); - } - } - m_changingPage=false; + m_previewReportWidget->slotNextPage(); } void PreviewReportWindow::slotZoomIn() { - ui->graphicsView->scale(1.2,1.2); + m_previewReportWidget->slotZoomIn(); } void PreviewReportWindow::slotZoomOut() { - ui->graphicsView->scale(1/1.2,1/1.2); + m_previewReportWidget->slotZoomOut(); } void PreviewReportWindow::slotPageNavigatorChanged(int value) { - if (m_changingPage) return; - m_changingPage = true; - if ((!m_reportPages.isEmpty())&&(m_reportPages.count() >= value)){ - m_currentPage = value; - //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); - ui->graphicsView->ensureVisible( - calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 - ); - } else { - if (reader()){ - int direction = (m_currentPage>value)?-1:1; - while (m_currentPage != value){ - if (direction == 1) reader()->next(); - else reader()->prior(); - m_currentPage += direction; - } - m_previewPage->removeAllItems(); - reader()->readItem(m_previewPage->pageItem()); - m_pagesNavigator->setValue(m_currentPage); - } - } - m_changingPage=false; + m_previewReportWidget->slotPageNavigatorChanged(value); } void PreviewReportWindow::slotShowErrors() { - ui->errorsView->setVisible(ui->actionShowMessages->isChecked()); + m_previewReportWidget->setErrorsMesagesVisible(ui->actionShowMessages->isChecked()); } ItemsReaderIntf *PreviewReportWindow::reader() @@ -320,127 +241,29 @@ ItemsReaderIntf *PreviewReportWindow::reader() return m_reader.data(); } -bool PreviewReportWindow::pageIsVisible(PageItemDesignIntf::Ptr page) -{ - return page->mapToScene(page->rect()).boundingRect().intersects( - ui->graphicsView->mapToScene(ui->graphicsView->viewport()->geometry()).boundingRect() - ); -} - -QRectF PreviewReportWindow::calcPageShift(PageItemDesignIntf::Ptr page) -{ - qreal pageHeight = page->mapToScene(page->boundingRect()).boundingRect().height(); - qreal viewHeight = ui->graphicsView->mapToScene( - 0,ui->graphicsView->viewport()->height() - ).y()-ui->graphicsView->mapToScene(0,0).y(); - viewHeight = (pageHeightmapRectToScene( - m_reportPages.at(m_currentPage-1)->rect() - ); - return QRectF(0,pageStartPos.y(),0,viewHeight); -} - void PreviewReportWindow::on_actionSaveToFile_triggered() { - QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name")); - if (!fileName.isEmpty()){ - QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); - foreach (PageItemDesignIntf::Ptr page, m_reportPages){ - writer->putItem(page.data()); - } - writer->saveToFile(fileName); - } + m_previewReportWidget->slotSaveToFile(); } void PreviewReportWindow::slotFirstPage() { - m_changingPage=true; - if ((!m_reportPages.isEmpty())&&(m_currentPage>1)){ - m_currentPage=1; - //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); - ui->graphicsView->ensureVisible( - calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 - ); - m_pagesNavigator->setValue(m_currentPage); - } else { - if (reader() && reader()->prior()){ - while (reader()->prior()) { - } - m_previewPage->removeAllItems(); - reader()->readItem(m_previewPage->pageItem()); - m_currentPage=1; - m_pagesNavigator->setValue(m_currentPage); - } - } - m_changingPage=false; + m_previewReportWidget->slotFirstPage(); } void PreviewReportWindow::slotLastPage() { - m_changingPage=true; - if ((!m_reportPages.isEmpty())&&(m_reportPages.count()>(m_currentPage))){ - m_currentPage=m_reportPages.count(); - //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); - ui->graphicsView->ensureVisible( - calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 - ); - m_pagesNavigator->setValue(m_currentPage); - } else { - - if (reader() && reader()->next()){ - m_currentPage++; - while (reader()->next()) { - m_currentPage++; - } - m_previewPage->removeAllItems(); - reader()->readItem(m_previewPage->pageItem()); - m_pagesNavigator->setValue(m_currentPage); - } - } - m_changingPage=false; + m_previewReportWidget->slotLastPage(); } void PreviewReportWindow::slotPrintToPDF() { - QString fileName = QFileDialog::getSaveFileName(this,tr("PDF file name"),"","PDF(*.pdf)" ); - qDebug()<reactivatePageItem(pageItem); - } - } + m_previewReportWidget->slotPrintToPDF(); } -void PreviewReportWindow::slotSliderMoved(int value) +void PreviewReportWindow::slotPageChanged(int pageIndex) { - if (ui->graphicsView->verticalScrollBar()->minimum()==value){ - m_currentPage = 1; - } else if (ui->graphicsView->verticalScrollBar()->maximum()==value){ - m_currentPage = m_reportPages.count(); - } - - if (!pageIsVisible(m_reportPages.at(m_currentPage-1))){ - if (value>m_priorScrolValue){ - m_currentPage++; - } else { - m_currentPage--; - } - } - - m_changingPage = true; - m_pagesNavigator->setValue(m_currentPage); - m_changingPage = false; - m_priorScrolValue = value; - + m_pagesNavigator->setValue(pageIndex); } }// namespace LimeReport diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index 38162c8..c23d5dc 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -38,6 +38,7 @@ #include "lrreportrender.h" #include "serializators/lrstorageintf.h" #include "serializators/lrxmlreader.h" +#include "lrpreviewreportwidget.h" namespace LimeReport { @@ -76,25 +77,20 @@ public slots: void slotFirstPage(); void slotLastPage(); void slotPrintToPDF(); -private slots: - void slotSliderMoved(int value); + void slotPageChanged(int pageIndex); private: ItemsReaderIntf* reader(); - bool pageIsVisible(PageItemDesignIntf::Ptr page); - QRectF calcPageShift(PageItemDesignIntf::Ptr page); + //bool pageIsVisible(PageItemDesignIntf::Ptr page); + //QRectF calcPageShift(PageItemDesignIntf::Ptr page); private: Ui::PreviewReportWindow *ui; QSpinBox* m_pagesNavigator; QSharedPointer m_reader; - int m_currentPage; - PageDesignIntf* m_previewPage; - QGraphicsScene* m_simpleScene; - ReportPages m_reportPages; QEventLoop m_eventLoop; bool m_changingPage; QSettings* m_settings; bool m_ownedSettings; - int m_priorScrolValue; + PreviewReportWidget* m_previewReportWidget; }; } //namespace LimeReport #endif // LRPREVIEWREPORTWINDOW_H diff --git a/limereport/lrpreviewreportwindow.ui b/limereport/lrpreviewreportwindow.ui index 632f7b0..a7c2170 100644 --- a/limereport/lrpreviewreportwindow.ui +++ b/limereport/lrpreviewreportwindow.ui @@ -27,12 +27,6 @@ 1 - - - - - - @@ -41,7 +35,7 @@ 0 0 800 - 20 + 21 @@ -232,8 +226,8 @@ - + diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 9e29e31..9c23915 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -42,62 +42,9 @@ #include #include - namespace LimeReport { -//GraphicsViewZoom -GraphicsViewZoom::GraphicsViewZoom(QGraphicsView* view) - : QObject(view), m_view(view) -{ - m_view->viewport()->installEventFilter(this); - m_view->setMouseTracking(true); - m_modifiers = Qt::ControlModifier; - m_zoomFactorBase = 1.0015; -} - -void GraphicsViewZoom::gentleZoom(double factor) { - m_view->scale(factor, factor); - m_view->centerOn(m_targetScenePos); - QPointF delta_viewport_pos = m_targetViewportPos - QPointF(m_view->viewport()->width() / 2.0, - m_view->viewport()->height() / 2.0); - QPointF viewport_center = m_view->mapFromScene(m_targetScenePos) - delta_viewport_pos; - m_view->centerOn(m_view->mapToScene(viewport_center.toPoint())); - emit zoomed(); -} - -void GraphicsViewZoom::setModifiers(Qt::KeyboardModifiers modifiers) { - m_modifiers = modifiers; -} - -void GraphicsViewZoom::setZoomFactorBase(double value) { - m_zoomFactorBase = value; -} - -bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event) { - if (event->type() == QEvent::MouseMove) { - QMouseEvent* mouse_event = static_cast(event); - QPointF delta = m_targetViewportPos - mouse_event->pos(); - if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5) { - m_targetViewportPos = mouse_event->pos(); - m_targetScenePos = m_view->mapToScene(mouse_event->pos()); - } - } else if (event->type() == QEvent::Wheel) { - QWheelEvent* wheel_event = static_cast(event); - if (QApplication::keyboardModifiers() == m_modifiers) { - if (wheel_event->orientation() == Qt::Vertical) { - double angle = wheel_event->delta(); - double factor = qPow(m_zoomFactorBase, angle); - gentleZoom(factor); - return true; - } - } - } - Q_UNUSED(object) - return false; -} - // ReportDesignIntf -//ReportDesignWidget* ReportDesignWidget::m_instance=0; ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) : QWidget(parent), m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) @@ -128,7 +75,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow m_view->scale(0.5,0.5); //m_instance=this; //m_view->viewport()->installEventFilter(this); - m_zoomer = new GraphicsViewZoom(m_view); + m_zoomer = new GraphicsViewZoomer(m_view); #ifdef Q_OS_WIN m_defaultFont = QFont("Arial",10); #endif @@ -193,7 +140,9 @@ void ReportDesignWidget::loadState(QSettings* settings) } ReportDesignWidget::~ReportDesignWidget() -{ /*m_instance=0;*/} +{ + delete m_zoomer; +} void ReportDesignWidget::setActivePage(PageDesignIntf *page) { diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 185b956..d247f2b 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -39,6 +39,7 @@ #include "lrdatasourcemanager.h" #include "lrcollection.h" #include "lrreportengine_p.h" +#include "lrgraphicsviewzoom.h" namespace LimeReport { @@ -47,24 +48,6 @@ class ReportEnginePrivate; class DataBrowser; class ReportDesignWindow; - -class GraphicsViewZoom : public QObject { - Q_OBJECT -public: - GraphicsViewZoom(QGraphicsView* view); - void gentleZoom(double factor); - void setModifiers(Qt::KeyboardModifiers modifiers); - void setZoomFactorBase(double value); -private: - QGraphicsView* m_view; - Qt::KeyboardModifiers m_modifiers; - double m_zoomFactorBase; - QPointF m_targetScenePos, m_targetViewportPos; - bool eventFilter(QObject* object, QEvent* event); -signals: - void zoomed(); -}; - class ReportDesignWidget : public QWidget { Q_OBJECT @@ -158,7 +141,7 @@ private: ReportEnginePrivate* m_report; QGraphicsView *m_view; QMainWindow *m_mainWindow; - GraphicsViewZoom* m_zoomer; + GraphicsViewZoomer* m_zoomer; QFont m_defaultFont; int m_verticalGridStep; int m_horizontalGridStep; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 1985b16..51bc4a5 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -47,6 +47,8 @@ #include "serializators/lrxmlreader.h" #include "lrreportrender.h" #include "lrpreviewreportwindow.h" +#include "lrpreviewreportwidget.h" +#include "lrpreviewreportwidget_p.h" namespace LimeReport{ @@ -312,6 +314,22 @@ void ReportEnginePrivate::previewReport() } } +PreviewReportWidget* ReportEnginePrivate::createPreviewWidget(QWidget* parent){ + + PreviewReportWidget* widget = new PreviewReportWidget(this, parent); + 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; +} + PageDesignIntf* ReportEnginePrivate::createPreviewScene(QObject* parent){ PageDesignIntf* result = 0; try { @@ -595,6 +613,12 @@ void ReportEngine::designReport() d->designReport(); } +PreviewReportWidget* ReportEngine::createPreviewWidget(QWidget *parent) +{ + Q_D(ReportEngine); + return d->createPreviewWidget(parent); +} + void ReportEngine::setShowProgressDialog(bool value) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 1eb4966..3506f1b 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -37,6 +37,7 @@ #include "lrglobal.h" #include "lrdatasourcemanagerintf.h" #include "lrscriptenginemanagerintf.h" +#include "lrpreviewreportwidget.h" class QPrinter; @@ -75,7 +76,6 @@ public: void setShowProgressDialog(bool value); IDataSourceManager* dataManager(); IScriptEngineManager* scriptManager(); - bool loadFromFile(const QString& fileName); bool loadFromByteArray(QByteArray *data); bool loadFromString(const QString& data); @@ -88,6 +88,7 @@ public: void setCurrentReportsDir(const QString& dirName); void setReportName(const QString& name); QString reportName(); + PreviewReportWidget *createPreviewWidget(QWidget *parent = 0); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 5fbcd9d..9177639 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -55,6 +55,7 @@ class ReportEnginePrivate : public QObject, public ICollectionContainer Q_DECLARE_PUBLIC(ReportEngine) Q_PROPERTY(ACollectionProperty pages READ fakeCollectionReader()) Q_PROPERTY(QObject* datasourcesManager READ dataManager()) + friend class PreviewReportWidget; public: static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); static void printReport(ReportPages pages, QPrinter &printer, const PrintRange &printRange); @@ -93,7 +94,6 @@ public: bool isNeedToSave(); QString lastError(); ReportEngine * q_ptr; - PageDesignIntf *createPreviewScene(QObject *parent); void emitSaveReport(); bool emitLoadReport(); bool isSaved(); @@ -102,6 +102,8 @@ public: void setReportName(const QString& reportName){ m_reportName=reportName;} QString reportName(){ return m_reportName;} bool hasActivePreview(){return m_activePreview;} + PageDesignIntf *createPreviewScene(QObject *parent); + PreviewReportWidget *createPreviewWidget(QWidget *parent); signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName);