Changeset View
Changeset View
Standalone View
Standalone View
libs/koreport/renderer/KoReportPreRenderer.cpp
Context not available. | |||||
79 | KRScriptHandler *m_scriptHandler; | 79 | KRScriptHandler *m_scriptHandler; | ||
---|---|---|---|---|---|
80 | void initEngine(); | 80 | void initEngine(); | ||
81 | 81 | | |||
82 | //! Generates m_document. Returns true on success. | ||||
83 | //! @note m_document is not removed on failure, caller should remove it. | ||||
84 | bool generateDocument(); | ||||
85 | | ||||
82 | KoReportASyncItemManager* asyncManager; | 86 | KoReportASyncItemManager* asyncManager; | ||
87 | QMap<QString, QObject*> scriptObjects; | ||||
83 | 88 | | |||
84 | private slots: | 89 | private slots: | ||
85 | void asyncItemsFinished(); | 90 | void asyncItemsFinished(); | ||
Context not available. | |||||
113 | m_reportData = 0; | 118 | m_reportData = 0; | ||
114 | 119 | | |||
115 | m_postProcText.clear(); | 120 | m_postProcText.clear(); | ||
121 | delete m_document; | ||||
116 | } | 122 | } | ||
117 | 123 | | |||
118 | void KoReportPreRendererPrivate::createNewPage() | 124 | void KoReportPreRendererPrivate::createNewPage() | ||
Context not available. | |||||
437 | delete asyncManager; | 443 | delete asyncManager; | ||
438 | } | 444 | } | ||
439 | 445 | | |||
440 | 446 | bool KoReportPreRendererPrivate::generateDocument() | |||
441 | //===========================KoReportPreRenderer=============================== | | |||
442 | | ||||
443 | KoReportPreRenderer::KoReportPreRenderer(const QDomElement & pDocument) : d(new KoReportPreRendererPrivate()) | | |||
444 | { | | |||
445 | setDom(pDocument); | | |||
446 | } | | |||
447 | | ||||
448 | KoReportPreRenderer::~KoReportPreRenderer() | | |||
449 | { | | |||
450 | delete d; | | |||
451 | } | | |||
452 | | ||||
453 | void KoReportPreRenderer::setName(const QString &n) | | |||
454 | { | 447 | { | ||
455 | d->m_reportData->setName(n); | 448 | if (!m_valid || !m_reportData || !m_kodata) { | ||
456 | } | 449 | return false; | ||
457 | 450 | } | |||
458 | ORODocument* KoReportPreRenderer::generate() | | |||
459 | { | | |||
460 | //kDebug(); | | |||
461 | if (d == 0 || !d->m_valid || d->m_reportData == 0 || d->m_kodata == 0) | | |||
462 | return 0; | | |||
463 | | ||||
464 | // Do this check now so we don't have to undo a lot of work later if it fails | 451 | // Do this check now so we don't have to undo a lot of work later if it fails | ||
465 | LabelSizeInfo label; | 452 | LabelSizeInfo label; | ||
466 | if (d->m_reportData->page.getPageSize() == "Labels") { | 453 | if (m_reportData->page.getPageSize() == "Labels") { | ||
467 | label = LabelSizeInfo::find(d->m_reportData->page.getLabelType()); | 454 | label = LabelSizeInfo::find(m_reportData->page.getLabelType()); | ||
468 | if (label.isNull()) | 455 | if (label.isNull()) { | ||
469 | return 0; | 456 | return false; | ||
457 | } | ||||
470 | } | 458 | } | ||
471 | 459 | | |||
472 | //kDebug() << "Creating Document"; | 460 | m_document = new ORODocument(m_reportData->m_title); | ||
473 | d->m_document = new ORODocument(d->m_reportData->m_title); | 461 | m_pageCounter = 0; | ||
474 | 462 | m_yOffset = 0.0; | |||
475 | d->m_pageCounter = 0; | | |||
476 | d->m_yOffset = 0.0; | | |||
477 | 463 | | |||
478 | //kDebug() << "Calculating Margins"; | 464 | //kDebug() << "Calculating Margins"; | ||
479 | if (!label.isNull()) { | 465 | if (!label.isNull()) { | ||
480 | if (d->m_reportData->page.isPortrait()) { | 466 | if (m_reportData->page.isPortrait()) { | ||
481 | d->m_topMargin = (label.startY() / 100.0); | 467 | m_topMargin = (label.startY() / 100.0); | ||
482 | d->m_bottomMargin = 0; | 468 | m_bottomMargin = 0; | ||
483 | d->m_rightMargin = 0; | 469 | m_rightMargin = 0; | ||
484 | d->m_leftMargin = (label.startX() / 100.0); | 470 | m_leftMargin = (label.startX() / 100.0); | ||
485 | } else { | 471 | } else { | ||
486 | d->m_topMargin = (label.startX() / 100.0); | 472 | m_topMargin = (label.startX() / 100.0); | ||
487 | d->m_bottomMargin = 0; | 473 | m_bottomMargin = 0; | ||
488 | d->m_rightMargin = 0; | 474 | m_rightMargin = 0; | ||
489 | d->m_leftMargin = (label.startY() / 100.0); | 475 | m_leftMargin = (label.startY() / 100.0); | ||
490 | } | 476 | } | ||
491 | } else { | 477 | } else { | ||
492 | d->m_topMargin = d->m_reportData->page.getMarginTop(); | 478 | m_topMargin = m_reportData->page.getMarginTop(); | ||
493 | d->m_bottomMargin = d->m_reportData->page.getMarginBottom(); | 479 | m_bottomMargin = m_reportData->page.getMarginBottom(); | ||
494 | d->m_rightMargin = d->m_reportData->page.getMarginRight(); | 480 | m_rightMargin = m_reportData->page.getMarginRight(); | ||
495 | d->m_leftMargin = d->m_reportData->page.getMarginLeft(); | 481 | m_leftMargin = m_reportData->page.getMarginLeft(); | ||
496 | //kDebug() << "Margins:" << d->m_topMargin << d->m_bottomMargin << d->m_rightMargin << d->m_leftMargin; | 482 | //kDebug() << "Margins:" << m_topMargin << m_bottomMargin << m_rightMargin << m_leftMargin; | ||
497 | } | 483 | } | ||
498 | 484 | | |||
499 | //kDebug() << "Calculating Page Size"; | 485 | //kDebug() << "Calculating Page Size"; | ||
500 | ReportPageOptions rpo(d->m_reportData->page); | 486 | ReportPageOptions rpo(m_reportData->page); | ||
501 | // This should reflect the information of the report page size | 487 | // This should reflect the information of the report page size | ||
502 | if (d->m_reportData->page.getPageSize() == "Custom") { | 488 | if (m_reportData->page.getPageSize() == "Custom") { | ||
503 | d->m_maxWidth = d->m_reportData->page.getCustomWidth(); | 489 | m_maxWidth = m_reportData->page.getCustomWidth(); | ||
504 | d->m_maxHeight = d->m_reportData->page.getCustomHeight(); | 490 | m_maxHeight = m_reportData->page.getCustomHeight(); | ||
505 | } else { | 491 | } else { | ||
506 | if (!label.isNull()) { | 492 | if (!label.isNull()) { | ||
507 | d->m_maxWidth = label.width(); | 493 | m_maxWidth = label.width(); | ||
508 | d->m_maxHeight = label.height(); | 494 | m_maxHeight = label.height(); | ||
509 | rpo.setPageSize(label.paper()); | 495 | rpo.setPageSize(label.paper()); | ||
510 | } else { | 496 | } else { | ||
511 | // lookup the correct size information for the specified size paper | 497 | // lookup the correct size information for the specified size paper | ||
512 | d->m_maxWidth = KoPageFormat::width(KoPageFormat::formatFromString(d->m_reportData->page.getPageSize()), KoPageFormat::Portrait); | 498 | m_maxWidth = KoPageFormat::width(KoPageFormat::formatFromString(m_reportData->page.getPageSize()), KoPageFormat::Portrait); | ||
513 | d->m_maxHeight = KoPageFormat::height(KoPageFormat::formatFromString(d->m_reportData->page.getPageSize()), KoPageFormat::Portrait); | 499 | m_maxHeight = KoPageFormat::height(KoPageFormat::formatFromString(m_reportData->page.getPageSize()), KoPageFormat::Portrait); | ||
514 | 500 | | |||
515 | KoUnit pageUnit(KoUnit::Millimeter); | 501 | KoUnit pageUnit(KoUnit::Millimeter); | ||
516 | d->m_maxWidth = KoUnit::toInch(pageUnit.fromUserValue(d->m_maxWidth)) * KoDpi::dpiX(); | 502 | m_maxWidth = KoUnit::toInch(pageUnit.fromUserValue(m_maxWidth)) * KoDpi::dpiX(); | ||
517 | d->m_maxHeight = KoUnit::toInch(pageUnit.fromUserValue(d->m_maxHeight)) * KoDpi::dpiY(); | 503 | m_maxHeight = KoUnit::toInch(pageUnit.fromUserValue(m_maxHeight)) * KoDpi::dpiY(); | ||
518 | } | 504 | } | ||
519 | } | 505 | } | ||
520 | 506 | | |||
521 | if (!d->m_reportData->page.isPortrait()) { | 507 | if (!m_reportData->page.isPortrait()) { | ||
522 | qreal tmp = d->m_maxWidth; | 508 | qreal tmp = m_maxWidth; | ||
523 | d->m_maxWidth = d->m_maxHeight; | 509 | m_maxWidth = m_maxHeight; | ||
524 | d->m_maxHeight = tmp; | 510 | m_maxHeight = tmp; | ||
525 | } | 511 | } | ||
526 | 512 | | |||
527 | //kDebug() << "Page Size:" << d->m_maxWidth << d->m_maxHeight; | 513 | //kDebug() << "Page Size:" << m_maxWidth << m_maxHeight; | ||
528 | 514 | | |||
529 | d->m_document->setPageOptions(rpo); | 515 | m_document->setPageOptions(rpo); | ||
530 | d->m_kodata->setSorting(d->m_reportData->m_detailSection->m_sortedFields); | 516 | m_kodata->setSorting(m_reportData->m_detailSection->m_sortedFields); | ||
531 | d->m_kodata->open(); | 517 | if (!m_kodata->open()) { | ||
532 | d->initEngine(); | 518 | return false; | ||
519 | } | ||||
520 | initEngine(); | ||||
533 | 521 | | |||
534 | //Loop through all abjects that have been registered, and register them with the script handler | 522 | //Loop through all abjects that have been registered, and register them with the script handler | ||
535 | if (d->m_scriptHandler) { | 523 | if (m_scriptHandler) { | ||
536 | QMapIterator<QString, QObject*> i(m_scriptObjects); | 524 | QMapIterator<QString, QObject*> i(scriptObjects); | ||
537 | while (i.hasNext()) { | 525 | while (i.hasNext()) { | ||
538 | i.next(); | 526 | i.next(); | ||
539 | d->m_scriptHandler->registerScriptObject(i.value(), i.key()); | 527 | m_scriptHandler->registerScriptObject(i.value(), i.key()); | ||
540 | 528 | | |||
541 | //!TODO This is a hack | 529 | //!TODO This is a hack | ||
542 | if (i.key() == "field") | 530 | if (i.key() == "field") { | ||
543 | QObject::connect(d->m_scriptHandler, SIGNAL(groupChanged(QString)), i.value(), SLOT(setWhere(QString))); | 531 | QObject::connect(m_scriptHandler, SIGNAL(groupChanged(QString)), i.value(), SLOT(setWhere(QString))); | ||
532 | } | ||||
544 | } | 533 | } | ||
545 | } | 534 | } | ||
546 | 535 | | |||
547 | //execute the script | 536 | //execute the script | ||
548 | d->m_scriptHandler->trigger(); | 537 | m_scriptHandler->trigger(); | ||
549 | 538 | | |||
550 | d->createNewPage(); | 539 | createNewPage(); | ||
551 | if (!label.isNull()) { | 540 | if (!label.isNull()) { | ||
552 | // Label Print Run | 541 | // Label Print Run | ||
553 | // remember the initial margin setting as we will be modifying | 542 | // remember the initial margin setting as we will be modifying | ||
554 | // the value and restoring it as we move around | 543 | // the value and restoring it as we move around | ||
555 | qreal margin = d->m_leftMargin; | 544 | qreal margin = m_leftMargin; | ||
556 | 545 | | |||
557 | d->m_yOffset = d->m_topMargin; | 546 | m_yOffset = m_topMargin; | ||
558 | 547 | | |||
559 | qreal w = (label.width() / 100.0); | 548 | qreal w = (label.width() / 100.0); | ||
560 | qreal wg = (label.xGap() / 100.0); | 549 | qreal wg = (label.xGap() / 100.0); | ||
Context not available. | |||||
565 | qreal tmp; | 554 | qreal tmp; | ||
566 | 555 | | |||
567 | // flip the value around if we are printing landscape | 556 | // flip the value around if we are printing landscape | ||
568 | if (!d->m_reportData->page.isPortrait()) { | 557 | if (!m_reportData->page.isPortrait()) { | ||
569 | w = (label.height() / 100.0); | 558 | w = (label.height() / 100.0); | ||
570 | wg = (label.yGap() / 100.0); | 559 | wg = (label.yGap() / 100.0); | ||
571 | h = (label.width() / 100.0); | 560 | h = (label.width() / 100.0); | ||
Context not available. | |||||
574 | numRows = label.columns(); | 563 | numRows = label.columns(); | ||
575 | } | 564 | } | ||
576 | 565 | | |||
577 | KRDetailSectionData * detailData = d->m_reportData->m_detailSection; | 566 | KRDetailSectionData * detailData = m_reportData->m_detailSection; | ||
578 | if (detailData->m_detailSection) { | 567 | if (detailData->m_detailSection) { | ||
579 | KoReportData *mydata = d->m_kodata; | 568 | KoReportData *mydata = m_kodata; | ||
580 | 569 | | |||
581 | if (mydata && mydata->recordCount() > 0) { /* && !((query = orqThis->getQuery())->eof()))*/ | 570 | if (mydata && mydata->recordCount() > 0) { /* && !((query = orqThis->getQuery())->eof()))*/ | ||
582 | mydata->moveFirst(); | 571 | if (!mydata->moveFirst()) { | ||
572 | return false; | ||||
573 | } | ||||
583 | int row = 0; | 574 | int row = 0; | ||
584 | int col = 0; | 575 | int col = 0; | ||
585 | do { | 576 | do { | ||
586 | tmp = d->m_yOffset; // store the value as renderSection changes it | 577 | tmp = m_yOffset; // store the value as renderSection changes it | ||
587 | d->renderSection(*(detailData->m_detailSection)); | 578 | renderSection(*detailData->m_detailSection); | ||
588 | d->m_yOffset = tmp; // restore the value that renderSection modified | 579 | m_yOffset = tmp; // restore the value that renderSection modified | ||
589 | 580 | | |||
590 | col++; | 581 | col++; | ||
591 | d->m_leftMargin += w + wg; | 582 | m_leftMargin += w + wg; | ||
592 | if (col >= numCols) { | 583 | if (col >= numCols) { | ||
593 | d->m_leftMargin = margin; // reset back to original value | 584 | m_leftMargin = margin; // reset back to original value | ||
594 | col = 0; | 585 | col = 0; | ||
595 | row++; | 586 | row++; | ||
596 | d->m_yOffset += h + hg; | 587 | m_yOffset += h + hg; | ||
597 | if (row >= numRows) { | 588 | if (row >= numRows) { | ||
598 | d->m_yOffset = d->m_topMargin; | 589 | m_yOffset = m_topMargin; | ||
599 | row = 0; | 590 | row = 0; | ||
600 | d->createNewPage(); | 591 | createNewPage(); | ||
601 | } | 592 | } | ||
602 | } | 593 | } | ||
603 | } while (mydata->moveNext()); | 594 | } while (mydata->moveNext()); | ||
Context not available. | |||||
606 | 597 | | |||
607 | } else { | 598 | } else { | ||
608 | // Normal Print Run | 599 | // Normal Print Run | ||
609 | if (d->m_reportData->m_reportHeader) { | 600 | if (m_reportData->m_reportHeader) { | ||
610 | d->renderSection(*(d->m_reportData->m_reportHeader)); | 601 | renderSection(*m_reportData->m_reportHeader); | ||
611 | } | 602 | } | ||
612 | 603 | | |||
613 | if (d->m_reportData->m_detailSection) { | 604 | if (m_reportData->m_detailSection) { | ||
614 | d->renderDetailSection(*(d->m_reportData->m_detailSection)); | 605 | renderDetailSection(*m_reportData->m_detailSection); | ||
615 | } | 606 | } | ||
616 | 607 | | |||
617 | if (d->m_reportData->m_reportFooter) { | 608 | if (m_reportData->m_reportFooter) { | ||
618 | if (d->renderSectionSize(*(d->m_reportData->m_reportFooter)) + d->finishCurPageSize(true) + d->m_bottomMargin + d->m_yOffset >= d->m_maxHeight) { | 609 | if (renderSectionSize(*m_reportData->m_reportFooter) + finishCurPageSize(true) + m_bottomMargin + m_yOffset >= m_maxHeight) { | ||
619 | d->createNewPage(); | 610 | createNewPage(); | ||
620 | } | 611 | } | ||
621 | d->renderSection(*(d->m_reportData->m_reportFooter)); | 612 | renderSection(*m_reportData->m_reportFooter); | ||
622 | } | 613 | } | ||
623 | } | 614 | } | ||
624 | d->finishCurPage(true); | 615 | finishCurPage(true); | ||
625 | 616 | | |||
626 | // _postProcText contains those text boxes that need to be updated | 617 | // _postProcText contains those text boxes that need to be updated | ||
627 | // with information that wasn't available at the time it was added to the document | 618 | // with information that wasn't available at the time it was added to the document | ||
628 | d->m_scriptHandler->setPageTotal(d->m_document->pages()); | 619 | m_scriptHandler->setPageTotal(m_document->pages()); | ||
629 | 620 | | |||
630 | for (int i = 0; i < d->m_postProcText.size(); i++) { | 621 | for (int i = 0; i < m_postProcText.size(); i++) { | ||
631 | OROTextBox * tb = d->m_postProcText.at(i); | 622 | OROTextBox * tb = m_postProcText.at(i); | ||
632 | 623 | | |||
633 | d->m_scriptHandler->setPageNumber(tb->page()->page() + 1); | 624 | m_scriptHandler->setPageNumber(tb->page()->page() + 1); | ||
634 | 625 | | |||
635 | tb->setText(d->m_scriptHandler->evaluate(tb->text()).toString()); | 626 | tb->setText(m_scriptHandler->evaluate(tb->text()).toString()); | ||
636 | } | 627 | } | ||
637 | 628 | | |||
638 | d->asyncManager->startRendering(); | 629 | asyncManager->startRendering(); | ||
630 | | ||||
631 | m_scriptHandler->displayErrors(); | ||||
639 | 632 | | |||
640 | d->m_scriptHandler->displayErrors(); | 633 | if (!m_kodata->close()) { | ||
634 | return false; | ||||
635 | } | ||||
636 | delete m_scriptHandler; | ||||
637 | delete m_kodata; | ||||
638 | m_postProcText.clear(); | ||||
639 | return true; | ||||
640 | } | ||||
641 | | ||||
642 | //===========================KoReportPreRenderer=============================== | ||||
641 | 643 | | |||
642 | d->m_kodata->close(); | 644 | KoReportPreRenderer::KoReportPreRenderer(const QDomElement & pDocument) : d(new KoReportPreRendererPrivate()) | ||
643 | delete d->m_scriptHandler; | 645 | { | ||
644 | delete d->m_kodata; | 646 | setDom(pDocument); | ||
645 | d->m_postProcText.clear(); | 647 | } | ||
646 | 648 | | |||
649 | KoReportPreRenderer::~KoReportPreRenderer() | ||||
650 | { | ||||
651 | delete d; | ||||
652 | } | ||||
653 | | ||||
654 | void KoReportPreRenderer::setName(const QString &n) | ||||
655 | { | ||||
656 | d->m_reportData->setName(n); | ||||
657 | } | ||||
658 | | ||||
659 | ORODocument* KoReportPreRenderer::document() | ||||
660 | { | ||||
661 | return d->m_document; | ||||
662 | } | ||||
663 | | ||||
664 | bool KoReportPreRenderer::generateDocument() | ||||
665 | { | ||||
666 | delete d->m_document; | ||||
667 | if (!d->generateDocument()) { | ||||
668 | delete d->m_document; | ||||
669 | d->m_document = 0; | ||||
670 | } | ||||
647 | return d->m_document; | 671 | return d->m_document; | ||
648 | } | 672 | } | ||
649 | 673 | | |||
Context not available. | |||||
681 | void KoReportPreRenderer::registerScriptObject(QObject* obj, const QString& name) | 705 | void KoReportPreRenderer::registerScriptObject(QObject* obj, const QString& name) | ||
682 | { | 706 | { | ||
683 | //kDebug() << name; | 707 | //kDebug() << name; | ||
684 | m_scriptObjects[name] = obj; | 708 | d->scriptObjects[name] = obj; | ||
685 | } | 709 | } | ||
686 | 710 | | |||
687 | const KoReportReportData* KoReportPreRenderer::reportData() const | 711 | const KoReportReportData* KoReportPreRenderer::reportData() const | ||
Context not available. |