source: trunk/src/qt3support/text/q3textedit.h@ 846

Last change on this file since 846 was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 19.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the Qt3Support module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef Q3TEXTEDIT_H
43#define Q3TEXTEDIT_H
44
45#include <Qt3Support/q3scrollview.h>
46#include <Qt3Support/q3stylesheet.h>
47#include <Qt3Support/q3mimefactory.h>
48#include <QtCore/qmap.h>
49
50QT_BEGIN_HEADER
51
52QT_BEGIN_NAMESPACE
53
54QT_MODULE(Qt3SupportLight)
55
56#ifndef QT_NO_TEXTEDIT
57// uncomment below to enable optimization mode - also uncomment the
58// optimDoAutoScroll() private slot since moc ignores #ifdefs..
59#define QT_TEXTEDIT_OPTIMIZATION
60
61class QPainter;
62class Q3TextDocument;
63class Q3TextCursor;
64class QKeyEvent;
65class QResizeEvent;
66class QMouseEvent;
67class QTimer;
68class Q3TextString;
69class QTextCommand;
70class Q3TextParagraph;
71class Q3TextFormat;
72class QFont;
73class QColor;
74class Q3TextEdit;
75class QTextBrowser;
76class Q3TextString;
77struct QUndoRedoInfoPrivate;
78class Q3PopupMenu;
79class Q3TextEditPrivate;
80class Q3SyntaxHighlighter;
81class Q3TextDrag;
82
83#ifdef QT_TEXTEDIT_OPTIMIZATION
84class Q3TextEditOptimPrivate
85{
86public:
87 // Note: no left-tag has any value for leftTag or parent, and
88 // no right-tag has any formatting flags set.
89 enum TagType { Color = 0, Format = 1 };
90 struct Tag {
91 TagType type:2;
92 bool bold:1;
93 bool italic:1;
94 bool underline:1;
95 int line;
96 int index;
97 Tag * leftTag; // ptr to left-tag in a left-right tag pair
98 Tag * parent; // ptr to parent left-tag in a nested tag
99 Tag * prev;
100 Tag * next;
101 QString tag;
102 };
103 Q3TextEditOptimPrivate()
104 {
105 len = numLines = maxLineWidth = 0;
106 selStart.line = selStart.index = -1;
107 selEnd.line = selEnd.index = -1;
108 search.line = search.index = 0;
109 tags = lastTag = 0;
110 }
111 void clearTags()
112 {
113 Tag * itr = tags;
114 while (tags) {
115 itr = tags;
116 tags = tags->next;
117 delete itr;
118 }
119 tags = lastTag = 0;
120 tagIndex.clear();
121 }
122 ~Q3TextEditOptimPrivate()
123 {
124 clearTags();
125 }
126 int len;
127 int numLines;
128 int maxLineWidth;
129 struct Selection {
130 int line;
131 int index;
132 };
133 Selection selStart, selEnd, search;
134 Tag * tags, * lastTag;
135 QMap<int, QString> lines;
136 QMap<int, Tag *> tagIndex;
137};
138#endif
139
140class Q_COMPAT_EXPORT Q3TextEdit : public Q3ScrollView
141{
142 friend class Q3TextBrowser;
143 friend class Q3SyntaxHighlighter;
144
145 Q_OBJECT
146 Q_ENUMS(WordWrap WrapPolicy)
147 Q_FLAGS(AutoFormattingFlag)
148 Q_PROPERTY(Qt::TextFormat textFormat READ textFormat WRITE setTextFormat)
149 Q_PROPERTY(QString text READ text WRITE setText)
150 Q_PROPERTY(QBrush paper READ paper WRITE setPaper)
151 Q_PROPERTY(bool linkUnderline READ linkUnderline WRITE setLinkUnderline)
152 Q_PROPERTY(QString documentTitle READ documentTitle)
153 Q_PROPERTY(int length READ length)
154 Q_PROPERTY(WordWrap wordWrap READ wordWrap WRITE setWordWrap)
155 Q_PROPERTY(int wrapColumnOrWidth READ wrapColumnOrWidth WRITE setWrapColumnOrWidth)
156 Q_PROPERTY(WrapPolicy wrapPolicy READ wrapPolicy WRITE setWrapPolicy)
157 Q_PROPERTY(bool hasSelectedText READ hasSelectedText)
158 Q_PROPERTY(QString selectedText READ selectedText)
159 Q_PROPERTY(int undoDepth READ undoDepth WRITE setUndoDepth)
160 Q_PROPERTY(bool overwriteMode READ isOverwriteMode WRITE setOverwriteMode)
161 Q_PROPERTY(bool modified READ isModified WRITE setModified DESIGNABLE false)
162 Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
163 Q_PROPERTY(bool undoRedoEnabled READ isUndoRedoEnabled WRITE setUndoRedoEnabled)
164 Q_PROPERTY(int tabStopWidth READ tabStopWidth WRITE setTabStopWidth)
165 Q_PROPERTY(bool tabChangesFocus READ tabChangesFocus WRITE setTabChangesFocus)
166 Q_PROPERTY(AutoFormattingFlag autoFormatting READ autoFormatting WRITE setAutoFormatting)
167
168public:
169 enum WordWrap {
170 NoWrap,
171 WidgetWidth,
172 FixedPixelWidth,
173 FixedColumnWidth
174 };
175
176 enum WrapPolicy {
177 AtWordBoundary,
178 AtWhiteSpace = AtWordBoundary, // AtWhiteSpace is deprecated
179 Anywhere,
180 AtWordOrDocumentBoundary
181 };
182
183 enum AutoFormattingFlag {
184 AutoNone = 0,
185 AutoBulletList = 0x00000001,
186 AutoAll = 0xffffffff
187 };
188
189 Q_DECLARE_FLAGS(AutoFormatting, AutoFormattingFlag)
190
191 enum KeyboardAction {
192 ActionBackspace,
193 ActionDelete,
194 ActionReturn,
195 ActionKill,
196 ActionWordBackspace,
197 ActionWordDelete
198 };
199
200 enum CursorAction {
201 MoveBackward,
202 MoveForward,
203 MoveWordBackward,
204 MoveWordForward,
205 MoveUp,
206 MoveDown,
207 MoveLineStart,
208 MoveLineEnd,
209 MoveHome,
210 MoveEnd,
211 MovePgUp,
212 MovePgDown
213 };
214
215 enum VerticalAlignment {
216 AlignNormal,
217 AlignSuperScript,
218 AlignSubScript
219 };
220
221 enum TextInsertionFlags {
222 RedoIndentation = 0x0001,
223 CheckNewLines = 0x0002,
224 RemoveSelected = 0x0004
225 };
226
227 Q3TextEdit(const QString& text, const QString& context = QString(),
228 QWidget* parent=0, const char* name=0);
229 Q3TextEdit(QWidget* parent=0, const char* name=0);
230 virtual ~Q3TextEdit();
231
232 QString text() const;
233 QString text(int para) const;
234 Qt::TextFormat textFormat() const;
235 QString context() const;
236 QString documentTitle() const;
237
238 void getSelection(int *paraFrom, int *indexFrom,
239 int *paraTo, int *indexTo, int selNum = 0) const;
240 virtual bool find(const QString &expr, bool cs, bool wo, bool forward = true,
241 int *para = 0, int *index = 0);
242
243 int paragraphs() const;
244 int lines() const;
245 int linesOfParagraph(int para) const;
246 int lineOfChar(int para, int chr);
247 int length() const;
248 QRect paragraphRect(int para) const;
249 int paragraphAt(const QPoint &pos) const;
250 int charAt(const QPoint &pos, int *para) const;
251 int paragraphLength(int para) const;
252
253 Q3StyleSheet* styleSheet() const;
254#ifndef QT_NO_MIME
255 Q3MimeSourceFactory* mimeSourceFactory() const;
256#endif
257 QBrush paper() const;
258 bool linkUnderline() const;
259
260 int heightForWidth(int w) const;
261
262 bool hasSelectedText() const;
263 QString selectedText() const;
264 bool isUndoAvailable() const;
265 bool isRedoAvailable() const;
266
267 WordWrap wordWrap() const;
268 int wrapColumnOrWidth() const;
269 WrapPolicy wrapPolicy() const;
270
271 int tabStopWidth() const;
272
273 QString anchorAt(const QPoint& pos, Qt::AnchorAttribute a = Qt::AnchorHref);
274
275 QSize sizeHint() const;
276
277 bool isReadOnly() const { return readonly; }
278
279 void getCursorPosition(int *parag, int *index) const;
280
281 bool isModified() const;
282 bool italic() const;
283 bool bold() const;
284 bool underline() const;
285 QString family() const;
286 int pointSize() const;
287 QColor color() const;
288 QFont font() const;
289 QFont currentFont() const;
290 int alignment() const;
291 VerticalAlignment verticalAlignment() const;
292 int undoDepth() const;
293
294 // do not use, will go away
295 virtual bool getFormat(int para, int index, QFont *font, QColor *color, VerticalAlignment *verticalAlignment);
296 // do not use, will go away
297 virtual bool getParagraphFormat(int para, QFont *font, QColor *color,
298 VerticalAlignment *verticalAlignment, int *alignment,
299 Q3StyleSheetItem::DisplayMode *displayMode,
300 Q3StyleSheetItem::ListStyle *listStyle,
301 int *listDepth);
302
303
304 bool isOverwriteMode() const { return overWrite; }
305 QColor paragraphBackgroundColor(int para) const;
306
307 bool isUndoRedoEnabled() const;
308 bool eventFilter(QObject *o, QEvent *e);
309 bool tabChangesFocus() const;
310
311 void setAutoFormatting(AutoFormatting);
312 AutoFormatting autoFormatting() const;
313 Q3SyntaxHighlighter *syntaxHighlighter() const;
314
315public Q_SLOTS:
316#ifndef QT_NO_MIME
317 virtual void setMimeSourceFactory(Q3MimeSourceFactory* factory);
318#endif
319 virtual void setStyleSheet(Q3StyleSheet* styleSheet);
320 virtual void scrollToAnchor(const QString& name);
321 virtual void setPaper(const QBrush& pap);
322 virtual void setLinkUnderline(bool);
323
324 virtual void setWordWrap(Q3TextEdit::WordWrap mode);
325 virtual void setWrapColumnOrWidth(int);
326 virtual void setWrapPolicy(Q3TextEdit::WrapPolicy policy);
327
328 virtual void copy();
329 virtual void append(const QString& text);
330
331 void setText(const QString &txt) { setText(txt, QString()); }
332 virtual void setText(const QString &txt, const QString &context);
333 virtual void setTextFormat(Qt::TextFormat f);
334
335 virtual void selectAll(bool select = true);
336 virtual void setTabStopWidth(int ts);
337 virtual void zoomIn(int range);
338 virtual void zoomIn() { zoomIn(1); }
339 virtual void zoomOut(int range);
340 virtual void zoomOut() { zoomOut(1); }
341 virtual void zoomTo(int size);
342
343 virtual void sync();
344 virtual void setReadOnly(bool b);
345
346 virtual void undo();
347 virtual void redo();
348 virtual void cut();
349 virtual void paste();
350#ifndef QT_NO_CLIPBOARD
351 virtual void pasteSubType(const QByteArray &subtype);
352#endif
353 virtual void clear();
354 virtual void del();
355 virtual void indent();
356 virtual void setItalic(bool b);
357 virtual void setBold(bool b);
358 virtual void setUnderline(bool b);
359 virtual void setFamily(const QString &f);
360 virtual void setPointSize(int s);
361 virtual void setColor(const QColor &c);
362 virtual void setVerticalAlignment(Q3TextEdit::VerticalAlignment a);
363 virtual void setAlignment(int a);
364
365 // do not use, will go away
366 virtual void setParagType(Q3StyleSheetItem::DisplayMode dm, Q3StyleSheetItem::ListStyle listStyle);
367
368 virtual void setCursorPosition(int parag, int index);
369 virtual void setSelection(int parag_from, int index_from, int parag_to, int index_to, int selNum = 0);
370 virtual void setSelectionAttributes(int selNum, const QColor &back, bool invertText);
371 virtual void setModified(bool m);
372 virtual void resetFormat();
373 virtual void setUndoDepth(int d);
374 virtual void setFormat(Q3TextFormat *f, int flags);
375 virtual void ensureCursorVisible();
376 virtual void placeCursor(const QPoint &pos, Q3TextCursor *c = 0);
377 virtual void moveCursor(Q3TextEdit::CursorAction action, bool select);
378 virtual void doKeyboardAction(Q3TextEdit::KeyboardAction action);
379 virtual void removeSelectedText(int selNum = 0);
380 virtual void removeSelection(int selNum = 0);
381 virtual void setCurrentFont(const QFont &f);
382 virtual void setOverwriteMode(bool b) { overWrite = b; }
383
384 virtual void scrollToBottom();
385
386 virtual void insert(const QString &text, uint insertionFlags = CheckNewLines | RemoveSelected);
387
388 // obsolete
389 virtual void insert(const QString &text, bool, bool = true, bool = true);
390
391 virtual void insertAt(const QString &text, int para, int index);
392 virtual void removeParagraph(int para);
393 virtual void insertParagraph(const QString &text, int para);
394
395 virtual void setParagraphBackgroundColor(int para, const QColor &bg);
396 virtual void clearParagraphBackground(int para);
397
398 virtual void setUndoRedoEnabled(bool b);
399 virtual void setTabChangesFocus(bool b);
400
401#ifdef QT_TEXTEDIT_OPTIMIZATION
402 void polishEvent(QEvent*);
403 void setMaxLogLines(int numLines);
404 int maxLogLines() const;
405#endif
406
407Q_SIGNALS:
408 void textChanged();
409 void selectionChanged();
410 void copyAvailable(bool);
411 void undoAvailable(bool yes);
412 void redoAvailable(bool yes);
413 void currentFontChanged(const QFont &f);
414 void currentColorChanged(const QColor &c);
415 void currentAlignmentChanged(int a);
416 void currentVerticalAlignmentChanged(Q3TextEdit::VerticalAlignment a);
417 void cursorPositionChanged(Q3TextCursor *c);
418 void cursorPositionChanged(int para, int pos);
419 void returnPressed();
420 void modificationChanged(bool m);
421 void clicked(int parag, int index);
422 void doubleClicked(int parag, int index);
423
424protected:
425 void repaintChanged();
426 void updateStyles();
427 void drawContents(QPainter *p, int cx, int cy, int cw, int ch);
428 bool event(QEvent *e);
429 void changeEvent(QEvent *);
430 void keyPressEvent(QKeyEvent *e);
431 void resizeEvent(QResizeEvent *e);
432 void viewportResizeEvent(QResizeEvent*);
433 void contentsMousePressEvent(QMouseEvent *e);
434 void contentsMouseMoveEvent(QMouseEvent *e);
435 void contentsMouseReleaseEvent(QMouseEvent *e);
436 void contentsMouseDoubleClickEvent(QMouseEvent *e);
437#ifndef QT_NO_WHEELEVENT
438 void contentsWheelEvent(QWheelEvent *e);
439#endif
440 void inputMethodEvent(QInputMethodEvent *);
441#ifndef QT_NO_DRAGANDDROP
442 void contentsDragEnterEvent(QDragEnterEvent *e);
443 void contentsDragMoveEvent(QDragMoveEvent *e);
444 void contentsDragLeaveEvent(QDragLeaveEvent *e);
445 void contentsDropEvent(QDropEvent *e);
446#endif
447 void contentsContextMenuEvent(QContextMenuEvent *e);
448 bool focusNextPrevChild(bool next);
449 Q3TextDocument *document() const;
450 Q3TextCursor *textCursor() const;
451 void setDocument(Q3TextDocument *doc);
452 virtual Q3PopupMenu *createPopupMenu(const QPoint& pos);
453 virtual Q3PopupMenu *createPopupMenu();
454 void drawCursor(bool visible);
455
456protected Q_SLOTS:
457 virtual void doChangeInterval();
458 virtual void sliderReleased();
459
460private Q_SLOTS:
461 void formatMore();
462 void doResize();
463 void autoScrollTimerDone();
464 void blinkCursor();
465 void setModified();
466 void startDrag();
467 void documentWidthChanged(int w);
468 void clipboardChanged();
469
470private:
471 struct Q_COMPAT_EXPORT UndoRedoInfo {
472 enum Type { Invalid, Insert, Delete, Backspace, Return, RemoveSelected, Format, Style, IME };
473
474 UndoRedoInfo(Q3TextDocument *dc);
475 ~UndoRedoInfo();
476 void clear();
477 bool valid() const;
478
479 QUndoRedoInfoPrivate *d;
480 int id;
481 int index;
482 int eid;
483 int eindex;
484 Q3TextFormat *format;
485 int flags;
486 Type type;
487 Q3TextDocument *doc;
488 QByteArray styleInformation;
489 };
490
491private:
492 void updateCursor(const QPoint & pos);
493 void handleMouseMove(const QPoint& pos);
494 void drawContents(QPainter *);
495 virtual bool linksEnabled() const { return false; }
496 void init();
497 void checkUndoRedoInfo(UndoRedoInfo::Type t);
498 void updateCurrentFormat();
499 bool handleReadOnlyKeyEvent(QKeyEvent *e);
500 void makeParagVisible(Q3TextParagraph *p);
501 void normalCopy();
502 void copyToClipboard();
503#ifndef QT_NO_MIME
504 QByteArray pickSpecial(QMimeSource* ms, bool always_ask, const QPoint&);
505 Q3TextDrag *dragObject(QWidget *parent = 0) const;
506#endif
507#ifndef QT_NO_MIMECLIPBOARD
508 void pasteSpecial(const QPoint&);
509#endif
510 void setFontInternal(const QFont &f);
511
512 virtual void emitHighlighted(const QString &) {}
513 virtual void emitLinkClicked(const QString &) {}
514
515 void readFormats(Q3TextCursor &c1, Q3TextCursor &c2, Q3TextString &text, bool fillStyles = false);
516 void clearUndoRedo();
517 void paintDocument(bool drawAll, QPainter *p, int cx = -1, int cy = -1, int cw = -1, int ch = -1);
518 void moveCursor(CursorAction action);
519 void ensureFormatted(Q3TextParagraph *p);
520 void placeCursor(const QPoint &pos, Q3TextCursor *c, bool link);
521 QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
522
523#ifdef QT_TEXTEDIT_OPTIMIZATION
524 bool checkOptimMode();
525 QString optimText() const;
526 void optimSetText(const QString &str);
527 void optimAppend(const QString &str);
528 void optimInsert(const QString &str, int line, int index);
529 void optimDrawContents(QPainter * p, int cx, int cy, int cw, int ch);
530 void optimMousePressEvent(QMouseEvent * e);
531 void optimMouseReleaseEvent(QMouseEvent * e);
532 void optimMouseMoveEvent(QMouseEvent * e);
533 int optimCharIndex(const QString &str, int mx) const;
534 void optimSelectAll();
535 void optimRemoveSelection();
536 void optimSetSelection(int startLine, int startIdx, int endLine,
537 int endIdx);
538 bool optimHasSelection() const;
539 QString optimSelectedText() const;
540 bool optimFind(const QString & str, bool, bool, bool, int *, int *);
541 void optimParseTags(QString * str, int lineNo = -1, int indexOffset = 0);
542 Q3TextEditOptimPrivate::Tag * optimPreviousLeftTag(int line);
543 void optimSetTextFormat(Q3TextDocument *, Q3TextCursor *, Q3TextFormat * f,
544 int, int, Q3TextEditOptimPrivate::Tag * t);
545 Q3TextEditOptimPrivate::Tag * optimAppendTag(int index, const QString & tag);
546 Q3TextEditOptimPrivate::Tag * optimInsertTag(int line, int index, const QString & tag);
547 void optimCheckLimit(const QString& str);
548 bool optimHasBoldMetrics(int line);
549
550private Q_SLOTS:
551 void optimDoAutoScroll();
552#endif // QT_TEXTEDIT_OPTIMIZATION
553
554private:
555#ifndef QT_NO_CLIPBOARD
556 void pasteSubType(const QByteArray &subtype, QMimeSource *m);
557#endif
558
559private:
560 Q_DISABLE_COPY(Q3TextEdit)
561
562 Q3TextDocument *doc;
563 Q3TextCursor *cursor;
564 QTimer *formatTimer, *scrollTimer, *changeIntervalTimer, *blinkTimer, *dragStartTimer;
565 Q3TextParagraph *lastFormatted;
566 int interval;
567 UndoRedoInfo undoRedoInfo;
568 Q3TextFormat *currentFormat;
569 int currentAlignment;
570 QPoint oldMousePos, mousePos;
571 QPoint dragStartPos;
572 QString onLink;
573 WordWrap wrapMode;
574 WrapPolicy wPolicy;
575 int wrapWidth;
576 QString pressedLink;
577 Q3TextEditPrivate *d;
578 bool inDoubleClick : 1;
579 bool mousePressed : 1;
580 bool cursorVisible : 1;
581 bool blinkCursorVisible : 1;
582 bool modified : 1;
583 bool mightStartDrag : 1;
584 bool inDnD : 1;
585 bool readonly : 1;
586 bool undoEnabled : 1;
587 bool overWrite : 1;
588};
589
590Q_DECLARE_OPERATORS_FOR_FLAGS(Q3TextEdit::AutoFormatting)
591
592inline Q3TextDocument *Q3TextEdit::document() const
593{
594 return doc;
595}
596
597inline Q3TextCursor *Q3TextEdit::textCursor() const
598{
599 return cursor;
600}
601
602inline void Q3TextEdit::setCurrentFont(const QFont &f)
603{
604 Q3TextEdit::setFontInternal(f);
605}
606
607#endif // QT_NO_TEXTEDIT
608
609QT_END_NAMESPACE
610
611QT_END_HEADER
612
613#endif // Q3TEXTEDIT_H
Note: See TracBrowser for help on using the repository browser.