示例#1
0
ReportItem::PrintResult ReportItemFrame::printMetaPaint(ReportItemMetaPaint *out, const ReportItem::Rect &bounding_rect)
{
	qfLogFuncFrame() << this;
	qfDebug() << "\tbounding_rect:" << bounding_rect.toString();
	qfDebug() << "\tdesignedRect:" << designedRect.toString();// << "isLeftTopFloating:" << isLeftTopFloating() << "isRightBottomFloating:" << isRightBottomFloating();
	qfDebug() << "\tlayout:" << ((layout() == LayoutHorizontal)? "horizontal": "vertical") << ", is rubber:" << isRubber(layout());
	QF_TIME_SCOPE("ReportItemFrame::printMetaPaint ***");
	PrintResult res = PR_PrintedOk;
	if(!isVisible())
		return res;
	Rect frame_content_br = bounding_rect;
	qfDebug() << "\tbbr 0:" << frame_content_br.toString();
	if(designedRect.horizontalUnit == Rect::UnitMM && designedRect.width() - Epsilon > bounding_rect.width()) {
		qfDebug() << "\t<<<< FRAME NOT FIT WIDTH";
		return checkPrintResult(PR_PrintAgainOnNextPage);
	}
	if(designedRect.verticalUnit == Rect::UnitMM && designedRect.height() - Epsilon > bounding_rect.height()) {
		qfDebug() << "\t<<<< FRAME NOT FIT HEIGHT";
		return checkPrintResult(PR_PrintAgainOnNextPage);
	}
	frame_content_br.adjust(hinset(), vinset(), -hinset(), -vinset());

	QList<double> column_sizes;
	double columns_gap = 0;
	if(column_sizes.isEmpty()) {
		qf::core::String s = columns();
		QStringList sl = s.splitAndTrim(',');
		columns_gap = columnsGap();
		double ly_size = frame_content_br.width() - (columns_gap * (sl.count() - 1));
		column_sizes = qf::qmlwidgets::graphics::makeLayoutSizes(sl, ly_size);
	}
	ReportItemMetaPaintFrame *metapaint_frame = new ReportItemMetaPaintFrame(out, this);
	QF_ASSERT_EX(metapaint_frame != nullptr, "Meta paint item for item " + QString(this->metaObject()->className()) + " not created.");
	metapaint_frame->setInset(hinset(), vinset());
	metapaint_frame->setLayout((qf::qmlwidgets::graphics::Layout)layout());
	metapaint_frame->setAlignment(horizontalAlignment(), verticalAlignment());
	Rect column_br_helper = frame_content_br;
	for(int current_column_index=0; current_column_index<column_sizes.count(); current_column_index++) {
		Rect column_br = column_br_helper;
		column_br.setWidth(column_sizes.value(current_column_index));
		qfDebug() << "\tcolumn bounding rect:" << column_br.toString();

		res = printMetaPaintChildren(metapaint_frame, column_br);

		if(res == PR_PrintAgainOnNextPage) {
			/// pokud je result neverfit, nech ho tam, at aspon vidime, co se nikdy nevejde
			if(!canBreak() && !(res == PR_ErrorNeverFit)) {
				// always delete current metapaint item when it cannot be broken
				// when keepWithPrev is true, delete also metapaint item for all metapaint items in it's keepWithPrev chain
				ReportItemFrame *parent_frame = this->parentFrame();
				if(!parent_frame) {
					qfWarning() << "Parent frame shall not be NULL!";
				}
				else {
					QF_CHECK(parent_frame->itemToPrintAt(parent_frame->m_indexToPrint) == this, "Internal error!");
					while(true) {
						ReportItem *it = parent_frame->itemToPrintAt(parent_frame->m_indexToPrint);
						QF_ASSERT(it != nullptr, "Internal error!", break);
						//qfWarning() << "reseting index of:" << it;
						it->resetIndexToPrintRecursively(ReportItem::IncludingParaTexts);
						ReportItemMetaPaint *mpit = out->lastChild();
						QF_ASSERT(mpit != nullptr, "Cannot delete NULL metapaint item!", break);
						QF_SAFE_DELETE(mpit);
						if(it->isKeepWithPrev()) {
							if(parent_frame->m_indexToPrint > 0) {
								parent_frame->m_indexToPrint--;
								//qfWarning() << "new m_indexToPrint:" << parent_frame->m_indexToPrint;
								continue;
							}
							else {
								qfWarning() << "Index to print == 0: Internal error!";
							}
						}
						break;
					}
				}
				/*
				resetIndexToPrintRecursively(ReportItem::IncludingParaTexts);
				QF_SAFE_DELETE(mp);
				*/
				return checkPrintResult(res);
			}
		}
		column_br_helper = column_br;
		column_br_helper.moveLeft(column_br.right() + columns_gap);
	}