1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_svx.hxx" 30 31 32 #include <tools/poly.hxx> 33 #include <vcl/metric.hxx> 34 #include <vcl/svapp.hxx> 35 #include <svtools/colorcfg.hxx> 36 #include <svx/swframeexample.hxx> 37 #include <com/sun/star/text/TextContentAnchorType.hpp> 38 #include <com/sun/star/text/HoriOrientation.hpp> 39 #include <com/sun/star/text/VertOrientation.hpp> 40 #include <com/sun/star/text/RelOrientation.hpp> 41 #include <com/sun/star/text/WrapTextMode.hpp> 42 43 using namespace ::com::sun::star::text; 44 45 #define FLYINFLY_BORDER 3 46 #define DEMOTEXT "Ij" 47 #define C2S(cChar) UniString::CreateFromAscii(cChar) 48 49 50 SvxSwFrameExample::SvxSwFrameExample( Window *pParent, const ResId& rResID ) : 51 52 Window(pParent, rResID), 53 54 nHAlign (HoriOrientation::CENTER), 55 nHRel (RelOrientation::FRAME), 56 nVAlign (VertOrientation::TOP), 57 nVRel (RelOrientation::PRINT_AREA), 58 nWrap (WrapTextMode_NONE), 59 nAnchor (TextContentAnchorType_AT_PAGE), 60 bTrans (sal_False), 61 aRelPos (Point(0,0)) 62 { 63 InitColors_Impl(); 64 SetMapMode(MAP_PIXEL); 65 } 66 67 SvxSwFrameExample::~SvxSwFrameExample() 68 { 69 } 70 71 void SvxSwFrameExample::InitColors_Impl( void ) 72 { 73 const StyleSettings& rSettings = GetSettings().GetStyleSettings(); 74 m_aBgCol = Color( rSettings.GetWindowColor() ); // old: COL_WHITE 75 76 sal_Bool bHC = rSettings.GetHighContrastMode(); 77 78 m_aFrameColor = Color( COL_LIGHTGREEN ); 79 m_aAlignColor = Color( COL_LIGHTRED ); 80 m_aTransColor = Color( COL_TRANSPARENT ); 81 82 m_aTxtCol = bHC? 83 svtools::ColorConfig().GetColorValue(svtools::FONTCOLOR).nColor : 84 Color( COL_GRAY ); // old: COL_GRAY 85 m_aPrintAreaCol = bHC? m_aTxtCol : Color( COL_GRAY ); 86 m_aBorderCol = m_aTxtCol; // old: COL_BLACK; 87 m_aBlankCol = bHC? m_aTxtCol : Color( COL_LIGHTGRAY ); 88 m_aBlankFrameCol = bHC? m_aTxtCol : Color( COL_GRAY ); 89 } 90 91 void SvxSwFrameExample::DataChanged( const DataChangedEvent& rDCEvt ) 92 { 93 Window::DataChanged( rDCEvt ); 94 95 if( rDCEvt.GetType() == DATACHANGED_SETTINGS && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) 96 InitColors_Impl(); 97 } 98 99 void SvxSwFrameExample::InitAllRects_Impl() 100 { 101 // const Size aSz(GetOutputSizePixel()); 102 103 // Seite 104 // aPage.SetSize(Size(aSz.Width() - 3, aSz.Height() - 3)); 105 aPage.SetSize( GetOutputSizePixel() ); 106 107 sal_uIntPtr nOutWPix = aPage.GetWidth(); 108 sal_uIntPtr nOutHPix = aPage.GetHeight(); 109 110 // PrintArea 111 sal_uIntPtr nLBorder; 112 sal_uIntPtr nRBorder; 113 sal_uIntPtr nTBorder; 114 sal_uIntPtr nBBorder; 115 116 sal_uIntPtr nLTxtBorder; 117 sal_uIntPtr nRTxtBorder; 118 sal_uIntPtr nTTxtBorder; 119 sal_uIntPtr nBTxtBorder; 120 121 if (nAnchor != TextContentAnchorType_AS_CHARACTER) 122 { 123 nLBorder = 14; 124 nRBorder = 10; 125 nTBorder = 10; 126 nBBorder = 15; 127 128 nLTxtBorder = 8; 129 nRTxtBorder = 4; 130 nTTxtBorder = 2; 131 nBTxtBorder = 2; 132 } 133 else 134 { 135 nLBorder = 2; 136 nRBorder = 2; 137 nTBorder = 2; 138 nBBorder = 2; 139 140 nLTxtBorder = 2; 141 nRTxtBorder = 2; 142 nTTxtBorder = 2; 143 nBTxtBorder = 2; 144 } 145 aPagePrtArea = Rectangle(Point(nLBorder, nTBorder), Point((nOutWPix - 1) - nRBorder, (nOutHPix - 1) - nBBorder)); 146 147 // Beispiel-Text: Vorbereiten fuer die Textausgabe 148 // Eine Textzeile 149 aTextLine = aPagePrtArea; 150 aTextLine.SetSize(Size(aTextLine.GetWidth(), 2)); 151 aTextLine.Left() += nLTxtBorder; 152 aTextLine.Right() -= nRTxtBorder; 153 aTextLine.Move(0, nTTxtBorder); 154 155 // Rechteck um Absatz incl. Raender 156 sal_uInt16 nLines = (sal_uInt16)((aPagePrtArea.GetHeight() / 2 - nTTxtBorder - nBTxtBorder) 157 / (aTextLine.GetHeight() + 2)); 158 aPara = aPagePrtArea; 159 aPara.SetSize(Size(aPara.GetWidth(), 160 (aTextLine.GetHeight() + 2) * nLines + nTTxtBorder + nBTxtBorder)); 161 162 // Rechteck um Absatz ohne Raender 163 aParaPrtArea = aPara; 164 aParaPrtArea.Left() += nLTxtBorder; 165 aParaPrtArea.Right() -= nRTxtBorder; 166 aParaPrtArea.Top() += nTTxtBorder; 167 aParaPrtArea.Bottom() -= nBTxtBorder; 168 169 if (nAnchor == TextContentAnchorType_AS_CHARACTER || nAnchor == TextContentAnchorType_AT_CHARACTER) 170 { 171 Font aFont = OutputDevice::GetDefaultFont( 172 DEFAULTFONT_LATIN_TEXT, Application::GetSettings().GetLanguage(), 173 DEFAULTFONT_FLAGS_ONLYONE, this ); 174 aFont.SetColor( m_aTxtCol ); 175 aFont.SetFillColor( m_aBgCol ); 176 aFont.SetWeight(WEIGHT_NORMAL); 177 178 if (nAnchor == TextContentAnchorType_AS_CHARACTER) 179 { 180 aFont.SetSize(Size(0, aParaPrtArea.GetHeight() - 2)); 181 SetFont(aFont); 182 aParaPrtArea.SetSize(Size(GetTextWidth(C2S(DEMOTEXT)), GetTextHeight())); 183 } 184 else 185 { 186 aFont.SetSize(Size(0, aParaPrtArea.GetHeight() / 2)); 187 SetFont(aFont); 188 aAutoCharFrame.SetSize(Size(GetTextWidth('A'), GetTextHeight())); 189 aAutoCharFrame.SetPos(Point(aParaPrtArea.Left() + (aParaPrtArea.GetWidth() - aAutoCharFrame.GetWidth()) / 2, 190 aParaPrtArea.Top() + (aParaPrtArea.GetHeight() - aAutoCharFrame.GetHeight()) / 2)); 191 } 192 } 193 194 // Innerer Frame fuer am Frame verankerte Rahmen 195 aFrameAtFrame = aPara; 196 aFrameAtFrame.Left() += 9; 197 aFrameAtFrame.Right() -= 5; 198 aFrameAtFrame.Bottom() += 5; 199 aFrameAtFrame.SetPos(Point(aFrameAtFrame.Left() + 2, (aPagePrtArea.Bottom() - aFrameAtFrame.GetHeight()) / 2 + 5)); 200 201 // Groesse des zu positionierenden Rahmens 202 if (nAnchor != TextContentAnchorType_AS_CHARACTER) 203 { 204 sal_uIntPtr nLFBorder = nAnchor == TextContentAnchorType_AT_PAGE ? nLBorder : nLTxtBorder; 205 sal_uIntPtr nRFBorder = nAnchor == TextContentAnchorType_AT_PAGE ? nRBorder : nRTxtBorder; 206 207 switch (nHRel) 208 { 209 case RelOrientation::PAGE_LEFT: 210 case RelOrientation::FRAME_LEFT: 211 aFrmSize = Size(nLFBorder - 4, (aTextLine.GetHeight() + 2) * 3); 212 break; 213 214 case RelOrientation::PAGE_RIGHT: 215 case RelOrientation::FRAME_RIGHT: 216 aFrmSize = Size(nRFBorder - 4, (aTextLine.GetHeight() + 2) * 3); 217 break; 218 219 default: 220 aFrmSize = Size(nLBorder - 3, (aTextLine.GetHeight() + 2) * 3); 221 break; 222 } 223 aFrmSize.Width() = Max(5L, aFrmSize.Width()); 224 aFrmSize.Height() = Max(5L, aFrmSize.Height()); 225 } 226 else 227 { 228 sal_uIntPtr nFreeWidth = aPagePrtArea.GetWidth() - GetTextWidth(C2S(DEMOTEXT)); 229 230 aFrmSize = Size(nFreeWidth / 2, (aTextLine.GetHeight() + 2) * 3); 231 aDrawObj.SetSize(Size(Max(5L, (long)nFreeWidth / 3L), Max(5L, aFrmSize.Height() * 3L))); 232 aDrawObj.SetPos(Point(aParaPrtArea.Right() + 1, aParaPrtArea.Bottom() / 2)); 233 aParaPrtArea.Right() = aDrawObj.Right(); 234 } 235 } 236 237 void SvxSwFrameExample::CalcBoundRect_Impl(Rectangle &rRect) 238 { 239 switch (nAnchor) 240 { 241 case TextContentAnchorType_AT_PAGE: 242 { 243 switch (nHRel) 244 { 245 case RelOrientation::FRAME: 246 case RelOrientation::PAGE_FRAME: 247 rRect.Left() = aPage.Left(); 248 rRect.Right() = aPage.Right(); 249 break; 250 251 case RelOrientation::PRINT_AREA: 252 case RelOrientation::PAGE_PRINT_AREA: 253 rRect.Left() = aPagePrtArea.Left(); 254 rRect.Right() = aPagePrtArea.Right(); 255 break; 256 257 case RelOrientation::PAGE_LEFT: 258 rRect.Left() = aPage.Left(); 259 rRect.Right() = aPagePrtArea.Left(); 260 break; 261 262 case RelOrientation::PAGE_RIGHT: 263 rRect.Left() = aPagePrtArea.Right(); 264 rRect.Right() = aPage.Right(); 265 break; 266 } 267 268 switch (nVRel) 269 { 270 case RelOrientation::PRINT_AREA: 271 case RelOrientation::PAGE_PRINT_AREA: 272 rRect.Top() = aPagePrtArea.Top(); 273 rRect.Bottom() = aPagePrtArea.Bottom(); 274 break; 275 276 case RelOrientation::FRAME: 277 case RelOrientation::PAGE_FRAME: 278 rRect.Top() = aPage.Top(); 279 rRect.Bottom() = aPage.Bottom(); 280 break; 281 } 282 } 283 break; 284 285 case TextContentAnchorType_AT_FRAME: 286 { 287 switch (nHRel) 288 { 289 case RelOrientation::FRAME: 290 case RelOrientation::PAGE_FRAME: 291 rRect.Left() = aFrameAtFrame.Left(); 292 rRect.Right() = aFrameAtFrame.Right(); 293 break; 294 295 case RelOrientation::PRINT_AREA: 296 case RelOrientation::PAGE_PRINT_AREA: 297 rRect.Left() = aFrameAtFrame.Left() + FLYINFLY_BORDER; 298 rRect.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER; 299 break; 300 301 case RelOrientation::PAGE_RIGHT: 302 rRect.Left() = aFrameAtFrame.Left(); 303 rRect.Right() = aFrameAtFrame.Left() + FLYINFLY_BORDER; 304 break; 305 306 case RelOrientation::PAGE_LEFT: 307 rRect.Left() = aFrameAtFrame.Right(); 308 rRect.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER; 309 break; 310 } 311 312 switch (nVRel) 313 { 314 case RelOrientation::FRAME: 315 case RelOrientation::PAGE_FRAME: 316 rRect.Top() = aFrameAtFrame.Top(); 317 rRect.Bottom() = aFrameAtFrame.Bottom(); 318 break; 319 320 case RelOrientation::PRINT_AREA: 321 case RelOrientation::PAGE_PRINT_AREA: 322 rRect.Top() = aFrameAtFrame.Top() + FLYINFLY_BORDER; 323 rRect.Bottom() = aFrameAtFrame.Bottom() - FLYINFLY_BORDER; 324 break; 325 } 326 } 327 break; 328 case TextContentAnchorType_AT_PARAGRAPH: 329 case TextContentAnchorType_AT_CHARACTER: 330 { 331 switch (nHRel) 332 { 333 case RelOrientation::FRAME: 334 rRect.Left() = aPara.Left(); 335 rRect.Right() = aPara.Right(); 336 break; 337 338 case RelOrientation::PRINT_AREA: 339 rRect.Left() = aParaPrtArea.Left(); 340 rRect.Right() = aParaPrtArea.Right(); 341 break; 342 343 case RelOrientation::PAGE_LEFT: 344 rRect.Left() = aPage.Left(); 345 rRect.Right() = aPagePrtArea.Left(); 346 break; 347 348 case RelOrientation::PAGE_RIGHT: 349 rRect.Left() = aPagePrtArea.Right(); 350 rRect.Right() = aPage.Right(); 351 break; 352 353 case RelOrientation::PAGE_FRAME: 354 rRect.Left() = aPage.Left(); 355 rRect.Right() = aPage.Right(); 356 break; 357 358 case RelOrientation::PAGE_PRINT_AREA: 359 rRect.Left() = aPagePrtArea.Left(); 360 rRect.Right() = aPagePrtArea.Right(); 361 break; 362 363 case RelOrientation::FRAME_LEFT: 364 rRect.Left() = aPara.Left(); 365 rRect.Right() = aParaPrtArea.Left(); 366 break; 367 368 case RelOrientation::FRAME_RIGHT: 369 rRect.Left() = aParaPrtArea.Right(); 370 rRect.Right() = aPara.Right(); 371 break; 372 373 case RelOrientation::CHAR: 374 rRect.Left() = aAutoCharFrame.Left(); 375 rRect.Right() = aAutoCharFrame.Left(); 376 break; 377 } 378 379 switch (nVRel) 380 { 381 case RelOrientation::FRAME: 382 rRect.Top() = aPara.Top(); 383 rRect.Bottom() = aPara.Bottom(); 384 break; 385 386 case RelOrientation::PRINT_AREA: 387 rRect.Top() = aParaPrtArea.Top(); 388 rRect.Bottom() = aParaPrtArea.Bottom(); 389 break; 390 391 case RelOrientation::CHAR: 392 if (nVAlign != VertOrientation::NONE && 393 nVAlign != VertOrientation::CHAR_BOTTOM) 394 rRect.Top() = aAutoCharFrame.Top(); 395 else 396 rRect.Top() = aAutoCharFrame.Bottom(); 397 rRect.Bottom() = aAutoCharFrame.Bottom(); 398 break; 399 // OD 12.11.2003 #i22341# 400 case RelOrientation::TEXT_LINE: 401 rRect.Top() = aAutoCharFrame.Top(); 402 rRect.Bottom() = aAutoCharFrame.Top(); 403 break; 404 } 405 } 406 break; 407 408 case TextContentAnchorType_AS_CHARACTER: 409 rRect.Left() = aParaPrtArea.Left(); 410 rRect.Right() = aParaPrtArea.Right(); 411 412 switch (nVAlign) 413 { 414 case VertOrientation::NONE: 415 case VertOrientation::TOP: 416 case VertOrientation::CENTER: 417 case VertOrientation::BOTTOM: 418 { 419 FontMetric aMetric(GetFontMetric()); 420 421 rRect.Top() = aParaPrtArea.Bottom() - aMetric.GetDescent(); 422 rRect.Bottom() = rRect.Top(); 423 } 424 break; 425 426 default: 427 428 case VertOrientation::LINE_TOP: 429 case VertOrientation::LINE_CENTER: 430 case VertOrientation::LINE_BOTTOM: 431 rRect.Top() = aParaPrtArea.Top(); 432 rRect.Bottom() = aDrawObj.Bottom(); 433 break; 434 435 case VertOrientation::CHAR_TOP: 436 case VertOrientation::CHAR_CENTER: 437 case VertOrientation::CHAR_BOTTOM: 438 rRect.Top() = aParaPrtArea.Top(); 439 rRect.Bottom() = aParaPrtArea.Bottom(); 440 break; 441 } 442 break; 443 444 default: 445 break; 446 } 447 } 448 449 Rectangle SvxSwFrameExample::DrawInnerFrame_Impl(const Rectangle &rRect, const Color &rFillColor, const Color &rBorderColor) 450 { 451 DrawRect_Impl(rRect, rFillColor, rBorderColor); 452 453 // Bereich, zu dem relativ positioniert wird, bestimmen 454 Rectangle aRect(rRect); // aPagePrtArea = Default 455 CalcBoundRect_Impl(aRect); 456 457 if (nAnchor == TextContentAnchorType_AT_FRAME && &rRect == &aPagePrtArea) 458 { 459 // Testabsatz zeichnen 460 Rectangle aTxt(aTextLine); 461 sal_Int32 nStep = aTxt.GetHeight() + 2; 462 sal_uInt16 nLines = (sal_uInt16)(aParaPrtArea.GetHeight() / (aTextLine.GetHeight() + 2)); 463 464 for (sal_uInt16 i = 0; i < nLines; i++) 465 { 466 if (i == nLines - 1) 467 aTxt.SetSize(Size(aTxt.GetWidth() / 2, aTxt.GetHeight())); 468 DrawRect_Impl(aTxt, m_aTxtCol, m_aTransColor); 469 aTxt.Move(0, nStep); 470 } 471 } 472 473 return aRect; 474 } 475 476 void SvxSwFrameExample::Paint(const Rectangle&) 477 { 478 InitAllRects_Impl(); 479 480 // Schatten zeichnen 481 // Rectangle aShadow(aPage); 482 // aShadow += Point(3, 3); 483 // DrawRect_Impl(aShadow, Color(COL_GRAY), aTransColor); 484 485 // Seite zeichnen 486 DrawRect_Impl( aPage, m_aBgCol, m_aBorderCol ); 487 488 // PrintArea zeichnen 489 Rectangle aRect = DrawInnerFrame_Impl( aPagePrtArea, m_aTransColor, m_aPrintAreaCol ); 490 491 if (nAnchor == TextContentAnchorType_AT_FRAME) 492 aRect = DrawInnerFrame_Impl( aFrameAtFrame, m_aBgCol, m_aBorderCol ); 493 494 long lXPos = 0; 495 long lYPos = 0; 496 497 // Horizontale Ausrichtung 498 // 499 if (nAnchor != TextContentAnchorType_AS_CHARACTER) 500 { 501 switch (nHAlign) 502 { 503 case HoriOrientation::RIGHT: 504 { 505 lXPos = aRect.Right() - aFrmSize.Width() + 1; 506 break; 507 } 508 case HoriOrientation::CENTER: 509 { 510 lXPos = aRect.Left() + (aRect.GetWidth() - aFrmSize.Width()) / 2; 511 break; 512 } 513 case HoriOrientation::NONE: 514 { 515 lXPos = aRect.Left() + aRelPos.X(); 516 break; 517 } 518 519 default: // HoriOrientation::LEFT 520 lXPos = aRect.Left(); 521 break; 522 } 523 } 524 else 525 lXPos = aRect.Right() + 2; 526 527 // Vertikale Ausrichtung 528 // 529 if (nAnchor != TextContentAnchorType_AS_CHARACTER) 530 { 531 switch (nVAlign) 532 { 533 case VertOrientation::BOTTOM: 534 case VertOrientation::LINE_BOTTOM: 535 { 536 // OD 12.11.2003 #i22341# 537 if ( nVRel != RelOrientation::TEXT_LINE ) 538 { 539 lYPos = aRect.Bottom() - aFrmSize.Height() + 1; 540 } 541 else 542 { 543 lYPos = aRect.Top(); 544 } 545 break; 546 } 547 case VertOrientation::CENTER: 548 case VertOrientation::LINE_CENTER: 549 { 550 lYPos = aRect.Top() + (aRect.GetHeight() - aFrmSize.Height()) / 2; 551 break; 552 } 553 case VertOrientation::NONE: 554 { 555 // OD 12.11.2003 #i22341# 556 if ( nVRel != RelOrientation::CHAR && nVRel != RelOrientation::TEXT_LINE ) 557 lYPos = aRect.Top() + aRelPos.Y(); 558 else 559 lYPos = aRect.Top() - aRelPos.Y(); 560 break; 561 } 562 default: 563 // OD 12.11.2003 #i22341# 564 if ( nVRel != RelOrientation::TEXT_LINE ) 565 { 566 lYPos = aRect.Top(); 567 } 568 else 569 { 570 lYPos = aRect.Bottom() - aFrmSize.Height() + 1; 571 } 572 break; 573 } 574 } 575 else 576 { 577 switch(nVAlign) 578 { 579 case VertOrientation::CENTER: 580 case VertOrientation::CHAR_CENTER: 581 case VertOrientation::LINE_CENTER: 582 lYPos = aRect.Top() + (aRect.GetHeight() - aFrmSize.Height()) / 2; 583 break; 584 585 case VertOrientation::TOP: 586 case VertOrientation::CHAR_BOTTOM: 587 case VertOrientation::LINE_BOTTOM: 588 lYPos = aRect.Bottom() - aFrmSize.Height() + 1; 589 break; 590 591 /* case VertOrientation::NONE: 592 case VertOrientation::BOTTOM: 593 case VertOrientation::CHAR_TOP: 594 case VertOrientation::LINE_TOP:*/ 595 default: 596 lYPos = aRect.Top() - aRelPos.Y(); 597 break; 598 } 599 } 600 601 Rectangle aFrmRect(Point(lXPos, lYPos), aFrmSize); 602 603 Rectangle *pOuterFrame = &aPage; 604 605 if (nAnchor == TextContentAnchorType_AT_FRAME) 606 pOuterFrame = &aFrameAtFrame; 607 608 if (aFrmRect.Left() < pOuterFrame->Left()) 609 aFrmRect.Move(pOuterFrame->Left() - aFrmRect.Left(), 0); 610 if (aFrmRect.Right() > pOuterFrame->Right()) 611 aFrmRect.Move(pOuterFrame->Right() - aFrmRect.Right(), 0); 612 613 if (aFrmRect.Top() < pOuterFrame->Top()) 614 aFrmRect.Move(0, pOuterFrame->Top() - aFrmRect.Top()); 615 if (aFrmRect.Bottom() > pOuterFrame->Bottom()) 616 aFrmRect.Move(0, pOuterFrame->Bottom() - aFrmRect.Bottom()); 617 618 // Testabsatz zeichnen 619 const long nTxtLineHeight = aTextLine.GetHeight(); 620 Rectangle aTxt(aTextLine); 621 sal_Int32 nStep; 622 sal_uInt16 nLines; 623 624 if (nAnchor == TextContentAnchorType_AT_FRAME) 625 { 626 aTxt.Left() = aFrameAtFrame.Left() + FLYINFLY_BORDER; 627 aTxt.Right() = aFrameAtFrame.Right() - FLYINFLY_BORDER; 628 aTxt.Top() = aFrameAtFrame.Top() + FLYINFLY_BORDER; 629 aTxt.Bottom() = aTxt.Top() + aTextLine.GetHeight() - 1; 630 631 nStep = aTxt.GetHeight() + 2; 632 nLines = (sal_uInt16)(((aFrameAtFrame.GetHeight() - 2 * FLYINFLY_BORDER) * 2 / 3) 633 / (aTxt.GetHeight() + 2)); 634 } 635 else 636 { 637 nStep = aTxt.GetHeight() + 2; 638 nLines = (sal_uInt16)(aParaPrtArea.GetHeight() / (aTextLine.GetHeight() + 2)); 639 } 640 641 if (nAnchor != TextContentAnchorType_AS_CHARACTER) 642 { 643 // Text simulieren 644 // 645 const long nOldR = aTxt.Right(); 646 const long nOldL = aTxt.Left(); 647 648 // OD 12.11.2003 #i22341# 649 const bool bIgnoreWrap = nAnchor == TextContentAnchorType_AT_CHARACTER && 650 ( nHRel == RelOrientation::CHAR || nVRel == RelOrientation::CHAR || 651 nVRel == RelOrientation::TEXT_LINE ); 652 653 for (sal_uInt16 i = 0; i < nLines; ++i) 654 { 655 if (i == (nLines - 1)) 656 aTxt.SetSize(Size(aTxt.GetWidth() / 2, aTxt.GetHeight())); 657 658 if (aTxt.IsOver(aFrmRect) && nAnchor != TextContentAnchorType_AS_CHARACTER && !bIgnoreWrap) 659 { 660 switch(nWrap) 661 { 662 case WrapTextMode_NONE: 663 aTxt.Top() = aFrmRect.Bottom() + nTxtLineHeight; 664 aTxt.Bottom() = aTxt.Top() + nTxtLineHeight - 1; 665 break; 666 667 case WrapTextMode_LEFT: 668 aTxt.Right() = aFrmRect.Left(); 669 break; 670 671 case WrapTextMode_RIGHT: 672 aTxt.Left() = aFrmRect.Right(); 673 break; 674 } 675 } 676 if (pOuterFrame->IsInside(aTxt)) 677 DrawRect_Impl( aTxt, m_aTxtCol, m_aTransColor ); 678 679 aTxt.Move(0, nStep); 680 aTxt.Right() = nOldR; 681 aTxt.Left() = nOldL; 682 } 683 aTxt.Move(0, -nStep); 684 685 if (nAnchor != TextContentAnchorType_AT_FRAME && aTxt.Bottom() > aParaPrtArea.Bottom()) 686 { 687 // Text wurde durch Rahmen verdraengt, daher Para-Hoehe anpassen 688 sal_uIntPtr nDiff = aTxt.Bottom() - aParaPrtArea.Bottom(); 689 aParaPrtArea.Bottom() += nDiff; 690 aPara.Bottom() += nDiff; 691 692 CalcBoundRect_Impl(aRect); 693 694 aParaPrtArea.Bottom() -= nDiff; 695 aPara.Bottom() -= nDiff; 696 } 697 if (nAnchor == TextContentAnchorType_AT_CHARACTER && bIgnoreWrap) 698 DrawText(aAutoCharFrame, 'A'); 699 } 700 else 701 { 702 DrawText(aParaPrtArea, C2S(DEMOTEXT)); 703 DrawRect_Impl(aDrawObj, m_aBlankCol, m_aBlankFrameCol ); 704 } 705 706 // Rechteck zeichnen, zu dem der Rahmen ausgerichtet wird: 707 DrawRect_Impl(aRect, m_aTransColor, m_aAlignColor); 708 709 // Frame anzeigen 710 sal_Bool bDontFill = (nAnchor == TextContentAnchorType_AT_CHARACTER && aFrmRect.IsOver(aAutoCharFrame)) ? sal_True : bTrans; 711 DrawRect_Impl( aFrmRect, bDontFill? m_aTransColor : m_aBgCol, m_aFrameColor ); 712 } 713 714 void SvxSwFrameExample::SetRelPos(const Point& rP) 715 { 716 aRelPos = rP; 717 718 if (aRelPos.X() > 0) 719 aRelPos.X() = 5; 720 if (aRelPos.X() < 0) 721 aRelPos.X() = -5; 722 723 if (aRelPos.Y() > 0) 724 aRelPos.Y() = 5; 725 if (aRelPos.Y() < 0) 726 aRelPos.Y() = -5; 727 } 728 729 void SvxSwFrameExample::DrawRect_Impl(const Rectangle &rRect, const Color &rFillColor, const Color &rLineColor) 730 { 731 SetFillColor(rFillColor); 732 SetLineColor(rLineColor); 733 Window::DrawRect(rRect); 734 } 735 736 737 738