Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qtextdocument_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QTEXTDOCUMENT_P_H
5#define QTEXTDOCUMENT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtGui/private/qtguiglobal_p.h>
19#include "QtGui/qtextcursor.h"
20#include "QtGui/qtextdocument.h"
21#include "QtGui/qtextlayout.h"
22#include "QtGui/qtextobject.h"
23#include "QtGui/qtextoption.h"
24
25#include "QtCore/qlist.h"
26#include "QtCore/qmap.h"
27#include "QtCore/qset.h"
28#include "QtCore/qstring.h"
29#include "QtCore/qurl.h"
30#include "QtCore/qvariant.h"
31
32#if QT_CONFIG(cssparser)
33#include "private/qcssparser_p.h"
34#endif
35#include "private/qfragmentmap_p.h"
36#include "private/qobject_p.h"
37#include "private/qtextformat_p.h"
38
39// #define QT_QMAP_DEBUG
40
41#ifdef QT_QMAP_DEBUG
42#include <iostream>
43#endif
44
46
48class QTextFormat;
52class QTextDocument;
53class QTextFrame;
54
55#define QTextBeginningOfFrame QChar(u'\xfdd0')
56#define QTextEndOfFrame QChar(u'\xfdd1')
57
59{
60public:
61 inline void initialize() {}
62 inline void invalidate() const {}
63 inline void free() {}
65 int format;
66};
67
68class QTextBlockData : public QFragment<3>
69{
70public:
71 inline void initialize()
72 { layout = nullptr; userData = nullptr; userState = -1; revision = 0; hidden = 0; }
73 void invalidate() const;
74 inline void free()
75 { delete layout; layout = nullptr; delete userData; userData = nullptr; }
76
77 mutable int format;
78 // ##### probably store a QTextEngine * here!
81 mutable int userState;
82 mutable signed int revision : 31;
83 mutable uint hidden : 1;
84};
85
86
88
90{
91public:
110 uint block_part : 1; // all commands that are part of an undo block (including the first and the last one) have this set to 1
111 uint block_end : 1; // the last command in an undo block has this set to 1.
112 uint block_padding : 6; // padding since block used to be a quint8
117 union {
122 };
124
125 bool tryMerge(const QTextUndoCommand &other);
126};
128
129class Q_GUI_EXPORT QTextDocumentPrivate : public QObjectPrivate
130{
131 Q_DECLARE_PUBLIC(QTextDocument)
132public:
133 typedef QFragmentMap<QTextFragmentData> FragmentMap;
134 typedef FragmentMap::ConstIterator FragmentIterator;
135 typedef QFragmentMap<QTextBlockData> BlockMap;
136
139
140 void init();
141 void clear();
142
144
145 void insert(int pos, QStringView text, int format);
146 void insert(int pos, QChar c, int format)
147 { insert(pos, QStringView(&c, 1), format); }
148 void insert(int pos, int strPos, int strLength, int format);
149 int insertBlock(int pos, int blockFormat, int charFormat, QTextUndoCommand::Operation = QTextUndoCommand::MoveCursor);
150 int insertBlock(QChar blockSeparator, int pos, int blockFormat, int charFormat,
152
153 void move(int from, int to, int length, QTextUndoCommand::Operation = QTextUndoCommand::MoveCursor);
155
156 void aboutToRemoveCell(int cursorFrom, int cursorEnd);
157
158 QTextFrame *insertFrame(int start, int end, const QTextFrameFormat &format);
159 void removeFrame(QTextFrame *frame);
160
161 enum FormatChangeMode { MergeFormat, SetFormat, SetFormatAndPreserveObjectIndices };
162
163 void setCharFormat(int pos, int length, const QTextCharFormat &newFormat, FormatChangeMode mode = SetFormat);
164 void setBlockFormat(const QTextBlock &from, const QTextBlock &to,
165 const QTextBlockFormat &newFormat, FormatChangeMode mode = SetFormat);
166
167 void emitUndoAvailable(bool available);
168 void emitRedoAvailable(bool available);
169
170 int undoRedo(bool undo);
171 inline void undo() { undoRedo(true); }
172 inline void redo() { undoRedo(false); }
173 void appendUndoItem(QAbstractUndoItem *);
174 inline void beginEditBlock() { if (0 == editBlock++) ++revision; }
175 void joinPreviousEditBlock();
176 void endEditBlock();
177 void finishEdit();
178 inline bool isInEditBlock() const { return editBlock; }
179 void enableUndoRedo(bool enable);
180 inline bool isUndoRedoEnabled() const { return undoEnabled; }
181
182 inline bool isUndoAvailable() const { return undoEnabled && undoState > 0; }
183 inline bool isRedoAvailable() const { return undoEnabled && undoState < undoStack.size(); }
184
185 inline int availableUndoSteps() const { return undoEnabled ? undoState : 0; }
186 inline int availableRedoSteps() const { return undoEnabled ? qMax(undoStack.size() - undoState - 1, 0) : 0; }
187
188 inline QString buffer() const { return text; }
189 QString plainText() const;
190 inline int length() const { return fragments.length(); }
191
193 inline const QTextFormatCollection *formatCollection() const { return &formats; }
194 inline QAbstractTextDocumentLayout *layout() const { return lout; }
195
196 inline FragmentIterator find(int pos) const { return fragments.find(pos); }
197 inline FragmentIterator begin() const { return fragments.begin(); }
198 inline FragmentIterator end() const { return fragments.end(); }
199
200 inline QTextBlock blocksBegin() const { return QTextBlock(const_cast<QTextDocumentPrivate *>(this), blocks.firstNode()); }
201 inline QTextBlock blocksEnd() const { return QTextBlock(const_cast<QTextDocumentPrivate *>(this), 0); }
202 inline QTextBlock blocksFind(int pos) const { return QTextBlock(const_cast<QTextDocumentPrivate *>(this), blocks.findNode(pos)); }
203 int blockCharFormatIndex(int node) const;
204
205 inline int numBlocks() const { return blocks.numNodes(); }
206
207 const BlockMap &blockMap() const { return blocks; }
208 const FragmentMap &fragmentMap() const { return fragments; }
209 BlockMap &blockMap() { return blocks; }
210 FragmentMap &fragmentMap() { return fragments; }
211
212 static const QTextBlockData *block(const QTextBlock &it) { return it.p->blocks.fragment(it.n); }
213
214 int nextCursorPosition(int position, QTextLayout::CursorMode mode) const;
215 int previousCursorPosition(int position, QTextLayout::CursorMode mode) const;
216 int leftCursorPosition(int position) const;
217 int rightCursorPosition(int position) const;
218
219 void changeObjectFormat(QTextObject *group, int format);
220
221 void setModified(bool m);
222 inline bool isModified() const { return modified; }
223
224 inline QFont defaultFont() const { return formats.defaultFont(); }
225 inline void setDefaultFont(const QFont &f) { formats.setDefaultFont(f); }
226
227 void clearUndoRedoStacks(QTextDocument::Stacks stacksToClear, bool emitSignals = false);
228
229private:
230 bool split(int pos);
231 bool unite(uint f);
232
233 void insert_string(int pos, uint strPos, uint length, int format, QTextUndoCommand::Operation op);
234 int insert_block(int pos, uint strPos, int format, int blockformat, QTextUndoCommand::Operation op, int command);
235 int remove_string(int pos, uint length, QTextUndoCommand::Operation op);
236 int remove_block(int pos, int *blockformat, int command, QTextUndoCommand::Operation op);
237
238 void insert_frame(QTextFrame *f);
239 void scan_frames(int pos, int charsRemoved, int charsAdded);
240 static void clearFrame(QTextFrame *f);
241
242 void adjustDocumentChangesAndCursors(int from, int addedOrRemoved, QTextUndoCommand::Operation op);
243
244 bool wasUndoAvailable;
245 bool wasRedoAvailable;
246
247public:
248 void documentChange(int from, int length);
249
250 void addCursor(QTextCursorPrivate *c);
251 void removeCursor(QTextCursorPrivate *c);
252
253 QTextFrame *frameAt(int pos) const;
254 QTextFrame *rootFrame() const;
255
256 QTextObject *objectForIndex(int objectIndex) const;
257 QTextObject *objectForFormat(int formatIndex) const;
258 QTextObject *objectForFormat(const QTextFormat &f) const;
259
260 QTextObject *createObject(const QTextFormat &newFormat, int objectIndex = -1);
261 void deleteObject(QTextObject *object);
262
263 QTextDocument *document() { return q_func(); }
264 const QTextDocument *document() const { return q_func(); }
265
266 bool ensureMaximumBlockCount();
267
268 static inline const QTextDocumentPrivate *get(const QTextDocument *document)
269 {
270 return document->d_func();
271 }
272
273 static inline QTextDocumentPrivate *get(QTextDocument *document)
274 {
275 return document->d_func();
276 }
277
278 static inline QTextDocumentPrivate *get(QTextBlock &block)
279 {
280 return block.p;
281 }
282
283 static inline const QTextDocumentPrivate *get(const QTextBlock &block)
284 {
285 return block.p;
286 }
287
288 static inline QTextDocumentPrivate *get(QTextObject *object)
289 {
290 return get(object->document());
291 }
292
293 static inline const QTextDocumentPrivate *get(const QTextObject *object)
294 {
295 return get(object->document());
296 }
297
298 bool canLayout() const { return layoutEnabled && !pageSize.isNull(); }
299
300private:
302 QTextDocumentPrivate& operator= (const QTextDocumentPrivate& m);
303
304 void appendUndoItem(const QTextUndoCommand &c);
305
306 void contentsChanged();
307
308 void compressPieceTable();
309
311 uint unreachableCharacterCount;
312
313 QList<QTextUndoCommand> undoStack;
314 bool undoEnabled;
315 int undoState;
316 int revision;
317 // position in undo stack of the last setModified(false) call
318 int modifiedState;
319 bool modified;
320
321 int editBlock;
322 int editBlockCursorPosition;
323 int docChangeFrom;
324 int docChangeOldLength;
325 int docChangeLength;
326 bool framesDirty;
327
329 mutable QTextFrame *rtFrame;
331 FragmentMap fragments;
332 BlockMap blocks;
333 int initialBlockCharFormatIndex;
334
335 QSet<QTextCursorPrivate *> cursors;
336 QMap<int, QTextObject *> objects;
337 QMap<QUrl, QVariant> resources;
338 QMap<QUrl, QVariant> cachedResources;
339 QTextDocument::ResourceProvider resourceProvider;
340 QString defaultStyleSheet;
341
342 int lastBlockCount;
343
344public:
346 bool layoutEnabled = true;
349#ifndef QT_NO_CSSPARSER
351#endif
363
364 void mergeCachedResources(const QTextDocumentPrivate *priv);
365
366 friend struct QTextHtmlParserNode;
367 friend class QTextHtmlExporter;
368 friend class QTextCursor;
369};
370
371class QTextTable;
373{
374public:
375 QTextHtmlExporter(const QTextDocument *_doc);
376
381
383
384private:
385 enum StyleMode { EmitStyleTag, OmitStyleTag };
386 enum FrameType { TextFrame, TableFrame, RootFrame };
387
388 void emitFrame(const QTextFrame::Iterator &frameIt);
389 void emitTextFrame(const QTextFrame *frame);
390 void emitBlock(const QTextBlock &block);
391 void emitTable(const QTextTable *table);
392 void emitFragment(const QTextFragment &fragment);
393
394 void emitBlockAttributes(const QTextBlock &block);
395 bool emitCharFormatStyle(const QTextCharFormat &format);
396 void emitTextLength(const char *attribute, const QTextLength &length);
397 void emitAlignment(Qt::Alignment alignment);
398 void emitFloatStyle(QTextFrameFormat::Position pos, StyleMode mode = EmitStyleTag);
399 void emitMargins(const QString &top, const QString &bottom, const QString &left, const QString &right);
400 void emitAttribute(const char *attribute, const QString &value);
401 void emitFrameStyle(const QTextFrameFormat &format, FrameType frameType);
402 void emitBorderStyle(QTextFrameFormat::BorderStyle style);
403 void emitPageBreakPolicy(QTextFormat::PageBreakFlags policy);
404
405 void emitFontFamily(const QStringList &families);
406
407 void emitBackgroundAttribute(const QTextFormat &format);
408 QString findUrlForImage(const QTextDocument *doc, qint64 cacheKey, bool isPixmap);
409
410 QString html;
411 QTextCharFormat defaultCharFormat;
412 const QTextDocument *doc;
413 bool fragmentMarkers;
414 QStringList closingTags;
415};
416
418
419#endif // QTEXTDOCUMENT_P_H
\inmodule QtCore
\reentrant
Definition qfont.h:22
\inmodule QtCore
Definition qsize.h:208
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:78
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QTextBlockUserData * userData
QTextLayout * layout
void invalidate() const
signed int revision
\reentrant
\reentrant \inmodule QtGui
Definition qtextcursor.h:30
QTextFormatCollection * formatCollection()
const BlockMap & blockMap() const
QAbstractTextDocumentLayout * layout() const
static QTextDocumentPrivate * get(QTextObject *object)
QFragmentMap< QTextBlockData > BlockMap
QCss::StyleSheet parsedDefaultStyleSheet
const QTextFormatCollection * formatCollection() const
int availableRedoSteps() const
QString buffer() const
QTextBlock blocksBegin() const
QTextDocument * document()
QTextBlock blocksEnd() const
static const QTextBlockData * block(const QTextBlock &it)
static const QTextDocumentPrivate * get(const QTextObject *object)
bool isUndoRedoEnabled() const
const FragmentMap & fragmentMap() const
FragmentMap & fragmentMap()
static const QTextDocumentPrivate * get(const QTextBlock &block)
static const QTextDocumentPrivate * get(const QTextDocument *document)
FragmentIterator begin() const
FragmentMap::ConstIterator FragmentIterator
QFragmentMap< QTextFragmentData > FragmentMap
QFont defaultFont() const
FragmentIterator find(int pos) const
void insert(int pos, QChar c, int format)
bool isUndoAvailable() const
Qt::CursorMoveStyle defaultCursorMoveStyle
QTextOption defaultTextOption
FragmentIterator end() const
static QTextDocumentPrivate * get(QTextDocument *document)
int availableUndoSteps() const
QTextBlock blocksFind(int pos) const
const QTextDocument * document() const
bool isRedoAvailable() const
void setDefaultFont(const QFont &f)
static QTextDocumentPrivate * get(QTextBlock &block)
\reentrant \inmodule QtGui
Stacks
\value UndoStack The undo stack.
std::function< QVariant(const QUrl &)> ResourceProvider
\reentrant
Definition qtextformat.h:90
void invalidate() const
\reentrant
Position
This enum describes how a frame is located relative to the surrounding text.
\reentrant
Definition qtextobject.h:81
QString toHtml(ExportMode mode=ExportEntireDocument)
Returns the document in HTML format.
QTextHtmlExporter(const QTextDocument *_doc)
\reentrant
Definition qtextlayout.h:70
CursorMode
\value SkipCharacters \value SkipWords
\reentrant
Definition qtextformat.h:45
\reentrant
Definition qtextobject.h:25
\reentrant
Definition qtextoption.h:18
\reentrant
Definition qtexttable.h:63
QAbstractUndoItem * custom
bool tryMerge(const QTextUndoCommand &other)
\inmodule QtCore
Definition qurl.h:94
b clear()
QString text
cache insert(employee->id(), employee)
QSet< QString >::iterator it
uint alignment
EGLint EGLint * formats
Combined button and popup list for selecting options.
CursorMoveStyle
static QDBusError::ErrorType get(const char *name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
EGLOutputLayerEXT EGLint attribute
static QByteArray cacheKey(Args &&...args)
static const QMetaObjectPrivate * priv(const uint *data)
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
GLenum mode
const GLfloat * m
GLuint GLuint end
GLenum GLuint GLenum GLsizei length
GLdouble GLdouble GLdouble GLdouble top
GLuint object
[3]
GLdouble GLdouble right
GLfloat GLfloat f
GLint left
GLboolean GLuint group
GLint GLint bottom
GLboolean enable
GLuint start
GLint GLsizei GLsizei GLenum format
const GLubyte * c
GLenum GLenum GLsizei void * table
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
static void split(QT_FT_Vector *b)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
@ Q_PRIMITIVE_TYPE
Definition qtypeinfo.h:157
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:180
unsigned int quint32
Definition qtypes.h:50
unsigned short quint16
Definition qtypes.h:48
unsigned int uint
Definition qtypes.h:34
long long qint64
Definition qtypes.h:60
double qreal
Definition qtypes.h:187
unsigned char quint8
Definition qtypes.h:46
settings remove("monkey")
QVBoxLayout * layout
QSharedPointer< T > other(t)
[5]
QFrame frame
[0]
stack undo()
groupBox setLayout(vbox)
QSizePolicy policy
const QByteArray plainText