18#include <QAbstractTextDocumentLayout>
24 : m_usesTabPositions(false)
30 ChartTextObject::registerChartTextObjectHandler(&m_document);
38void KDReports::TextDocumentData::dumpTextValueCursors()
const
40 qDebug() <<
"Text value cursors: (document size=" << m_document.characterCount() <<
")";
42 while (it != m_textValueCursors.end()) {
43 const TextValueData &data = *it;
44 if (data.cursor.isNull()) {
45 qDebug() << it.
key() <<
"unresolved cursor at pos" << data.initialPosition;
47 qDebug() << it.
key() <<
"QTextCursor currently at pos" << data.cursor.position() <<
"length" << data.valueLength;
55 resolveCursorPositions(mode);
58void KDReports::TextDocumentData::resolveCursorPositions(ModificationMode mode)
64 auto it = m_textValueCursors.begin();
65 for (; it != m_textValueCursors.end(); ++it) {
66 TextValueData &data = *it;
67 if (data.cursor.isNull()) {
70 if (mode == Append && data.initialPosition >= m_document.characterCount() - 1) {
74 data.cursor.setPosition(data.initialPosition);
85 val.valueLength = valueLength;
86 val.elementType = html ? ElementTypeHtml : ElementTypeText;
87 val.initialPosition = pos;
88 m_textValueCursors.insert(
id, val);
93 aboutToModifyContents(Modify);
98 while (it != m_textValueCursors.end() && it.
key() ==
id) {
99 TextValueData &data = *it;
103 const int oldPos = data.cursor.position();
105 const bool html = data.elementType == ElementTypeHtml;
111 data.valueLength = c.
position() - oldPos;
112 data.cursor.setPosition(oldPos);
123 if (!m_hasResizableImages && !m_usesTabPositions) {
128 if (m_hasResizableImages) {
135 updatePercentSize(imageFormat, size);
141 }
while (!c.
atEnd());
144 if (m_usesTabPositions) {
158 tab.position = availableWidth;
160 tab.position = availableWidth / 2;
169 block = block.
next();
177 if (w != m_document.textWidth()) {
179 m_document.setTextWidth(w);
180 updatePercentSizes(m_document.size());
186 if (size != m_document.pageSize()) {
188 m_document.setPageSize(size);
189 updatePercentSizes(size);
197 const qreal imageRatio = imageFormat.
height() / imageFormat.
width();
198 const qreal pageWidth = size.
width();
199 const qreal pageHeight = size.
height();
200 const qreal pageRatio = pageWidth ? pageHeight / pageWidth : 0;
203 if (imageRatio < pageRatio) {
204 prop = QStringLiteral(
"W100");
206 prop = QStringLiteral(
"H100");
210 switch (prop[0].toLatin1()) {
212 const qreal newWidth = pageWidth * percent / 100.0;
214 imageFormat.
setHeight(newWidth * imageRatio);
216 if (percent == 100.0)
220 imageFormat.
setHeight(pageHeight * percent / 100.0);
224 if (percent == 100.0)
226 imageFormat.
setWidth(imageRatio ? imageFormat.
height() / imageRatio : 0);
230 qWarning(
"Unhandled image format property type - internal error");
236 m_tables.append(table);
242 qreal currentPointSize = -1.0;
248 if (cursorFontPointSize != currentPointSize) {
249 if (currentPointSize != -1.0) {
250 setFontSizeHelper(lastCursor, cursor.
position() - 1, currentPointSize, factor);
253 currentPointSize = cursorFontPointSize;
259 if (currentPointSize != -1.0) {
260 setFontSizeHelper(lastCursor, cursor.
position(), currentPointSize, factor);
270 for (
int i = 0; i < constraints.
size(); ++i) {
281void KDReports::TextDocumentData::setFontSizeHelper(
QTextCursor &lastCursor,
int endPosition, qreal pointSize, qreal factor)
283 if (pointSize == 0) {
284 pointSize = m_document.defaultFont().pointSize();
297#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
298 QString htmlText = m_document.toHtml(
"utf-8");
300 QString htmlText = m_document.toHtml();
302 htmlText.
remove(
QLatin1String(
"margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; "));
313 registerTable(table);
314 m_autoTables.insert(table, *element);
321 for (AutoTablesMaps::iterator it = m_autoTables.begin(); it != m_autoTables.end(); ++it)
329 if (m_autoTables.isEmpty())
331 aboutToModifyContents(Modify);
334 AutoTablesMaps autoTables = m_autoTables;
335 m_autoTables.clear();
336 AutoTablesMaps::const_iterator it = autoTables.constBegin();
337 for (; it != autoTables.constEnd(); ++it) {
340 regenerateOneTable(tableElement, table);
348 aboutToModifyContents(Modify);
350 AutoTablesMaps::iterator it = m_autoTables.begin();
351 for (; it != m_autoTables.end(); ++it) {
355 m_autoTables.erase(it);
356 regenerateOneTable(tableElement, table);
375 m_tables.removeAll(table);
377 ReportBuilder builder(*
this, cursor,
nullptr );
379 QFont font = tableElement.defaultFont(&isSet);
381 builder.setDefaultFont(font);
383 tableElement.
build(builder);
391 Q_FOREACH (
const QString &name, m_resourceNames) {
402 m_resourceNames.append(resourceName);
407 m_hasResizableImages =
true;
412 m_usesTabPositions = usesTabs;
QAbstractItemModel * tableModel() const
void build(ReportBuilder &) const override
static void registerHLineObjectHandler(QTextDocument *doc)
void setUsesTabPositions(bool usesTabs)
void regenerateAutoTables()
void addResourceName(const QString &resourceName)
void regenerateAutoTableForModel(QAbstractItemModel *model)
void updatePercentSizes(QSizeF size)
void aboutToModifyContents(ModificationMode mode)
void scaleFontsBy(qreal factor)
void layoutWithTextWidth(qreal w)
void registerTable(QTextTable *table)
QList< KDReports::AutoTableElement * > autoTableElements()
static void updatePercentSize(QTextImageFormat &format, QSizeF size)
void registerAutoTable(QTextTable *table, const KDReports::AutoTableElement *element)
void saveResourcesToFiles()
void updateTextValue(const QString &id, const QString &newValue)
void setPageSize(QSizeF size)
void setHasResizableImages()
void setTextValueMarker(int pos, const QString &id, int valueLength, bool html)
static const int ResizableImageProperty
void append(const T &value)
bool isEmpty() const const
const Key & key() const const
const T & value() const const
const Key & key() const const
bool isNull() const const
bool save(const QString &fileName, const char *format, int quality) const const
qreal height() const const
qreal width() const const
QString mid(int position, int n) const const
QString & remove(int position, int n)
double toDouble(bool *ok) const const
QTextBlockFormat blockFormat() const const
bool isValid() const const
QTextBlock next() const const
int position() const const
qreal leftMargin() const const
qreal rightMargin() const const
void setTabPositions(const QList< QTextOption::Tab > &tabs)
QList< QTextOption::Tab > tabPositions() const const
qreal fontPointSize() const const
void setFontPointSize(qreal size)
QTextBlockFormat blockFormat() const const
QTextCharFormat charFormat() const const
void insertHtml(const QString &html)
void insertText(const QString &text)
void mergeCharFormat(const QTextCharFormat &modifier)
bool movePosition(QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode, int n)
int position() const const
void removeSelectedText()
void setBlockFormat(const QTextBlockFormat &format)
void setCharFormat(const QTextCharFormat &format)
void setPosition(int pos, QTextCursor::MoveMode m)
void setUseDesignMetrics(bool b)
bool hasProperty(int propertyId) const const
bool isImageFormat() const const
QVariant property(int propertyId) const const
QTextImageFormat toImageFormat() const const
QTextCursor firstCursorPosition() const const
QTextCursor lastCursorPosition() const const
qreal leftMargin() const const
qreal rightMargin() const const
qreal height() const const
void setHeight(qreal height)
void setWidth(qreal width)
qreal width() const const
QTextTableFormat format() const const
void setFormat(const QTextTableFormat &format)
qreal cellPadding() const const
QVector< QTextLength > columnWidthConstraints() const const
void setCellPadding(qreal padding)
void setColumnWidthConstraints(const QVector< QTextLength > &constraints)
QString toString() const const