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.5.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Mar 20 14:25:27 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003