1
/****************************************************************************
3
** Copyright (C) 1992-2005 Trolltech AS. All rights reserved.
5
** This file is part of the Qt 3 compatibility classes of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
32
#include "Qt3Support/q3scrollview.h"
33
#include "Qt3Support/q3stylesheet.h"
34
#include "Qt3Support/q3mimefactory.h"
35
#include "QtCore/qmap.h"
37
#ifndef QT_NO_TEXTEDIT
38
// uncomment below to enable optimization mode - also uncomment the
39
// optimDoAutoScroll() private slot since moc ignores #ifdefs..
40
#define QT_TEXTEDIT_OPTIMIZATION
51
class Q3TextParagraph;
58
struct QUndoRedoInfoPrivate;
60
class Q3TextEditPrivate;
61
class Q3SyntaxHighlighter;
64
#ifdef QT_TEXTEDIT_OPTIMIZATION
65
class Q3TextEditOptimPrivate
68
// Note: no left-tag has any value for leftTag or parent, and
69
// no right-tag has any formatting flags set.
70
enum TagType { Color = 0, Format = 1 };
78
Tag * leftTag; // ptr to left-tag in a left-right tag pair
79
Tag * parent; // ptr to parent left-tag in a nested tag
84
Q3TextEditOptimPrivate()
86
len = numLines = maxLineWidth = 0;
87
selStart.line = selStart.index = -1;
88
selEnd.line = selEnd.index = -1;
89
search.line = search.index = 0;
103
~Q3TextEditOptimPrivate()
114
Selection selStart, selEnd, search;
115
Tag * tags, * lastTag;
116
QMap<int, QString> lines;
117
QMap<int, Tag *> tagIndex;
121
class Q_COMPAT_EXPORT Q3TextEdit : public Q3ScrollView
123
friend class Q3TextBrowser;
124
friend class Q3SyntaxHighlighter;
127
Q_ENUMS(WordWrap WrapPolicy)
128
Q_FLAGS(AutoFormattingFlag)
129
Q_PROPERTY(Qt::TextFormat textFormat READ textFormat WRITE setTextFormat)
130
Q_PROPERTY(QString text READ text WRITE setText)
131
Q_PROPERTY(QBrush paper READ paper WRITE setPaper)
132
Q_PROPERTY(bool linkUnderline READ linkUnderline WRITE setLinkUnderline)
133
Q_PROPERTY(QString documentTitle READ documentTitle)
134
Q_PROPERTY(int length READ length)
135
Q_PROPERTY(WordWrap wordWrap READ wordWrap WRITE setWordWrap)
136
Q_PROPERTY(int wrapColumnOrWidth READ wrapColumnOrWidth WRITE setWrapColumnOrWidth)
137
Q_PROPERTY(WrapPolicy wrapPolicy READ wrapPolicy WRITE setWrapPolicy)
138
Q_PROPERTY(bool hasSelectedText READ hasSelectedText)
139
Q_PROPERTY(QString selectedText READ selectedText)
140
Q_PROPERTY(int undoDepth READ undoDepth WRITE setUndoDepth)
141
Q_PROPERTY(bool overwriteMode READ isOverwriteMode WRITE setOverwriteMode)
142
Q_PROPERTY(bool modified READ isModified WRITE setModified DESIGNABLE false)
143
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
144
Q_PROPERTY(bool undoRedoEnabled READ isUndoRedoEnabled WRITE setUndoRedoEnabled)
145
Q_PROPERTY(int tabStopWidth READ tabStopWidth WRITE setTabStopWidth)
146
Q_PROPERTY(bool tabChangesFocus READ tabChangesFocus WRITE setTabChangesFocus)
147
Q_PROPERTY(AutoFormattingFlag autoFormatting READ autoFormatting WRITE setAutoFormatting)
159
AtWhiteSpace = AtWordBoundary, // AtWhiteSpace is deprecated
161
AtWordOrDocumentBoundary
164
enum AutoFormattingFlag {
166
AutoBulletList = 0x00000001,
170
Q_DECLARE_FLAGS(AutoFormatting, AutoFormattingFlag)
172
enum KeyboardAction {
196
enum VerticalAlignment {
202
enum TextInsertionFlags {
203
RedoIndentation = 0x0001,
204
CheckNewLines = 0x0002,
205
RemoveSelected = 0x0004
208
Q3TextEdit(const QString& text, const QString& context = QString(),
209
QWidget* parent=0, const char* name=0);
210
Q3TextEdit(QWidget* parent=0, const char* name=0);
211
virtual ~Q3TextEdit();
213
QString text() const;
214
QString text(int para) const;
215
Qt::TextFormat textFormat() const;
216
QString context() const;
217
QString documentTitle() const;
219
void getSelection(int *paraFrom, int *indexFrom,
220
int *paraTo, int *indexTo, int selNum = 0) const;
221
virtual bool find(const QString &expr, bool cs, bool wo, bool forward = true,
222
int *para = 0, int *index = 0);
224
int paragraphs() const;
226
int linesOfParagraph(int para) const;
227
int lineOfChar(int para, int chr);
229
QRect paragraphRect(int para) const;
230
int paragraphAt(const QPoint &pos) const;
231
int charAt(const QPoint &pos, int *para) const;
232
int paragraphLength(int para) const;
234
Q3StyleSheet* styleSheet() const;
236
Q3MimeSourceFactory* mimeSourceFactory() const;
238
QBrush paper() const;
239
bool linkUnderline() const;
241
int heightForWidth(int w) const;
243
bool hasSelectedText() const;
244
QString selectedText() const;
245
bool isUndoAvailable() const;
246
bool isRedoAvailable() const;
248
WordWrap wordWrap() const;
249
int wrapColumnOrWidth() const;
250
WrapPolicy wrapPolicy() const;
252
int tabStopWidth() const;
254
QString anchorAt(const QPoint& pos, Qt::AnchorAttribute a = Qt::AnchorHref);
256
QSize sizeHint() const;
258
bool isReadOnly() const { return readonly; }
260
void getCursorPosition(int *parag, int *index) const;
262
bool isModified() const;
265
bool underline() const;
266
QString family() const;
267
int pointSize() const;
268
QColor color() const;
270
QFont currentFont() const;
271
int alignment() const;
272
VerticalAlignment verticalAlignment() const;
273
int undoDepth() const;
275
// do not use, will go away
276
virtual bool getFormat(int para, int index, QFont *font, QColor *color, VerticalAlignment *verticalAlignment);
277
// do not use, will go away
278
virtual bool getParagraphFormat(int para, QFont *font, QColor *color,
279
VerticalAlignment *verticalAlignment, int *alignment,
280
Q3StyleSheetItem::DisplayMode *displayMode,
281
Q3StyleSheetItem::ListStyle *listStyle,
285
bool isOverwriteMode() const { return overWrite; }
286
QColor paragraphBackgroundColor(int para) const;
288
bool isUndoRedoEnabled() const;
289
bool eventFilter(QObject *o, QEvent *e);
290
bool tabChangesFocus() const;
292
void setAutoFormatting(AutoFormatting);
293
AutoFormatting autoFormatting() const;
294
Q3SyntaxHighlighter *syntaxHighlighter() const;
298
virtual void setMimeSourceFactory(Q3MimeSourceFactory* factory);
300
virtual void setStyleSheet(Q3StyleSheet* styleSheet);
301
virtual void scrollToAnchor(const QString& name);
302
virtual void setPaper(const QBrush& pap);
303
virtual void setLinkUnderline(bool);
305
virtual void setWordWrap(WordWrap mode);
306
virtual void setWrapColumnOrWidth(int);
307
virtual void setWrapPolicy(WrapPolicy policy);
310
virtual void append(const QString& text);
312
void setText(const QString &txt) { setText(txt, QString()); }
313
virtual void setText(const QString &txt, const QString &context);
314
virtual void setTextFormat(Qt::TextFormat f);
316
virtual void selectAll(bool select = true);
317
virtual void setTabStopWidth(int ts);
318
virtual void zoomIn(int range);
319
virtual void zoomIn() { zoomIn(1); }
320
virtual void zoomOut(int range);
321
virtual void zoomOut() { zoomOut(1); }
322
virtual void zoomTo(int size);
325
virtual void setReadOnly(bool b);
330
virtual void paste();
331
#ifndef QT_NO_CLIPBOARD
332
virtual void pasteSubType(const QByteArray &subtype);
334
virtual void clear();
336
virtual void indent();
337
virtual void setItalic(bool b);
338
virtual void setBold(bool b);
339
virtual void setUnderline(bool b);
340
virtual void setFamily(const QString &f);
341
virtual void setPointSize(int s);
342
virtual void setColor(const QColor &c);
343
virtual void setVerticalAlignment(VerticalAlignment a);
344
virtual void setAlignment(int a);
346
// do not use, will go away
347
virtual void setParagType(Q3StyleSheetItem::DisplayMode dm, Q3StyleSheetItem::ListStyle listStyle);
349
virtual void setCursorPosition(int parag, int index);
350
virtual void setSelection(int parag_from, int index_from, int parag_to, int index_to, int selNum = 0);
351
virtual void setSelectionAttributes(int selNum, const QColor &back, bool invertText);
352
virtual void setModified(bool m);
353
virtual void resetFormat();
354
virtual void setUndoDepth(int d);
355
virtual void setFormat(Q3TextFormat *f, int flags);
356
virtual void ensureCursorVisible();
357
virtual void placeCursor(const QPoint &pos, Q3TextCursor *c = 0);
358
virtual void moveCursor(CursorAction action, bool select);
359
virtual void doKeyboardAction(KeyboardAction action);
360
virtual void removeSelectedText(int selNum = 0);
361
virtual void removeSelection(int selNum = 0);
362
virtual void setCurrentFont(const QFont &f);
363
virtual void setOverwriteMode(bool b) { overWrite = b; }
365
virtual void scrollToBottom();
367
virtual void insert(const QString &text, uint insertionFlags = CheckNewLines | RemoveSelected);
370
virtual void insert(const QString &text, bool, bool = true, bool = true);
372
virtual void insertAt(const QString &text, int para, int index);
373
virtual void removeParagraph(int para);
374
virtual void insertParagraph(const QString &text, int para);
376
virtual void setParagraphBackgroundColor(int para, const QColor &bg);
377
virtual void clearParagraphBackground(int para);
379
virtual void setUndoRedoEnabled(bool b);
380
virtual void setTabChangesFocus(bool b);
382
#ifdef QT_TEXTEDIT_OPTIMIZATION
383
void polishEvent(QEvent*);
384
void setMaxLogLines(int numLines);
385
int maxLogLines() const;
390
void selectionChanged();
391
void copyAvailable(bool);
392
void undoAvailable(bool yes);
393
void redoAvailable(bool yes);
394
void currentFontChanged(const QFont &f);
395
void currentColorChanged(const QColor &c);
396
void currentAlignmentChanged(int a);
397
void currentVerticalAlignmentChanged(VerticalAlignment a);
398
void cursorPositionChanged(Q3TextCursor *c);
399
void cursorPositionChanged(int para, int pos);
400
void returnPressed();
401
void modificationChanged(bool m);
402
void clicked(int parag, int index);
403
void doubleClicked(int parag, int index);
406
void repaintChanged();
408
void drawContents(QPainter *p, int cx, int cy, int cw, int ch);
409
bool event(QEvent *e);
410
void changeEvent(QEvent *);
411
void keyPressEvent(QKeyEvent *e);
412
void resizeEvent(QResizeEvent *e);
413
void viewportResizeEvent(QResizeEvent*);
414
void contentsMousePressEvent(QMouseEvent *e);
415
void contentsMouseMoveEvent(QMouseEvent *e);
416
void contentsMouseReleaseEvent(QMouseEvent *e);
417
void contentsMouseDoubleClickEvent(QMouseEvent *e);
418
#ifndef QT_NO_WHEELEVENT
419
void contentsWheelEvent(QWheelEvent *e);
421
void inputMethodEvent(QInputMethodEvent *);
422
#ifndef QT_NO_DRAGANDDROP
423
void contentsDragEnterEvent(QDragEnterEvent *e);
424
void contentsDragMoveEvent(QDragMoveEvent *e);
425
void contentsDragLeaveEvent(QDragLeaveEvent *e);
426
void contentsDropEvent(QDropEvent *e);
428
void contentsContextMenuEvent(QContextMenuEvent *e);
429
bool focusNextPrevChild(bool next);
430
Q3TextDocument *document() const;
431
Q3TextCursor *textCursor() const;
432
void setDocument(Q3TextDocument *doc);
433
virtual Q3PopupMenu *createPopupMenu(const QPoint& pos);
434
virtual Q3PopupMenu *createPopupMenu();
435
void drawCursor(bool visible);
438
virtual void doChangeInterval();
439
virtual void sliderReleased();
444
void autoScrollTimerDone();
448
void documentWidthChanged(int w);
449
void clipboardChanged();
452
struct Q_COMPAT_EXPORT UndoRedoInfo {
453
enum Type { Invalid, Insert, Delete, Backspace, Return, RemoveSelected, Format, Style };
455
UndoRedoInfo(Q3TextDocument *dc);
460
QUndoRedoInfoPrivate *d;
465
Q3TextFormat *format;
469
QByteArray styleInformation;
473
void updateCursor(const QPoint & pos);
474
void handleMouseMove(const QPoint& pos);
475
void drawContents(QPainter *);
476
virtual bool linksEnabled() const { return false; }
478
void checkUndoRedoInfo(UndoRedoInfo::Type t);
479
void updateCurrentFormat();
480
bool handleReadOnlyKeyEvent(QKeyEvent *e);
481
void makeParagVisible(Q3TextParagraph *p);
483
void copyToClipboard();
485
QByteArray pickSpecial(QMimeSource* ms, bool always_ask, const QPoint&);
486
Q3TextDrag *dragObject(QWidget *parent = 0) const;
488
#ifndef QT_NO_MIMECLIPBOARD
489
void pasteSpecial(const QPoint&);
491
void setFontInternal(const QFont &f);
493
virtual void emitHighlighted(const QString &) {}
494
virtual void emitLinkClicked(const QString &) {}
496
void readFormats(Q3TextCursor &c1, Q3TextCursor &c2, Q3TextString &text, bool fillStyles = false);
497
void clearUndoRedo();
498
void paintDocument(bool drawAll, QPainter *p, int cx = -1, int cy = -1, int cw = -1, int ch = -1);
499
void moveCursor(CursorAction action);
500
void ensureFormatted(Q3TextParagraph *p);
501
void placeCursor(const QPoint &pos, Q3TextCursor *c, bool link);
502
QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
504
#ifdef QT_TEXTEDIT_OPTIMIZATION
505
bool checkOptimMode();
506
QString optimText() const;
507
void optimSetText(const QString &str);
508
void optimAppend(const QString &str);
509
void optimInsert(const QString &str, int line, int index);
510
void optimDrawContents(QPainter * p, int cx, int cy, int cw, int ch);
511
void optimMousePressEvent(QMouseEvent * e);
512
void optimMouseReleaseEvent(QMouseEvent * e);
513
void optimMouseMoveEvent(QMouseEvent * e);
514
int optimCharIndex(const QString &str, int mx) const;
515
void optimSelectAll();
516
void optimRemoveSelection();
517
void optimSetSelection(int startLine, int startIdx, int endLine,
519
bool optimHasSelection() const;
520
QString optimSelectedText() const;
521
bool optimFind(const QString & str, bool, bool, bool, int *, int *);
522
void optimParseTags(QString * str, int lineNo = -1, int indexOffset = 0);
523
Q3TextEditOptimPrivate::Tag * optimPreviousLeftTag(int line);
524
void optimSetTextFormat(Q3TextDocument *, Q3TextCursor *, Q3TextFormat * f,
525
int, int, Q3TextEditOptimPrivate::Tag * t);
526
Q3TextEditOptimPrivate::Tag * optimAppendTag(int index, const QString & tag);
527
Q3TextEditOptimPrivate::Tag * optimInsertTag(int line, int index, const QString & tag);
528
void optimCheckLimit(const QString& str);
529
bool optimHasBoldMetrics(int line);
532
void optimDoAutoScroll();
533
#endif // QT_TEXTEDIT_OPTIMIZATION
536
#ifndef QT_NO_CLIPBOARD
537
void pasteSubType(const QByteArray &subtype, QMimeSource *m);
541
Q_DISABLE_COPY(Q3TextEdit)
544
Q3TextCursor *cursor;
545
QTimer *formatTimer, *scrollTimer, *changeIntervalTimer, *blinkTimer, *dragStartTimer;
546
Q3TextParagraph *lastFormatted;
548
UndoRedoInfo undoRedoInfo;
549
Q3TextFormat *currentFormat;
550
int currentAlignment;
551
QPoint oldMousePos, mousePos;
558
Q3TextEditPrivate *d;
559
bool inDoubleClick : 1;
560
bool mousePressed : 1;
561
bool cursorVisible : 1;
562
bool blinkCursorVisible : 1;
564
bool mightStartDrag : 1;
567
bool undoEnabled : 1;
571
Q_DECLARE_OPERATORS_FOR_FLAGS(Q3TextEdit::AutoFormatting)
573
inline Q3TextDocument *Q3TextEdit::document() const
578
inline Q3TextCursor *Q3TextEdit::textCursor() const
583
inline void Q3TextEdit::setCurrentFont(const QFont &f)
585
Q3TextEdit::setFontInternal(f);
588
#endif // QT_NO_TEXTEDIT
590
#endif // Q3TEXTEDIT_H