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> ¶ms)
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