1 #include "lrpreviewreportwidget.h"
2 #include "ui_lrpreviewreportwidget.h"
3 
4 #include <QPrinter>
5 #include <QPrintDialog>
6 #include <QPrinterInfo>
7 #include <QScrollBar>
8 #include <QFileDialog>
9 
10 #include "lrpagedesignintf.h"
11 #include "lrreportrender.h"
12 #include "lrreportengine_p.h"
13 #include "lrpreviewreportwidget_p.h"
14 #include "serializators/lrxmlwriter.h"
15 #include "lrpreparedpages.h"
16 
17 #include "lrexportersfactory.h"
18 
19 
20 namespace LimeReport {
21 
pageIsVisible()22 bool PreviewReportWidgetPrivate::pageIsVisible(){
23     QGraphicsView* view = q_ptr->ui->graphicsView;
24 	if ( m_currentPage-1 >= m_reportPages.size() || m_currentPage <= 0 )
25         return false;
26     PageItemDesignIntf::Ptr page = m_reportPages.at(m_currentPage-1);
27     return page->mapToScene(page->rect()).boundingRect().intersects(
28                 view->mapToScene(view->viewport()->geometry()).boundingRect()
29                 );
30 }
31 
calcPageShift()32 QRectF PreviewReportWidgetPrivate::calcPageShift(){
33     QGraphicsView *view = q_ptr->ui->graphicsView;
34     PageItemDesignIntf::Ptr page = m_reportPages.at(m_currentPage-1);
35     qreal pageHeight = page->mapToScene(page->boundingRect()).boundingRect().height();
36     qreal viewHeight = view->mapToScene(
37                 0, view->viewport()->height()
38                 ).y() - view->mapToScene(0,0).y();
39     viewHeight = (pageHeight<viewHeight)?pageHeight:viewHeight;
40     QRectF pageStartPos =  m_reportPages.at(m_currentPage-1)->mapRectToScene(
41                 m_reportPages.at(m_currentPage-1)->rect()
42                 );
43     return QRectF(0,pageStartPos.y(),0,viewHeight);
44 }
45 
setPages(ReportPages pages)46 void PreviewReportWidgetPrivate::setPages(ReportPages pages)
47 {
48     m_reportPages = pages;
49     if (!m_reportPages.isEmpty()){
50         m_previewPage->setPageItems(m_reportPages);
51         m_changingPage = true;
52         m_currentPage = 1;
53         if (pages.at(0)) pages.at(0)->setSelected(true);
54         m_changingPage = false;
55         q_ptr->initPreview();
56         q_ptr->emitPageSet();
57         q_ptr->activateCurrentPage();
58     }
59 }
60 
currentPage()61 PageItemDesignIntf::Ptr PreviewReportWidgetPrivate::currentPage()
62 {
63     if (m_reportPages.count()>0 && m_reportPages.count() >= m_currentPage && m_currentPage > 0)
64         return m_reportPages.at(m_currentPage-1);
65     else return PageItemDesignIntf::Ptr(0);
66 }
67 
aviableExporters()68 QList<QString> PreviewReportWidgetPrivate::aviableExporters()
69 {
70     return ExportersFactory::instance().map().keys();
71 }
72 
startInsertTextItem()73 void PreviewReportWidgetPrivate::startInsertTextItem()
74 {
75     m_previewPage->startInsertMode("TextItem");
76 }
77 
activateItemSelectionMode()78 void PreviewReportWidgetPrivate::activateItemSelectionMode()
79 {
80     m_previewPage->startEditMode();
81 }
82 
deleteSelectedItems()83 void PreviewReportWidgetPrivate::deleteSelectedItems()
84 {
85     m_previewPage->deleteSelected();
86 }
87 
PreviewReportWidget(ReportEngine * report,QWidget * parent)88 PreviewReportWidget::PreviewReportWidget(ReportEngine *report, QWidget *parent) :
89     QWidget(parent),
90     ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)),
91     m_scaleType(FitWidth), m_scalePercent(0), m_previewPageBackgroundColor(Qt::white),
92     m_defaultPrinter(0)
93 {
94     ui->setupUi(this);
95     d_ptr->m_report = report->d_ptr;
96     d_ptr->m_previewPage = d_ptr->m_report->createPreviewPage();
97     d_ptr->m_previewPage->setItemMode( LimeReport::PreviewMode );
98     m_resizeTimer.setSingleShot(true);
99 
100     ui->errorsView->setVisible(false);
101     connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int)));
102     connect(d_ptr->m_report, SIGNAL(destroyed(QObject*)), this, SLOT(reportEngineDestroyed(QObject*)));
103     d_ptr->m_zoomer = new GraphicsViewZoomer(ui->graphicsView);
104     connect(d_ptr->m_zoomer, SIGNAL(zoomed(double)), this, SLOT(slotZoomed(double)));
105     connect(&m_resizeTimer, SIGNAL(timeout()), this, SLOT(resizeDone()));
106 }
107 
~PreviewReportWidget()108 PreviewReportWidget::~PreviewReportWidget()
109 {
110     delete d_ptr->m_previewPage;
111     d_ptr->m_previewPage = 0;
112     delete d_ptr->m_zoomer;
113     delete d_ptr;
114     delete ui;
115 }
116 
aviableExporters()117 QList<QString> PreviewReportWidget::aviableExporters()
118 {
119     return d_ptr->aviableExporters();
120 }
121 
exportReport(QString exporterName,const QMap<QString,QVariant> & params)122 bool PreviewReportWidget::exportReport(QString exporterName, const QMap<QString, QVariant> &params)
123 {
124     if (ExportersFactory::instance().map().contains(exporterName)){
125 
126         ReportExporterInterface* e = ExportersFactory::instance().objectCreator(exporterName)(d_ptr->m_report);
127         QString defaultFileName = d_ptr->m_report->reportName().split(".")[0];
128         QString filter = QString("%1 (*.%2)").arg(e->exporterName()).arg(e->exporterFileExt());
129         QString fileName = QFileDialog::getSaveFileName(this,tr("%1 file name").arg(e->exporterName()), defaultFileName, filter);
130         if (!fileName.isEmpty()){
131             QFileInfo fi(fileName);
132             if (fi.suffix().isEmpty())
133                 fileName += QString(".%1").arg(e->exporterFileExt());
134             bool result = e->exportPages(d_ptr->m_reportPages, fileName, params);
135             delete e;
136             return result;
137         }
138     }
139     return false;
140 }
141 
initPreview()142 void PreviewReportWidget::initPreview()
143 {
144     if (ui->graphicsView->scene()!=d_ptr->m_previewPage)
145         ui->graphicsView->setScene(d_ptr->m_previewPage);
146     ui->graphicsView->resetMatrix();
147     ui->graphicsView->centerOn(0, 0);
148     ui->graphicsView->scene()->setBackgroundBrush(QColor(m_previewPageBackgroundColor));
149     setScalePercent(d_ptr->m_scalePercent);
150     PageDesignIntf* page = dynamic_cast<PageDesignIntf*>(ui->graphicsView->scene());
151     if (page)
152         connect(page, SIGNAL(itemInserted(LimeReport::PageDesignIntf*, QPointF, QString)),
153                 this, SIGNAL(itemInserted(LimeReport::PageDesignIntf*, QPointF, QString)));
154 }
155 
setErrorsMesagesVisible(bool visible)156 void PreviewReportWidget::setErrorsMesagesVisible(bool visible)
157 {
158     ui->errorsView->setVisible(visible);
159 }
160 
zoomIn()161 void PreviewReportWidget::zoomIn()
162 {
163     d_ptr->m_scalePercent =  (d_ptr->m_scalePercent / 10) * 10 + 10;
164     setScalePercent(d_ptr->m_scalePercent);
165 }
166 
zoomOut()167 void PreviewReportWidget::zoomOut()
168 {
169     if (d_ptr->m_scalePercent>0)
170         d_ptr->m_scalePercent = (d_ptr->m_scalePercent / 10) * 10 - 10;
171     setScalePercent(d_ptr->m_scalePercent);
172 }
173 
firstPage()174 void PreviewReportWidget::firstPage()
175 {
176     d_ptr->m_changingPage=true;
177     if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){
178         d_ptr->m_currentPage=1;
179         ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
180         emit pageChanged(d_ptr->m_currentPage);
181         activateCurrentPage();
182     }
183     d_ptr->m_changingPage=false;
184 }
185 
priorPage()186 void PreviewReportWidget::priorPage()
187 {
188     d_ptr->m_changingPage=true;
189     if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_currentPage>1)){
190        d_ptr->m_currentPage--;
191        ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
192        emit pageChanged(d_ptr->m_currentPage);
193        activateCurrentPage();
194     }
195    d_ptr->m_changingPage=false;
196 }
197 
nextPage()198 void PreviewReportWidget::nextPage()
199 {
200     d_ptr->m_changingPage=true;
201     if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){
202         d_ptr->m_currentPage++;
203         ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
204         emit pageChanged(d_ptr->m_currentPage);
205         activateCurrentPage();
206     }
207     d_ptr->m_changingPage=false;
208 }
209 
lastPage()210 void PreviewReportWidget::lastPage()
211 {
212     d_ptr->m_changingPage=true;
213     if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count()>(d_ptr->m_currentPage))){
214         d_ptr->m_currentPage=d_ptr->m_reportPages.count();
215         ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
216         emit pageChanged(d_ptr->m_currentPage);
217         activateCurrentPage();
218     }
219     d_ptr->m_changingPage=false;
220 }
221 
printPages(QPrinter * printer)222 void PreviewReportWidget::printPages(QPrinter* printer)
223 {
224     if (!d_ptr->m_reportPages.isEmpty())
225         d_ptr->m_report->printPages(
226             d_ptr->m_reportPages,
227             printer
228         );
229     foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){
230         d_ptr->m_previewPage->reactivatePageItem(pageItem);
231     }
232 }
233 
print()234 void PreviewReportWidget::print()
235 {
236     QPrinterInfo pi;
237     QPrinter lp(QPrinter::HighResolution);
238 
239     if (!pi.defaultPrinter().isNull()){
240 #ifdef HAVE_QT4
241             lp.setPrinterName(pi.defaultPrinter().printerName());
242 #endif
243 #ifdef HAVE_QT5
244 #if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))
245             lp.setPrinterName(pi.defaultPrinterName());
246 #else
247             lp.setPrinterName(pi.defaultPrinter().printerName());
248 #endif
249 #endif
250     }
251 
252     QPrinter* printer = m_defaultPrinter ? m_defaultPrinter : &lp;
253 
254     QPrintDialog dialog(printer,QApplication::activeWindow());
255     if (dialog.exec()==QDialog::Accepted){
256         printPages(printer);
257     }
258 
259 }
260 
printToPDF()261 void PreviewReportWidget::printToPDF()
262 {
263     if (!d_ptr->m_reportPages.isEmpty()){
264         exportReport("PDF");
265         foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){
266             d_ptr->m_previewPage->reactivatePageItem(pageItem);
267         }
268     }
269 }
270 
pageNavigatorChanged(int value)271 void PreviewReportWidget::pageNavigatorChanged(int value)
272 {
273     if (d_ptr->m_changingPage) return;
274     d_ptr->m_changingPage = true;
275     if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count() >= value) && value>0){
276         d_ptr->m_currentPage = value;
277         activateCurrentPage();
278         ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0);
279     }
280     d_ptr->m_changingPage=false;
281 }
282 
saveToFile()283 void PreviewReportWidget::saveToFile()
284 {
285     bool saved = false;
286     PreparedPages pagesManager = PreparedPages(&d_ptr->m_reportPages);
287     emit onSave(saved, &pagesManager);
288     if (!saved){
289         QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name"));
290         if (!fileName.isEmpty()){
291             QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
292             foreach (PageItemDesignIntf::Ptr page, d_ptr->m_reportPages){
293                 writer->putItem(page.data());
294             }
295             writer->saveToFile(fileName);
296         }
297     }
298 }
299 
setScalePercent(int percent)300 void PreviewReportWidget::setScalePercent(int percent)
301 {
302     ui->graphicsView->resetMatrix();
303     d_ptr->m_scalePercent = percent;
304     qreal scaleSize = percent/100.0;
305     ui->graphicsView->scale(scaleSize, scaleSize);
306     emit scalePercentChanged(percent);
307     if (percent == 100){
308         m_scaleType = OneToOne;
309     } else {
310         m_scaleType = Percents;
311         m_scalePercent = percent;
312     }
313 }
314 
fitWidth()315 void PreviewReportWidget::fitWidth()
316 {
317     if (d_ptr->currentPage()){
318         qreal scalePercent = ui->graphicsView->viewport()->width() / ui->graphicsView->scene()->width();
319         setScalePercent(scalePercent*100);
320         m_scaleType = FitWidth;
321     }
322 }
323 
fitPage()324 void PreviewReportWidget::fitPage()
325 {
326     if (d_ptr->currentPage()){
327         qreal vScale = ui->graphicsView->viewport()->width() / ui->graphicsView->scene()->width();
328         qreal hScale = ui->graphicsView->viewport()->height() / d_ptr->currentPage()->height();
329         setScalePercent(qMin(vScale,hScale)*100);
330         m_scaleType = FitPage;
331     }
332 }
333 
resizeEvent(QResizeEvent *)334 void PreviewReportWidget::resizeEvent(QResizeEvent *)
335 {
336     m_resizeTimer.start(100);
337 }
338 
setErrorMessages(const QStringList & value)339 void PreviewReportWidget::setErrorMessages(const QStringList &value)
340 {
341     foreach (QString line, value) {
342         ui->errorsView->append(line);
343     }
344 }
345 
emitPageSet()346 void PreviewReportWidget::emitPageSet()
347 {
348     emit pagesSet(d_ptr->m_reportPages.count());
349 }
350 
defaultPrinter() const351 QPrinter *PreviewReportWidget::defaultPrinter() const
352 {
353     return m_defaultPrinter;
354 }
355 
setDefaultPrinter(QPrinter * defaultPrinter)356 void PreviewReportWidget::setDefaultPrinter(QPrinter *defaultPrinter)
357 {
358     m_defaultPrinter = defaultPrinter;
359 }
360 
scaleType() const361 ScaleType PreviewReportWidget::scaleType() const
362 {
363     return m_scaleType;
364 }
365 
startInsertTextItem()366 void PreviewReportWidget::startInsertTextItem()
367 {
368     d_ptr->startInsertTextItem();
369 }
370 
activateItemSelectionMode()371 void PreviewReportWidget::activateItemSelectionMode()
372 {
373     d_ptr->activateItemSelectionMode();
374 }
375 
deleteSelectedItems()376 void PreviewReportWidget::deleteSelectedItems()
377 {
378     d_ptr->deleteSelectedItems();
379 }
380 
scalePercent() const381 int PreviewReportWidget::scalePercent() const
382 {
383     return m_scalePercent;
384 }
385 
setScaleType(const ScaleType & scaleType,int percent)386 void PreviewReportWidget::setScaleType(const ScaleType &scaleType, int percent)
387 {
388     m_scaleType = scaleType;
389     m_scalePercent = percent;
390 }
391 
setPreviewPageBackgroundColor(QColor color)392 void PreviewReportWidget::setPreviewPageBackgroundColor(QColor color)
393 {
394     m_previewPageBackgroundColor = color;
395 }
396 
previewPageBackgroundColor()397 QColor PreviewReportWidget::previewPageBackgroundColor()
398 {
399     return  m_previewPageBackgroundColor;
400 }
401 
refreshPages()402 void PreviewReportWidget::refreshPages()
403 {
404     if (d_ptr->m_report){
405         try{
406             d_ptr->m_report->dataManager()->setDesignTime(false);
407             ReportPages pages = d_ptr->m_report->renderToPages();
408             d_ptr->m_report->dataManager()->setDesignTime(true);
409             if (pages.count()>0){
410                 d_ptr->setPages(pages);
411             }
412         } catch (ReportError &exception){
413             d_ptr->m_report->saveError(exception.what());
414             d_ptr->m_report->showError(exception.what());
415        }
416     }
417 }
418 
activateCurrentPage()419 void PreviewReportWidget::activateCurrentPage()
420 {
421     PageDesignIntf* page = dynamic_cast<PageDesignIntf*>(ui->graphicsView->scene());
422     if (page)
423         page->setCurrentPage(d_ptr->currentPage().data());
424 }
425 
slotSliderMoved(int value)426 void PreviewReportWidget::slotSliderMoved(int value)
427 {
428     int curPage = d_ptr->m_currentPage;
429     if (ui->graphicsView->verticalScrollBar()->minimum()==value){
430         d_ptr->m_currentPage = 1;
431     } else if (ui->graphicsView->verticalScrollBar()->maximum()==value){
432         d_ptr->m_currentPage = d_ptr->m_reportPages.count();
433     }
434 
435     if (!d_ptr->pageIsVisible()){
436         if (value>d_ptr->m_priorScrolValue){
437             d_ptr->m_currentPage++;
438         } else {
439             d_ptr->m_currentPage--;
440         }
441     }
442 
443     if (curPage != d_ptr->m_currentPage){
444         d_ptr->m_changingPage = true;
445         emit pageChanged(d_ptr->m_currentPage);
446         activateCurrentPage();
447         d_ptr->m_changingPage = false;
448     }
449 
450     d_ptr->m_priorScrolValue = value;
451 }
452 
reportEngineDestroyed(QObject * object)453 void PreviewReportWidget::reportEngineDestroyed(QObject *object)
454 {
455     if (object == d_ptr->m_report){
456         d_ptr->m_report = 0;
457     }
458 }
459 
slotZoomed(double)460 void PreviewReportWidget::slotZoomed(double )
461 {
462     d_ptr->m_scalePercent = ui->graphicsView->matrix().m11()*100;
463     emit scalePercentChanged(d_ptr->m_scalePercent);
464 }
465 
resizeDone()466 void PreviewReportWidget::resizeDone()
467 {
468     switch (m_scaleType) {
469     case FitPage:
470         fitPage();
471         break;
472     case FitWidth:
473         fitWidth();
474         break;
475     case OneToOne:
476         setScalePercent(100);
477         break;
478     case Percents:
479         setScalePercent(m_scalePercent);
480         break;
481     }
482 }
483 
484 
485 }
486