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 _DRAWFONT_HXX 24 #define _DRAWFONT_HXX 25 26 #include <tools/solar.h> 27 #include <tools/string.hxx> 28 #include <errhdl.hxx> 29 30 class SwTxtFrm; 31 class OutputDevice; 32 class ViewShell; 33 class SwScriptInfo; 34 class Point; 35 class SwWrongList; 36 class Size; 37 class SwFont; 38 class Font; 39 class SwUnderlineFont; 40 41 /************************************************************************* 42 * class SwDrawTextInfo 43 * 44 * encapsulates information for drawing text 45 *************************************************************************/ 46 47 class SwDrawTextInfo 48 { 49 const SwTxtFrm* pFrm; 50 OutputDevice* pOut; 51 ViewShell* pSh; 52 const SwScriptInfo* pScriptInfo; 53 const Point* pPos; 54 const XubString* pText; 55 const SwWrongList* pWrong; 56 const SwWrongList* pGrammarCheck; 57 const SwWrongList* pSmartTags; // SMARTTAGS 58 const Size* pSize; 59 SwFont *pFnt; 60 SwUnderlineFont* pUnderFnt; 61 xub_StrLen* pHyphPos; 62 long nLeft; 63 long nRight; 64 long nKanaDiff; 65 xub_StrLen nIdx; 66 xub_StrLen nLen; 67 xub_StrLen nOfst; 68 sal_uInt16 nWidth; 69 sal_uInt16 nAscent; 70 sal_uInt16 nCompress; 71 long nSperren; 72 long nSpace; 73 long nKern; 74 xub_StrLen nNumberOfBlanks; 75 sal_uInt8 nCursorBidiLevel; 76 sal_Bool bBullet : 1; 77 sal_Bool bUpper : 1; // Fuer Kapitaelchen: Grossbuchstaben-Flag 78 sal_Bool bDrawSpace : 1; // Fuer Kapitaelchen: Unter/Durchstreichung 79 sal_Bool bGreyWave : 1; // Graue Wellenlinie beim extended TextInput 80 sal_Bool bSpaceStop : 1; // For underlining we need to know, if a portion 81 // is right in front of a hole portion or a 82 // fix margin portion. 83 sal_Bool bSnapToGrid : 1; // Does paragraph snap to grid? 84 sal_Bool bIgnoreFrmRTL : 1; // Paint text as if text has LTR direction, used for 85 // line numbering 86 sal_Bool bPosMatchesBounds :1; // GetCrsrOfst should not return the next 87 // position if screen position is inside second 88 // half of bound rect, used for Accessibility 89 90 SwDrawTextInfo(); // nicht zulaessig 91 public: 92 93 #ifdef DBG_UTIL 94 sal_Bool bPos : 1; // These flags should control, that the appropriate 95 sal_Bool bWrong : 1; // Set-function has been called before calling 96 sal_Bool bGrammarCheck : 1; // the Get-function of a member 97 sal_Bool bSize : 1; 98 sal_Bool bFnt : 1; 99 sal_Bool bHyph : 1; 100 sal_Bool bLeft : 1; 101 sal_Bool bRight : 1; 102 sal_Bool bKana : 1; 103 sal_Bool bOfst : 1; 104 sal_Bool bAscent: 1; 105 sal_Bool bSperr : 1; 106 sal_Bool bSpace : 1; 107 sal_Bool bNumberOfBlanks : 1; 108 sal_Bool bUppr : 1; 109 sal_Bool bDrawSp: 1; 110 #endif 111 SwDrawTextInfo(ViewShell * pS,OutputDevice & rO,const SwScriptInfo * pSI,const XubString & rSt,xub_StrLen nI,xub_StrLen nL,sal_uInt16 nW=0,sal_Bool bB=sal_False)112 SwDrawTextInfo( ViewShell *pS, OutputDevice &rO, const SwScriptInfo* pSI, 113 const XubString &rSt, xub_StrLen nI, xub_StrLen nL, 114 sal_uInt16 nW = 0, sal_Bool bB = sal_False ) 115 { 116 pFrm = NULL; 117 pSh = pS; 118 pOut = &rO; 119 pScriptInfo = pSI; 120 pText = &rSt; 121 nIdx = nI; 122 nLen = nL; 123 nKern = 0; 124 nCompress = 0; 125 nWidth = nW; 126 nNumberOfBlanks = 0; 127 nCursorBidiLevel = 0; 128 bBullet = bB; 129 pUnderFnt = 0; 130 bGreyWave = sal_False; 131 bSpaceStop = sal_False; 132 bSnapToGrid = sal_False; 133 bIgnoreFrmRTL = sal_False; 134 bPosMatchesBounds = sal_False; 135 136 // These values are initialized but, they have to be 137 // set explicitly via their Set-function before they may 138 // be accessed by their Get-function: 139 pPos = 0; 140 pWrong = 0; 141 pGrammarCheck = 0; 142 pSmartTags = 0; 143 pSize = 0; 144 pFnt = 0; 145 pHyphPos = 0; 146 nLeft = 0; 147 nRight = 0; 148 nKanaDiff = 0; 149 nOfst = 0; 150 nAscent = 0; 151 nSperren = 0; 152 nSpace = 0; 153 bUpper = sal_False; 154 bDrawSpace = sal_False; 155 156 #ifdef DBG_UTIL 157 // these flags control, whether the matching member variables have 158 // been set by using the Set-function before they may be accessed 159 // by their Get-function: 160 bPos = bWrong = bGrammarCheck = bSize = bFnt = bAscent = bSpace = bNumberOfBlanks = bUppr = 161 bDrawSp = bLeft = bRight = bKana = bOfst = bHyph = bSperr = sal_False; 162 #endif 163 } 164 GetFrm() const165 const SwTxtFrm* GetFrm() const 166 { 167 return pFrm; 168 } 169 SetFrm(const SwTxtFrm * pNewFrm)170 void SetFrm( const SwTxtFrm* pNewFrm ) 171 { 172 pFrm = pNewFrm; 173 } 174 GetShell() const175 ViewShell *GetShell() const 176 { 177 return pSh; 178 } 179 GetOut() const180 OutputDevice& GetOut() const 181 { 182 return *pOut; 183 } 184 GetpOut() const185 OutputDevice *GetpOut() const 186 { 187 return pOut; 188 } 189 GetScriptInfo() const190 const SwScriptInfo* GetScriptInfo() const 191 { 192 return pScriptInfo; 193 } 194 GetPos() const195 const Point &GetPos() const 196 { 197 ASSERT( bPos, "DrawTextInfo: Undefined Position" ); 198 return *pPos; 199 } 200 GetHyphPos() const201 xub_StrLen *GetHyphPos() const 202 { 203 ASSERT( bHyph, "DrawTextInfo: Undefined Hyph Position" ); 204 return pHyphPos; 205 } 206 GetText() const207 const XubString &GetText() const 208 { 209 return *pText; 210 } 211 GetWrong() const212 const SwWrongList* GetWrong() const 213 { 214 ASSERT( bWrong, "DrawTextInfo: Undefined WrongList" ); 215 return pWrong; 216 } 217 GetGrammarCheck() const218 const SwWrongList* GetGrammarCheck() const 219 { 220 ASSERT( bGrammarCheck, "DrawTextInfo: Undefined GrammarCheck List" ); 221 return pGrammarCheck; 222 } 223 GetSmartTags() const224 const SwWrongList* GetSmartTags() const 225 { 226 return pSmartTags; 227 } 228 GetSize() const229 const Size &GetSize() const 230 { 231 ASSERT( bSize, "DrawTextInfo: Undefined Size" ); 232 return *pSize; 233 } 234 GetFont() const235 SwFont* GetFont() const 236 { 237 ASSERT( bFnt, "DrawTextInfo: Undefined Font" ); 238 return pFnt; 239 } 240 GetUnderFnt() const241 SwUnderlineFont* GetUnderFnt() const 242 { 243 return pUnderFnt; 244 } 245 GetIdx() const246 xub_StrLen GetIdx() const 247 { 248 return nIdx; 249 } 250 GetLen() const251 xub_StrLen GetLen() const 252 { 253 return nLen; 254 } 255 GetOfst() const256 xub_StrLen GetOfst() const 257 { 258 ASSERT( bOfst, "DrawTextInfo: Undefined Offset" ); 259 return nOfst; 260 } 261 GetEnd() const262 xub_StrLen GetEnd() const 263 { 264 return nIdx + nLen; 265 } 266 GetLeft() const267 long GetLeft() const 268 { 269 ASSERT( bLeft, "DrawTextInfo: Undefined left range" ); 270 return nLeft; 271 } 272 GetRight() const273 long GetRight() const 274 { 275 ASSERT( bRight, "DrawTextInfo: Undefined right range" ); 276 return nRight; 277 } 278 GetKanaDiff() const279 long GetKanaDiff() const 280 { 281 ASSERT( bKana, "DrawTextInfo: Undefined kana difference" ); 282 return nKanaDiff; 283 } 284 GetWidth() const285 sal_uInt16 GetWidth() const 286 { 287 return nWidth; 288 } 289 GetAscent() const290 sal_uInt16 GetAscent() const 291 { 292 ASSERT( bAscent, "DrawTextInfo: Undefined Ascent" ); 293 return nAscent; 294 } 295 GetKanaComp() const296 sal_uInt16 GetKanaComp() const 297 { 298 return nCompress; 299 } 300 GetSperren() const301 long GetSperren() const 302 { 303 ASSERT( bSperr, "DrawTextInfo: Undefined >Sperren<" ); 304 return nSperren; 305 } 306 GetKern() const307 long GetKern() const 308 { 309 return nKern; 310 } 311 GetSpace() const312 long GetSpace() const 313 { 314 ASSERT( bSpace, "DrawTextInfo: Undefined Spacing" ); 315 return nSpace; 316 } 317 GetNumberOfBlanks() const318 xub_StrLen GetNumberOfBlanks() const 319 { 320 ASSERT( bNumberOfBlanks, "DrawTextInfo::Undefined NumberOfBlanks" ); 321 return nNumberOfBlanks; 322 } 323 GetCursorBidiLevel() const324 sal_uInt8 GetCursorBidiLevel() const 325 { 326 return nCursorBidiLevel; 327 } 328 GetBullet() const329 sal_Bool GetBullet() const 330 { 331 return bBullet; 332 } 333 GetUpper() const334 sal_Bool GetUpper() const 335 { 336 ASSERT( bUppr, "DrawTextInfo: Undefined Upperflag" ); 337 return bUpper; 338 } 339 GetDrawSpace() const340 sal_Bool GetDrawSpace() const 341 { 342 ASSERT( bDrawSp, "DrawTextInfo: Undefined DrawSpaceflag" ); 343 return bDrawSpace; 344 } 345 GetGreyWave() const346 sal_Bool GetGreyWave() const 347 { 348 return bGreyWave; 349 } 350 IsSpaceStop() const351 sal_Bool IsSpaceStop() const 352 { 353 return bSpaceStop; 354 } 355 SnapToGrid() const356 sal_Bool SnapToGrid() const 357 { 358 return bSnapToGrid; 359 } 360 IsIgnoreFrmRTL() const361 sal_Bool IsIgnoreFrmRTL() const 362 { 363 return bIgnoreFrmRTL; 364 } 365 IsPosMatchesBounds() const366 sal_Bool IsPosMatchesBounds() const 367 { 368 return bPosMatchesBounds; 369 } 370 SetOut(OutputDevice & rNew)371 void SetOut( OutputDevice &rNew ) 372 { 373 pOut = &rNew; 374 } 375 SetPos(const Point & rNew)376 void SetPos( const Point &rNew ) 377 { 378 pPos = &rNew; 379 #ifdef DBG_UTIL 380 bPos = sal_True; 381 #endif 382 } 383 SetHyphPos(xub_StrLen * pNew)384 void SetHyphPos( xub_StrLen *pNew ) 385 { 386 pHyphPos = pNew; 387 #ifdef DBG_UTIL 388 bHyph = sal_True; 389 #endif 390 } 391 SetText(const XubString & rNew)392 void SetText( const XubString &rNew ) 393 { 394 pText = &rNew; 395 } 396 SetWrong(const SwWrongList * pNew)397 void SetWrong( const SwWrongList* pNew ) 398 { 399 pWrong = pNew; 400 #ifdef DBG_UTIL 401 bWrong = sal_True; 402 #endif 403 } 404 SetGrammarCheck(const SwWrongList * pNew)405 void SetGrammarCheck( const SwWrongList* pNew ) 406 { 407 pGrammarCheck = pNew; 408 #ifdef DBG_UTIL 409 bGrammarCheck = sal_True; 410 #endif 411 } 412 SetSmartTags(const SwWrongList * pNew)413 void SetSmartTags( const SwWrongList* pNew ) 414 { 415 pSmartTags = pNew; 416 } 417 SetSize(const Size & rNew)418 void SetSize( const Size &rNew ) 419 { 420 pSize = &rNew; 421 #ifdef DBG_UTIL 422 bSize = sal_True; 423 #endif 424 } 425 SetFont(SwFont * pNew)426 void SetFont( SwFont* pNew ) 427 { 428 pFnt = pNew; 429 #ifdef DBG_UTIL 430 bFnt = sal_True; 431 #endif 432 } 433 SetIdx(xub_StrLen nNew)434 void SetIdx( xub_StrLen nNew ) 435 { 436 nIdx = nNew; 437 } 438 SetLen(xub_StrLen nNew)439 void SetLen( xub_StrLen nNew ) 440 { 441 nLen = nNew; 442 } 443 SetOfst(xub_StrLen nNew)444 void SetOfst( xub_StrLen nNew ) 445 { 446 nOfst = nNew; 447 #ifdef DBG_UTIL 448 bOfst = sal_True; 449 #endif 450 } 451 SetLeft(long nNew)452 void SetLeft( long nNew ) 453 { 454 nLeft = nNew; 455 #ifdef DBG_UTIL 456 bLeft = sal_True; 457 #endif 458 } 459 SetRight(long nNew)460 void SetRight( long nNew ) 461 { 462 nRight = nNew; 463 #ifdef DBG_UTIL 464 bRight = sal_True; 465 #endif 466 } 467 SetKanaDiff(long nNew)468 void SetKanaDiff( long nNew ) 469 { 470 nKanaDiff = nNew; 471 #ifdef DBG_UTIL 472 bKana = sal_True; 473 #endif 474 } 475 SetWidth(sal_uInt16 nNew)476 void SetWidth( sal_uInt16 nNew ) 477 { 478 nWidth = nNew; 479 } 480 SetAscent(sal_uInt16 nNew)481 void SetAscent( sal_uInt16 nNew ) 482 { 483 nAscent = nNew; 484 #ifdef DBG_UTIL 485 bAscent = sal_True; 486 #endif 487 } 488 SetKern(long nNew)489 void SetKern( long nNew ) 490 { 491 nKern = nNew; 492 } 493 SetSpace(long nNew)494 void SetSpace( long nNew ) 495 { 496 if( nNew < 0 ) 497 { 498 nSperren = -nNew; 499 nSpace = 0; 500 } 501 else 502 { 503 nSpace = nNew; 504 nSperren = 0; 505 } 506 #ifdef DBG_UTIL 507 bSpace = sal_True; 508 bSperr = sal_True; 509 #endif 510 } 511 SetNumberOfBlanks(xub_StrLen nNew)512 void SetNumberOfBlanks( xub_StrLen nNew ) 513 { 514 #ifdef DBG_UTIL 515 bNumberOfBlanks = sal_True; 516 #endif 517 nNumberOfBlanks = nNew; 518 } 519 SetCursorBidiLevel(sal_uInt8 nNew)520 void SetCursorBidiLevel( sal_uInt8 nNew ) 521 { 522 nCursorBidiLevel = nNew; 523 } 524 SetKanaComp(short nNew)525 void SetKanaComp( short nNew ) 526 { 527 nCompress = nNew; 528 } 529 SetBullet(sal_Bool bNew)530 void SetBullet( sal_Bool bNew ) 531 { 532 bBullet = bNew; 533 } 534 SetUnderFnt(SwUnderlineFont * pULFnt)535 void SetUnderFnt( SwUnderlineFont* pULFnt ) 536 { 537 pUnderFnt = pULFnt; 538 } 539 SetUpper(sal_Bool bNew)540 void SetUpper( sal_Bool bNew ) 541 { 542 bUpper = bNew; 543 #ifdef DBG_UTIL 544 bUppr = sal_True; 545 #endif 546 } 547 SetDrawSpace(sal_Bool bNew)548 void SetDrawSpace( sal_Bool bNew ) 549 { 550 bDrawSpace = bNew; 551 #ifdef DBG_UTIL 552 bDrawSp = sal_True; 553 #endif 554 } 555 SetGreyWave(sal_Bool bNew)556 void SetGreyWave( sal_Bool bNew ) 557 { 558 bGreyWave = bNew; 559 } 560 SetSpaceStop(sal_Bool bNew)561 void SetSpaceStop( sal_Bool bNew ) 562 { 563 bSpaceStop = bNew; 564 } 565 SetSnapToGrid(sal_Bool bNew)566 void SetSnapToGrid( sal_Bool bNew ) 567 { 568 bSnapToGrid = bNew; 569 } 570 SetIgnoreFrmRTL(sal_Bool bNew)571 void SetIgnoreFrmRTL( sal_Bool bNew ) 572 { 573 bIgnoreFrmRTL = bNew; 574 } 575 SetPosMatchesBounds(sal_Bool bNew)576 void SetPosMatchesBounds( sal_Bool bNew ) 577 { 578 bPosMatchesBounds = bNew; 579 } 580 581 void Shift( sal_uInt16 nDir ); 582 583 // sets a new color at the output device if necessary 584 // if a font is passed as argument, the change if made to the font 585 // otherwise the font at the output device is changed 586 // returns if the font has been changed 587 sal_Bool ApplyAutoColor( Font* pFnt = 0 ); 588 }; 589 590 #endif 591