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 | |
17 | QT_REQUIRE_CONFIG(textedit); |
18 | |
19 | QT_BEGIN_NAMESPACE |
20 | |
21 | class QStyleSheet; |
22 | class QTextDocument; |
23 | class ; |
24 | class QPlainTextEditPrivate; |
25 | class QMimeData; |
26 | class QPagedPaintDevice; |
27 | class QRegularExpression; |
28 | |
29 | class 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) |
50 | public: |
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 (const QList<QTextEdit::ExtraSelection> &selections); |
143 | QList<QTextEdit::ExtraSelection> () 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 | |
155 | public 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 | |
181 | Q_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 | |
193 | protected: |
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 (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 | |
241 | private: |
242 | Q_DISABLE_COPY(QPlainTextEdit) |
243 | |
244 | friend class QPlainTextEditControl; |
245 | }; |
246 | |
247 | |
248 | class QPlainTextDocumentLayoutPrivate; |
249 | class 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 | |
255 | public: |
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 | |
275 | protected: |
276 | void documentChanged(int from, int /*charsRemoved*/, int charsAdded) override; |
277 | |
278 | |
279 | private: |
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 | |
291 | QT_END_NAMESPACE |
292 | |
293 | #endif // QPLAINTEXTEDIT_H |
294 | |