/**************************************************************************** ** ** ??? ** ** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. ** ** This file is part of the kernel module of the TQt GUI Toolkit. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free TQt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** Licensees holding valid TQt Commercial licenses may use this file in ** accordance with the TQt Commercial License Agreement provided with ** the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #ifndef TQTEXTLAYOUT_P_H #define TQTEXTLAYOUT_P_H #include "tqtglobaldefines.h" #ifndef TQT_H #include "tqstring.h" #include "tqnamespace.h" #include "tqrect.h" #endif // TQT_H #ifdef USE_QT4 #include "tqfont.h" #include #include #endif // USE_QT4 class TQTextEngine; class TQFont; // [FIXME] // Due to the absence of a font engine, we MUST inherit something from Qt4, as we therefore cannot directly implement the old QTextItem class! // [FIXME] #ifdef USE_QT4 #define BetweenCharacters CursorBetweenCharacters #define OnCharacters CursorOnCharacter class TQ_EXPORT TQTextItem : public QTextLine, virtual public TQt { public: TQTextItem() : QTextLine() {} bool isRightToLeft() const; bool isObject() const; bool isSpace() const; bool isTab() const; int from() const; int length() const; inline TQRect tqrect() const { return TQRect(rect().left(), rect().top(), rect().width(), rect().height()); } private: TQTextItem(int line, QTextEngine *e); QTextEngine* tqt_textEngine() const; TQString tqt_textString() const; void tqt_tqdrawTextItem( TQPainter* p, int x, int y, const TQTextItem &ti, int textFlags ) const; friend class TQTextLayout; friend class TQPainter; public: // Interoperability static const TQTextItem& convertFromQTextLine( QTextLine& qtl ); }; // Interoperability inline static const TQTextItem& convertFromQTextLine( const QTextLine& qtl ) { return (*static_cast(&qtl)); } #else // USE_QT4 class TQ_EXPORT TQTextItem { public: inline TQTextItem() : item(0), engine(0) {} inline bool isValid() const { return (bool)engine; } TQRect rect() const; int x() const; int y() const; int width() const; int ascent() const; int descent() const; enum Edge { Leading, Trailing }; enum CursorPosition { BetweenCharacters, OnCharacters }; /* cPos gets set to the valid position */ int cursorToX( int *cPos, Edge edge = Leading ) const; inline int cursorToX( int cPos, Edge edge = Leading ) const { return cursorToX( &cPos, edge ); } int xToCursor( int x, CursorPosition = BetweenCharacters ) const; bool isRightToLeft() const; bool isObject() const; bool isSpace() const; bool isTab() const; void setWidth( int w ); void setAscent( int a ); void setDescent( int d ); int from() const; int length() const; private: friend class TQTextLayout; friend class TQPainter; friend class TQPSPrinter; TQTextItem( int i, TQTextEngine *e ) : item( i ), engine( e ) {} int item; TQTextEngine *engine; }; #endif // USE_QT4 #ifdef USE_QT4 class TQ_EXPORT TQTextLayout : public QTextLayout, virtual public TQt { public: TQTextLayout() : QTextLayout() {} TQTextLayout( const QString& string, QPainter *p = 0 ) : QTextLayout(string, QFont(), p->device()) {} TQTextLayout( const TQString& string, const TQFont& fnt ) : QTextLayout(string, convertFromQFont(fnt)) {} enum LayoutMode { NoBidi, SingleLine, MultiLine }; enum LineBreakStrategy { AtWordBoundaries, AtCharBoundaries }; enum Result { Ok, LineFull, LineEmpty, Error }; Result addCurrentItem(); Result endLine( int x = 0, int y = 0, int tqalignment = TQt::AlignLeft, int *ascent = 0, int *descent = 0, int *left = 0, int *right = 0 ); int numItems() const { return lineCount(); } TQTextItem itemAt( int i ) const { return convertFromQTextLine(lineAt(i)); } TQTextItem findItem( int strPos ) const { return convertFromQTextLine(lineForTextPosition(strPos)); } bool atEnd() const; TQTextItem nextItem(); TQTextItem currentItem(); inline void setLineWidth( int newWidth ) { tqtl_lineWidth = newWidth; currentItem().setLineWidth(newWidth); } inline int lineWidth() { return tqtl_lineWidth; } int widthUsed(); int availableWidth() const; void beginLine( int width ); inline void beginLayout() { tqtl_currentItem = 0; return QTextLayout::beginLayout(); } inline void beginLayout( LayoutMode m ) { TQ_UNUSED(m); tqtl_currentItem = 0; return QTextLayout::beginLayout(); } inline void setText( const QString& string ) { QTextLayout::setText(string); } inline void setText( const TQString& string, const TQFont& fnt ) { QTextLayout::setText(string); QTextLayout::setFont(fnt); } void setDirection(TQChar::Direction); private: int tqtl_currentItem; int tqtl_widthUsed; int tqtl_lineWidth; }; #else // USE_QT4 class TQPainter; class TQ_EXPORT TQTextLayout { public: // does itemization TQTextLayout(); TQTextLayout( const TQString& string, TQPainter * = 0 ); TQTextLayout( const TQString& string, const TQFont& fnt ); ~TQTextLayout(); void setText( const TQString& string, const TQFont& fnt ); enum LineBreakStrategy { AtWordBoundaries, AtCharBoundaries }; /* add an additional item boundary eg. for style change */ void setBoundary( int strPos ); int numItems() const; TQTextItem itemAt( int i ) const; TQTextItem findItem( int strPos ) const; enum LayoutMode { NoBidi, SingleLine, MultiLine }; void beginLayout( LayoutMode m = MultiLine ); void beginLine( int width ); bool atEnd() const; TQTextItem nextItem(); TQTextItem currentItem(); /* ## maybe also currentItem() */ void setLineWidth( int newWidth ); int lineWidth() const; int widthUsed() const; int availableWidth() const; enum Result { Ok, LineFull, LineEmpty, Error }; /* returns true if completely added */ Result addCurrentItem(); /* Note: if ascent and descent are used they must be initialized to the minimum ascent/descent acceptable for the line. TQFontMetrics::ascent/descent() is usually the right choice */ Result endLine( int x = 0, int y = 0, int tqalignment = TQt::AlignLeft, int *ascent = 0, int *descent = 0, int *left = 0, int *right = 0 ); void endLayout(); enum CursorMode { SkipCharacters, SkipWords }; bool validCursorPosition( int pos ) const; int nextCursorPosition( int oldPos, CursorMode mode = SkipCharacters ) const; int previousCursorPosition( int oldPos, CursorMode mode = SkipCharacters ) const; void setDirection(TQChar::Direction); private: TQTextLayout( TQTextEngine *e ) : d( e ) {} /* disable copy and assignment */ TQTextLayout( const TQTextLayout & ) {} void operator = ( const TQTextLayout & ) {} friend class TQTextItem; friend class TQPainter; friend class TQPSPrinter; TQTextEngine *d; }; /* class TQPainter { ..... void tqdrawTextItem( int x, int y, TQTextItem *item ); }; */ #endif // USE_QT4 #endif