/**************************************************************************** | |
** | |
** 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 Qt3Support 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 Q3TEXTEDIT_H | |
#define Q3TEXTEDIT_H | |
#include <Qt3Support/q3scrollview.h> | |
#include <Qt3Support/q3stylesheet.h> | |
#include <Qt3Support/q3mimefactory.h> | |
#include <QtCore/qmap.h> | |
QT_BEGIN_HEADER | |
QT_BEGIN_NAMESPACE | |
QT_MODULE(Qt3SupportLight) | |
#ifndef QT_NO_TEXTEDIT | |
// uncomment below to enable optimization mode - also uncomment the | |
// optimDoAutoScroll() private slot since moc ignores #ifdefs.. | |
#define QT_TEXTEDIT_OPTIMIZATION | |
class QPainter; | |
class Q3TextDocument; | |
class Q3TextCursor; | |
class QKeyEvent; | |
class QResizeEvent; | |
class QMouseEvent; | |
class QTimer; | |
class Q3TextString; | |
class QTextCommand; | |
class Q3TextParagraph; | |
class Q3TextFormat; | |
class QFont; | |
class QColor; | |
class Q3TextEdit; | |
class QTextBrowser; | |
class Q3TextString; | |
struct QUndoRedoInfoPrivate; | |
class Q3PopupMenu; | |
class Q3TextEditPrivate; | |
class Q3SyntaxHighlighter; | |
class Q3TextDrag; | |
#ifdef QT_TEXTEDIT_OPTIMIZATION | |
class Q3TextEditOptimPrivate | |
{ | |
public: | |
// Note: no left-tag has any value for leftTag or parent, and | |
// no right-tag has any formatting flags set. | |
enum TagType { Color = 0, Format = 1 }; | |
struct Tag { | |
TagType type:2; | |
bool bold:1; | |
bool italic:1; | |
bool underline:1; | |
int line; | |
int index; | |
Tag * leftTag; // ptr to left-tag in a left-right tag pair | |
Tag * parent; // ptr to parent left-tag in a nested tag | |
Tag * prev; | |
Tag * next; | |
QString tag; | |
}; | |
Q3TextEditOptimPrivate() | |
{ | |
len = numLines = maxLineWidth = 0; | |
selStart.line = selStart.index = -1; | |
selEnd.line = selEnd.index = -1; | |
search.line = search.index = 0; | |
tags = lastTag = 0; | |
} | |
void clearTags() | |
{ | |
Tag * itr = tags; | |
while (tags) { | |
itr = tags; | |
tags = tags->next; | |
delete itr; | |
} | |
tags = lastTag = 0; | |
tagIndex.clear(); | |
} | |
~Q3TextEditOptimPrivate() | |
{ | |
clearTags(); | |
} | |
int len; | |
int numLines; | |
int maxLineWidth; | |
struct Selection { | |
int line; | |
int index; | |
}; | |
Selection selStart, selEnd, search; | |
Tag * tags, * lastTag; | |
QMap<int, QString> lines; | |
QMap<int, Tag *> tagIndex; | |
}; | |
#endif | |
class Q_COMPAT_EXPORT Q3TextEdit : public Q3ScrollView | |
{ | |
friend class Q3TextBrowser; | |
friend class Q3SyntaxHighlighter; | |
Q_OBJECT | |
Q_ENUMS(WordWrap WrapPolicy) | |
Q_FLAGS(AutoFormattingFlag) | |
Q_PROPERTY(Qt::TextFormat textFormat READ textFormat WRITE setTextFormat) | |
Q_PROPERTY(QString text READ text WRITE setText) | |
Q_PROPERTY(QBrush paper READ paper WRITE setPaper) | |
Q_PROPERTY(bool linkUnderline READ linkUnderline WRITE setLinkUnderline) | |
Q_PROPERTY(QString documentTitle READ documentTitle) | |
Q_PROPERTY(int length READ length) | |
Q_PROPERTY(WordWrap wordWrap READ wordWrap WRITE setWordWrap) | |
Q_PROPERTY(int wrapColumnOrWidth READ wrapColumnOrWidth WRITE setWrapColumnOrWidth) | |
Q_PROPERTY(WrapPolicy wrapPolicy READ wrapPolicy WRITE setWrapPolicy) | |
Q_PROPERTY(bool hasSelectedText READ hasSelectedText) | |
Q_PROPERTY(QString selectedText READ selectedText) | |
Q_PROPERTY(int undoDepth READ undoDepth WRITE setUndoDepth) | |
Q_PROPERTY(bool overwriteMode READ isOverwriteMode WRITE setOverwriteMode) | |
Q_PROPERTY(bool modified READ isModified WRITE setModified DESIGNABLE false) | |
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly) | |
Q_PROPERTY(bool undoRedoEnabled READ isUndoRedoEnabled WRITE setUndoRedoEnabled) | |
Q_PROPERTY(int tabStopWidth READ tabStopWidth WRITE setTabStopWidth) | |
Q_PROPERTY(bool tabChangesFocus READ tabChangesFocus WRITE setTabChangesFocus) | |
Q_PROPERTY(AutoFormattingFlag autoFormatting READ autoFormatting WRITE setAutoFormatting) | |
public: | |
enum WordWrap { | |
NoWrap, | |
WidgetWidth, | |
FixedPixelWidth, | |
FixedColumnWidth | |
}; | |
enum WrapPolicy { | |
AtWordBoundary, | |
AtWhiteSpace = AtWordBoundary, // AtWhiteSpace is deprecated | |
Anywhere, | |
AtWordOrDocumentBoundary | |
}; | |
enum AutoFormattingFlag { | |
AutoNone = 0, | |
AutoBulletList = 0x00000001, | |
AutoAll = 0xffffffff | |
}; | |
Q_DECLARE_FLAGS(AutoFormatting, AutoFormattingFlag) | |
enum KeyboardAction { | |
ActionBackspace, | |
ActionDelete, | |
ActionReturn, | |
ActionKill, | |
ActionWordBackspace, | |
ActionWordDelete | |
}; | |
enum CursorAction { | |
MoveBackward, | |
MoveForward, | |
MoveWordBackward, | |
MoveWordForward, | |
MoveUp, | |
MoveDown, | |
MoveLineStart, | |
MoveLineEnd, | |
MoveHome, | |
MoveEnd, | |
MovePgUp, | |
MovePgDown | |
}; | |
enum VerticalAlignment { | |
AlignNormal, | |
AlignSuperScript, | |
AlignSubScript | |
}; | |
enum TextInsertionFlags { | |
RedoIndentation = 0x0001, | |
CheckNewLines = 0x0002, | |
RemoveSelected = 0x0004 | |
}; | |
Q3TextEdit(const QString& text, const QString& context = QString(), | |
QWidget* parent=0, const char* name=0); | |
Q3TextEdit(QWidget* parent=0, const char* name=0); | |
virtual ~Q3TextEdit(); | |
QString text() const; | |
QString text(int para) const; | |
Qt::TextFormat textFormat() const; | |
QString context() const; | |
QString documentTitle() const; | |
void getSelection(int *paraFrom, int *indexFrom, | |
int *paraTo, int *indexTo, int selNum = 0) const; | |
virtual bool find(const QString &expr, bool cs, bool wo, bool forward = true, | |
int *para = 0, int *index = 0); | |
int paragraphs() const; | |
int lines() const; | |
int linesOfParagraph(int para) const; | |
int lineOfChar(int para, int chr); | |
int length() const; | |
QRect paragraphRect(int para) const; | |
int paragraphAt(const QPoint &pos) const; | |
int charAt(const QPoint &pos, int *para) const; | |
int paragraphLength(int para) const; | |
Q3StyleSheet* styleSheet() const; | |
#ifndef QT_NO_MIME | |
Q3MimeSourceFactory* mimeSourceFactory() const; | |
#endif | |
QBrush paper() const; | |
bool linkUnderline() const; | |
int heightForWidth(int w) const; | |
bool hasSelectedText() const; | |
QString selectedText() const; | |
bool isUndoAvailable() const; | |
bool isRedoAvailable() const; | |
WordWrap wordWrap() const; | |
int wrapColumnOrWidth() const; | |
WrapPolicy wrapPolicy() const; | |
int tabStopWidth() const; | |
QString anchorAt(const QPoint& pos, Qt::AnchorAttribute a = Qt::AnchorHref); | |
QSize sizeHint() const; | |
bool isReadOnly() const { return readonly; } | |
void getCursorPosition(int *parag, int *index) const; | |
bool isModified() const; | |
bool italic() const; | |
bool bold() const; | |
bool underline() const; | |
QString family() const; | |
int pointSize() const; | |
QColor color() const; | |
QFont font() const; | |
QFont currentFont() const; | |
int alignment() const; | |
VerticalAlignment verticalAlignment() const; | |
int undoDepth() const; | |
// do not use, will go away | |
virtual bool getFormat(int para, int index, QFont *font, QColor *color, VerticalAlignment *verticalAlignment); | |
// do not use, will go away | |
virtual bool getParagraphFormat(int para, QFont *font, QColor *color, | |
VerticalAlignment *verticalAlignment, int *alignment, | |
Q3StyleSheetItem::DisplayMode *displayMode, | |
Q3StyleSheetItem::ListStyle *listStyle, | |
int *listDepth); | |
bool isOverwriteMode() const { return overWrite; } | |
QColor paragraphBackgroundColor(int para) const; | |
bool isUndoRedoEnabled() const; | |
bool eventFilter(QObject *o, QEvent *e); | |
bool tabChangesFocus() const; | |
void setAutoFormatting(AutoFormatting); | |
AutoFormatting autoFormatting() const; | |
Q3SyntaxHighlighter *syntaxHighlighter() const; | |
public Q_SLOTS: | |
#ifndef QT_NO_MIME | |
virtual void setMimeSourceFactory(Q3MimeSourceFactory* factory); | |
#endif | |
virtual void setStyleSheet(Q3StyleSheet* styleSheet); | |
virtual void scrollToAnchor(const QString& name); | |
virtual void setPaper(const QBrush& pap); | |
virtual void setLinkUnderline(bool); | |
virtual void setWordWrap(Q3TextEdit::WordWrap mode); | |
virtual void setWrapColumnOrWidth(int); | |
virtual void setWrapPolicy(Q3TextEdit::WrapPolicy policy); | |
virtual void copy(); | |
virtual void append(const QString& text); | |
void setText(const QString &txt) { setText(txt, QString()); } | |
virtual void setText(const QString &txt, const QString &context); | |
virtual void setTextFormat(Qt::TextFormat f); | |
virtual void selectAll(bool select = true); | |
virtual void setTabStopWidth(int ts); | |
virtual void zoomIn(int range); | |
virtual void zoomIn() { zoomIn(1); } | |
virtual void zoomOut(int range); | |
virtual void zoomOut() { zoomOut(1); } | |
virtual void zoomTo(int size); | |
virtual void sync(); | |
virtual void setReadOnly(bool b); | |
virtual void undo(); | |
virtual void redo(); | |
virtual void cut(); | |
virtual void paste(); | |
#ifndef QT_NO_CLIPBOARD | |
virtual void pasteSubType(const QByteArray &subtype); | |
#endif | |
virtual void clear(); | |
virtual void del(); | |
virtual void indent(); | |
virtual void setItalic(bool b); | |
virtual void setBold(bool b); | |
virtual void setUnderline(bool b); | |
virtual void setFamily(const QString &f); | |
virtual void setPointSize(int s); | |
virtual void setColor(const QColor &c); | |
virtual void setVerticalAlignment(Q3TextEdit::VerticalAlignment a); | |
virtual void setAlignment(int a); | |
// do not use, will go away | |
virtual void setParagType(Q3StyleSheetItem::DisplayMode dm, Q3StyleSheetItem::ListStyle listStyle); | |
virtual void setCursorPosition(int parag, int index); | |
virtual void setSelection(int parag_from, int index_from, int parag_to, int index_to, int selNum = 0); | |
virtual void setSelectionAttributes(int selNum, const QColor &back, bool invertText); | |
virtual void setModified(bool m); | |
virtual void resetFormat(); | |
virtual void setUndoDepth(int d); | |
virtual void setFormat(Q3TextFormat *f, int flags); | |
virtual void ensureCursorVisible(); | |
virtual void placeCursor(const QPoint &pos, Q3TextCursor *c = 0); | |
virtual void moveCursor(Q3TextEdit::CursorAction action, bool select); | |
virtual void doKeyboardAction(Q3TextEdit::KeyboardAction action); | |
virtual void removeSelectedText(int selNum = 0); | |
virtual void removeSelection(int selNum = 0); | |
virtual void setCurrentFont(const QFont &f); | |
virtual void setOverwriteMode(bool b) { overWrite = b; } | |
virtual void scrollToBottom(); | |
virtual void insert(const QString &text, uint insertionFlags = CheckNewLines | RemoveSelected); | |
// obsolete | |
virtual void insert(const QString &text, bool, bool = true, bool = true); | |
virtual void insertAt(const QString &text, int para, int index); | |
virtual void removeParagraph(int para); | |
virtual void insertParagraph(const QString &text, int para); | |
virtual void setParagraphBackgroundColor(int para, const QColor &bg); | |
virtual void clearParagraphBackground(int para); | |
virtual void setUndoRedoEnabled(bool b); | |
virtual void setTabChangesFocus(bool b); | |
#ifdef QT_TEXTEDIT_OPTIMIZATION | |
void polishEvent(QEvent*); | |
void setMaxLogLines(int numLines); | |
int maxLogLines() const; | |
#endif | |
Q_SIGNALS: | |
void textChanged(); | |
void selectionChanged(); | |
void copyAvailable(bool); | |
void undoAvailable(bool yes); | |
void redoAvailable(bool yes); | |
void currentFontChanged(const QFont &f); | |
void currentColorChanged(const QColor &c); | |
void currentAlignmentChanged(int a); | |
void currentVerticalAlignmentChanged(Q3TextEdit::VerticalAlignment a); | |
void cursorPositionChanged(Q3TextCursor *c); | |
void cursorPositionChanged(int para, int pos); | |
void returnPressed(); | |
void modificationChanged(bool m); | |
void clicked(int parag, int index); | |
void doubleClicked(int parag, int index); | |
protected: | |
void repaintChanged(); | |
void updateStyles(); | |
void drawContents(QPainter *p, int cx, int cy, int cw, int ch); | |
bool event(QEvent *e); | |
void changeEvent(QEvent *); | |
void keyPressEvent(QKeyEvent *e); | |
void resizeEvent(QResizeEvent *e); | |
void viewportResizeEvent(QResizeEvent*); | |
void contentsMousePressEvent(QMouseEvent *e); | |
void contentsMouseMoveEvent(QMouseEvent *e); | |
void contentsMouseReleaseEvent(QMouseEvent *e); | |
void contentsMouseDoubleClickEvent(QMouseEvent *e); | |
#ifndef QT_NO_WHEELEVENT | |
void contentsWheelEvent(QWheelEvent *e); | |
#endif | |
void inputMethodEvent(QInputMethodEvent *); | |
#ifndef QT_NO_DRAGANDDROP | |
void contentsDragEnterEvent(QDragEnterEvent *e); | |
void contentsDragMoveEvent(QDragMoveEvent *e); | |
void contentsDragLeaveEvent(QDragLeaveEvent *e); | |
void contentsDropEvent(QDropEvent *e); | |
#endif | |
void contentsContextMenuEvent(QContextMenuEvent *e); | |
bool focusNextPrevChild(bool next); | |
Q3TextDocument *document() const; | |
Q3TextCursor *textCursor() const; | |
void setDocument(Q3TextDocument *doc); | |
virtual Q3PopupMenu *createPopupMenu(const QPoint& pos); | |
virtual Q3PopupMenu *createPopupMenu(); | |
void drawCursor(bool visible); | |
protected Q_SLOTS: | |
virtual void doChangeInterval(); | |
virtual void sliderReleased(); | |
private Q_SLOTS: | |
void formatMore(); | |
void doResize(); | |
void autoScrollTimerDone(); | |
void blinkCursor(); | |
void setModified(); | |
void startDrag(); | |
void documentWidthChanged(int w); | |
void clipboardChanged(); | |
private: | |
struct Q_COMPAT_EXPORT UndoRedoInfo { | |
enum Type { Invalid, Insert, Delete, Backspace, Return, RemoveSelected, Format, Style, IME }; | |
UndoRedoInfo(Q3TextDocument *dc); | |
~UndoRedoInfo(); | |
void clear(); | |
bool valid() const; | |
QUndoRedoInfoPrivate *d; | |
int id; | |
int index; | |
int eid; | |
int eindex; | |
Q3TextFormat *format; | |
int flags; | |
Type type; | |
Q3TextDocument *doc; | |
QByteArray styleInformation; | |
}; | |
private: | |
void updateCursor(const QPoint & pos); | |
void handleMouseMove(const QPoint& pos); | |
void drawContents(QPainter *); | |
virtual bool linksEnabled() const { return false; } | |
void init(); | |
void checkUndoRedoInfo(UndoRedoInfo::Type t); | |
void updateCurrentFormat(); | |
bool handleReadOnlyKeyEvent(QKeyEvent *e); | |
void makeParagVisible(Q3TextParagraph *p); | |
void normalCopy(); | |
void copyToClipboard(); | |
#ifndef QT_NO_MIME | |
QByteArray pickSpecial(QMimeSource* ms, bool always_ask, const QPoint&); | |
Q3TextDrag *dragObject(QWidget *parent = 0) const; | |
#endif | |
#ifndef QT_NO_MIMECLIPBOARD | |
void pasteSpecial(const QPoint&); | |
#endif | |
void setFontInternal(const QFont &f); | |
virtual void emitHighlighted(const QString &) {} | |
virtual void emitLinkClicked(const QString &) {} | |
void readFormats(Q3TextCursor &c1, Q3TextCursor &c2, Q3TextString &text, bool fillStyles = false); | |
void clearUndoRedo(); | |
void paintDocument(bool drawAll, QPainter *p, int cx = -1, int cy = -1, int cw = -1, int ch = -1); | |
void moveCursor(CursorAction action); | |
void ensureFormatted(Q3TextParagraph *p); | |
void placeCursor(const QPoint &pos, Q3TextCursor *c, bool link); | |
QVariant inputMethodQuery(Qt::InputMethodQuery query) const; | |
#ifdef QT_TEXTEDIT_OPTIMIZATION | |
bool checkOptimMode(); | |
QString optimText() const; | |
void optimSetText(const QString &str); | |
void optimAppend(const QString &str); | |
void optimInsert(const QString &str, int line, int index); | |
void optimDrawContents(QPainter * p, int cx, int cy, int cw, int ch); | |
void optimMousePressEvent(QMouseEvent * e); | |
void optimMouseReleaseEvent(QMouseEvent * e); | |
void optimMouseMoveEvent(QMouseEvent * e); | |
int optimCharIndex(const QString &str, int mx) const; | |
void optimSelectAll(); | |
void optimRemoveSelection(); | |
void optimSetSelection(int startLine, int startIdx, int endLine, | |
int endIdx); | |
bool optimHasSelection() const; | |
QString optimSelectedText() const; | |
bool optimFind(const QString & str, bool, bool, bool, int *, int *); | |
void optimParseTags(QString * str, int lineNo = -1, int indexOffset = 0); | |
Q3TextEditOptimPrivate::Tag * optimPreviousLeftTag(int line); | |
void optimSetTextFormat(Q3TextDocument *, Q3TextCursor *, Q3TextFormat * f, | |
int, int, Q3TextEditOptimPrivate::Tag * t); | |
Q3TextEditOptimPrivate::Tag * optimAppendTag(int index, const QString & tag); | |
Q3TextEditOptimPrivate::Tag * optimInsertTag(int line, int index, const QString & tag); | |
void optimCheckLimit(const QString& str); | |
bool optimHasBoldMetrics(int line); | |
private Q_SLOTS: | |
void optimDoAutoScroll(); | |
#endif // QT_TEXTEDIT_OPTIMIZATION | |
private: | |
#ifndef QT_NO_CLIPBOARD | |
void pasteSubType(const QByteArray &subtype, QMimeSource *m); | |
#endif | |
private: | |
Q_DISABLE_COPY(Q3TextEdit) | |
Q3TextDocument *doc; | |
Q3TextCursor *cursor; | |
QTimer *formatTimer, *scrollTimer, *changeIntervalTimer, *blinkTimer, *dragStartTimer; | |
Q3TextParagraph *lastFormatted; | |
int interval; | |
UndoRedoInfo undoRedoInfo; | |
Q3TextFormat *currentFormat; | |
int currentAlignment; | |
QPoint oldMousePos, mousePos; | |
QPoint dragStartPos; | |
QString onLink; | |
WordWrap wrapMode; | |
WrapPolicy wPolicy; | |
int wrapWidth; | |
QString pressedLink; | |
Q3TextEditPrivate *d; | |
bool inDoubleClick : 1; | |
bool mousePressed : 1; | |
bool cursorVisible : 1; | |
bool blinkCursorVisible : 1; | |
bool modified : 1; | |
bool mightStartDrag : 1; | |
bool inDnD : 1; | |
bool readonly : 1; | |
bool undoEnabled : 1; | |
bool overWrite : 1; | |
}; | |
Q_DECLARE_OPERATORS_FOR_FLAGS(Q3TextEdit::AutoFormatting) | |
inline Q3TextDocument *Q3TextEdit::document() const | |
{ | |
return doc; | |
} | |
inline Q3TextCursor *Q3TextEdit::textCursor() const | |
{ | |
return cursor; | |
} | |
inline void Q3TextEdit::setCurrentFont(const QFont &f) | |
{ | |
Q3TextEdit::setFontInternal(f); | |
} | |
#endif // QT_NO_TEXTEDIT | |
QT_END_NAMESPACE | |
QT_END_HEADER | |
#endif // Q3TEXTEDIT_H |