qplaintextedit.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2016 The Qt Company Ltd.
  4. ** Contact: https://www.qt.io/licensing/
  5. **
  6. ** This file is part of the QtWidgets module of the Qt Toolkit.
  7. **
  8. ** $QT_BEGIN_LICENSE:LGPL$
  9. ** Commercial License Usage
  10. ** Licensees holding valid commercial Qt licenses may use this file in
  11. ** accordance with the commercial license agreement provided with the
  12. ** Software or, alternatively, in accordance with the terms contained in
  13. ** a written agreement between you and The Qt Company. For licensing terms
  14. ** and conditions see https://www.qt.io/terms-conditions. For further
  15. ** information use the contact form at https://www.qt.io/contact-us.
  16. **
  17. ** GNU Lesser General Public License Usage
  18. ** Alternatively, this file may be used under the terms of the GNU Lesser
  19. ** General Public License version 3 as published by the Free Software
  20. ** Foundation and appearing in the file LICENSE.LGPL3 included in the
  21. ** packaging of this file. Please review the following information to
  22. ** ensure the GNU Lesser General Public License version 3 requirements
  23. ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
  24. **
  25. ** GNU General Public License Usage
  26. ** Alternatively, this file may be used under the terms of the GNU
  27. ** General Public License version 2.0 or (at your option) the GNU General
  28. ** Public license version 3 or any later version approved by the KDE Free
  29. ** Qt Foundation. The licenses are as published by the Free Software
  30. ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
  31. ** included in the packaging of this file. Please review the following
  32. ** information to ensure the GNU General Public License requirements will
  33. ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
  34. ** https://www.gnu.org/licenses/gpl-3.0.html.
  35. **
  36. ** $QT_END_LICENSE$
  37. **
  38. ****************************************************************************/
  39. #ifndef QPLAINTEXTEDIT_H
  40. #define QPLAINTEXTEDIT_H
  41. #include <QtWidgets/qtextedit.h>
  42. #include <QtWidgets/qabstractscrollarea.h>
  43. #include <QtGui/qtextdocument.h>
  44. #include <QtGui/qtextoption.h>
  45. #include <QtGui/qtextcursor.h>
  46. #include <QtGui/qtextformat.h>
  47. #include <QtGui/qabstracttextdocumentlayout.h>
  48. #ifndef QT_NO_TEXTEDIT
  49. QT_BEGIN_NAMESPACE
  50. class QStyleSheet;
  51. class QTextDocument;
  52. class QMenu;
  53. class QPlainTextEditPrivate;
  54. class QMimeData;
  55. class QPagedPaintDevice;
  56. class Q_WIDGETS_EXPORT QPlainTextEdit : public QAbstractScrollArea
  57. {
  58. Q_OBJECT
  59. Q_DECLARE_PRIVATE(QPlainTextEdit)
  60. Q_PROPERTY(bool tabChangesFocus READ tabChangesFocus WRITE setTabChangesFocus)
  61. Q_PROPERTY(QString documentTitle READ documentTitle WRITE setDocumentTitle)
  62. Q_PROPERTY(bool undoRedoEnabled READ isUndoRedoEnabled WRITE setUndoRedoEnabled)
  63. Q_PROPERTY(LineWrapMode lineWrapMode READ lineWrapMode WRITE setLineWrapMode)
  64. QDOC_PROPERTY(QTextOption::WrapMode wordWrapMode READ wordWrapMode WRITE setWordWrapMode)
  65. Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
  66. Q_PROPERTY(QString plainText READ toPlainText WRITE setPlainText NOTIFY textChanged USER true)
  67. Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
  68. Q_PROPERTY(int tabStopWidth READ tabStopWidth WRITE setTabStopWidth)
  69. Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
  70. Q_PROPERTY(Qt::TextInteractionFlags textInteractionFlags READ textInteractionFlags WRITE setTextInteractionFlags)
  71. Q_PROPERTY(int blockCount READ blockCount)
  72. Q_PROPERTY(int maximumBlockCount READ maximumBlockCount WRITE setMaximumBlockCount)
  73. Q_PROPERTY(bool backgroundVisible READ backgroundVisible WRITE setBackgroundVisible)
  74. Q_PROPERTY(bool centerOnScroll READ centerOnScroll WRITE setCenterOnScroll)
  75. Q_PROPERTY(QString placeholderText READ placeholderText WRITE setPlaceholderText)
  76. public:
  77. enum LineWrapMode {
  78. NoWrap,
  79. WidgetWidth
  80. };
  81. Q_ENUM(LineWrapMode)
  82. explicit QPlainTextEdit(QWidget *parent = Q_NULLPTR);
  83. explicit QPlainTextEdit(const QString &text, QWidget *parent = Q_NULLPTR);
  84. virtual ~QPlainTextEdit();
  85. void setDocument(QTextDocument *document);
  86. QTextDocument *document() const;
  87. void setPlaceholderText(const QString &placeholderText);
  88. QString placeholderText() const;
  89. void setTextCursor(const QTextCursor &cursor);
  90. QTextCursor textCursor() const;
  91. bool isReadOnly() const;
  92. void setReadOnly(bool ro);
  93. void setTextInteractionFlags(Qt::TextInteractionFlags flags);
  94. Qt::TextInteractionFlags textInteractionFlags() const;
  95. void mergeCurrentCharFormat(const QTextCharFormat &modifier);
  96. void setCurrentCharFormat(const QTextCharFormat &format);
  97. QTextCharFormat currentCharFormat() const;
  98. bool tabChangesFocus() const;
  99. void setTabChangesFocus(bool b);
  100. inline void setDocumentTitle(const QString &title)
  101. { document()->setMetaInformation(QTextDocument::DocumentTitle, title); }
  102. inline QString documentTitle() const
  103. { return document()->metaInformation(QTextDocument::DocumentTitle); }
  104. inline bool isUndoRedoEnabled() const
  105. { return document()->isUndoRedoEnabled(); }
  106. inline void setUndoRedoEnabled(bool enable)
  107. { document()->setUndoRedoEnabled(enable); }
  108. inline void setMaximumBlockCount(int maximum)
  109. { document()->setMaximumBlockCount(maximum); }
  110. inline int maximumBlockCount() const
  111. { return document()->maximumBlockCount(); }
  112. LineWrapMode lineWrapMode() const;
  113. void setLineWrapMode(LineWrapMode mode);
  114. QTextOption::WrapMode wordWrapMode() const;
  115. void setWordWrapMode(QTextOption::WrapMode policy);
  116. void setBackgroundVisible(bool visible);
  117. bool backgroundVisible() const;
  118. void setCenterOnScroll(bool enabled);
  119. bool centerOnScroll() const;
  120. bool find(const QString &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
  121. #ifndef QT_NO_REGEXP
  122. bool find(const QRegExp &exp, QTextDocument::FindFlags options = QTextDocument::FindFlags());
  123. #endif
  124. inline QString toPlainText() const
  125. { return document()->toPlainText(); }
  126. void ensureCursorVisible();
  127. virtual QVariant loadResource(int type, const QUrl &name);
  128. #ifndef QT_NO_CONTEXTMENU
  129. QMenu *createStandardContextMenu();
  130. QMenu *createStandardContextMenu(const QPoint &position);
  131. #endif
  132. QTextCursor cursorForPosition(const QPoint &pos) const;
  133. QRect cursorRect(const QTextCursor &cursor) const;
  134. QRect cursorRect() const;
  135. QString anchorAt(const QPoint &pos) const;
  136. bool overwriteMode() const;
  137. void setOverwriteMode(bool overwrite);
  138. int tabStopWidth() const;
  139. void setTabStopWidth(int width);
  140. int cursorWidth() const;
  141. void setCursorWidth(int width);
  142. void setExtraSelections(const QList<QTextEdit::ExtraSelection> &selections);
  143. QList<QTextEdit::ExtraSelection> extraSelections() const;
  144. void moveCursor(QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode = QTextCursor::MoveAnchor);
  145. bool canPaste() const;
  146. void print(QPagedPaintDevice *printer) const;
  147. int blockCount() const;
  148. QVariant inputMethodQuery(Qt::InputMethodQuery property) const Q_DECL_OVERRIDE;
  149. Q_INVOKABLE QVariant inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const;
  150. public Q_SLOTS:
  151. void setPlainText(const QString &text);
  152. #ifndef QT_NO_CLIPBOARD
  153. void cut();
  154. void copy();
  155. void paste();
  156. #endif
  157. void undo();
  158. void redo();
  159. void clear();
  160. void selectAll();
  161. void insertPlainText(const QString &text);
  162. void appendPlainText(const QString &text);
  163. void appendHtml(const QString &html);
  164. void centerCursor();
  165. void zoomIn(int range = 1);
  166. void zoomOut(int range = 1);
  167. Q_SIGNALS:
  168. void textChanged();
  169. void undoAvailable(bool b);
  170. void redoAvailable(bool b);
  171. void copyAvailable(bool b);
  172. void selectionChanged();
  173. void cursorPositionChanged();
  174. void updateRequest(const QRect &rect, int dy);
  175. void blockCountChanged(int newBlockCount);
  176. void modificationChanged(bool);
  177. protected:
  178. virtual bool event(QEvent *e) Q_DECL_OVERRIDE;
  179. virtual void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE;
  180. virtual void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE;
  181. virtual void keyReleaseEvent(QKeyEvent *e) Q_DECL_OVERRIDE;
  182. virtual void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;
  183. virtual void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE;
  184. virtual void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
  185. virtual void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
  186. virtual void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
  187. virtual void mouseDoubleClickEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
  188. virtual bool focusNextPrevChild(bool next) Q_DECL_OVERRIDE;
  189. #ifndef QT_NO_CONTEXTMENU
  190. virtual void contextMenuEvent(QContextMenuEvent *e) Q_DECL_OVERRIDE;
  191. #endif
  192. #ifndef QT_NO_DRAGANDDROP
  193. virtual void dragEnterEvent(QDragEnterEvent *e) Q_DECL_OVERRIDE;
  194. virtual void dragLeaveEvent(QDragLeaveEvent *e) Q_DECL_OVERRIDE;
  195. virtual void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE;
  196. virtual void dropEvent(QDropEvent *e) Q_DECL_OVERRIDE;
  197. #endif
  198. virtual void focusInEvent(QFocusEvent *e) Q_DECL_OVERRIDE;
  199. virtual void focusOutEvent(QFocusEvent *e) Q_DECL_OVERRIDE;
  200. virtual void showEvent(QShowEvent *) Q_DECL_OVERRIDE;
  201. virtual void changeEvent(QEvent *e) Q_DECL_OVERRIDE;
  202. #ifndef QT_NO_WHEELEVENT
  203. virtual void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE;
  204. #endif
  205. virtual QMimeData *createMimeDataFromSelection() const;
  206. virtual bool canInsertFromMimeData(const QMimeData *source) const;
  207. virtual void insertFromMimeData(const QMimeData *source);
  208. virtual void inputMethodEvent(QInputMethodEvent *) Q_DECL_OVERRIDE;
  209. QPlainTextEdit(QPlainTextEditPrivate &dd, QWidget *parent);
  210. virtual void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE;
  211. virtual void doSetTextCursor(const QTextCursor &cursor);
  212. QTextBlock firstVisibleBlock() const;
  213. QPointF contentOffset() const;
  214. QRectF blockBoundingRect(const QTextBlock &block) const;
  215. QRectF blockBoundingGeometry(const QTextBlock &block) const;
  216. QAbstractTextDocumentLayout::PaintContext getPaintContext() const;
  217. void zoomInF(float range);
  218. private:
  219. Q_DISABLE_COPY(QPlainTextEdit)
  220. Q_PRIVATE_SLOT(d_func(), void _q_repaintContents(const QRectF &r))
  221. Q_PRIVATE_SLOT(d_func(), void _q_adjustScrollbars())
  222. Q_PRIVATE_SLOT(d_func(), void _q_verticalScrollbarActionTriggered(int))
  223. Q_PRIVATE_SLOT(d_func(), void _q_cursorPositionChanged())
  224. friend class QPlainTextEditControl;
  225. };
  226. class QPlainTextDocumentLayoutPrivate;
  227. class Q_WIDGETS_EXPORT QPlainTextDocumentLayout : public QAbstractTextDocumentLayout
  228. {
  229. Q_OBJECT
  230. Q_DECLARE_PRIVATE(QPlainTextDocumentLayout)
  231. Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
  232. public:
  233. QPlainTextDocumentLayout(QTextDocument *document);
  234. ~QPlainTextDocumentLayout();
  235. void draw(QPainter *, const PaintContext &) Q_DECL_OVERRIDE;
  236. int hitTest(const QPointF &, Qt::HitTestAccuracy ) const Q_DECL_OVERRIDE;
  237. int pageCount() const Q_DECL_OVERRIDE;
  238. QSizeF documentSize() const Q_DECL_OVERRIDE;
  239. QRectF frameBoundingRect(QTextFrame *) const Q_DECL_OVERRIDE;
  240. QRectF blockBoundingRect(const QTextBlock &block) const Q_DECL_OVERRIDE;
  241. void ensureBlockLayout(const QTextBlock &block) const;
  242. void setCursorWidth(int width);
  243. int cursorWidth() const;
  244. void requestUpdate();
  245. protected:
  246. void documentChanged(int from, int /*charsRemoved*/, int charsAdded) Q_DECL_OVERRIDE;
  247. private:
  248. void setTextWidth(qreal newWidth);
  249. qreal textWidth() const;
  250. void layoutBlock(const QTextBlock &block);
  251. qreal blockWidth(const QTextBlock &block);
  252. QPlainTextDocumentLayoutPrivate *priv() const;
  253. friend class QPlainTextEdit;
  254. friend class QPlainTextEditPrivate;
  255. };
  256. QT_END_NAMESPACE
  257. #endif // QT_NO_TEXTEDIT
  258. #endif // QPLAINTEXTEDIT_H