add QTextControl class to QtGui

This is a reduced version of the old text control
class, that doesn't support a few QWidget specific
additions.

Change-Id: Ib4542845a30473bb2462b2fe14daba178b571368
This commit is contained in:
Lars Knoll 2011-07-05 13:03:09 +02:00
parent 4ed17a6508
commit eaedcefbf8
7 changed files with 3420 additions and 1 deletions

View File

@ -123,6 +123,7 @@ protected:
private:
friend class QWidgetTextControl;
friend class QTextControl;
friend class QTextDocument;
friend class QTextDocumentPrivate;
friend class QTextEngine;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,286 @@
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QTEXTCONTROL_P_H
#define QTEXTCONTROL_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtGui/qtextdocument.h>
#include <QtGui/qtextoption.h>
#include <QtGui/qtextcursor.h>
#include <QtGui/qtextformat.h>
#include <QtCore/qrect.h>
#include <QtGui/qabstracttextdocumentlayout.h>
#include <QtGui/qtextdocumentfragment.h>
#include <QtGui/qclipboard.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
QT_MODULE(Gui)
class QStyleSheet;
class QTextDocument;
class QTextControlPrivate;
class QMimeData;
class QAbstractScrollArea;
class QEvent;
class QTimerEvent;
class Q_WIDGETS_EXPORT QTextControl : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(QTextControl)
#ifndef QT_NO_TEXTHTMLPARSER
Q_PROPERTY(QString html READ toHtml WRITE setHtml NOTIFY textChanged USER true)
#endif
Q_PROPERTY(bool overwriteMode READ overwriteMode WRITE setOverwriteMode)
Q_PROPERTY(bool acceptRichText READ acceptRichText WRITE setAcceptRichText)
Q_PROPERTY(int cursorWidth READ cursorWidth WRITE setCursorWidth)
Q_PROPERTY(Qt::TextInteractionFlags textInteractionFlags READ textInteractionFlags WRITE setTextInteractionFlags)
Q_PROPERTY(bool openExternalLinks READ openExternalLinks WRITE setOpenExternalLinks)
Q_PROPERTY(bool ignoreUnusedNavigationEvents READ ignoreUnusedNavigationEvents WRITE setIgnoreUnusedNavigationEvents)
public:
explicit QTextControl(QObject *parent = 0);
explicit QTextControl(const QString &text, QObject *parent = 0);
explicit QTextControl(QTextDocument *doc, QObject *parent = 0);
virtual ~QTextControl();
void setView(QObject *view);
QObject *view() const;
void setDocument(QTextDocument *document);
QTextDocument *document() const;
void setTextCursor(const QTextCursor &cursor);
QTextCursor textCursor() const;
void setTextInteractionFlags(Qt::TextInteractionFlags flags);
Qt::TextInteractionFlags textInteractionFlags() const;
void mergeCurrentCharFormat(const QTextCharFormat &modifier);
void setCurrentCharFormat(const QTextCharFormat &format);
QTextCharFormat currentCharFormat() const;
bool find(const QString &exp, QTextDocument::FindFlags options = 0);
inline QString toPlainText() const
{ return document()->toPlainText(); }
#ifndef QT_NO_TEXTHTMLPARSER
inline QString toHtml() const
{ return document()->toHtml(); }
#endif
virtual void ensureCursorVisible();
virtual QVariant loadResource(int type, const QUrl &name);
QTextCursor cursorForPosition(const QPointF &pos) const;
QRectF cursorRect(const QTextCursor &cursor) const;
QRectF cursorRect() const;
QRectF selectionRect(const QTextCursor &cursor) const;
QRectF selectionRect() const;
QString anchorAt(const QPointF &pos) const;
QPointF anchorPosition(const QString &name) const;
QString anchorAtCursor() const;
bool overwriteMode() const;
void setOverwriteMode(bool overwrite);
int cursorWidth() const;
void setCursorWidth(int width);
bool acceptRichText() const;
void setAcceptRichText(bool accept);
void setExtraSelections(const QVector<QAbstractTextDocumentLayout::Selection> &selections);
QVector<QAbstractTextDocumentLayout::Selection> extraSelections() const;
void setTextWidth(qreal width);
qreal textWidth() const;
QSizeF size() const;
void setOpenExternalLinks(bool open);
bool openExternalLinks() const;
void setIgnoreUnusedNavigationEvents(bool ignore);
bool ignoreUnusedNavigationEvents() const;
void moveCursor(QTextCursor::MoveOperation op, QTextCursor::MoveMode mode = QTextCursor::MoveAnchor);
bool canPaste() const;
void setCursorIsFocusIndicator(bool b);
bool cursorIsFocusIndicator() const;
void setDragEnabled(bool enabled);
bool isDragEnabled() const;
bool isWordSelectionEnabled() const;
void setWordSelectionEnabled(bool enabled);
#ifndef QT_NO_PRINTER
void print(QPrinter *printer) const;
#endif
virtual int hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy) const;
virtual QRectF blockBoundingRect(const QTextBlock &block) const;
QAbstractTextDocumentLayout::PaintContext getPaintContext() const;
public Q_SLOTS:
void setPlainText(const QString &text);
void setHtml(const QString &text);
#ifndef QT_NO_CLIPBOARD
void cut();
void copy();
void paste(QClipboard::Mode mode = QClipboard::Clipboard);
#endif
void undo();
void redo();
void clear();
void selectAll();
void insertPlainText(const QString &text);
#ifndef QT_NO_TEXTHTMLPARSER
void insertHtml(const QString &text);
#endif
void append(const QString &text);
void appendHtml(const QString &html);
void appendPlainText(const QString &text);
void adjustSize();
Q_SIGNALS:
void textChanged();
void undoAvailable(bool b);
void redoAvailable(bool b);
void currentCharFormatChanged(const QTextCharFormat &format);
void copyAvailable(bool b);
void selectionChanged();
void cursorPositionChanged();
// control signals
void updateRequest(const QRectF &rect = QRectF());
void documentSizeChanged(const QSizeF &);
void blockCountChanged(int newBlockCount);
void visibilityRequest(const QRectF &rect);
void microFocusChanged();
void linkActivated(const QString &link);
void linkHovered(const QString &);
void modificationChanged(bool m);
public:
// control properties
QPalette palette() const;
void setPalette(const QPalette &pal);
virtual void processEvent(QEvent *e, const QMatrix &matrix);
void processEvent(QEvent *e, const QPointF &coordinateOffset = QPointF());
// control methods
void drawContents(QPainter *painter, const QRectF &rect = QRectF());
void setFocus(bool focus, Qt::FocusReason = Qt::OtherFocusReason);
virtual QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
virtual QMimeData *createMimeDataFromSelection() const;
virtual bool canInsertFromMimeData(const QMimeData *source) const;
virtual void insertFromMimeData(const QMimeData *source);
bool setFocusToAnchor(const QTextCursor &newCursor);
bool setFocusToNextOrPreviousAnchor(bool next);
bool findNextPrevAnchor(const QTextCursor& from, bool next, QTextCursor& newAnchor);
protected:
virtual void timerEvent(QTimerEvent *e);
virtual bool event(QEvent *e);
private:
Q_DISABLE_COPY(QTextControl)
Q_PRIVATE_SLOT(d_func(), void _q_updateCurrentCharFormatAndSelection())
Q_PRIVATE_SLOT(d_func(), void _q_emitCursorPosChanged(const QTextCursor &))
Q_PRIVATE_SLOT(d_func(), void _q_deleteSelected())
Q_PRIVATE_SLOT(d_func(), void _q_copyLink())
Q_PRIVATE_SLOT(d_func(), void _q_updateBlock(const QTextBlock &))
Q_PRIVATE_SLOT(d_func(), void _q_documentLayoutChanged())
};
// also used by QLabel
class QTextEditMimeData : public QMimeData
{
public:
inline QTextEditMimeData(const QTextDocumentFragment &aFragment) : fragment(aFragment) {}
virtual QStringList formats() const;
protected:
virtual QVariant retrieveData(const QString &mimeType, QVariant::Type type) const;
private:
void setup() const;
mutable QTextDocumentFragment fragment;
};
QT_END_NAMESPACE
QT_END_HEADER
#endif // QTextControl_H

View File

@ -0,0 +1,232 @@
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QTEXTCONTROL_P_P_H
#define QTEXTCONTROL_P_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "QtGui/qtextdocumentfragment.h"
#include "QtGui/qtextcursor.h"
#include "QtGui/qtextformat.h"
#include "QtGui/qabstracttextdocumentlayout.h"
#include "QtCore/qbasictimer.h"
#include "QtCore/qpointer.h"
#include "private/qobject_p.h"
QT_BEGIN_NAMESPACE
class QMimeData;
class QAbstractScrollArea;
class QInputContext;
class QTextControlPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QTextControl)
public:
QTextControlPrivate();
bool cursorMoveKeyEvent(QKeyEvent *e);
void updateCurrentCharFormat();
void indent();
void outdent();
void gotoNextTableCell();
void gotoPreviousTableCell();
void createAutoBulletList();
void init(Qt::TextFormat format = Qt::RichText, const QString &text = QString(),
QTextDocument *document = 0);
void setContent(Qt::TextFormat format = Qt::RichText, const QString &text = QString(),
QTextDocument *document = 0);
void startDrag();
void paste(const QMimeData *source);
void setCursorPosition(const QPointF &pos);
void setCursorPosition(int pos, QTextCursor::MoveMode mode = QTextCursor::MoveAnchor);
void repaintCursor();
inline void repaintSelection()
{ repaintOldAndNewSelection(QTextCursor()); }
void repaintOldAndNewSelection(const QTextCursor &oldSelection);
void selectionChanged(bool forceEmitSelectionChanged = false);
void _q_updateCurrentCharFormatAndSelection();
#ifndef QT_NO_CLIPBOARD
void setClipboardSelection();
#endif
void _q_emitCursorPosChanged(const QTextCursor &someCursor);
void setBlinkingCursorEnabled(bool enable);
void extendWordwiseSelection(int suggestedNewPosition, qreal mouseXPosition);
void extendBlockwiseSelection(int suggestedNewPosition);
void _q_deleteSelected();
void _q_setCursorAfterUndoRedo(int undoPosition, int charsAdded, int charsRemoved);
QRectF cursorRectPlusUnicodeDirectionMarkers(const QTextCursor &cursor) const;
QRectF rectForPosition(int position) const;
QRectF selectionRect(const QTextCursor &cursor) const;
inline QRectF selectionRect() const
{ return selectionRect(this->cursor); }
QString anchorForCursor(const QTextCursor &anchor) const;
void keyPressEvent(QKeyEvent *e);
void mousePressEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos,
Qt::KeyboardModifiers modifiers,
Qt::MouseButtons buttons,
const QPoint &globalPos);
void mouseMoveEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos,
Qt::KeyboardModifiers modifiers,
Qt::MouseButtons buttons,
const QPoint &globalPos);
void mouseReleaseEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos,
Qt::KeyboardModifiers modifiers,
Qt::MouseButtons buttons,
const QPoint &globalPos);
void mouseDoubleClickEvent(QEvent *e, Qt::MouseButton button, const QPointF &pos,
Qt::KeyboardModifiers modifiers,
Qt::MouseButtons buttons,
const QPoint &globalPos);
bool sendMouseEventToInputContext(QEvent *e, QEvent::Type eventType, Qt::MouseButton button,
const QPointF &pos,
Qt::KeyboardModifiers modifiers,
Qt::MouseButtons buttons,
const QPoint &globalPos);
void contextMenuEvent(const QPoint &screenPos, const QPointF &docPos, QWidget *contextWidget);
void focusEvent(QFocusEvent *e);
#ifdef QT_KEYPAD_NAVIGATION
void editFocusEvent(QEvent *e);
#endif
bool dragEnterEvent(QEvent *e, const QMimeData *mimeData);
void dragLeaveEvent();
bool dragMoveEvent(QEvent *e, const QMimeData *mimeData, const QPointF &pos);
bool dropEvent(const QMimeData *mimeData, const QPointF &pos, Qt::DropAction dropAction, QObject *source);
void inputMethodEvent(QInputMethodEvent *);
void activateLinkUnderCursor(QString href = QString());
void append(const QString &text, Qt::TextFormat format = Qt::AutoText);
QInputContext *inputContext();
QTextDocument *doc;
bool cursorOn;
QTextCursor cursor;
bool cursorIsFocusIndicator;
QTextCharFormat lastCharFormat;
QTextCursor dndFeedbackCursor;
Qt::TextInteractionFlags interactionFlags;
QBasicTimer cursorBlinkTimer;
QBasicTimer trippleClickTimer;
QPointF trippleClickPoint;
bool dragEnabled;
bool mousePressed;
bool mightStartDrag;
QPoint dragStartPos;
QPointer<QObject> contextObject;
bool lastSelectionState;
bool ignoreAutomaticScrollbarAdjustement;
QTextCursor selectedWordOnDoubleClick;
QTextCursor selectedBlockOnTrippleClick;
bool overwriteMode;
bool acceptRichText;
int preeditCursor;
bool hideCursor; // used to hide the cursor in the preedit area
QVector<QAbstractTextDocumentLayout::Selection> extraSelections;
QPalette palette;
bool hasFocus;
#ifdef QT_KEYPAD_NAVIGATION
bool hasEditFocus;
#endif
bool isEnabled;
QString highlightedAnchor; // Anchor below cursor
QString anchorOnMousePress;
bool hadSelectionOnMousePress;
bool ignoreUnusedNavigationEvents;
bool openExternalLinks;
bool wordSelectionEnabled;
QString linkToCopy;
void _q_copyLink();
void _q_updateBlock(const QTextBlock &);
void _q_documentLayoutChanged();
};
QT_END_NAMESPACE
#endif // QTextControl_P_H

View File

@ -228,6 +228,7 @@ public:
private:
QSharedDataPointer<QTextCursorPrivate> d;
friend class QTextCursorPrivate;
friend class QTextDocumentFragmentPrivate;
friend class QTextCopyHelper;
friend class QWidgetTextControlPrivate;

View File

@ -68,6 +68,8 @@ public:
QTextCursorPrivate(const QTextCursorPrivate &rhs);
~QTextCursorPrivate();
static inline QTextCursorPrivate *getPrivate(QTextCursor *c) { return c->d; }
enum AdjustResult { CursorMoved, CursorUnchanged };
AdjustResult adjustPosition(int positionOfChange, int charsAddedOrRemoved, QTextUndoCommand::Operation op);

View File

@ -22,7 +22,9 @@ HEADERS += \
text/qtexthtmlparser_p.h \
text/qabstracttextdocumentlayout.h \
text/qtextdocumentlayout_p.h \
text/qtextcursor.h \
text/qtextcontrol_p.h \
text/qtextcontrol_p_p.h \
text/qtextcursor.h \
text/qtextcursor_p.h \
text/qtextdocumentfragment.h \
text/qtextdocumentfragment_p.h \
@ -50,6 +52,7 @@ SOURCES += \
text/qfontsubset.cpp \
text/qfontmetrics.cpp \
text/qfontdatabase.cpp \
text/qtextcontrol.cpp \
text/qtextengine.cpp \
text/qtextlayout.cpp \
text/qtextformat.cpp \