KD Reports API Documentation  2.0
KDReportsReportBuilder.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** This file is part of the KD Reports library.
4 **
5 ** SPDX-FileCopyrightText: 2007-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6 **
7 ** SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDAB-KDReports OR LicenseRef-KDAB-KDReports-US
8 **
9 ** Licensees holding valid commercial KD Reports licenses may use this file in
10 ** accordance with the KD Reports Commercial License Agreement provided with
11 ** the Software.
12 **
13 ** Contact info@kdab.com if any conditions of this licensing are not clear to you.
14 **
15 ****************************************************************************/
16 
18 #include "KDReportsHeader_p.h" // for variableValue and setVariableMarker
19 #include "KDReportsLayoutHelper_p.h" // mmToPixels
20 #include "KDReportsTextElement.h"
21 
22 #include <QDebug>
23 #include <QTextBlock>
24 
25 //@cond PRIVATE
26 KDReports::ReportBuilder::ReportBuilder(KDReports::TextDocumentData &contentDocument, const QTextCursor &cursor, KDReports::Report *report)
27  : m_contentDocument(contentDocument)
28  , m_cursor(cursor)
29  , m_report(report)
30 {
31 }
32 //@endcond
33 
35 {
36  cursor().beginEditBlock();
37  // Save/restore the char format, otherwise insertHtml("<font size=\"+8\">My Title</font>")
38  // leaves us with a large-font char format, which would affect subsequent insertText().
39  // So: char format change must be done inside a single html element, not across.
40  // This is also true for charts and images, and variables, which all set things into the char format.
41  const QTextCharFormat origCharFormat = cursor().charFormat();
42  element.build(*this);
43  cursor().setCharFormat(origCharFormat);
44  cursor().endEditBlock();
45 }
46 
47 void KDReports::ReportBuilder::addBlockElement(const Element &element, Qt::AlignmentFlag horizontalAlignment, const QColor &backgroundColor)
48 {
49  QTextCursor &cursor = this->cursor();
50  cursor.beginEditBlock();
51 
52  if (!m_first) {
53  cursor.insertBlock();
54  } else {
55  m_first = false;
56  }
57 
58  // Set the default font again, the previous block should have no effect on this one
59  QTextCharFormat charFormat = cursor.charFormat();
60  charFormat.setFont(m_defaultFont);
61  cursor.setCharFormat(charFormat);
62 
63  QTextBlockFormat blockFormat;
64  blockFormat.setAlignment(horizontalAlignment);
65  setupBlockFormat(blockFormat);
66 
67  if (backgroundColor.isValid())
68  blockFormat.setBackground(backgroundColor);
69 
70  cursor.setBlockFormat(blockFormat);
71 
72  element.build(*this);
73 
74  cursor.endEditBlock();
75 
76 #if 0 // DEBUG CODE for tab positions
77  if (!m_tabPositions.isEmpty()) {
78  QTextBlock block = cursor.document()->firstBlock();
79  do {
80  qDebug() << "addBlock: Looking at block" << block.blockNumber() << "tabs:" << block.blockFormat().tabPositions().count();
81  block = block.next();
82  } while ( block.isValid() );
83  }
84 #endif
85 }
86 
88 {
89  const int charPosition = cursor().position();
90  // Don't ask for the value of PageCount yet -- it would create a documentlayout
91  // which would make any later insertion into the textdocument much, much slower.
92  const QString value = variable == KDReports::PageCount ? QStringLiteral("UNKNOWN YET") : variableValue(0 /*pageNumber*/, m_report, variable);
93  KDReports::TextElement element(value);
94 
95  const QTextCharFormat origCharFormat = cursor().charFormat();
96 
97  // Keep the current font (KDRE-91).
98  QTextCursor docCursor(&currentDocument());
99  docCursor.setPosition(charPosition);
100  cursor().setCharFormat(docCursor.charFormat());
101 
102  cursor().beginEditBlock();
103  element.build(*this);
104  cursor().endEditBlock();
105 
106  setVariableMarker(currentDocument(), charPosition, variable, value.length());
107 
108  cursor().setCharFormat(origCharFormat); // restore the orig format
109 }
110 
112 {
113  QTextCursor &cursor = this->cursor();
114  cursor.beginEditBlock();
115 
116  if (!m_first) {
117  cursor.insertBlock();
118  } else {
119  m_first = false;
120  }
121 
122  QTextBlockFormat blockFormat;
123  blockFormat.setBottomMargin(KDReports::mmToPixels(space));
124  cursor.setBlockFormat(blockFormat);
125  QTextCharFormat charFormat;
126  charFormat.setFontPointSize(1);
127  cursor.setCharFormat(charFormat);
128  cursor.endEditBlock();
129 }
130 
131 //@cond PRIVATE
133 {
134  addInlineElement(element);
135 }
136 
137 void KDReports::ReportBuilder::addBlockElementPublic(const Element &element, Qt::AlignmentFlag horizontalAlignment, const QColor &backgroundColor)
138 {
139  addBlockElement(element, horizontalAlignment, backgroundColor);
140 }
141 
143 {
144  addVariable(variable);
145 }
146 
148 {
149  addVerticalSpacing(space);
150 }
151 //@endcond
152 
154 {
155  QTextBlockFormat blockFormat = m_cursor.blockFormat();
156  blockFormat.setPageBreakPolicy(QTextFormat::PageBreak_AlwaysAfter);
157  m_cursor.setBlockFormat(blockFormat);
158 }
159 
160 void KDReports::ReportBuilder::insertFragmentPublic(const QTextDocumentFragment &fragment)
161 {
162  m_cursor.insertFragment(fragment);
163 }
164 
166 {
167  QList<QTextOption::Tab> tabsInPixels;
168  Q_FOREACH (QTextOption::Tab tab, tabs) { // krazy:exclude=foreach
169  tab.position = mmToPixels(tab.position);
170  tabsInPixels.append(tab);
171  }
172  // qDebug() << "setTabPositions" << tabsInPixels;
173 
174  m_tabPositions = tabsInPixels;
175  m_contentDocument.setUsesTabPositions(true);
176 }
177 
179 {
180  m_tabPositions = parentBuilder.m_tabPositions;
181  m_leftMargin = parentBuilder.m_leftMargin;
182  m_rightMargin = parentBuilder.m_rightMargin;
183  m_topMargin = parentBuilder.m_topMargin;
184  m_bottomMargin = parentBuilder.m_bottomMargin;
185  m_defaultFont = parentBuilder.m_defaultFont;
186 }
187 
188 QDebug operator<<(QDebug &dbg, QTextOption::Tab tab) // clazy says: pass by value, small enough
189 {
190  static const char *types[] = {"LeftTab", "RightTab", "CenterTab", "DelimiterTab"};
191  dbg.space() << '(' << types[tab.type] << tab.position << "px" << ')';
192  return dbg;
193 }
194 
195 //@cond PRIVATE
196 void KDReports::ReportBuilder::setParagraphMargins(qreal left, qreal top, qreal right, qreal bottom)
197 {
198  m_leftMargin = mmToPixels(left);
199  m_topMargin = mmToPixels(top);
200  m_rightMargin = mmToPixels(right);
201  m_bottomMargin = mmToPixels(bottom);
202 }
203 //@endcond
204 
205 void KDReports::ReportBuilder::setupBlockFormat(QTextBlockFormat &blockFormat)
206 {
207  blockFormat.setTabPositions(m_tabPositions);
208  blockFormat.setLeftMargin(m_leftMargin);
209  blockFormat.setRightMargin(m_rightMargin);
210  blockFormat.setTopMargin(m_topMargin);
211  blockFormat.setBottomMargin(m_bottomMargin);
212 }
213 
215 {
216  return m_cursor.position();
217 }
operator<<
QDebug operator<<(QDebug &dbg, QTextOption::Tab tab)
Definition: KDReportsReportBuilder.cpp:188
KDReports::ReportBuilder
Definition: KDReportsReportBuilder_p.h:41
KDReports::ReportBuilder::addVerticalSpacingPublic
virtual void addVerticalSpacingPublic(qreal space)
KDReports::TextDocumentData
Definition: KDReportsTextDocumentData_p.h:56
KDReports::TextElement::build
void build(ReportBuilder &builder) const override
Definition: KDReportsTextElement.cpp:84
KDReports::TextElement
Definition: KDReportsTextElement.h:36
QList< QTextOption::Tab >
KDReportsTextElement.h
KDReports::Element
Definition: KDReportsElement.h:39
KDReports::ReportBuilder::copyStateFrom
void copyStateFrom(ReportBuilder &parentBuilder)
Definition: KDReportsReportBuilder.cpp:178
KDReports::PageCount
@ PageCount
Page count.
Definition: KDReportsVariableType.h:31
KDReports::Element::build
virtual void build(ReportBuilder &) const =0
KDReports::Report
Definition: KDReportsReport.h:80
KDReports::ReportBuilder::setParagraphMargins
void setParagraphMargins(qreal left, qreal top, qreal right, qreal bottom)
KDReports::ReportBuilder::insertFragmentPublic
virtual void insertFragmentPublic(const QTextDocumentFragment &fragment)
Definition: KDReportsReportBuilder.cpp:160
KDReports::ReportBuilder::addVariable
virtual void addVariable(KDReports::VariableType variable)
Definition: KDReportsReportBuilder.cpp:87
KDReportsHeader_p.h
KDReports::setVariableMarker
void setVariableMarker(QTextDocument &textDoc, int pos, KDReports::VariableType variableType, int valueLength)
Definition: KDReportsHeader.cpp:96
KDReportsReportBuilder_p.h
KDReports::ReportBuilder::addInlineElement
virtual void addInlineElement(const Element &element)
Definition: KDReportsReportBuilder.cpp:34
KDReports::ReportBuilder::addVerticalSpacing
virtual void addVerticalSpacing(qreal space)
Definition: KDReportsReportBuilder.cpp:111
KDReports::ReportBuilder::ReportBuilder
ReportBuilder(KDReports::TextDocumentData &contentDocument, const QTextCursor &cursor, Report *report)
KDReports::ReportBuilder::addInlineElementPublic
virtual void addInlineElementPublic(const Element &element)
KDReports::ReportBuilder::setupBlockFormat
void setupBlockFormat(QTextBlockFormat &blockFormat)
Definition: KDReportsReportBuilder.cpp:205
KDReports::variableValue
QString variableValue(int pageNumber, KDReports::Report *report, VariableType type)
Definition: KDReportsHeader.cpp:63
KDReports::mmToPixels
KDREPORTS_EXPORT qreal mmToPixels(qreal mm)
Definition: KDReportsLayoutHelper.cpp:23
KDReportsLayoutHelper_p.h
KDReports::ReportBuilder::addBlockElementPublic
virtual void addBlockElementPublic(const Element &element, Qt::AlignmentFlag horizontalAlignment, const QColor &backgroundColor=QColor())
KDReports::ReportBuilder::currentPosition
int currentPosition()
Definition: KDReportsReportBuilder.cpp:214
KDReports::ReportBuilder::addBlockElement
virtual void addBlockElement(const Element &element, Qt::AlignmentFlag horizontalAlignment, const QColor &backgroundColor=QColor())
Definition: KDReportsReportBuilder.cpp:47
KDReports::ReportBuilder::setTabPositions
void setTabPositions(const QList< QTextOption::Tab > &tabs)
Definition: KDReportsReportBuilder.cpp:165
KDReports::VariableType
VariableType
Definition: KDReportsVariableType.h:29
KDReports::ReportBuilder::addVariablePublic
virtual void addVariablePublic(KDReports::VariableType variable)
KDReports::ReportBuilder::addPageBreakPublic
virtual void addPageBreakPublic()
Definition: KDReportsReportBuilder.cpp:153

© 2007-2021 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
https://www.kdab.com/development-resources/qt-tools/kd-reports/
Generated on Sat Jan 8 2022 02:38:32 for KD Reports API Documentation by doxygen 1.8.17