Diffstat (limited to 'noncore/apps/opie-write/qrichtext_p.h') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-write/qrichtext_p.h | 576 |
1 files changed, 223 insertions, 353 deletions
diff --git a/noncore/apps/opie-write/qrichtext_p.h b/noncore/apps/opie-write/qrichtext_p.h index 94ce913..e368edb 100644 --- a/noncore/apps/opie-write/qrichtext_p.h +++ b/noncore/apps/opie-write/qrichtext_p.h @@ -52,5 +52,4 @@ #ifndef QT_H -#include "qt3namespace.h" #include "qstring.h" #include "qlist.h" @@ -79,6 +78,4 @@ #endif // QT_H -//#define DEBUG_COLLECTION - namespace Qt3 { @@ -88,5 +85,5 @@ class QTextPreProcessor; class QTextFormat; class QTextCursor; -class QTextParag; +class QTextParagraph; class QTextFormatter; class QTextIndent; @@ -126,5 +123,4 @@ public: void setFormat( QTextFormat *f ); void setCustomItem( QTextCustomItem *i ); - QTextStringChar *clone() const; struct CustomData { @@ -153,10 +149,10 @@ private: } friend class QComplexText; - friend class QTextParag; + friend class QTextParagraph; }; #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QMemArray<QTextStringChar>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMemArray<QTextStringChar>; // MOC_SKIP_END #endif @@ -179,5 +175,6 @@ public: void insert( int index, const QString &s, QTextFormat *f ); - void insert( int index, QTextStringChar *c ); + void insert( int index, const QChar *unicode, int len, QTextFormat *f ); + void insert( int index, QTextStringChar *c, bool doAddRefFormat = FALSE ); void truncate( int index ); void remove( int index, int len ); @@ -196,5 +193,5 @@ public: void operator=( const QString &s ) { clear(); insert( 0, s, 0 ); } - void operator+=( const QString &s ); + void operator+=( const QString &s ) {insert( length(), s, 0 ); } void prepend( const QString &s ) { insert( 0, s, 0 ); } @@ -232,7 +229,7 @@ inline QChar::Direction QTextString::direction() const #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QValueStack<int>; -template class Q_EXPORT QValueStack<QTextParag*>; -template class Q_EXPORT QValueStack<bool>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QValueStack<int>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QValueStack<QTextParagraph*>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QValueStack<bool>; // MOC_SKIP_END #endif @@ -241,6 +238,5 @@ class Q_EXPORT QTextCursor { public: - QTextCursor( QTextDocument *d ); - QTextCursor(); + QTextCursor( QTextDocument *d = 0 ); QTextCursor( const QTextCursor &c ); QTextCursor &operator=( const QTextCursor &c ); @@ -250,11 +246,11 @@ public: bool operator!=( const QTextCursor &c ) const { return !(*this == c); } - QTextDocument *document() const { return doc; } - void setDocument( QTextDocument *d ); - - QTextParag *parag() const; + QTextParagraph *paragraph() const; + void setParagraph( QTextParagraph*p ) { gotoPosition(p, 0 ); } + QTextDocument *document() const; int index() const; - void setParag( QTextParag *s, bool restore = TRUE ); + void setIndex( int index ) { gotoPosition(paragraph(), index ); } + void gotoPosition( QTextParagraph* p, int index = 0); void gotoLeft(); void gotoRight(); @@ -275,7 +271,6 @@ public: void insert( const QString &s, bool checkNewLine, QMemArray<QTextStringChar> *formatting = 0 ); - void splitAndInsertEmptyParag( bool ind = TRUE, bool updateIds = TRUE ); + void splitAndInsertEmptyParagraph( bool ind = TRUE, bool updateIds = TRUE ); bool remove(); - void killLine(); void indent(); @@ -283,21 +278,20 @@ public: bool atParagEnd(); - void setIndex( int i, bool restore = TRUE ); - - void checkIndex(); + int x() const; // x in current paragraph + int y() const; // y in current paragraph - int offsetX() const { return ox; } - int offsetY() const { return oy; } + int globalX() const; + int globalY() const; - QTextParag *topParag() const { return parags.isEmpty() ? string : parags.first(); } - int totalOffsetX() const; - int totalOffsetY() const; + QTextParagraph *topParagraph() const { return paras.isEmpty() ? para : paras.first(); } + int offsetX() const { return ox; } // inner document offset + int offsetY() const { return oy; } // inner document offset + int totalOffsetX() const; // total document offset + int totalOffsetY() const; // total document offset - bool place( const QPoint &pos, QTextParag *s ) { return place( pos, s, FALSE ); } - bool place( const QPoint &pos, QTextParag *s, bool link ); + bool place( const QPoint &pos, QTextParagraph *s ) { return place( pos, s, FALSE ); } + bool place( const QPoint &pos, QTextParagraph *s, bool link ); void restoreState(); - int x() const; - int y() const; int nestedDepth() const { return (int)indices.count(); } //### size_t/int cast @@ -315,14 +309,11 @@ private: void gotoIntoNested( const QPoint &globalPos ); - QTextParag *string; - QTextDocument *doc; + QTextParagraph *para; int idx, tmpIndex; int ox, oy; QValueStack<int> indices; - QValueStack<QTextParag*> parags; + QValueStack<QTextParagraph*> paras; QValueStack<int> xOffsets; QValueStack<int> yOffsets; - QValueStack<bool> nestedStack; - uint nested : 1; uint valid : 1; @@ -334,5 +325,5 @@ class Q_EXPORT QTextCommand { public: - enum Commands { Invalid, Insert, Delete, Format, Alignment, ParagType }; + enum Commands { Invalid, Insert, Delete, Format, Style }; QTextCommand( QTextDocument *d ) : doc( d ), cursor( d ) {} @@ -352,5 +343,5 @@ protected: #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QPtrList<QTextCommand>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextCommand>; // MOC_SKIP_END #endif @@ -422,16 +413,16 @@ public: QRect geometry() const { return QRect( xpos, ypos, width, height ); } - virtual bool enter( QTextCursor *, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy, bool atEnd = FALSE ); - virtual bool enterAt( QTextCursor *, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy, const QPoint & ); - virtual bool next( QTextCursor *, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); - virtual bool prev( QTextCursor *, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); - virtual bool down( QTextCursor *, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); - virtual bool up( QTextCursor *, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); + virtual bool enter( QTextCursor *, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy, bool atEnd = FALSE ); + virtual bool enterAt( QTextCursor *, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy, const QPoint & ); + virtual bool next( QTextCursor *, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); + virtual bool prev( QTextCursor *, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); + virtual bool down( QTextCursor *, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); + virtual bool up( QTextCursor *, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); - void setParagraph( QTextParag *p ) { parag = p; } - QTextParag *paragrapth() const { return parag; } + void setParagraph( QTextParagraph *p ) { parag = p; } + QTextParagraph *paragraph() const { return parag; } QTextDocument *parent; - QTextParag *parag; + QTextParagraph *parag; virtual void pageBreak( int y, QTextFlow* flow ); @@ -440,5 +431,5 @@ public: #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QMap<QString, QString>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<QString, QString>; // MOC_SKIP_END #endif @@ -490,5 +481,5 @@ private: #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QPtrList<QTextCustomItem>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextCustomItem>; // MOC_SKIP_END #endif @@ -547,5 +538,4 @@ public: const QTextFormat& fmt, const QString& context, QMimeSourceFactory &factory, QStyleSheet *sheet, const QString& doc ); - QTextTableCell( QTextTable* table, int row, int column ); virtual ~QTextTableCell(); @@ -601,6 +591,6 @@ private: #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QPtrList<QTextTableCell>; -template class Q_EXPORT QMap<QTextCursor*, int>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextTableCell>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<QTextCursor*, int>; // MOC_SKIP_END #endif @@ -626,10 +616,10 @@ public: virtual void invalidate(); - virtual bool enter( QTextCursor *c, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy, bool atEnd = FALSE ); - virtual bool enterAt( QTextCursor *c, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy, const QPoint &pos ); - virtual bool next( QTextCursor *c, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); - virtual bool prev( QTextCursor *c, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); - virtual bool down( QTextCursor *c, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); - virtual bool up( QTextCursor *c, QTextDocument *&doc, QTextParag *¶g, int &idx, int &ox, int &oy ); + virtual bool enter( QTextCursor *c, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy, bool atEnd = FALSE ); + virtual bool enterAt( QTextCursor *c, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy, const QPoint &pos ); + virtual bool next( QTextCursor *c, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); + virtual bool prev( QTextCursor *c, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); + virtual bool down( QTextCursor *c, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); + virtual bool up( QTextCursor *c, QTextDocument *&doc, QTextParagraph *¶g, int &idx, int &ox, int &oy ); QString richText() const; @@ -667,5 +657,5 @@ private: class QTextTableCell; -class QTextParag; +class QTextParagraph; struct Q_EXPORT QTextDocumentSelection @@ -677,8 +667,8 @@ struct Q_EXPORT QTextDocumentSelection #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QMap<int, QColor>; -template class Q_EXPORT QMap<int, bool>; -template class Q_EXPORT QMap<int, QTextDocumentSelection>; -template class Q_EXPORT QPtrList<QTextDocument>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QColor>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, bool>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextDocumentSelection>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextDocument>; // MOC_SKIP_END #endif @@ -691,5 +681,5 @@ class Q_EXPORT QTextDocument : public QObject friend class QTextCursor; friend class QTextEdit; - friend class QTextParag; + friend class QTextParagraph; public: @@ -705,5 +695,5 @@ public: QTextDocument *parent() const { return par; } - QTextParag *parentParag() const { return parParag; } + QTextParagraph *parentParagraph() const { return parentPar; } void setText( const QString &text, const QString &context ); @@ -723,5 +713,5 @@ public: void setWidth( int w ); int minimumWidth() const; - bool setMinimumWidth( int needed, int used = -1, QTextParag *parag = 0 ); + bool setMinimumWidth( int needed, int used = -1, QTextParagraph *parag = 0 ); void setY( int y ); @@ -731,8 +721,8 @@ public: void setRightMargin( int rm ); - QTextParag *firstParag() const; - QTextParag *lastParag() const; - void setFirstParag( QTextParag *p ); - void setLastParag( QTextParag *p ); + QTextParagraph *firstParagraph() const; + QTextParagraph *lastParagraph() const; + void setFirstParagraph( QTextParagraph *p ); + void setLastParagraph( QTextParagraph *p ); void invalidate(); @@ -752,6 +742,6 @@ public: void setInvertSelectionText( int id, bool b ); bool hasSelection( int id, bool visible = FALSE ) const; - void setSelectionStart( int id, QTextCursor *cursor ); - bool setSelectionEnd( int id, QTextCursor *cursor ); + void setSelectionStart( int id, const QTextCursor &cursor ); + bool setSelectionEnd( int id, const QTextCursor &cursor ); void selectAll( int id ); bool removeSelection( int id ); @@ -761,15 +751,12 @@ public: void selectionEnd( int id, int ¶gId, int &index ); void setFormat( int id, QTextFormat *f, int flags ); - QTextParag *selectionStart( int id ); - QTextParag *selectionEnd( int id ); int numSelections() const { return nSelections; } void addSelection( int id ); - QString selectedText( int id, bool withCustom = TRUE ) const; - void copySelectedText( int id ); + QString selectedText( int id, bool asRichText = FALSE ) const; void removeSelectedText( int id, QTextCursor *cursor ); void indentSelection( int id ); - QTextParag *paragAt( int i ) const; + QTextParagraph *paragAt( int i ) const; void addCommand( QTextCommand *cmd ); @@ -780,5 +767,5 @@ public: QTextFormatCollection *formatCollection() const; - bool find( const QString &expr, bool cs, bool wo, bool forward, int *parag, int *index, QTextCursor *cursor ); + bool find( QTextCursor &cursor, const QString &expr, bool cs, bool wo, bool forward); void setTextFormat( Qt::TextFormat f ); @@ -792,11 +779,9 @@ public: void setStyleSheet( QStyleSheet *s ); - void updateStyles(); - void updateFontSizes( int base, bool usePixels ); - void updateFontAttributes( const QFont &f, const QFont &old ); + void setDefaultFormat( const QFont &font, const QColor &color ); void setMimeSourceFactory( QMimeSourceFactory *f ) { if ( f ) factory_ = f; } void setContext( const QString &c ) { if ( !c.isEmpty() ) contxt = c; } - void setUnderlineLinks( bool b ) { underlLinks = b; } + void setUnderlineLinks( bool b ); bool underlineLinks() const { return underlLinks; } @@ -806,15 +791,13 @@ public: void doLayout( QPainter *p, int w ); void draw( QPainter *p, const QRect& rect, const QColorGroup &cg, const QBrush *paper = 0 ); - void drawParag( QPainter *p, QTextParag *parag, int cx, int cy, int cw, int ch, + void drawParagraph( QPainter *p, QTextParagraph *parag, int cx, int cy, int cw, int ch, QPixmap *&doubleBuffer, const QColorGroup &cg, bool drawCursor, QTextCursor *cursor, bool resetChanged = TRUE ); - QTextParag *draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg, + QTextParagraph *draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg, bool onlyChanged = FALSE, bool drawCursor = FALSE, QTextCursor *cursor = 0, bool resetChanged = TRUE ); - void setDefaultFont( const QFont &f ); - - void registerCustomItem( QTextCustomItem *i, QTextParag *p ); - void unregisterCustomItem( QTextCustomItem *i, QTextParag *p ); + void registerCustomItem( QTextCustomItem *i, QTextParagraph *p ); + void unregisterCustomItem( QTextCustomItem *i, QTextParagraph *p ); void setFlow( QTextFlow *f ); @@ -832,6 +815,6 @@ public: void setPlainText( const QString &text ); void setRichText( const QString &text, const QString &context ); - QString richText( QTextParag *p = 0 ) const; - QString plainText( QTextParag *p = 0 ) const; + QString richText() const; + QString plainText() const; bool focusNextPrevChild( bool next ); @@ -851,5 +834,5 @@ public: void clear( bool createEmptyParag = FALSE ); - virtual QTextParag *createParag( QTextDocument *d, QTextParag *pr = 0, QTextParag *nx = 0, bool updateIds = TRUE ); + virtual QTextParagraph *createParagraph( QTextDocument *d, QTextParagraph *pr = 0, QTextParagraph *nx = 0, bool updateIds = TRUE ); void insertChild( QObject *o ) { QObject::insertChild( o ); } void removeChild( QObject *o ) { QObject::removeChild( o ); } @@ -858,7 +841,4 @@ public: QPtrList<QTextDocument> children() const { return childList; } - void setAddMargins( bool b ) { addMargs = b; } - int addMargins() const { return addMargs; } - bool hasFocusParagraph() const; QString focusHref() const; @@ -866,4 +846,7 @@ public: void invalidateOriginalText() { oTextValid = FALSE; oText = ""; } + static QString section( QString str, const QString &sep, int start, int end = 0xffffffff ); + static bool endsWith( QString str, const QString &s); + signals: void minimumWidthChanged( int ); @@ -876,5 +859,5 @@ private: bool hasPrefix(const QChar* doc, int length, int pos, const QString& s); QTextCustomItem* parseTable( const QMap<QString, QString> &attr, const QTextFormat &fmt, - const QChar* doc, int length, int& pos, QTextParag *curpar ); + const QChar* doc, int length, int& pos, QTextParagraph *curpar ); bool eatSpace(const QChar* doc, int length, int& pos, bool includeNbsp = FALSE ); bool eat(const QChar* doc, int length, int& pos, QChar c); @@ -884,9 +867,10 @@ private: QString parseWord(const QChar* doc, int length, int& pos, bool lower = TRUE); QChar parseChar(const QChar* doc, int length, int& pos, QStyleSheetItem::WhiteSpaceMode wsm ); - void setRichTextInternal( const QString &text ); + void setRichTextInternal( const QString &text, QTextCursor* cursor = 0 ); + void setRichTextMarginsInternal( QPtrList< QPtrVector<QStyleSheetItem> >& styles, QTextParagraph* stylesPar ); private: struct Q_EXPORT Focus { - QTextParag *parag; + QTextParagraph *parag; int start, len; QString href; @@ -894,5 +878,5 @@ private: int cx, cy, cw, vw; - QTextParag *fParag, *lParag; + QTextParagraph *fParag, *lParag; QTextPreProcessor *pProcessor; QMap<int, QColor> selectionColors; @@ -910,5 +894,4 @@ private: uint underlLinks : 1; uint nextDoubleBuffered : 1; - uint addMargs : 1; uint oTextValid : 1; uint mightHaveCustomItems : 1; @@ -917,7 +900,6 @@ private: QTextFlow *flow_; QTextDocument *par; - QTextParag *parParag; + QTextParagraph *parentPar; QTextTableCell *tc; - QTextCursor *tmpCursor; QBrush *backBrush; QPixmap *buf_pixmap; @@ -927,5 +909,5 @@ private: int leftmargin; int rightmargin; - QTextParag *minwParag, *curParag; + QTextParagraph *minwParag, *curParag; QStyleSheet* sheet_; QMimeSourceFactory* factory_; @@ -938,5 +920,7 @@ private: QPtrList<QTextDocument> childList; QColor linkColor; + double scaleFontsFactor; + short list_tm,list_bm, list_lm, li_tm, li_bm, par_tm, par_bm; }; @@ -948,8 +932,6 @@ class Q_EXPORT QTextDeleteCommand : public QTextCommand public: QTextDeleteCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str, - const QValueList< QPtrVector<QStyleSheetItem> > &os, - const QValueList<QStyleSheetItem::ListStyle> &ols, - const QMemArray<int> &oas ); - QTextDeleteCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str ); + const QByteArray& oldStyle ); + QTextDeleteCommand( QTextParagraph *p, int idx, const QMemArray<QTextStringChar> &str ); virtual ~QTextDeleteCommand(); @@ -960,9 +942,7 @@ public: protected: int id, index; - QTextParag *parag; + QTextParagraph *parag; QMemArray<QTextStringChar> text; - QValueList< QPtrVector<QStyleSheetItem> > oldStyles; - QValueList<QStyleSheetItem::ListStyle> oldListStyles; - QMemArray<int> oldAligns; + QByteArray styleInformation; }; @@ -972,9 +952,7 @@ class Q_EXPORT QTextInsertCommand : public QTextDeleteCommand public: QTextInsertCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str, - const QValueList< QPtrVector<QStyleSheetItem> > &os, - const QValueList<QStyleSheetItem::ListStyle> &ols, - const QMemArray<int> &oas ) - : QTextDeleteCommand( d, i, idx, str, os, ols, oas ) {} - QTextInsertCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str ) + const QByteArray& oldStyleInfo ) + : QTextDeleteCommand( d, i, idx, str, oldStyleInfo ) {} + QTextInsertCommand( QTextParagraph *p, int idx, const QMemArray<QTextStringChar> &str ) : QTextDeleteCommand( p, idx, str ) {} virtual ~QTextInsertCommand() {} @@ -1004,57 +982,38 @@ protected: }; -class Q_EXPORT QTextAlignmentCommand : public QTextCommand +class Q_EXPORT QTextStyleCommand : public QTextCommand { public: - QTextAlignmentCommand( QTextDocument *d, int fParag, int lParag, int na, const QMemArray<int> &oa ); - virtual ~QTextAlignmentCommand() {} + QTextStyleCommand( QTextDocument *d, int fParag, int lParag, const QByteArray& beforeChange ); + virtual ~QTextStyleCommand() {} - Commands type() const { return Alignment; } + Commands type() const { return Style; } QTextCursor *execute( QTextCursor *c ); QTextCursor *unexecute( QTextCursor *c ); -private: - int firstParag, lastParag; - int newAlign; - QMemArray<int> oldAligns; - -}; - -class Q_EXPORT QTextParagTypeCommand : public QTextCommand -{ -public: - QTextParagTypeCommand( QTextDocument *d, int fParag, int lParag, bool l, - QStyleSheetItem::ListStyle s, const QValueList< QPtrVector<QStyleSheetItem> > &os, - const QValueList<QStyleSheetItem::ListStyle> &ols ); - virtual ~QTextParagTypeCommand() {} - - Commands type() const { return ParagType; } - QTextCursor *execute( QTextCursor *c ); - QTextCursor *unexecute( QTextCursor *c ); + static QByteArray readStyleInformation( QTextDocument* d, int fParag, int lParag ); + static void writeStyleInformation( QTextDocument* d, int fParag, const QByteArray& style ); private: int firstParag, lastParag; - bool list; - QStyleSheetItem::ListStyle listStyle; - QValueList< QPtrVector<QStyleSheetItem> > oldStyles; - QValueList<QStyleSheetItem::ListStyle> oldListStyles; - + QByteArray before; + QByteArray after; }; // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -struct Q_EXPORT QTextParagSelection +struct Q_EXPORT QTextParagraphSelection { int start, end; }; -struct Q_EXPORT QTextParagLineStart +struct Q_EXPORT QTextLineStart { - QTextParagLineStart() : y( 0 ), baseLine( 0 ), h( 0 ) + QTextLineStart() : y( 0 ), baseLine( 0 ), h( 0 ) #ifndef QT_NO_COMPLEXTEXT , bidicontext( 0 ) #endif { } - QTextParagLineStart( ushort y_, ushort bl, ushort h_ ) : y( y_ ), baseLine( bl ), h( h_ ), + QTextLineStart( ushort y_, ushort bl, ushort h_ ) : y( y_ ), baseLine( bl ), h( h_ ), w( 0 ) #ifndef QT_NO_COMPLEXTEXT @@ -1063,9 +1022,9 @@ struct Q_EXPORT QTextParagLineStart { } #ifndef QT_NO_COMPLEXTEXT - QTextParagLineStart( QBidiContext *c, QBidiStatus s ) : y(0), baseLine(0), h(0), + QTextLineStart( QBidiContext *c, QBidiStatus s ) : y(0), baseLine(0), h(0), status( s ), bidicontext( c ) { if ( bidicontext ) bidicontext->ref(); } #endif - virtual ~QTextParagLineStart() + virtual ~QTextLineStart() { #ifndef QT_NO_COMPLEXTEXT @@ -1103,22 +1062,22 @@ private: #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QMap<int, QTextParagSelection>; -template class Q_EXPORT QMap<int, QTextParagLineStart*>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextParagraphSelection>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextLineStart*>; // MOC_SKIP_END #endif -class Q_EXPORT QTextParagData +class Q_EXPORT QTextParagraphData { public: - QTextParagData() {} - virtual ~QTextParagData(); - virtual void join( QTextParagData * ); + QTextParagraphData() {} + virtual ~QTextParagraphData(); + virtual void join( QTextParagraphData * ); }; -class Q_EXPORT QTextParagPseudoDocument +class Q_EXPORT QTextParagraphPseudoDocument { public: - QTextParagPseudoDocument(); - ~QTextParagPseudoDocument(); + QTextParagraphPseudoDocument(); + ~QTextParagraphPseudoDocument(); QRect docRect; QTextFormatter *pFormatter; @@ -1129,5 +1088,5 @@ public: //nase -class Q_EXPORT QTextParag +class Q_EXPORT QTextParagraph { friend class QTextDocument; @@ -1135,6 +1094,6 @@ class Q_EXPORT QTextParag public: - QTextParag( QTextDocument *d, QTextParag *pr = 0, QTextParag *nx = 0, bool updateIds = TRUE ); - virtual ~QTextParag(); + QTextParagraph( QTextDocument *d, QTextParagraph *pr = 0, QTextParagraph *nx = 0, bool updateIds = TRUE ); + virtual ~QTextParagraph(); QTextString *string() const; @@ -1143,19 +1102,19 @@ public: int length() const; // maybe remove later - void setListStyle( QStyleSheetItem::ListStyle ls ); - QStyleSheetItem::ListStyle listStyle() const; + void setListStyle( QStyleSheetItem::ListStyle ls ) { lstyle = ls; changed = TRUE; } + QStyleSheetItem::ListStyle listStyle() const { return lstyle; } + void setListItem( bool li ) { litem = li; changed = TRUE; } + bool isListItem() const { return litem; } void setListValue( int v ) { list_val = v; } - int listValue() const { return list_val; } + int listValue() const { return list_val > 0 ? list_val : -1; } - void setList( bool b, int listStyle ); - void incDepth(); - void decDepth(); - int listDepth() const; + void setListDepth( int depth ); + int listDepth() const { return ldepth; } - void setFormat( QTextFormat *fm ); - QTextFormat *paragFormat() const; +// void setFormat( QTextFormat *fm ); +// QTextFormat *paragFormat() const; QTextDocument *document() const; - QTextParagPseudoDocument *pseudoDocument() const; + QTextParagraphPseudoDocument *pseudoDocument() const; QRect rect() const; @@ -1165,14 +1124,15 @@ public: bool isVisible() const { return visible; } - QTextParag *prev() const; - QTextParag *next() const; - void setPrev( QTextParag *s ); - void setNext( QTextParag *s ); + QTextParagraph *prev() const; + QTextParagraph *next() const; + void setPrev( QTextParagraph *s ); + void setNext( QTextParagraph *s ); void insert( int index, const QString &s ); + void insert( int index, const QChar *unicode, int len ); void append( const QString &s, bool reallyAtEnd = FALSE ); void truncate( int index ); void remove( int index, int len ); - void join( QTextParag *s ); + void join( QTextParagraph *s ); void invalidate( int chr ); @@ -1213,8 +1173,8 @@ public: void indent( int *oldIndent = 0, int *newIndent = 0 ); - void setExtraData( QTextParagData *data ); - QTextParagData *extraData() const; + void setExtraData( QTextParagraphData *data ); + QTextParagraphData *extraData() const; - QMap<int, QTextParagLineStart*> &lineStartList(); + QMap<int, QTextLineStart*> &lineStartList(); void setFormat( int index, int len, QTextFormat *f, bool useCollection = TRUE, int flags = -1 ); @@ -1226,8 +1186,4 @@ public: int clipx = -1, int clipy = -1, int clipw = -1, int cliph = -1 ); - void setStyleSheetItems( const QPtrVector<QStyleSheetItem> &vec ); - QPtrVector<QStyleSheetItem> styleSheetItems() const; - QStyleSheetItem *style() const; - virtual int topMargin() const; virtual int bottomMargin() const; @@ -1237,5 +1193,4 @@ public: virtual int lineSpacing() const; - int numberOfSubParagraph() const; void registerFloatingItem( QTextCustomItem *i ); void unregisterFloatingItem( QTextCustomItem *i ); @@ -1271,5 +1226,5 @@ public: QTextCursor *redo( QTextCursor *c = 0 ); QTextCommandHistory *commands() const; - virtual void copyParagData( QTextParag *parag ); + virtual void copyParagData( QTextParagraph *parag ); void setBreakable( bool b ) { breakable = b; } @@ -1280,6 +1235,4 @@ public: void clearBackgroundColor(); - bool isLineBreak() const { return isBr; } - void setMovedDown( bool b ) { movedDown = b; } bool wasMovedDown() const { return movedDown; } @@ -1288,20 +1241,24 @@ public: QChar::Direction direction() const; + void readStyleInformation( QDataStream& stream ); + void writeStyleInformation( QDataStream& stream ) const; + protected: virtual void drawLabel( QPainter* p, int x, int y, int w, int h, int base, const QColorGroup& cg ); - virtual void drawParagString( QPainter &painter, const QString &str, int start, int len, int startX, - int lastY, int baseLine, int bw, int h, bool drawSelections, - QTextStringChar *formatChar, int i, const QMemArray<int> &selectionStarts, - const QMemArray<int> &selectionEnds, const QColorGroup &cg, bool rightToLeft ); + virtual void drawString( QPainter &painter, const QString &str, int start, int len, int xstart, + int y, int baseLine, int w, int h, int selection, + QTextStringChar *formatChar, const QColorGroup& cg, + bool rightToLeft ); private: - QMap<int, QTextParagSelection> &selections() const; - QPtrVector<QStyleSheetItem> &styleSheetItemsVec() const; + QMap<int, QTextParagraphSelection> &selections() const; QPtrList<QTextCustomItem> &floatingItems() const; + QBrush backgroundBrush( const QColorGroup&cg ) { if ( bgcol ) return *bgcol; return cg.brush( QColorGroup::Base ); } + void invalidateStyleCache(); - QMap<int, QTextParagLineStart*> lineStarts; + QMap<int, QTextLineStart*> lineStarts; int invalid; QRect r; - QTextParag *p, *n; + QTextParagraph *p, *n; void *docOrPseudo; uint changed : 1; @@ -1310,27 +1267,25 @@ private: uint needPreProcess : 1; uint fullWidth : 1; - uint newLinesAllowed : 1; uint lastInFrame : 1; uint visible : 1; uint breakable : 1; - uint isBr : 1; uint movedDown : 1; uint mightHaveCustomItems : 1; uint hasdoc : 1; + uint litem : 1; // whether the paragraph is a list item + uint rtext : 1; // whether the paragraph needs rich text margin int align : 4; int state, id; QTextString *str; - QMap<int, QTextParagSelection> *mSelections; - QPtrVector<QStyleSheetItem> *mStyleSheetItemsVec; + QMap<int, QTextParagraphSelection> *mSelections; QPtrList<QTextCustomItem> *mFloatingItems; - QStyleSheetItem::ListStyle listS; - int numSubParag; - int tm, bm, lm, rm, flm; - QTextFormat *defFormat; + QStyleSheetItem::ListStyle lstyle; + short utm, ubm, ulm, urm, uflm, ulinespacing; int *tArray; - int tabStopWidth; - QTextParagData *eData; - int list_val; + short tabStopWidth; + QTextParagraphData *eData; + short list_val; QColor *bgcol; + ushort ldepth; }; @@ -1344,8 +1299,8 @@ public: virtual ~QTextFormatter(); - virtual int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts ) = 0; - virtual int formatVertically( QTextDocument* doc, QTextParag* parag ); + virtual int format( QTextDocument *doc, QTextParagraph *parag, int start, const QMap<int, QTextLineStart*> &oldLineStarts ) = 0; + virtual int formatVertically( QTextDocument* doc, QTextParagraph* parag ); - bool isWrapEnabled( QTextParag *p ) const { if ( !wrapEnabled ) return FALSE; if ( p && !p->isBreakable() ) return FALSE; return TRUE;} + bool isWrapEnabled( QTextParagraph *p ) const { if ( !wrapEnabled ) return FALSE; if ( p && !p->isBreakable() ) return FALSE; return TRUE;} int wrapAtColumn() const { return wrapColumn;} virtual void setWrapEnabled( bool b ); @@ -1357,13 +1312,14 @@ public: int widthUsed() const { return thiswused; } + static bool isBreakable( QTextString *string, int pos ); + protected: - virtual QTextParagLineStart *formatLine( QTextParag *parag, QTextString *string, QTextParagLineStart *line, QTextStringChar *start, + virtual QTextLineStart *formatLine( QTextParagraph *parag, QTextString *string, QTextLineStart *line, QTextStringChar *start, QTextStringChar *last, int align = Qt3::AlignAuto, int space = 0 ); #ifndef QT_NO_COMPLEXTEXT - virtual QTextParagLineStart *bidiReorderLine( QTextParag *parag, QTextString *string, QTextParagLineStart *line, QTextStringChar *start, + virtual QTextLineStart *bidiReorderLine( QTextParagraph *parag, QTextString *string, QTextLineStart *line, QTextStringChar *start, QTextStringChar *last, int align, int space ); #endif - virtual bool isBreakable( QTextString *string, int pos ) const; - void insertLineStart( QTextParag *parag, int index, QTextParagLineStart *ls ); + void insertLineStart( QTextParagraph *parag, int index, QTextLineStart *ls ); int thisminw; @@ -1390,5 +1346,5 @@ public: virtual ~QTextFormatterBreakInWords() {} - int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts ); + int format( QTextDocument *doc, QTextParagraph *parag, int start, const QMap<int, QTextLineStart*> &oldLineStarts ); }; @@ -1402,5 +1358,5 @@ public: virtual ~QTextFormatterBreakWords() {} - int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts ); + int format( QTextDocument *doc, QTextParagraph *parag, int start, const QMap<int, QTextLineStart*> &oldLineStarts ); }; @@ -1414,5 +1370,5 @@ public: virtual ~QTextIndent() {} - virtual void indent( QTextDocument *doc, QTextParag *parag, int *oldIndent = 0, int *newIndent = 0 ) = 0; + virtual void indent( QTextDocument *doc, QTextParagraph *parag, int *oldIndent = 0, int *newIndent = 0 ) = 0; }; @@ -1430,5 +1386,5 @@ public: virtual ~QTextPreProcessor() {} - virtual void process( QTextDocument *doc, QTextParag *, int, bool = TRUE ) = 0; + virtual void process( QTextDocument *doc, QTextParagraph *, int, bool = TRUE ) = 0; virtual QTextFormat *format( int id ) = 0; @@ -1453,5 +1409,6 @@ public: Misspelled = 64, VAlign = 128, - Font = Bold | Italic | Underline | Family | Size, + StrikeOut= 256, + Font = Bold | Italic | Underline | Family | Size | StrikeOut, Format = Font | Color | Misspelled | VAlign }; @@ -1465,5 +1422,5 @@ public: QTextFormat( const QFont &f, const QColor &c, QTextFormatCollection *parent = 0 ); QTextFormat( const QTextFormat &fm ); - QTextFormat makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr ) const; + QTextFormat makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr, double scaleFontsFactor ) const; QTextFormat& operator=( const QTextFormat &fm ); QColor color() const; @@ -1484,4 +1441,5 @@ public: void setItalic( bool b ); void setUnderline( bool b ); + void setStrikeOut( bool b ); void setFamily( const QString &f ); void setPointSize( int s ); @@ -1500,15 +1458,10 @@ public: void removeRef(); - QString makeFormatChangeTags( QTextFormat *f, const QString& oldAnchorHref, const QString& anchorHref ) const; - QString makeFormatEndTags( const QString& anchorHref ) const; + QString makeFormatChangeTags( QTextFormat* defaultFormat, QTextFormat *f, const QString& oldAnchorHref, const QString& anchorHref ) const; + QString makeFormatEndTags( QTextFormat* defaultFormat, const QString& anchorHref ) const; static void setPainter( QPainter *p ); static QPainter* painter(); - void updateStyle(); - void updateStyleFlags(); - void setStyle( const QString &s ); - QString styleName() const { return style; } - int changed() const { return different; } bool fontSizesInPixels() { return usePixelSizes; } @@ -1536,6 +1489,4 @@ private: int stdSize; static QPainter *pntr; - QString style; - int different; }; @@ -1545,5 +1496,5 @@ private: #if defined(Q_TEMPLATEDLL) // MOC_SKIP_BEGIN -template class Q_EXPORT QDict<QTextFormat>; +Q_TEMPLATE_EXTERN template class Q_EXPORT QDict<QTextFormat>; // MOC_SKIP_END #endif @@ -1566,11 +1517,6 @@ public: virtual QTextFormat *createFormat( const QTextFormat &f ) { return new QTextFormat( f ); } virtual QTextFormat *createFormat( const QFont &f, const QColor &c ) { return new QTextFormat( f, c, this ); } - void debug(); - QStyleSheet *styleSheet() const { return sheet; } - void setStyleSheet( QStyleSheet *s ) { sheet = s; } - void updateStyles(); - void updateFontSizes( int base, bool usePixels ); - void updateFontAttributes( const QFont &f, const QFont &old ); + void updateDefaultFormat( const QFont &font, const QColor &c, QStyleSheet *sheet ); QDict<QTextFormat> dict() const { return cKey; } @@ -1586,6 +1532,4 @@ private: QString kof, knf; int cflags; - QStyleSheet *sheet; - }; @@ -1597,22 +1541,17 @@ inline int QTextString::length() const } -inline void QTextString::operator+=( const QString &s ) -{ - insert( length(), s, 0 ); -} - -inline int QTextParag::length() const +inline int QTextParagraph::length() const { return str->length(); } -inline QRect QTextParag::rect() const +inline QRect QTextParagraph::rect() const { return r; } -inline QTextParag *QTextCursor::parag() const +inline QTextParagraph *QTextCursor::paragraph() const { - return string; + return para; } @@ -1622,33 +1561,4 @@ inline int QTextCursor::index() const } -inline void QTextCursor::setIndex( int i, bool restore ) -{ - if ( restore ) - restoreState(); - if ( i < 0 || i >= string->length() ) { -#if defined(QT_CHECK_RANGE) - qWarning( "QTextCursor::setIndex: %d out of range", i ); -#endif - i = i < 0 ? 0 : string->length() - 1; - } - - tmpIndex = -1; - idx = i; -} - -inline void QTextCursor::setParag( QTextParag *s, bool restore ) -{ - if ( restore ) - restoreState(); - idx = 0; - string = s; - tmpIndex = -1; -} - -inline void QTextCursor::checkIndex() -{ - if ( idx >= string->length() ) - idx = string->length() - 1; -} // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1674,20 +1584,20 @@ inline int QTextDocument::visibleWidth() const } -inline QTextParag *QTextDocument::firstParag() const +inline QTextParagraph *QTextDocument::firstParagraph() const { return fParag; } -inline QTextParag *QTextDocument::lastParag() const +inline QTextParagraph *QTextDocument::lastParagraph() const { return lParag; } -inline void QTextDocument::setFirstParag( QTextParag *p ) +inline void QTextDocument::setFirstParagraph( QTextParagraph *p ) { fParag = p; } -inline void QTextDocument::setLastParag( QTextParag *p ) +inline void QTextDocument::setLastParagraph( QTextParagraph *p ) { lParag = p; @@ -1871,7 +1781,4 @@ inline void QTextFormat::addRef() { ref++; -#ifdef DEBUG_COLLECTION - qDebug( "add ref of '%s' to %d (%p)", k.latin1(), ref, this ); -#endif } @@ -1883,7 +1790,4 @@ inline void QTextFormat::removeRef() if ( this == collection->defFormat ) return; -#ifdef DEBUG_COLLECTION - qDebug( "remove ref of '%s' to %d (%p)", k.latin1(), ref, this ); -#endif if ( ref == 0 ) collection->remove( this ); @@ -1900,9 +1804,4 @@ inline bool QTextFormat::useLinkColor() const } -inline void QTextFormat::setStyle( const QString &s ) -{ - style = s; - updateStyleFlags(); -} // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1915,20 +1814,20 @@ inline QTextStringChar &QTextString::at( int i ) const // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -inline QTextStringChar *QTextParag::at( int i ) const +inline QTextStringChar *QTextParagraph::at( int i ) const { return &str->at( i ); } -inline bool QTextParag::isValid() const +inline bool QTextParagraph::isValid() const { return invalid == -1; } -inline bool QTextParag::hasChanged() const +inline bool QTextParagraph::hasChanged() const { return changed; } -inline void QTextParag::setBackgroundColor( const QColor & c ) +inline void QTextParagraph::setBackgroundColor( const QColor & c ) { delete bgcol; @@ -1937,10 +1836,10 @@ inline void QTextParag::setBackgroundColor( const QColor & c ) } -inline void QTextParag::clearBackgroundColor() +inline void QTextParagraph::clearBackgroundColor() { delete bgcol; bgcol = 0; setChanged( TRUE ); } -inline void QTextParag::append( const QString &s, bool reallyAtEnd ) +inline void QTextParagraph::append( const QString &s, bool reallyAtEnd ) { if ( reallyAtEnd ) @@ -1950,20 +1849,20 @@ inline void QTextParag::append( const QString &s, bool reallyAtEnd ) } -inline QTextParag *QTextParag::prev() const +inline QTextParagraph *QTextParagraph::prev() const { return p; } -inline QTextParag *QTextParag::next() const +inline QTextParagraph *QTextParagraph::next() const { return n; } -inline bool QTextParag::hasAnySelection() const +inline bool QTextParagraph::hasAnySelection() const { return mSelections ? !selections().isEmpty() : FALSE; } -inline void QTextParag::setEndState( int s ) +inline void QTextParagraph::setEndState( int s ) { if ( s == state ) @@ -1972,15 +1871,15 @@ inline void QTextParag::setEndState( int s ) } -inline int QTextParag::endState() const +inline int QTextParagraph::endState() const { return state; } -inline void QTextParag::setParagId( int i ) +inline void QTextParagraph::setParagId( int i ) { id = i; } -inline int QTextParag::paragId() const +inline int QTextParagraph::paragId() const { if ( id == -1 ) @@ -1989,25 +1888,25 @@ inline int QTextParag::paragId() const } -inline bool QTextParag::firstPreProcess() const +inline bool QTextParagraph::firstPreProcess() const { return firstPProcess; } -inline void QTextParag::setFirstPreProcess( bool b ) +inline void QTextParagraph::setFirstPreProcess( bool b ) { firstPProcess = b; } -inline QMap<int, QTextParagLineStart*> &QTextParag::lineStartList() +inline QMap<int, QTextLineStart*> &QTextParagraph::lineStartList() { return lineStarts; } -inline QTextString *QTextParag::string() const +inline QTextString *QTextParagraph::string() const { return str; } -inline QTextDocument *QTextParag::document() const +inline QTextDocument *QTextParagraph::document() const { if ( hasdoc ) @@ -2016,18 +1915,18 @@ inline QTextDocument *QTextParag::document() const } -inline QTextParagPseudoDocument *QTextParag::pseudoDocument() const +inline QTextParagraphPseudoDocument *QTextParagraph::pseudoDocument() const { if ( hasdoc ) return 0; - return (QTextParagPseudoDocument*) docOrPseudo; + return (QTextParagraphPseudoDocument*) docOrPseudo; } -inline QTextTableCell *QTextParag::tableCell() const +inline QTextTableCell *QTextParagraph::tableCell() const { return hasdoc ? document()->tableCell () : 0; } -inline QTextCommandHistory *QTextParag::commands() const +inline QTextCommandHistory *QTextParagraph::commands() const { return hasdoc ? document()->commands() : pseudoDocument()->commandHistory; @@ -2035,83 +1934,54 @@ inline QTextCommandHistory *QTextParag::commands() const -inline void QTextParag::setAlignment( int a ) -{ - if ( a == (int)align ) - return; - align = a; - invalidate( 0 ); -} - -inline void QTextParag::setListStyle( QStyleSheetItem::ListStyle ls ) -{ - listS = ls; - invalidate( 0 ); -} - -inline QStyleSheetItem::ListStyle QTextParag::listStyle() const -{ - return listS; -} - -inline QTextFormat *QTextParag::paragFormat() const +inline int QTextParagraph::alignment() const { - return defFormat; + return align; } -inline void QTextParag::registerFloatingItem( QTextCustomItem *i ) +inline void QTextParagraph::registerFloatingItem( QTextCustomItem *i ) { floatingItems().append( i ); } -inline void QTextParag::unregisterFloatingItem( QTextCustomItem *i ) +inline void QTextParagraph::unregisterFloatingItem( QTextCustomItem *i ) { floatingItems().removeRef( i ); } -inline QBrush *QTextParag::background() const +inline QBrush *QTextParagraph::background() const { return tableCell() ? tableCell()->backGround() : 0; } -inline int QTextParag::documentWidth() const +inline int QTextParagraph::documentWidth() const { return hasdoc ? document()->width() : pseudoDocument()->docRect.width(); } -inline int QTextParag::documentVisibleWidth() const +inline int QTextParagraph::documentVisibleWidth() const { return hasdoc ? document()->visibleWidth() : pseudoDocument()->docRect.width(); } -inline int QTextParag::documentX() const +inline int QTextParagraph::documentX() const { return hasdoc ? document()->x() : pseudoDocument()->docRect.x(); } -inline int QTextParag::documentY() const +inline int QTextParagraph::documentY() const { return hasdoc ? document()->y() : pseudoDocument()->docRect.y(); } -inline void QTextParag::setExtraData( QTextParagData *data ) +inline void QTextParagraph::setExtraData( QTextParagraphData *data ) { eData = data; } -inline QTextParagData *QTextParag::extraData() const +inline QTextParagraphData *QTextParagraph::extraData() const { return eData; } -inline void QTextParag::setNewLinesAllowed( bool b ) -{ - newLinesAllowed = b; -} - -inline bool QTextParag::isNewLinesAllowed() const -{ - return newLinesAllowed; -} - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |