1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 #ifndef _INFTXT_HXX 24 #define _INFTXT_HXX 25 #include <com/sun/star/linguistic2/XHyphenatedWord.hpp> 26 #include <com/sun/star/beans/PropertyValues.hpp> 27 28 #ifndef _TABLE_HXX //autogen 29 #include <tools/table.hxx> 30 #endif 31 32 #include "swtypes.hxx" 33 #include "txttypes.hxx" 34 #include "swrect.hxx" 35 #include "txtfly.hxx" 36 #include "swfont.hxx" 37 #include "porlay.hxx" 38 #include "txtfrm.hxx" 39 #include "ndtxt.hxx" 40 #include "txttypes.hxx" 41 #include <editeng/paravertalignitem.hxx> 42 43 class Font; 44 class OutputDevice; 45 class SvxBrushItem; 46 class SvxLineSpacingItem; 47 class SvxTabStop; 48 class SvxTabStopItem; 49 class SwAttrSet; 50 class SwFldPortion; 51 class SwFlyPortion; 52 class SwFmtDrop; 53 class SwLineLayout; 54 class SwLinePortion; 55 class SwParaPortion; 56 class SwTabPortion; 57 class SwTxtFrm; 58 class SwTxtSizeInfo; 59 class SwViewOption; 60 class ViewShell; 61 class SwTxtFtn; 62 class SwAttrIter; 63 struct SwMultiCreator; 64 class SwMultiPortion; 65 class SwWrongList; 66 67 /* Minimum: Prozentwert fuers kernen */ 68 #define MINKERNPERCENT 5 69 #define ARROW_WIDTH 200 70 #define DIR_LEFT2RIGHT 0 71 #define DIR_BOTTOM2TOP 1 72 #define DIR_RIGHT2LEFT 2 73 #define DIR_TOP2BOTTOM 3 74 75 #ifdef DBG_UTIL 76 #define OPTCALM( rInf ) (rInf).IsOptCalm() 77 #define OPTLOW( rInf ) (rInf).IsOptLow() 78 #define OPTDBG( rInf ) (rInf).IsOptDbg() 79 #else 80 #define OPTCALM( rInf ) sal_True 81 #define OPTLOW( rInf ) sal_False 82 #define OPTDBG( rInf ) sal_False 83 #endif 84 85 /************************************************************************* 86 * class SwLineInfo 87 *************************************************************************/ 88 89 // Beruecksichtigt das Attribut LineSpace bei der Hoehen/Ascentberechnung. 90 91 class SwLineInfo 92 { 93 friend class SwTxtIter; 94 95 SvxTabStopItem* pRuler; 96 const SvxLineSpacingItem *pSpace; 97 sal_uInt16 nVertAlign; 98 KSHORT nDefTabStop; 99 // --> OD 2008-02-04 #newlistlevelattrs# 100 bool bListTabStopIncluded; 101 long nListTabStopPosition; 102 // <-- 103 104 // --> OD 2008-01-17 #newlistlevelattrs# 105 void CtorInitLineInfo( const SwAttrSet& rAttrSet, 106 const SwTxtNode& rTxtNode ); 107 // <-- 108 109 // --> OD 2008-01-17 #newlistlevelattrs# 110 SwLineInfo(); 111 ~SwLineInfo(); 112 public: 113 // const SvxTabStop *GetTabStop( const SwTwips nLinePos, 114 // const SwTwips nLeft, 115 // #i24363# tab stops relative to indent - returns the tab stop following nSearchPos or NULL 116 const SvxTabStop *GetTabStop( const SwTwips nSearchPos, 117 const SwTwips nRight ) const; 118 inline const SvxLineSpacingItem *GetLineSpacing() const { return pSpace; } 119 inline KSHORT GetDefTabStop() const { return nDefTabStop; } 120 inline void SetDefTabStop( KSHORT nNew ) const 121 { ( (SwLineInfo*)this )->nDefTabStop = nNew; } 122 123 // vertical alignment 124 inline sal_uInt16 GetVertAlign() const { return nVertAlign; } 125 inline sal_Bool HasSpecialAlign( sal_Bool bVert ) const 126 { return bVert ? 127 ( SvxParaVertAlignItem::BASELINE != nVertAlign ) : 128 ( SvxParaVertAlignItem::BASELINE != nVertAlign && 129 SvxParaVertAlignItem::AUTOMATIC != nVertAlign ); } 130 131 sal_uInt16 NumberOfTabStops() const; 132 133 // --> OD 2008-02-04 #newlistlevelattrs# 134 inline bool IsListTabStopIncluded() const 135 { 136 return bListTabStopIncluded; 137 } 138 inline long GetListTabStopPosition() const 139 { 140 return nListTabStopPosition; 141 } 142 // <-- 143 144 145 // friend ostream &operator<<( ostream &rOS, const SwLineInfo &rInf ); 146 friend SvStream &operator<<( SvStream &rOS, const SwLineInfo &rInf ); 147 }; 148 149 /************************************************************************* 150 * class SwTxtInfo 151 *************************************************************************/ 152 153 class SwTxtInfo 154 { 155 // Implementation in txthyph.cxx 156 friend void SetParaPortion( SwTxtInfo *pInf, SwParaPortion *pRoot ); 157 SwParaPortion *pPara; 158 xub_StrLen nTxtStart; // TxtOfst bei Follows 159 160 protected: 161 inline SwTxtInfo() { } 162 public: 163 void CtorInitTxtInfo( SwTxtFrm *pFrm ); 164 SwTxtInfo( const SwTxtInfo &rInf ); 165 inline SwTxtInfo( SwTxtFrm *pFrm ) { CtorInitTxtInfo( pFrm ); } 166 inline SwParaPortion *GetParaPortion() { return pPara; } 167 inline const SwParaPortion *GetParaPortion() const { return pPara; } 168 inline xub_StrLen GetTxtStart() const { return nTxtStart; } 169 170 friend SvStream &operator<<( SvStream &rOS, const SwTxtInfo &rInf ); 171 }; 172 173 /************************************************************************* 174 * class SwTxtSizeInfo 175 *************************************************************************/ 176 177 DECLARE_TABLE( SwTxtPortionTable, sal_IntPtr ) 178 179 class SwTxtSizeInfo : public SwTxtInfo 180 { 181 protected: 182 // during formatting, a small database is built, mapping portion pointers 183 // to their maximum size (used for kana compression) 184 SwTxtPortionTable aMaxWidth; 185 // for each line, an array of compression values is calculated 186 // this array is passed over to the info structure 187 SvUShorts* pKanaComp; 188 189 ViewShell *pVsh; 190 191 // pOut is the output device, pRef is the device used for formatting 192 OutputDevice* pOut; 193 OutputDevice* pRef; 194 195 SwFont *pFnt; 196 SwUnderlineFont *pUnderFnt; // Font for underlining 197 SwTxtFrm *pFrm; 198 const SwViewOption *pOpt; 199 const XubString *pTxt; 200 xub_StrLen nIdx, nLen; 201 sal_uInt16 nKanaIdx; 202 sal_Bool bOnWin : 1; 203 sal_Bool bNotEOL : 1; 204 sal_Bool bURLNotify : 1; 205 sal_Bool bStopUnderFlow : 1;// Underflow gestoppt z.B. von einer FlyPortion 206 sal_Bool bFtnInside : 1; // the current line contains a footnote 207 sal_Bool bOtherThanFtnInside : 1; // the current line contains another portion than a footnote portion. 208 // needed for checking keep together of footnote portion with previous portion 209 sal_Bool bMulti : 1; // inside a multiportion 210 sal_Bool bFirstMulti : 1; // this flag is used for two purposes: 211 // - the multiportion is the first lineportion 212 // - indicates, if we are currently in second 213 // line of multi portion 214 sal_Bool bRuby : 1; // during the formatting of a phonetic line 215 sal_Bool bHanging : 1; // formatting of hanging punctuation allowed 216 sal_Bool bScriptSpace : 1; // space between different scripts (Asian/Latin) 217 sal_Bool bForbiddenChars : 1; // Forbidden start/endline characters 218 sal_Bool bSnapToGrid : 1; // paragraph snaps to grid 219 sal_uInt8 nDirection : 2; // writing direction: 0/90/180/270 degree 220 221 protected: 222 void CtorInitTxtSizeInfo( SwTxtFrm *pFrm, SwFont *pFnt = 0, 223 const xub_StrLen nIdx = 0, 224 const xub_StrLen nLen = STRING_LEN ); 225 SwTxtSizeInfo() {} 226 public: 227 SwTxtSizeInfo( const SwTxtSizeInfo &rInf ); 228 SwTxtSizeInfo( const SwTxtSizeInfo &rInf, const XubString &rTxt, 229 const xub_StrLen nIdx = 0, 230 const xub_StrLen nLen = STRING_LEN ); 231 232 inline SwTxtSizeInfo( SwTxtFrm *pTxtFrm, SwFont *pTxtFnt = 0, 233 const xub_StrLen nIndex = 0, 234 const xub_StrLen nLength = STRING_LEN ) 235 { CtorInitTxtSizeInfo( pTxtFrm, pTxtFnt, nIndex, nLength ); } 236 237 // GetMultiAttr returns the text attribute of the multiportion, 238 // if rPos is inside any multi-line part. 239 // rPos will set to the end of the multi-line part. 240 SwMultiCreator* GetMultiCreator( xub_StrLen &rPos, SwMultiPortion* pM ) const; 241 242 inline sal_Bool OnWin() const { return bOnWin; } 243 inline void SetOnWin( const sal_Bool bNew ) { bOnWin = bNew; } 244 inline sal_Bool NotEOL() const { return bNotEOL; } 245 inline void SetNotEOL( const sal_Bool bNew ) { bNotEOL = bNew; } 246 inline sal_Bool URLNotify() const { return bURLNotify; } 247 inline void SetURLNotify( const sal_Bool bNew ) { bURLNotify = bNew; } 248 inline sal_Bool StopUnderFlow() const { return bStopUnderFlow; } 249 inline void SetStopUnderFlow( const sal_Bool bNew ) { bStopUnderFlow = bNew; } 250 inline sal_Bool IsFtnInside() const { return bFtnInside; } 251 inline void SetFtnInside( const sal_Bool bNew ) { bFtnInside = bNew; } 252 inline sal_Bool IsOtherThanFtnInside() const { return bOtherThanFtnInside; } 253 inline void SetOtherThanFtnInside( const sal_Bool bNew ) { bOtherThanFtnInside = bNew; } 254 inline sal_Bool IsMulti() const { return bMulti; } 255 inline void SetMulti( const sal_Bool bNew ) { bMulti = bNew; } 256 inline sal_Bool IsFirstMulti() const { return bFirstMulti; } 257 inline void SetFirstMulti( const sal_Bool bNew ) { bFirstMulti = bNew; } 258 inline sal_Bool IsRuby() const { return bRuby; } 259 inline void SetRuby( const sal_Bool bNew ) { bRuby = bNew; } 260 inline sal_Bool IsHanging() const { return bHanging; } 261 inline void SetHanging( const sal_Bool bNew ) { bHanging = bNew; } 262 inline sal_Bool HasScriptSpace() const { return bScriptSpace; } 263 inline void SetScriptSpace( const sal_Bool bNew ) { bScriptSpace = bNew; } 264 inline sal_Bool HasForbiddenChars() const { return bForbiddenChars; } 265 inline void SetForbiddenChars( const sal_Bool bN ) { bForbiddenChars = bN; } 266 inline sal_Bool SnapToGrid() const { return bSnapToGrid; } 267 inline void SetSnapToGrid( const sal_Bool bN ) { bSnapToGrid = bN; } 268 inline sal_uInt8 GetDirection() const { return nDirection; } 269 inline void SetDirection( const sal_uInt8 nNew ) { nDirection = nNew; } 270 inline sal_Bool IsRotated() const { return 0 != ( 1 & nDirection ); } 271 272 inline ViewShell *GetVsh() { return pVsh; } 273 inline const ViewShell *GetVsh() const { return pVsh; } 274 275 inline OutputDevice *GetOut() { return pOut; } 276 inline const OutputDevice *GetOut() const { return pOut; } 277 inline void SetOut( OutputDevice* pNewOut ) { pOut = pNewOut; } 278 279 inline OutputDevice *GetRefDev() { return pRef; } 280 inline const OutputDevice *GetRefDev() const { return pRef; } 281 282 inline SwFont *GetFont() { return pFnt; } 283 inline const SwFont *GetFont() const { return pFnt; } 284 inline void SetFont( SwFont *pNew ) { pFnt = pNew; } 285 void SelectFont(); 286 inline void SetUnderFnt( SwUnderlineFont* pNew ) { pUnderFnt = pNew; } 287 inline SwUnderlineFont* GetUnderFnt() const { return pUnderFnt; } 288 289 inline const SwViewOption &GetOpt() const { return *pOpt; } 290 inline const XubString &GetTxt() const { return *pTxt; } 291 inline xub_Unicode GetChar( const xub_StrLen nPos ) const 292 { return pTxt->GetChar( nPos ); } 293 294 inline KSHORT GetTxtHeight() const; 295 296 // 297 // GetTxtSize 298 // 299 SwPosSize GetTxtSize( OutputDevice* pOut, const SwScriptInfo* pSI, 300 const XubString& rTxt, const xub_StrLen nIdx, 301 const xub_StrLen nLen, const sal_uInt16 nComp ) const; 302 SwPosSize GetTxtSize() const; 303 void GetTxtSize( const SwScriptInfo* pSI, const xub_StrLen nIdx, 304 const xub_StrLen nLen, const sal_uInt16 nComp, 305 sal_uInt16& nMinSize, sal_uInt16& nMaxSizeDiff ) const; 306 inline SwPosSize GetTxtSize( const SwScriptInfo* pSI, const xub_StrLen nIdx, 307 const xub_StrLen nLen, const sal_uInt16 nComp ) const; 308 inline SwPosSize GetTxtSize( const XubString &rTxt ) const; 309 310 // 311 // GetTxtBreak 312 // 313 xub_StrLen GetTxtBreak( const long nLineWidth, 314 const xub_StrLen nMaxLen, 315 const sal_uInt16 nComp ) const; 316 xub_StrLen GetTxtBreak( const long nLineWidth, 317 const xub_StrLen nMaxLen, 318 const sal_uInt16 nComp, 319 xub_StrLen& rExtraCharPos ) const; 320 321 inline KSHORT GetAscent() const; 322 323 inline xub_StrLen GetIdx() const { return nIdx; } 324 inline void SetIdx( const xub_StrLen nNew ) { nIdx = nNew; } 325 inline xub_StrLen GetLen() const { return nLen; } 326 inline void SetLen( const xub_StrLen nNew ) { nLen = nNew; } 327 inline void SetTxt( const XubString &rNew ){ pTxt = &rNew; } 328 329 friend SvStream &operator<<( SvStream &rOS, const SwTxtSizeInfo &rInf ); 330 331 // 7780: Keine Bullets beim Symbol-Zeichensatz! 332 inline sal_Bool IsNoSymbol() const 333 { return RTL_TEXTENCODING_SYMBOL != pFnt->GetCharSet( pFnt->GetActual() ); } 334 335 void NoteAnimation() const; 336 337 // Home is where Your heart is... 338 inline SwTxtFrm *GetTxtFrm() { return pFrm; } 339 inline const SwTxtFrm *GetTxtFrm() const { return pFrm; } 340 341 inline sal_Bool HasHint( xub_StrLen nPos ) const 342 { return _HasHint( pFrm->GetTxtNode(), nPos ); } 343 static sal_Bool _HasHint( const SwTxtNode* pTxtNode, xub_StrLen nPos ); 344 345 // If Kana Compression is enabled, a minimum and maximum portion width 346 // is calculated. We format lines with minimal size and share remaining 347 // space among compressed kanas. 348 // During formatting, the maximum values of compressable portions are 349 // stored in aMaxWidth and discarded after a line has been formatted. 350 inline void SetMaxWidthDiff( sal_uLong nKey, sal_uInt16 nVal ) 351 { 352 aMaxWidth.Insert( nKey, nVal ); 353 }; 354 inline sal_uInt16 GetMaxWidthDiff( sal_uLong nKey ) 355 { 356 return (sal_uInt16)aMaxWidth.Get( nKey ); 357 }; 358 inline void ResetMaxWidthDiff() 359 { 360 aMaxWidth.Clear(); 361 }; 362 inline sal_Bool CompressLine() 363 { 364 return (sal_Bool)aMaxWidth.Count(); 365 }; 366 367 // 368 // Feature: Kana Compression 369 // 370 inline MSHORT GetKanaIdx() const { return nKanaIdx; } 371 inline void ResetKanaIdx(){ nKanaIdx = 0; } 372 inline void SetKanaIdx( MSHORT nNew ) { nKanaIdx = nNew; } 373 inline void IncKanaIdx() { ++nKanaIdx; } 374 inline void SetKanaComp( SvUShorts *pNew ){ pKanaComp = pNew; } 375 inline SvUShorts* GetpKanaComp() const { return pKanaComp; } 376 inline sal_uInt16 GetKanaComp() const 377 { return ( pKanaComp && nKanaIdx < pKanaComp->Count() ) 378 ? (*pKanaComp)[nKanaIdx] : 0; } 379 380 #ifdef DBG_UTIL 381 sal_Bool IsOptCalm() const; 382 sal_Bool IsOptLow() const; 383 sal_Bool IsOptDbg() const; 384 sal_Bool IsOptTest1() const; 385 sal_Bool IsOptTest2() const; 386 sal_Bool IsOptTest3() const; 387 sal_Bool IsOptTest4() const; 388 sal_Bool IsOptTest5() const; 389 sal_Bool IsOptTest6() const; 390 sal_Bool IsOptTest7() const; 391 sal_Bool IsOptTest8() const; 392 #endif 393 }; 394 395 /************************************************************************* 396 * class SwTxtPaintInfo 397 *************************************************************************/ 398 399 class SwTxtPaintInfo : public SwTxtSizeInfo 400 { 401 const SwWrongList *pWrongList; 402 const SwWrongList *pGrammarCheckList; 403 const SwWrongList *pSmartTags; // SMARTTAGS 404 std::vector<long>* pSpaceAdd; 405 const SvxBrushItem *pBrushItem; // Fuer den Hintergrund 406 SwRect aItemRect; // ebenfalls fuer den Hintergrund 407 SwTxtFly aTxtFly; // FlyFrm-Berechnung 408 Point aPos; // Ausgabeposition 409 SwRect aPaintRect; // Original Ausgaberechteck (aus Layout-Paint) 410 411 MSHORT nSpaceIdx; 412 void _DrawText( const XubString &rText, const SwLinePortion &rPor, 413 const xub_StrLen nIdx, const xub_StrLen nLen, 414 const sal_Bool bKern, const sal_Bool bWrong = sal_False, 415 const sal_Bool bSmartTag = sal_False, 416 const sal_Bool bGrammarCheck = sal_False ); // SMARTTAGS 417 418 SwTxtPaintInfo &operator=(const SwTxtPaintInfo&); 419 void _NotifyURL( const SwLinePortion &rPor ) const; 420 void _DrawBackBrush( const SwLinePortion &rPor ) const; 421 422 protected: 423 #ifndef DBG_UTIL 424 SwTxtPaintInfo() { pFrm = 0; pWrongList = 0; pGrammarCheckList = 0; pWrongList = 0; pSmartTags = 0; pSpaceAdd = 0; pBrushItem = 0;} 425 #else 426 SwTxtPaintInfo() { pFrm = 0; pWrongList = 0; pGrammarCheckList = 0; pSmartTags = 0; pSpaceAdd = 0; 427 pBrushItem = ((SvxBrushItem*)-1);} 428 #endif 429 public: 430 SwTxtPaintInfo( const SwTxtPaintInfo &rInf ); 431 SwTxtPaintInfo( const SwTxtPaintInfo &rInf, const XubString &rTxt ); 432 433 void CtorInitTxtPaintInfo( SwTxtFrm *pFrame, const SwRect &rPaint ); 434 435 void SetBack( const SvxBrushItem *pItem, 436 const SwRect &rRect ) { pBrushItem = pItem; aItemRect = rRect;} 437 const SvxBrushItem *GetBrushItem() const { return pBrushItem; } 438 const SwRect &GetBrushRect() const { return aItemRect; } 439 440 inline SwTxtPaintInfo( SwTxtFrm *pFrame, const SwRect &rPaint ) 441 { CtorInitTxtPaintInfo( pFrame, rPaint ); } 442 443 inline SwTwips X() const { return aPos.X(); } 444 inline void X( const long nNew ) { aPos.X() = nNew; } 445 inline SwTwips Y() const { return aPos.Y(); } 446 inline void Y( const SwTwips nNew ) { aPos.Y() = nNew; } 447 448 inline SwTxtFly *GetTxtFly() { return &aTxtFly; } 449 inline const SwTxtFly *GetTxtFly() const { return &aTxtFly; } 450 inline void DrawText( const XubString &rText, const SwLinePortion &rPor, 451 const xub_StrLen nIdx = 0, 452 const xub_StrLen nLen = STRING_LEN, 453 const sal_Bool bKern = sal_False) const; 454 inline void DrawText( const SwLinePortion &rPor, const xub_StrLen nLen, 455 const sal_Bool bKern = sal_False ) const; 456 inline void DrawMarkedText( const SwLinePortion &rPor, const xub_StrLen nLen, 457 const sal_Bool bKern, 458 const sal_Bool bWrong, 459 const sal_Bool bSmartTags, 460 const sal_Bool bGrammarCheck ) const; 461 462 void DrawRect( const SwRect &rRect, sal_Bool bNoGraphic = sal_False, 463 sal_Bool bRetouche = sal_True ) const; 464 void DrawTab( const SwLinePortion &rPor ) const; 465 void DrawLineBreak( const SwLinePortion &rPor ) const; 466 void DrawRedArrow( const SwLinePortion &rPor ) const; 467 void DrawPostIts( const SwLinePortion &rPor, sal_Bool bScript ) const; 468 void DrawBackground( const SwLinePortion &rPor ) const; 469 void DrawViewOpt( const SwLinePortion &rPor, const MSHORT nWhich ) const; 470 inline void DrawBackBrush( const SwLinePortion &rPor ) const 471 { /* if( pFnt->GetBackColor() ) */ _DrawBackBrush( rPor ); } 472 473 void DrawCheckBox( const SwFieldFormPortion &rPor, bool checked) const; 474 475 inline void NotifyURL( const SwLinePortion &rPor ) const 476 { if( URLNotify() ) _NotifyURL( rPor ); } 477 478 void CalcRect( const SwLinePortion& rPor, SwRect* pRect, SwRect* pIntersect = 0 ) const; 479 480 inline SwTwips GetPaintOfst() const; 481 inline void SetPaintOfst( const SwTwips nNew ); 482 inline const Point &GetPos() const { return aPos; } 483 inline void SetPos( const Point &rNew ) { aPos = rNew; } 484 485 inline const SwRect &GetPaintRect() const { return aPaintRect; } 486 inline void SetPaintRect( const SwRect &rNew ) { aPaintRect = rNew; } 487 488 friend SvStream &operator<<( SvStream &rOS, const SwTxtPaintInfo &rInf ); 489 490 // 491 // STUFF FOR JUSTIFIED ALIGNMENT 492 // 493 inline MSHORT GetSpaceIdx() const { return nSpaceIdx; } 494 inline void ResetSpaceIdx(){nSpaceIdx = 0; } 495 inline void SetSpaceIdx( MSHORT nNew ) { nSpaceIdx = nNew; } 496 inline void IncSpaceIdx() { ++nSpaceIdx; } 497 inline void RemoveFirstSpaceAdd() { pSpaceAdd->erase( pSpaceAdd->begin() ); } 498 inline long GetSpaceAdd() const 499 { return ( pSpaceAdd && nSpaceIdx < pSpaceAdd->size() ) 500 ? (*pSpaceAdd)[nSpaceIdx] : 0; } 501 502 inline void SetpSpaceAdd( std::vector<long>* pNew ){ pSpaceAdd = pNew; } 503 inline std::vector<long>* GetpSpaceAdd() const { return pSpaceAdd; } 504 505 506 inline void SetWrongList( const SwWrongList *pNew ){ pWrongList = pNew; } 507 inline const SwWrongList* GetpWrongList() const { return pWrongList; } 508 509 inline void SetGrammarCheckList( const SwWrongList *pNew ){ pGrammarCheckList = pNew; } 510 inline const SwWrongList* GetGrammarCheckList() const { return pGrammarCheckList; } 511 512 // SMARTTAGS 513 inline void SetSmartTags( const SwWrongList *pNew ){ pSmartTags = pNew; } 514 inline const SwWrongList* GetSmartTags() const { return pSmartTags; } 515 }; 516 517 /************************************************************************* 518 * class SwTxtFormatInfo 519 *************************************************************************/ 520 521 class SwTxtFormatInfo : public SwTxtPaintInfo 522 { 523 // temporary arguments for hyphenation 524 com::sun::star::beans::PropertyValues aHyphVals; 525 526 SwLineLayout *pRoot; // die Root der aktuellen Zeile (pCurr) 527 SwLinePortion *pLast; // die letzte Portion 528 SwFlyPortion *pFly; // die nachfolgende FlyPortion 529 SwFldPortion *pLastFld; // umgebrochenes Feld 530 SwLinePortion *pUnderFlow; // Unterlaufsituation: letzte Portion 531 SwLinePortion *pRest; // Rest ist der Beginn der naechsten Zeile 532 533 SwTabPortion *pLastTab; // die _letzte_ TabPortion 534 535 xub_StrLen nSoftHyphPos; // SoftHyphPos fuer Hyphenate 536 xub_StrLen nHyphStart; // TxtPos, an der die interakt.Tr.z.Z. steht 537 xub_StrLen nHyphWrdStart; // gefundene Wort-Position 538 xub_StrLen nHyphWrdLen; // gefundene Wort-Laenge 539 xub_StrLen nLineStart; // aktueller Zeilenbeginn im rTxt 540 xub_StrLen nUnderScorePos; // enlarge repaint if underscore has been found 541 // --> FME 2004-11-25 #i34348# Changed type from sal_uInt16 to SwTwips 542 SwTwips nLeft; // linker Rand 543 SwTwips nRight; // rechter Rand 544 SwTwips nFirst; // EZE 545 // <-- 546 KSHORT nRealWidth; // "echte" Zeilenbreite 547 KSHORT nWidth; // "virtuelle" Zeilenbreite 548 KSHORT nLineHeight; // endgueltige Hoehe nach CalcLine 549 KSHORT nLineNettoHeight; // line height without spacing 550 KSHORT nForcedLeftMargin; // Verschiebung des linken Rands wg. Rahmen 551 552 sal_Int16 nMinLeading; // minimum number of chars before hyphenation point 553 sal_Int16 nMinTrailing; // minimum number of chars after hyphenation point 554 sal_Int16 nMinWordLength; // minimum length of word to be hyphenated 555 556 sal_Bool bFull : 1; // Zeile ist voll 557 sal_Bool bFtnDone : 1; // Ftn bereits formatiert 558 sal_Bool bErgoDone : 1; // ErgoDone bereits formatiert 559 sal_Bool bNumDone : 1; // bNumDone bereits formatiert 560 sal_Bool bArrowDone : 1; // Pfeil nach links bei gescrollten Absaetzen 561 sal_Bool bStop : 1; // Sofort abbrechen, Zeile verwerfen. 562 sal_Bool bNewLine : 1; // Noch eine weitere Zeile formatieren. 563 sal_Bool bShift : 1; // Positionsaend.: Repaint bis auf Weiteres 564 sal_Bool bUnderFlow : 1; // Kontext: UnderFlow() ? 565 sal_Bool bInterHyph: 1; // interaktive Trennung ? 566 sal_Bool bAutoHyph : 1; // automatische Trennung ? 567 sal_Bool bDropInit : 1; // DropWidth einstellen. 568 sal_Bool bQuick : 1; // FormatQuick() 569 sal_Bool bNoEndHyph : 1; // Trennung am Zeilenende abgeschaltet wg. MaxHyphens 570 sal_Bool bNoMidHyph : 1; // Trennung vor Flies abgeschaltet wg. MaxHyphens 571 sal_Bool bIgnoreFly: 1; // FitToContent ignoriert Flies 572 sal_Bool bFakeLineStart: 1; // String has been replaced by field portion 573 // info structure only pretends that we are at 574 // the beginning of a line 575 576 xub_Unicode cTabDecimal; // das _aktuelle_ Dezimalzeichen 577 xub_Unicode cHookChar; // fuer Tabs in Feldern etc. 578 sal_uInt8 nMaxHyph; // max. Zeilenanz. aufeinanderfolg. Trenn. 579 sal_Bool bTestFormat; // Testformatierung aus WouldFit, keine Benachrichtigungen etc. 580 581 // Hyphenating ... 582 sal_Bool InitHyph( const sal_Bool bAuto = sal_False ); 583 sal_Bool _CheckFtnPortion( SwLineLayout* pCurr ); 584 585 public: 586 void CtorInitTxtFormatInfo( SwTxtFrm *pFrm, const sal_Bool bInterHyph = sal_False, 587 const sal_Bool bQuick = sal_False, const sal_Bool bTst = sal_False ); 588 inline SwTxtFormatInfo(SwTxtFrm *pFrame,const sal_Bool bInterHyphL=sal_False, 589 const sal_Bool bQuickL = sal_False, const sal_Bool bTst = sal_False ) 590 { CtorInitTxtFormatInfo( pFrame, bInterHyphL, bQuickL, bTst ); } 591 592 // For the formatting inside a double line in a line (multi-line portion) 593 // we need a modified text-format-info: 594 SwTxtFormatInfo( const SwTxtFormatInfo& rInf, SwLineLayout& rLay, 595 SwTwips nActWidth ); 596 597 inline KSHORT Width() const { return nWidth; } 598 inline void Width( const KSHORT nNew ) { nWidth = nNew; } 599 void Init(); 600 601 // liefert die erste veraenderte Position im Absatz zurueck 602 inline xub_StrLen GetReformatStart() const; 603 604 // Raender 605 inline SwTwips Left() const { return nLeft; } 606 inline void Left( const SwTwips nNew ) { nLeft = nNew; } 607 inline SwTwips Right() const { return nRight; } 608 inline void Right( const SwTwips nNew ) { nRight = nNew; } 609 inline SwTwips First() const { return nFirst; } 610 inline void First( const SwTwips nNew ) { nFirst = nNew; } 611 inline KSHORT RealWidth() const { return nRealWidth; } 612 inline void RealWidth( const KSHORT nNew ) { nRealWidth = nNew; } 613 inline KSHORT ForcedLeftMargin() const { return nForcedLeftMargin; } 614 inline void ForcedLeftMargin( const KSHORT nN ) { nForcedLeftMargin = nN; } 615 616 inline sal_uInt8 &MaxHyph() { return nMaxHyph; } 617 inline const sal_uInt8 &MaxHyph() const { return nMaxHyph; } 618 619 inline SwLineLayout *GetRoot() { return pRoot; } 620 inline const SwLineLayout *GetRoot() const { return pRoot; } 621 622 inline void SetRoot( SwLineLayout *pNew ) { pRoot = pNew; } 623 inline SwLinePortion *GetLast() { return pLast; } 624 inline void SetLast( SwLinePortion *pNewLast ) { pLast = pNewLast; } 625 inline sal_Bool IsFull() const { return bFull; } 626 inline void SetFull( const sal_Bool bNew ) { bFull = bNew; } 627 inline sal_Bool IsHyphForbud() const 628 { return pFly ? bNoMidHyph : bNoEndHyph; } 629 inline void SetHyphForbud( const sal_Bool bNew ) 630 { if ( pFly ) bNoMidHyph = bNew; else bNoEndHyph = bNew; } 631 inline void ChkNoHyph( const sal_uInt8 bEnd, const sal_uInt8 bMid ) 632 { bNoEndHyph = (nMaxHyph && bEnd >= nMaxHyph); 633 bNoMidHyph = (nMaxHyph && bMid >= nMaxHyph); } 634 inline sal_Bool IsIgnoreFly() const { return bIgnoreFly; } 635 inline void SetIgnoreFly( const sal_Bool bNew ) { bIgnoreFly = bNew; } 636 inline sal_Bool IsFakeLineStart() const { return bFakeLineStart; } 637 inline void SetFakeLineStart( const sal_Bool bNew ) { bFakeLineStart = bNew; } 638 inline sal_Bool IsStop() const { return bStop; } 639 inline void SetStop( const sal_Bool bNew ) { bStop = bNew; } 640 inline SwLinePortion *GetRest() { return pRest; } 641 inline void SetRest( SwLinePortion *pNewRest ) { pRest = pNewRest; } 642 inline sal_Bool IsNewLine() const { return bNewLine; } 643 inline void SetNewLine( const sal_Bool bNew ) { bNewLine = bNew; } 644 inline sal_Bool IsShift() const { return bShift; } 645 inline void SetShift( const sal_Bool bNew ) { bShift = bNew; } 646 inline sal_Bool IsInterHyph() const { return bInterHyph; } 647 inline sal_Bool IsAutoHyph() const { return bAutoHyph; } 648 inline sal_Bool IsUnderFlow() const { return bUnderFlow; } 649 inline void ClrUnderFlow() { bUnderFlow = sal_False; } 650 inline sal_Bool IsDropInit() const { return bDropInit; } 651 inline void SetDropInit( const sal_Bool bNew ) { bDropInit = bNew; } 652 inline sal_Bool IsQuick() const { return bQuick; } 653 inline sal_Bool IsTest() const { return bTestFormat; } 654 655 inline xub_StrLen GetLineStart() const { return nLineStart; } 656 inline void SetLineStart( const xub_StrLen nNew ) { nLineStart = nNew; } 657 658 // these are used during fly calculation 659 inline KSHORT GetLineHeight() const { return nLineHeight; } 660 inline void SetLineHeight( const KSHORT nNew ) { nLineHeight = nNew; } 661 inline KSHORT GetLineNettoHeight() const { return nLineNettoHeight; } 662 inline void SetLineNettoHeight( const KSHORT nNew ) { nLineNettoHeight = nNew; } 663 664 inline const SwLinePortion *GetUnderFlow() const { return pUnderFlow; } 665 inline SwLinePortion *GetUnderFlow() { return pUnderFlow; } 666 inline void SetUnderFlow( SwLinePortion *pNew ) 667 { pUnderFlow = pNew; bUnderFlow = sal_True; } 668 inline xub_StrLen GetSoftHyphPos() const { return nSoftHyphPos; } 669 inline void SetSoftHyphPos( const xub_StrLen nNew ) { nSoftHyphPos = nNew; } 670 671 inline void SetParaFtn(); 672 673 // FlyFrms 674 inline SwFlyPortion *GetFly() { return pFly; } 675 inline void SetFly( SwFlyPortion *pNew ) { pFly = pNew; } 676 677 inline const SwAttrSet& GetCharAttr() const; 678 679 // Tabs 680 inline SwTabPortion *GetLastTab() { return pLastTab; } 681 inline void SetLastTab( SwTabPortion *pNew ) { pLastTab = pNew; } 682 inline xub_Unicode GetTabDecimal() const { return cTabDecimal; } 683 inline void SetTabDecimal( const xub_Unicode cNew ) { cTabDecimal = cNew;} 684 685 // Last* 686 inline SwFldPortion *GetLastFld() { return pLastFld; } 687 inline void SetLastFld( SwFldPortion *pNew ) { pLastFld = pNew; } 688 689 inline void ClearHookChar() { cHookChar = 0; } 690 inline void SetHookChar( const xub_Unicode cNew ) { cHookChar = cNew; } 691 inline xub_Unicode GetHookChar() const { return cHookChar; } 692 693 // Done-Flags 694 inline sal_Bool IsFtnDone() const { return bFtnDone; } 695 inline void SetFtnDone( const sal_Bool bNew ) { bFtnDone = bNew; } 696 inline sal_Bool IsErgoDone() const { return bErgoDone; } 697 inline void SetErgoDone( const sal_Bool bNew ) { bErgoDone = bNew; } 698 inline sal_Bool IsNumDone() const { return bNumDone; } 699 inline void SetNumDone( const sal_Bool bNew ) { bNumDone = bNew; } 700 inline sal_Bool IsArrowDone() const { return bArrowDone; } 701 inline void SetArrowDone( const sal_Bool bNew ) { bArrowDone = bNew; } 702 703 // Fuer SwTxtPortion::Hyphenate 704 inline sal_Bool IsSoftHyph( const xub_StrLen nPos ) const; 705 sal_Bool ChgHyph( const sal_Bool bNew ); 706 707 // Soll die Trennhilfe angeschmissen werden? 708 sal_Bool IsHyphenate() const; 709 inline void SetHyphStart( const xub_StrLen nNew ) { nHyphStart = nNew; } 710 inline xub_StrLen GetHyphStart() const { return nHyphStart; } 711 inline void SetHyphWrdStart( const xub_StrLen nNew ) { nHyphWrdStart = nNew; } 712 inline xub_StrLen GetHyphWrdStart() const { return nHyphWrdStart; } 713 inline void SetHyphWrdLen( const xub_StrLen nNew ) { nHyphWrdLen = nNew; } 714 inline xub_StrLen GetHyphWrdLen() const { return nHyphWrdLen; } 715 inline xub_StrLen GetUnderScorePos() const { return nUnderScorePos; } 716 inline void SetUnderScorePos( xub_StrLen nNew ) { nUnderScorePos = nNew; } 717 718 // ruft HyphenateWord() des Hyphenators 719 ::com::sun::star::uno::Reference< 720 ::com::sun::star::linguistic2::XHyphenatedWord > 721 HyphWord( const String &rTxt, const sal_uInt16 nMinTrail ); 722 const com::sun::star::beans::PropertyValues & 723 GetHyphValues() const; 724 725 sal_Bool CheckFtnPortion( SwLineLayout* pCurr ) 726 { return IsFtnInside() && _CheckFtnPortion( pCurr ); } 727 728 // Dropcaps vom SwTxtFormatter::CTOR gerufen. 729 const SwFmtDrop *GetDropFmt() const; 730 731 // setzt die FormatInfo wieder in den Anfangszustand 732 void Reset( const SwTxtFrm *pFrame); // , const sal_Bool bAll ); 733 734 // Sets the last SwKernPortion as pLast, if it is followed by empty portions 735 sal_Bool LastKernPortion(); 736 737 // Sucht ab nIdx bis nEnd nach Tabs, TabDec, TXTATR und BRK. 738 // Return: gefundene Position, setzt ggf. cHookChar 739 xub_StrLen ScanPortionEnd( const xub_StrLen nStart, const xub_StrLen nEnd ); 740 741 // friend ostream &operator<<( ostream &rOS, const SwTxtFormatInfo &rInf ); 742 friend SvStream &operator<<( SvStream &rOS, const SwTxtFormatInfo &rInf ); 743 }; 744 745 /************************************************************************* 746 * class SwTxtSlot 747 *************************************************************************/ 748 749 // Fuer die Textersetzung und Restaurierung der SwTxtSizeInfo. 750 // Die Art und Weise ist etwas kriminell, rInf ist const und wird 751 // trotzdem veraendert. Da rInf im DTOR wieder restauriert wird, 752 // ist dies zulaessig, es handelt sich um ein "logisches const". 753 754 class SwTxtSlot 755 { 756 XubString aTxt; 757 const XubString *pOldTxt; 758 const SwWrongList* pOldSmartTagList; 759 const SwWrongList* pOldGrammarCheckList; 760 SwWrongList* pTempList; 761 xub_StrLen nIdx; 762 xub_StrLen nLen; 763 sal_Bool bOn; 764 protected: 765 SwTxtSizeInfo *pInf; 766 public: 767 // Der Ersetzungstring kommt wahlweise aus der Portion via GetExpText() 768 // oder aus dem char Pointer pCh, wenn dieser ungleich NULL ist. 769 SwTxtSlot( const SwTxtSizeInfo *pNew, const SwLinePortion *pPor, bool bTxtLen, 770 bool bExgLists, const sal_Char *pCh = NULL ); 771 ~SwTxtSlot(); 772 inline sal_Bool IsOn() const { return bOn; } 773 }; 774 775 /************************************************************************* 776 * class SwFontSave 777 *************************************************************************/ 778 779 class SwFontSave 780 { 781 SwTxtSizeInfo *pInf; 782 SwFont *pFnt; 783 SwAttrIter *pIter; 784 public: 785 SwFontSave( const SwTxtSizeInfo &rInf, SwFont *pFnt, 786 SwAttrIter* pItr = NULL ); 787 ~SwFontSave(); 788 }; 789 790 /************************************************************************* 791 * class SwDefFontSave 792 *************************************************************************/ 793 794 class SwDefFontSave 795 { 796 SwTxtSizeInfo *pInf; 797 SwFont *pFnt; 798 SwFont *pNewFnt; 799 sal_Bool bAlter; 800 public: 801 SwDefFontSave( const SwTxtSizeInfo &rInf ); 802 ~SwDefFontSave(); 803 }; 804 805 /************************************************************************* 806 * Inline-Implementierungen SwTxtSizeInfo 807 *************************************************************************/ 808 809 inline KSHORT SwTxtSizeInfo::GetAscent() const 810 { 811 ASSERT( GetOut(), "SwTxtSizeInfo::GetAscent() without pOut" ) 812 return ((SwFont*)GetFont())->GetAscent( pVsh, *GetOut() ); 813 } 814 815 inline KSHORT SwTxtSizeInfo::GetTxtHeight() const 816 { 817 ASSERT( GetOut(), "SwTxtSizeInfo::GetTxtHeight() without pOut" ) 818 return ((SwFont*)GetFont())->GetHeight( pVsh, *GetOut() ); 819 } 820 821 inline SwPosSize SwTxtSizeInfo::GetTxtSize( const XubString &rTxt ) const 822 { 823 return GetTxtSize( pOut, 0, rTxt, 0, rTxt.Len(), 0 ); 824 } 825 826 inline SwPosSize SwTxtSizeInfo::GetTxtSize( const SwScriptInfo* pSI, 827 const xub_StrLen nNewIdx, 828 const xub_StrLen nNewLen, 829 const sal_uInt16 nCompress ) const 830 { 831 return GetTxtSize( pOut, pSI, *pTxt, nNewIdx, nNewLen, nCompress ); 832 } 833 834 /************************************************************************* 835 * Inline-Implementierungen SwTxtPaintInfo 836 *************************************************************************/ 837 838 inline SwTwips SwTxtPaintInfo::GetPaintOfst() const 839 { 840 return GetParaPortion()->GetRepaint()->GetOfst(); 841 } 842 843 inline void SwTxtPaintInfo::SetPaintOfst( const SwTwips nNew ) 844 { 845 GetParaPortion()->GetRepaint()->SetOfst( nNew ); 846 } 847 848 849 inline void SwTxtPaintInfo::DrawText( const XubString &rText, 850 const SwLinePortion &rPor, 851 const xub_StrLen nStart, const xub_StrLen nLength, 852 const sal_Bool bKern ) const 853 { 854 ((SwTxtPaintInfo*)this)->_DrawText( rText, rPor, nStart, nLength, bKern ); 855 } 856 857 inline void SwTxtPaintInfo::DrawText( const SwLinePortion &rPor, 858 const xub_StrLen nLength, const sal_Bool bKern ) const 859 { 860 ((SwTxtPaintInfo*)this)->_DrawText( *pTxt, rPor, nIdx, nLength, bKern ); 861 } 862 863 inline void SwTxtPaintInfo::DrawMarkedText( const SwLinePortion &rPor, 864 const xub_StrLen nLength, 865 const sal_Bool bKern, 866 const sal_Bool bWrong, 867 const sal_Bool bSmartTags, 868 const sal_Bool bGrammarCheck ) const 869 { 870 ((SwTxtPaintInfo*)this)->_DrawText( *pTxt, rPor, nIdx, nLength, bKern, bWrong, bSmartTags, bGrammarCheck ); 871 } 872 873 /************************************************************************* 874 * Inline-Implementierungen SwTxtFormatInfo 875 *************************************************************************/ 876 877 inline xub_StrLen SwTxtFormatInfo::GetReformatStart() const 878 { 879 return GetParaPortion()->GetReformat()->Start(); 880 } 881 882 inline const SwAttrSet& SwTxtFormatInfo::GetCharAttr() const 883 { 884 return GetTxtFrm()->GetTxtNode()->GetSwAttrSet(); 885 } 886 887 inline void SwTxtFormatInfo::SetParaFtn() 888 { 889 GetTxtFrm()->SetFtn( sal_True ); 890 } 891 892 inline sal_Bool SwTxtFormatInfo::IsSoftHyph( const xub_StrLen nPos ) const 893 { 894 return CHAR_SOFTHYPHEN == GetTxtFrm()->GetTxtNode()->GetTxt().GetChar(nPos); 895 } 896 897 898 899 #endif 900 901