lib Library API Documentation

kotextformat.h

00001 #ifndef _KOTEXTFORMAT_H 00002 #define _KOTEXTFORMAT_H 00003 00004 // File included by korichtext.h 00005 00006 /* This file is part of the KDE project 00007 Copyright (C) 2001 David Faure <faure@kde.org> 00008 00009 This library is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU Library General Public 00011 License as published by the Free Software Foundation; either 00012 version 2 of the License, or (at your option) any later version. 00013 00014 This library is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 Library General Public License for more details. 00018 00019 You should have received a copy of the GNU Library General Public License 00020 along with this library; see the file COPYING.LIB. If not, write to 00021 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00022 Boston, MA 02111-1307, USA. 00023 */ 00024 00025 #undef S_NONE // Solaris defines it in sys/signal.h 00026 00027 #include <qcolor.h> 00028 #include <qfont.h> 00029 #include <qstring.h> 00030 #include <qdict.h> 00031 00032 class QFontMetrics; 00033 class KoCharStyle; 00034 class KoTextFormatCollection; 00035 class KoZoomHandler; 00036 class KoTextStringChar; 00037 class KoTextParag; 00038 00048 class KoTextFormat 00049 { 00050 friend class KoTextFormatCollection; // it sets 'collection' 00051 //friend class KoTextDocument; 00052 00053 // Having it here allows inline methods returning d->blah, for speed 00054 private: 00055 class KoTextFormatPrivate 00056 { 00057 public: 00058 KoTextFormatPrivate() : m_screenFont( 0L ), m_screenFontMetrics( 0L ), 00059 m_refFont( 0L ), m_refFontMetrics( 0L ), 00060 m_refAscent( -1 ), m_refDescent( -1 ), m_refHeight( -1 ) 00061 00062 { 00063 memset( m_screenWidths, 0, 256 * sizeof( ushort ) ); 00064 m_charStyle = 0L; 00065 } 00066 ~KoTextFormatPrivate() 00067 { 00068 clearCache(); 00069 } 00070 void clearCache(); 00071 // caching for speedup when formatting 00072 QFont* m_screenFont; // font to be used when painting (zoom-dependent) 00073 QFontMetrics* m_screenFontMetrics; // font metrics on screen (zoom-dependent) 00074 QFont* m_refFont; // font to be used when formatting text for layout units 00075 QFontMetrics* m_refFontMetrics; // font metrics for m_refFontMetrics 00076 int m_refAscent; 00077 int m_refDescent; 00078 int m_refHeight; 00079 int m_offsetFromBaseLine; 00080 ushort m_screenWidths[ 256 ]; 00081 // m_refWidths[ 256 ] would speed things up too, but ushort might not be enough for it 00082 double m_relativeTextSize; 00083 double m_underLineWidth; 00084 KoCharStyle *m_charStyle; 00085 00086 double m_shadowDistanceX; // 0 in both x and y means no shadow 00087 double m_shadowDistanceY; 00088 QColor m_shadowColor; 00089 bool m_bWordByWord; 00090 bool m_bHyphenation; 00091 }; 00092 00093 public: 00094 enum Flags { 00095 NoFlags, 00096 Bold = 1, 00097 Italic = 2, 00098 Underline = 4, 00099 Family = 8, 00100 Size = 16, 00101 Color = 32, 00102 Misspelled = 64, 00103 VAlign = 128, 00104 // 256 is free for use 00105 StrikeOut = 512, // style and type strikeout 00106 TextBackgroundColor = 1024, 00107 ExtendUnderLine = 2048, // color, style and type of underline 00108 Language = 4096, 00109 ShadowText = 8192, 00110 OffsetFromBaseLine = 16384, 00111 WordByWord = 32768, 00112 Attribute = 65536, // lower/upper/smallcaps 00113 Hyphenation = 131072, 00114 UnderLineWidth = 262144, 00115 00116 Font = Bold | Italic | Underline | Family | Size, 00117 // Format means "everything" 00118 Format = Font | Color | Misspelled | VAlign | StrikeOut | TextBackgroundColor | 00119 ExtendUnderLine | Language | ShadowText | OffsetFromBaseLine | 00120 WordByWord | Attribute | Hyphenation | UnderLineWidth 00121 }; 00122 00123 enum VerticalAlignment { AlignNormal, AlignSubScript, AlignSuperScript }; // QRT now has it in another order, but it's too late, we use this order in KWord's file format now ! 00124 enum UnderlineType { U_NONE = 0, U_SIMPLE = 1, U_DOUBLE = 2, U_SIMPLE_BOLD = 3, U_WAVE = 4}; 00125 enum StrikeOutType { S_NONE = 0, S_SIMPLE = 1, S_DOUBLE = 2, S_SIMPLE_BOLD = 3}; 00126 enum UnderlineStyle { U_SOLID = 0 , U_DASH = 1, U_DOT = 2, U_DASH_DOT = 3, U_DASH_DOT_DOT = 4}; 00127 enum StrikeOutStyle { S_SOLID = 0 , S_DASH = 1, S_DOT = 2, S_DASH_DOT = 3, S_DASH_DOT_DOT = 4}; 00128 00129 enum AttributeStyle { ATT_NONE = 0, ATT_UPPER = 1, ATT_LOWER = 2 , ATT_SMALL_CAPS}; 00130 00131 00132 KoTextFormat(); 00133 ~KoTextFormat(); 00134 00136 // (I think hyphenation and ulw are wrong here) 00137 KoTextFormat( const QFont &f, const QColor &c, const QString &_language, 00138 bool hyphenation, double ulw, KoTextFormatCollection *parent = 0 ); 00139 00141 KoTextFormat( const QFont &_font, 00142 VerticalAlignment _valign, 00143 const QColor & _color, 00144 const QColor & _backGroundColor, 00145 const QColor & _underlineColor, 00146 KoTextFormat::UnderlineType _underlineType, 00147 KoTextFormat::UnderlineStyle _underlineStyle, 00148 KoTextFormat::StrikeOutType _strikeOutType, 00149 KoTextFormat::StrikeOutStyle _strikeOutStyle, 00150 KoTextFormat::AttributeStyle _fontAttribute, 00151 const QString &_language, 00152 double _relativeTextSize, 00153 int _offsetFromBaseLine, 00154 bool _wordByWord, 00155 bool _hyphenation, 00156 double _shadowDistanceX, 00157 double _shadowDistanceY, 00158 const QColor& shadowColor ); 00159 00160 KoTextFormat( const KoTextFormat &fm ); 00161 //KoTextFormat makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr ) const; 00162 KoTextFormat& operator=( const KoTextFormat &fm ); 00163 void copyFormat( const KoTextFormat &fm, int flags ); 00164 QColor color() const; 00165 QFont font() const; 00166 int pointSize() const { return font().pointSize(); } 00167 bool isMisspelled() const; 00168 VerticalAlignment vAlign() const; 00169 //int minLeftBearing() const; 00170 //int minRightBearing() const; 00176 int width( const QChar &c ) const; 00177 int width( const QString &str, int pos ) const; 00178 int height() const; // in LU pixels 00179 int ascent() const; // in LU pixels 00180 int descent() const; // in LU pixels 00181 //bool useLinkColor() const; 00182 int offsetX() const; // in LU pixels 00183 int offsetY() const; // in LU pixels 00184 00185 void setBold( bool b ); 00186 void setItalic( bool b ); 00187 void setUnderline( bool b ); 00188 void setFamily( const QString &f ); 00189 void setPointSize( int s ); 00190 void setFont( const QFont &f ); 00191 void setColor( const QColor &c ); 00192 void setMisspelled( bool b ); 00193 void setVAlign( VerticalAlignment a ); 00194 00195 bool operator==( const KoTextFormat &f ) const; 00196 KoTextFormatCollection *parent() const; 00197 void setCollection( KoTextFormatCollection *parent ) { collection = parent; } 00198 QString key() const; 00199 00200 static QString getKey( const QFont &f, const QColor &c, bool misspelled, VerticalAlignment vAlign ); 00201 00202 void addRef(); 00203 void removeRef(); 00204 00206 int compare( const KoTextFormat & format ) const; 00207 00210 static QColor defaultTextColor( QPainter * painter ); 00211 00212 void setStrikeOutType (StrikeOutType _type); 00213 StrikeOutType strikeOutType()const {return m_strikeOutType;} 00214 00215 void setStrikeOutStyle( StrikeOutStyle _type ); 00216 StrikeOutStyle strikeOutStyle()const {return m_strikeOutStyle;} 00217 00218 00219 void setTextBackgroundColor(const QColor &); 00220 QColor textBackgroundColor()const {return m_textBackColor;} 00221 00222 void setTextUnderlineColor(const QColor &); 00223 QColor textUnderlineColor()const {return m_textUnderlineColor;} 00224 00225 void setUnderlineType (UnderlineType _type); 00226 UnderlineType underlineType()const {return m_underlineType;} 00227 00228 void setUnderlineStyle (UnderlineStyle _type); 00229 UnderlineStyle underlineStyle()const {return m_underlineStyle;} 00230 00231 void setLanguage( const QString & _lang); 00232 QString language() const { return m_language;} 00233 00234 void setHyphenation( bool b ); 00235 bool hyphenation() const { return d->m_bHyphenation; } 00236 00237 // This settings is a bit different - it's cached into the KoTextFormat, 00238 // but it's not directly settable by the user. 00239 void setUnderLineWidth( double ulw ); 00240 double underLineWidth() const { return d->m_underLineWidth; } 00241 00242 00243 void setAttributeFont( KoTextFormat::AttributeStyle _att ); 00244 KoTextFormat::AttributeStyle attributeFont() const { return m_attributeFont;} 00245 00246 00247 double shadowDistanceX() const { return d->m_shadowDistanceX; } 00248 double shadowDistanceY() const { return d->m_shadowDistanceY; } 00249 QColor shadowColor() const; 00251 int shadowX( KoZoomHandler *zh ) const; 00253 int shadowY( KoZoomHandler *zh ) const; 00254 void setShadow( double shadowDistanceX, double shadowDistanceY, const QColor& shadowColor ); 00256 QString shadowAsCss() const; 00257 static QString shadowAsCss( double shadowDistanceX, double shadowDistanceY, const QColor& shadowColor ); 00259 void parseShadowFromCss( const QString& css ); 00260 00261 double relativeTextSize() const { return d->m_relativeTextSize;} 00262 void setRelativeTextSize( double _size ); 00263 00264 //we store this offset into as point => int 00265 int offsetFromBaseLine() const { return d->m_offsetFromBaseLine;} 00266 void setOffsetFromBaseLine( int _offset ); 00267 00268 bool wordByWord() const { return d->m_bWordByWord;} 00269 void setWordByWord( bool _b ); 00270 00271 bool doubleUnderline() const { return (m_underlineType==U_DOUBLE ); } 00272 bool waveUnderline() const { return (m_underlineType==U_WAVE ); } 00273 bool underline() const { return (m_underlineType==U_SIMPLE ); } 00274 bool strikeOut() const { return (m_strikeOutType==S_SIMPLE ); } 00275 bool doubleStrikeOut() const { return (m_strikeOutType==S_DOUBLE ); } 00276 bool isStrikedOrUnderlined() const { return ((m_underlineType != U_NONE) ||(m_strikeOutType!=S_NONE));} 00277 00283 float refPointSize() const; 00284 00289 float screenPointSize( const KoZoomHandler* zh ) const; 00290 00296 const QFontMetrics& refFontMetrics() const; 00297 00303 const QFontMetrics& screenFontMetrics( const KoZoomHandler* zh ) const; 00304 00309 QFont refFont() const; 00310 00316 QFont screenFont( const KoZoomHandler* zh ) const; 00317 00318 QFont smallCapsFont( const KoZoomHandler* zh, bool applyZoom ) const; 00319 00325 int charWidth( const KoZoomHandler* zh, bool applyZoom, const KoTextStringChar* c, 00326 const KoTextParag* parag, int i ) const; 00327 00332 int charWidthLU( const KoTextStringChar* c, 00333 const KoTextParag* parag, int i ) const; 00334 00335 void applyCharStyle( KoCharStyle *_style ); 00336 KoCharStyle *style() const; 00337 static QString underlineStyleToString( UnderlineStyle _lineType ); 00338 static QString strikeOutStyleToString( StrikeOutStyle _lineType ); 00339 static UnderlineStyle stringToUnderlineStyle( const QString & _str ); 00340 static StrikeOutStyle stringToStrikeOutStyle( const QString & _str ); 00341 00342 static QString attributeFontToString( KoTextFormat::AttributeStyle _attr ); 00343 static AttributeStyle stringToAttributeFont( const QString & _str ); 00344 00345 QString displayedString( const QString& c )const; 00346 static QStringList underlineTypeList(); 00347 static QStringList strikeOutTypeList(); 00348 static QStringList fontAttributeList(); 00349 static QStringList underlineStyleList(); 00350 static QStringList strikeOutStyleList(); 00351 00352 #ifndef NDEBUG 00353 void printDebug(); 00354 #endif 00355 00356 protected: 00357 QChar displayedChar( QChar c )const; 00358 void generateKey(); 00359 00360 private: 00361 void update(); 00362 00363 QColor m_textBackColor; 00364 QColor m_textUnderlineColor; 00365 UnderlineType m_underlineType; 00366 StrikeOutType m_strikeOutType; 00367 UnderlineStyle m_underlineStyle; 00368 StrikeOutStyle m_strikeOutStyle; 00369 QString m_language; 00370 AttributeStyle m_attributeFont; 00371 class KoTextFormatPrivate; 00372 KoTextFormatPrivate *d; 00373 00374 QFont fn; 00375 QColor col; 00376 uint missp : 1; 00377 //uint linkColor : 1; 00378 VerticalAlignment va; 00379 KoTextFormatCollection *collection; 00380 int ref; 00381 QString k; 00382 }; 00383 00384 #if defined(Q_TEMPLATEDLL) 00385 // MOC_SKIP_BEGIN 00386 template class Q_EXPORT QDict<KoTextFormat>; 00387 // MOC_SKIP_END 00388 #endif 00389 00390 class Q_EXPORT KoTextFormatCollection 00391 { 00392 friend class KoTextDocument; 00393 friend class KoTextFormat; 00394 00395 public: 00396 KoTextFormatCollection(); 00397 KoTextFormatCollection( const QFont& defaultFont, const QColor& defaultColor, const QString & defaultLanguage, bool hyphen, double ulw ); 00398 virtual ~KoTextFormatCollection(); 00399 00400 void setDefaultFormat( KoTextFormat *f ); 00401 KoTextFormat *defaultFormat() const; 00402 virtual KoTextFormat *format( const KoTextFormat *f ); 00403 virtual KoTextFormat *format( const KoTextFormat *of, const KoTextFormat *nf, int flags ); 00404 virtual KoTextFormat *format( const QFont &f, const QColor &c , const QString &_language, bool hyphen, double ulw ); 00405 virtual void remove( KoTextFormat *f ); 00406 virtual KoTextFormat *createFormat( const KoTextFormat &f ) { return new KoTextFormat( f ); } 00407 virtual KoTextFormat *createFormat( const QFont &f, const QColor &c, const QString & _language, bool hyphen, double ulw) { return new KoTextFormat( f, c, _language, hyphen, ulw, this ); } 00408 void debug(); 00409 00410 //void setPainter( QPainter *p ); 00411 //QStyleSheet *styleSheet() const { return sheet; } 00412 //void setStyleSheet( QStyleSheet *s ) { sheet = s; } 00413 //void updateStyles(); 00414 //void updateFontSizes( int base ); 00415 //void updateFontAttributes( const QFont &f, const QFont &old ); 00416 00417 QDict<KoTextFormat> & dict() { return cKey; } 00418 00419 private: 00420 KoTextFormat *defFormat, *lastFormat, *cachedFormat; 00421 QDict<KoTextFormat> cKey; 00422 KoTextFormat *cres; 00423 QFont cfont; 00424 QColor ccol; 00425 QString kof, knf; 00426 int cflags; 00427 //QStyleSheet *sheet; 00428 }; 00429 00430 inline QColor KoTextFormat::color() const 00431 { 00432 return col; 00433 } 00434 00435 inline QFont KoTextFormat::font() const 00436 { 00437 return fn; 00438 } 00439 00440 inline bool KoTextFormat::isMisspelled() const 00441 { 00442 return missp; 00443 } 00444 00445 inline KoTextFormat::VerticalAlignment KoTextFormat::vAlign() const 00446 { 00447 return va; 00448 } 00449 00450 inline bool KoTextFormat::operator==( const KoTextFormat &f ) const 00451 { 00452 return k == f.k; 00453 } 00454 00455 inline KoTextFormatCollection *KoTextFormat::parent() const 00456 { 00457 return collection; 00458 } 00459 00460 inline QString KoTextFormat::key() const 00461 { 00462 return k; 00463 } 00464 00465 //inline bool KoTextFormat::useLinkColor() const 00466 //{ 00467 // return linkColor; 00468 //} 00469 00470 inline void KoTextFormatCollection::setDefaultFormat( KoTextFormat *f ) 00471 { 00472 defFormat = f; 00473 } 00474 00475 inline KoTextFormat *KoTextFormatCollection::defaultFormat() const 00476 { 00477 return defFormat; 00478 } 00479 00480 #endif
KDE Logo
This file is part of the documentation for lib Library Version 1.3.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Sep 24 18:22:27 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003