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

© 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 Fri Jul 15 2022 13:09:07 for KD Reports API Documentation by doxygen 1.8.20