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 QPLAINTEXTEDIT_H
5#define QPLAINTEXTEDIT_H
6
7#include <QtWidgets/qtwidgetsglobal.h>
8#include <QtWidgets/qtextedit.h>
9
10#include <QtWidgets/qabstractscrollarea.h>
11#include <QtGui/qtextdocument.h>
12#include <QtGui/qtextoption.h>
13#include <QtGui/qtextcursor.h>
14#include <QtGui/qtextformat.h>
15#include <QtGui/qabstracttextdocumentlayout.h>
16
17QT_REQUIRE_CONFIG(textedit);
18
19QT_BEGIN_NAMESPACE
20
21class QStyleSheet;
22class QTextDocument;
23class QMenu;
24class QPlainTextEditPrivate;
25class QMimeData;
26class QPagedPaintDevice;
27class QRegularExpression;
28
29class Q_WIDGETS_EXPORT QPlainTextEdit : public QAbstractScrollArea
30{
31 Q_OBJECT
32 Q_DECLARE_PRIVATE(QPlainTextEdit)
33 Q_PROPERTY(bool tabChangesFocus READ tabChangesFocus WRITE setTabChangesFocus)
34 Q_PROPERTY(QString documentTitle READ documentTitle WRITE setDocumentTitle)
35 Q_PROPERTY(bool undoRedoEnabled READ isUndoRedoEnabled WRITE setUndoRedoEnabled)
36 Q_PROPERTY(LineWrapMode lineWrapMode READ lineWrapMode WRITE setLineWrapMode)
37 QDOC_PROPERTY(QTextOption::WrapMode wordWrapMode READ wordWrapMode WRITE setWordWrapMode)
38 Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
39 Q_PROPERTY(QString plainText READ toPlainText WRITE setPlainText NOTIFY textChanged USER true)
40 Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
41 Q_PROPERTY(qreal tabStopDistance READ tabStopDistance WRITE setTabStopDistance)
42 Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
43 Q_PROPERTY(Qt::TextInteractionFlags textInteractionFlags READ textInteractionFlags
44 WRITE setTextInteractionFlags)
45 Q_PROPERTY(int blockCount READ blockCount)
46 Q_PROPERTY(int maximumBlockCount READ maximumBlockCount WRITE setMaximumBlockCount)
47 Q_PROPERTY(bool backgroundVisible READ backgroundVisible WRITE setBackgroundVisible)
48 Q_PROPERTY(bool centerOnScroll READ centerOnScroll WRITE setCenterOnScroll)
49 Q_PROPERTY(QString placeholderText READ placeholderText WRITE setPlaceholderText)
50public:
51 enum LineWrapMode {
52 NoWrap,
53 WidgetWidth
54 };
55 Q_ENUM(LineWrapMode)
56
57 explicit QPlainTextEdit(QWidget *parent = nullptr);
58 explicit QPlainTextEdit(const QString &text, QWidget *parent = nullptr);
59 virtual ~QPlainTextEdit();
60
61 void setDocument(QTextDocument *document);
62 QTextDocument *document() const;
63
64 void setPlaceholderText(const QString &placeholderText);
65 QString placeholderText() const;
66
67 void setTextCursor(const QTextCursor &cursor);
68 QTextCursor textCursor() const;
69
70 bool isReadOnly() const;
71 void setReadOnly(bool ro);
72
73 void setTextInteractionFlags(Qt::TextInteractionFlags flags);
74 Qt::TextInteractionFlags textInteractionFlags() const;
75
76 void mergeCurrentCharFormat(const QTextCharFormat &modifier);
77 void setCurrentCharFormat(const QTextCharFormat &format);
78 QTextCharFormat currentCharFormat() const;
79
80 bool tabChangesFocus() const;
81 void setTabChangesFocus(bool b);
82
83 inline void setDocumentTitle(const QString &title)
84 { document()->setMetaInformation(info: QTextDocument::DocumentTitle, title); }
85 inline QString documentTitle() const
86 { return document()->metaInformation(info: QTextDocument::DocumentTitle); }
87
88 inline bool isUndoRedoEnabled() const
89 { return document()->isUndoRedoEnabled(); }
90 inline void setUndoRedoEnabled(bool enable)
91 { document()->setUndoRedoEnabled(enable); }
92
93 inline void setMaximumBlockCount(int maximum)
94 { document()->setMaximumBlockCount(maximum); }
95 inline int maximumBlockCount() const
96 { return document()->maximumBlockCount(); }
97
98
99 LineWrapMode lineWrapMode() const;
100 void setLineWrapMode(LineWrapMode mode);
101
102 QTextOption::WrapMode wordWrapMode() const;
103 void setWordWrapMode(QTextOption::WrapMode policy);
104
105 void setBackgroundVisible(bool visible);
106 bool backgroundVisible() const;
107
108 void setCenterOnScroll(bool enabled);
109 bool centerOnScroll() const;
110
111 bool find(const QString &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
112#if QT_CONFIG(regularexpression)
113 bool find(const QRegularExpression &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
114#endif
115
116 inline QString toPlainText() const
117 { return document()->toPlainText(); }
118
119 void ensureCursorVisible();
120
121 virtual QVariant loadResource(int type, const QUrl &name);
122#ifndef QT_NO_CONTEXTMENU
123 QMenu *createStandardContextMenu();
124 QMenu *createStandardContextMenu(const QPoint &position);
125#endif
126
127 QTextCursor cursorForPosition(const QPoint &pos) const;
128 QRect cursorRect(const QTextCursor &cursor) const;
129 QRect cursorRect() const;
130
131 QString anchorAt(const QPoint &pos) const;
132
133 bool overwriteMode() const;
134 void setOverwriteMode(bool overwrite);
135
136 qreal tabStopDistance() const;
137 void setTabStopDistance(qreal distance);
138
139 int cursorWidth() const;
140 void setCursorWidth(int width);
141
142 void setExtraSelections(const QList<QTextEdit::ExtraSelection> &selections);
143 QList<QTextEdit::ExtraSelection> extraSelections() const;
144
145 void moveCursor(QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode = QTextCursor::MoveAnchor);
146
147 bool canPaste() const;
148
149 void print(QPagedPaintDevice *printer) const;
150
151 int blockCount() const;
152 QVariant inputMethodQuery(Qt::InputMethodQuery property) const override;
153 Q_INVOKABLE QVariant inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const;
154
155public Q_SLOTS:
156
157 void setPlainText(const QString &text);
158
159#ifndef QT_NO_CLIPBOARD
160 void cut();
161 void copy();
162 void paste();
163#endif
164
165 void undo();
166 void redo();
167
168 void clear();
169 void selectAll();
170
171 void insertPlainText(const QString &text);
172
173 void appendPlainText(const QString &text);
174 void appendHtml(const QString &html);
175
176 void centerCursor();
177
178 void zoomIn(int range = 1);
179 void zoomOut(int range = 1);
180
181Q_SIGNALS:
182 void textChanged();
183 void undoAvailable(bool b);
184 void redoAvailable(bool b);
185 void copyAvailable(bool b);
186 void selectionChanged();
187 void cursorPositionChanged();
188
189 void updateRequest(const QRect &rect, int dy);
190 void blockCountChanged(int newBlockCount);
191 void modificationChanged(bool);
192
193protected:
194 virtual bool event(QEvent *e) override;
195 virtual void timerEvent(QTimerEvent *e) override;
196 virtual void keyPressEvent(QKeyEvent *e) override;
197 virtual void keyReleaseEvent(QKeyEvent *e) override;
198 virtual void resizeEvent(QResizeEvent *e) override;
199 virtual void paintEvent(QPaintEvent *e) override;
200 virtual void mousePressEvent(QMouseEvent *e) override;
201 virtual void mouseMoveEvent(QMouseEvent *e) override;
202 virtual void mouseReleaseEvent(QMouseEvent *e) override;
203 virtual void mouseDoubleClickEvent(QMouseEvent *e) override;
204 virtual bool focusNextPrevChild(bool next) override;
205#ifndef QT_NO_CONTEXTMENU
206 virtual void contextMenuEvent(QContextMenuEvent *e) override;
207#endif
208#if QT_CONFIG(draganddrop)
209 virtual void dragEnterEvent(QDragEnterEvent *e) override;
210 virtual void dragLeaveEvent(QDragLeaveEvent *e) override;
211 virtual void dragMoveEvent(QDragMoveEvent *e) override;
212 virtual void dropEvent(QDropEvent *e) override;
213#endif
214 virtual void focusInEvent(QFocusEvent *e) override;
215 virtual void focusOutEvent(QFocusEvent *e) override;
216 virtual void showEvent(QShowEvent *) override;
217 virtual void changeEvent(QEvent *e) override;
218#if QT_CONFIG(wheelevent)
219 virtual void wheelEvent(QWheelEvent *e) override;
220#endif
221
222 virtual QMimeData *createMimeDataFromSelection() const;
223 virtual bool canInsertFromMimeData(const QMimeData *source) const;
224 virtual void insertFromMimeData(const QMimeData *source);
225
226 virtual void inputMethodEvent(QInputMethodEvent *) override;
227
228 QPlainTextEdit(QPlainTextEditPrivate &dd, QWidget *parent);
229
230 virtual void scrollContentsBy(int dx, int dy) override;
231 virtual void doSetTextCursor(const QTextCursor &cursor);
232
233 QTextBlock firstVisibleBlock() const;
234 QPointF contentOffset() const;
235 QRectF blockBoundingRect(const QTextBlock &block) const;
236 QRectF blockBoundingGeometry(const QTextBlock &block) const;
237 QAbstractTextDocumentLayout::PaintContext getPaintContext() const;
238
239 void zoomInF(float range);
240
241private:
242 Q_DISABLE_COPY(QPlainTextEdit)
243
244 friend class QPlainTextEditControl;
245};
246
247
248class QPlainTextDocumentLayoutPrivate;
249class Q_WIDGETS_EXPORT QPlainTextDocumentLayout : public QAbstractTextDocumentLayout
250{
251 Q_OBJECT
252 Q_DECLARE_PRIVATE(QPlainTextDocumentLayout)
253 Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
254
255public:
256 QPlainTextDocumentLayout(QTextDocument *document);
257 ~QPlainTextDocumentLayout();
258
259 void draw(QPainter *, const PaintContext &) override;
260 int hitTest(const QPointF &, Qt::HitTestAccuracy ) const override;
261
262 int pageCount() const override;
263 QSizeF documentSize() const override;
264
265 QRectF frameBoundingRect(QTextFrame *) const override;
266 QRectF blockBoundingRect(const QTextBlock &block) const override;
267
268 void ensureBlockLayout(const QTextBlock &block) const;
269
270 void setCursorWidth(int width);
271 int cursorWidth() const;
272
273 void requestUpdate();
274
275protected:
276 void documentChanged(int from, int /*charsRemoved*/, int charsAdded) override;
277
278
279private:
280 void setTextWidth(qreal newWidth);
281 qreal textWidth() const;
282 void layoutBlock(const QTextBlock &block);
283 qreal blockWidth(const QTextBlock &block);
284
285 QPlainTextDocumentLayoutPrivate *priv() const;
286
287 friend class QPlainTextEdit;
288 friend class QPlainTextEditPrivate;
289};
290
291QT_END_NAMESPACE
292
293#endif // QPLAINTEXTEDIT_H
294

source code of qtbase/src/widgets/widgets/qplaintextedit.h