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 // MARKER(update_precomp.py): autogen include statement, do not remove 23 #include "precompiled_sw.hxx" 24 25 #include <hintids.hxx> 26 #include <tools/urlobj.hxx> 27 #include <vcl/print.hxx> 28 #include <vcl/virdev.hxx> 29 #include <vcl/svapp.hxx> 30 #include <svtools/imapobj.hxx> 31 #include <svtools/imap.hxx> 32 #include <svl/urihelper.hxx> 33 #include <svtools/soerr.hxx> 34 #include <sfx2/progress.hxx> 35 #include <sfx2/docfile.hxx> 36 #include <sfx2/linkmgr.hxx> 37 #include <sfx2/printer.hxx> 38 #include <editeng/udlnitem.hxx> 39 #include <editeng/colritem.hxx> 40 #include <svx/xoutbmp.hxx> 41 #include <vcl/window.hxx> 42 #include <fmturl.hxx> 43 #include <fmtsrnd.hxx> 44 #include <frmfmt.hxx> 45 #include <swrect.hxx> 46 #include <fesh.hxx> 47 #include <doc.hxx> 48 #include <flyfrm.hxx> 49 #include <frmtool.hxx> 50 #include <viewopt.hxx> 51 #include <viewimp.hxx> 52 #include <pam.hxx> 53 #include <hints.hxx> 54 #include <rootfrm.hxx> 55 #include <dflyobj.hxx> 56 #include <pagefrm.hxx> 57 #include <notxtfrm.hxx> 58 #include <grfatr.hxx> 59 #include <charatr.hxx> 60 #include <fmtornt.hxx> 61 #include <ndnotxt.hxx> 62 #include <ndgrf.hxx> 63 #include <ndole.hxx> 64 #include <swregion.hxx> 65 #include <poolfmt.hxx> 66 #include <mdiexp.hxx> 67 #include <swwait.hxx> 68 #include <comcore.hrc> 69 #include <accessibilityoptions.hxx> 70 #include <com/sun/star/embed/EmbedMisc.hpp> 71 #include <com/sun/star/embed/EmbedStates.hpp> 72 #include <svtools/embedhlp.hxx> 73 #include <svx/charthelper.hxx> 74 #include <dview.hxx> 75 #include <basegfx/matrix/b2dhommatrix.hxx> 76 #include <drawinglayer/processor2d/baseprocessor2d.hxx> 77 #include <basegfx/matrix/b2dhommatrixtools.hxx> 78 #include <drawinglayer/processor2d/processor2dtools.hxx> 79 #include <basegfx/matrix/b2dhommatrixtools.hxx> 80 #include <drawinglayer/primitive2d/graphicprimitive2d.hxx> 81 #include <vcl/pdfextoutdevdata.hxx> 82 #include <svtools/filter.hxx> 83 84 using namespace com::sun::star; 85 86 #define DEFTEXTSIZE 12 87 88 extern void ClrContourCache( const SdrObject *pObj ); // TxtFly.Cxx 89 90 91 inline sal_Bool GetRealURL( const SwGrfNode& rNd, String& rTxt ) 92 { 93 sal_Bool bRet = rNd.GetFileFilterNms( &rTxt, 0 ); 94 if( bRet ) 95 rTxt = URIHelper::removePassword( rTxt, INetURLObject::WAS_ENCODED, 96 INetURLObject::DECODE_UNAMBIGUOUS); 97 return bRet; 98 } 99 100 void lcl_PaintReplacement( const SwRect &rRect, const String &rText, 101 const ViewShell &rSh, const SwNoTxtFrm *pFrm, 102 sal_Bool bDefect ) 103 { 104 static Font *pFont = 0; 105 if ( !pFont ) 106 { 107 pFont = new Font(); 108 pFont->SetWeight( WEIGHT_BOLD ); 109 pFont->SetStyleName( aEmptyStr ); 110 pFont->SetName( String::CreateFromAscii( 111 RTL_CONSTASCII_STRINGPARAM( "Arial Unicode" ))); 112 pFont->SetFamily( FAMILY_SWISS ); 113 pFont->SetTransparent( sal_True ); 114 } 115 116 Color aCol( COL_RED ); 117 FontUnderline eUnderline = UNDERLINE_NONE; 118 const SwFmtURL &rURL = pFrm->FindFlyFrm()->GetFmt()->GetURL(); 119 if( rURL.GetURL().Len() || rURL.GetMap() ) 120 { 121 sal_Bool bVisited = sal_False; 122 if ( rURL.GetMap() ) 123 { 124 ImageMap *pMap = (ImageMap*)rURL.GetMap(); 125 for( sal_uInt16 i = 0; i < pMap->GetIMapObjectCount(); i++ ) 126 { 127 IMapObject *pObj = pMap->GetIMapObject( i ); 128 if( rSh.GetDoc()->IsVisitedURL( pObj->GetURL() ) ) 129 { 130 bVisited = sal_True; 131 break; 132 } 133 } 134 } 135 else if ( rURL.GetURL().Len() ) 136 bVisited = rSh.GetDoc()->IsVisitedURL( rURL.GetURL() ); 137 138 SwFmt *pFmt = rSh.GetDoc()->GetFmtFromPool( static_cast<sal_uInt16> 139 (bVisited ? RES_POOLCHR_INET_VISIT : RES_POOLCHR_INET_NORMAL ) ); 140 aCol = pFmt->GetColor().GetValue(); 141 eUnderline = pFmt->GetUnderline().GetLineStyle(); 142 } 143 144 pFont->SetUnderline( eUnderline ); 145 pFont->SetColor( aCol ); 146 147 const BitmapEx& rBmp = ViewShell::GetReplacementBitmap( bDefect != sal_False ); 148 Graphic::DrawEx( rSh.GetOut(), rText, *pFont, rBmp, rRect.Pos(), rRect.SSize() ); 149 } 150 151 /************************************************************************* 152 |* 153 |* SwGrfFrm::SwGrfFrm(ViewShell * const,SwGrfNode *) 154 |* 155 |* Beschreibung 156 |* Ersterstellung JP 05.03.91 157 |* Letzte Aenderung MA 03. Mar. 93 158 |* 159 *************************************************************************/ 160 161 162 SwNoTxtFrm::SwNoTxtFrm(SwNoTxtNode * const pNode, SwFrm* pSib ) 163 : SwCntntFrm( pNode, pSib ) 164 { 165 InitCtor(); 166 } 167 168 // Initialisierung: z.Zt. Eintragen des Frames im Cache 169 170 171 void SwNoTxtFrm::InitCtor() 172 { 173 nType = FRMC_NOTXT; 174 // Das Gewicht der Grafik ist 0, wenn sie noch nicht 175 // gelesen ist, < 0, wenn ein Lesefehler auftrat und 176 // Ersatzdarstellung angewendet werden musste und >0, 177 // wenn sie zur Verfuegung steht. 178 nWeight = 0; 179 } 180 181 /************************************************************************* 182 |* 183 |* SwNoTxtNode::MakeFrm() 184 |* 185 |* Beschreibung 186 |* Ersterstellung JP 05.03.91 187 |* Letzte Aenderung MA 03. Mar. 93 188 |* 189 *************************************************************************/ 190 191 192 SwCntntFrm *SwNoTxtNode::MakeFrm( SwFrm* pSib ) 193 { 194 return new SwNoTxtFrm(this, pSib); 195 } 196 197 /************************************************************************* 198 |* 199 |* SwNoTxtFrm::~SwNoTxtFrm() 200 |* 201 |* Beschreibung 202 |* Ersterstellung JP 05.03.91 203 |* Letzte Aenderung MA 30. Apr. 96 204 |* 205 *************************************************************************/ 206 207 SwNoTxtFrm::~SwNoTxtFrm() 208 { 209 StopAnimation(); 210 } 211 212 /************************************************************************* 213 |* 214 |* void SwNoTxtFrm::Modify( SwHint * pOld, SwHint * pNew ) 215 |* 216 |* Beschreibung 217 |* Ersterstellung JP 05.03.91 218 |* Letzte Aenderung JP 05.03.91 219 |* 220 *************************************************************************/ 221 222 void SetOutDev( ViewShell *pSh, OutputDevice *pOut ) 223 { 224 pSh->pOut = pOut; 225 } 226 227 228 229 230 void lcl_ClearArea( const SwFrm &rFrm, 231 OutputDevice &rOut, const SwRect& rPtArea, 232 const SwRect &rGrfArea ) 233 { 234 SwRegionRects aRegion( rPtArea, 4, 4 ); 235 aRegion -= rGrfArea; 236 237 if ( aRegion.Count() ) 238 { 239 const SvxBrushItem *pItem; const Color *pCol; SwRect aOrigRect; 240 241 //UUUU 242 drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes; 243 244 if ( rFrm.GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigRect, sal_False ) ) 245 { 246 const bool bDone(::DrawFillAttributes(aFillAttributes, aOrigRect, rPtArea, rOut)); 247 248 if(!bDone) 249 { 250 for( sal_uInt16 i = 0; i < aRegion.Count(); ++i ) 251 { 252 ::DrawGraphic( pItem, &rOut, aOrigRect, aRegion[i] ); 253 } 254 } 255 } 256 else 257 { 258 // OD 2004-04-23 #116347# 259 rOut.Push( PUSH_FILLCOLOR|PUSH_LINECOLOR ); 260 rOut.SetFillColor( rFrm.getRootFrm()->GetCurrShell()->Imp()->GetRetoucheColor()); 261 rOut.SetLineColor(); 262 for( sal_uInt16 i = 0; i < aRegion.Count(); ++i ) 263 rOut.DrawRect( aRegion[i].SVRect() ); 264 rOut.Pop(); 265 } 266 } 267 } 268 269 /************************************************************************* 270 |* 271 |* void SwNoTxtFrm::Paint() 272 |* 273 |* Beschreibung 274 |* Ersterstellung JP 05.03.91 275 |* Letzte Aenderung MA 10. Jan. 97 276 |* 277 *************************************************************************/ 278 279 void SwNoTxtFrm::Paint(SwRect const& rRect, SwPrintData const*const) const 280 { 281 if ( Frm().IsEmpty() ) 282 return; 283 284 const ViewShell* pSh = getRootFrm()->GetCurrShell(); 285 if( !pSh->GetViewOptions()->IsGraphic() ) 286 { 287 StopAnimation(); 288 // OD 10.01.2003 #i6467# - no paint of placeholder for page preview 289 if ( pSh->GetWin() && !pSh->IsPreView() ) 290 { 291 const SwNoTxtNode* pNd = GetNode()->GetNoTxtNode(); 292 String aTxt( pNd->GetTitle() ); 293 if ( !aTxt.Len() && pNd->IsGrfNode() ) 294 GetRealURL( *(SwGrfNode*)pNd, aTxt ); 295 if( !aTxt.Len() ) 296 aTxt = FindFlyFrm()->GetFmt()->GetName(); 297 lcl_PaintReplacement( Frm(), aTxt, *pSh, this, sal_False ); 298 } 299 return; 300 } 301 302 if( pSh->GetAccessibilityOptions()->IsStopAnimatedGraphics() || 303 // --> FME 2004-06-21 #i9684# Stop animation during printing/pdf export 304 !pSh->GetWin() ) 305 // <-- 306 StopAnimation(); 307 308 SfxProgress::EnterLock(); //Keine Progress-Reschedules im Paint (SwapIn) 309 310 OutputDevice *pOut = pSh->GetOut(); 311 pOut->Push(); 312 sal_Bool bClip = sal_True; 313 PolyPolygon aPoly; 314 315 SwNoTxtNode& rNoTNd = *(SwNoTxtNode*)GetNode(); 316 SwGrfNode* pGrfNd = rNoTNd.GetGrfNode(); 317 if( pGrfNd ) 318 pGrfNd->SetFrameInPaint( sal_True ); 319 320 // OD 16.04.2003 #i13147# - add 2nd parameter with value <sal_True> to 321 // method call <FindFlyFrm().GetContour(..)> to indicate that it is called 322 // for paint in order to avoid load of the intrinsic graphic. 323 if ( ( !pOut->GetConnectMetaFile() || 324 !pSh->GetWin() ) && 325 FindFlyFrm()->GetContour( aPoly, sal_True ) 326 ) 327 { 328 pOut->SetClipRegion( aPoly ); 329 bClip = sal_False; 330 } 331 332 SwRect aOrigPaint( rRect ); 333 if ( HasAnimation() && pSh->GetWin() ) 334 { 335 aOrigPaint = Frm(); aOrigPaint += Prt().Pos(); 336 } 337 338 SwRect aGrfArea( Frm() ); 339 SwRect aPaintArea( aGrfArea ); 340 aPaintArea._Intersection( aOrigPaint ); 341 342 SwRect aNormal( Frm().Pos() + Prt().Pos(), Prt().SSize() ); 343 aNormal.Justify(); //Normalisiertes Rechteck fuer die Vergleiche 344 345 if( aPaintArea.IsOver( aNormal ) ) 346 { 347 // berechne die 4 zu loeschenden Rechtecke 348 if( pSh->GetWin() ) 349 ::lcl_ClearArea( *this, *pSh->GetOut(), aPaintArea, aNormal ); 350 351 // in der Schnittmenge vom PaintBereich und der Bitmap liegt 352 // der absolut sichtbare Bereich vom Frame 353 aPaintArea._Intersection( aNormal ); 354 355 if ( bClip ) 356 pOut->IntersectClipRegion( aPaintArea.SVRect() ); 357 /// OD 25.09.2002 #99739# - delete unused 3rd parameter 358 PaintPicture( pOut, aGrfArea ); 359 } 360 else 361 // wenn nicht sichtbar, loesche einfach den angegebenen Bereich 362 lcl_ClearArea( *this, *pSh->GetOut(), aPaintArea, SwRect() ); 363 if( pGrfNd ) 364 pGrfNd->SetFrameInPaint( sal_False ); 365 366 pOut->Pop(); 367 SfxProgress::LeaveLock(); 368 } 369 370 /************************************************************************* 371 |* 372 |* void lcl_CalcRect( Point & aPt, Size & aDim, 373 |* sal_uInt16 nMirror ) 374 |* 375 |* Beschreibung Errechne die Position und die Groesse der Grafik im 376 |* Frame, entsprechen der aktuellen Grafik-Attribute 377 |* 378 |* Parameter Point& die Position im Frame ( auch Return-Wert ) 379 |* Size& die Groesse der Grafik ( auch Return-Wert ) 380 |* MirrorGrf akt. Spiegelungs-Attribut 381 |* Ersterstellung JP 04.03.91 382 |* Letzte Aenderung JP 31.08.94 383 |* 384 *************************************************************************/ 385 386 387 void lcl_CalcRect( Point& rPt, Size& rDim, sal_uInt16 nMirror ) 388 { 389 if( nMirror == RES_MIRROR_GRAPH_VERT || nMirror == RES_MIRROR_GRAPH_BOTH ) 390 { 391 rPt.X() += rDim.Width() -1; 392 rDim.Width() = -rDim.Width(); 393 } 394 395 if( nMirror == RES_MIRROR_GRAPH_HOR || nMirror == RES_MIRROR_GRAPH_BOTH ) 396 { 397 rPt.Y() += rDim.Height() -1; 398 rDim.Height() = -rDim.Height(); 399 } 400 } 401 402 /************************************************************************* 403 |* 404 |* void SwNoTxtFrm::GetGrfArea() 405 |* 406 |* Beschreibung Errechne die Position und die Groesse der Bitmap 407 |* innerhalb des uebergebenem Rechtecks. 408 |* 409 |* Ersterstellung JP 03.09.91 410 |* Letzte Aenderung MA 11. Oct. 94 411 |* 412 *************************************************************************/ 413 414 void SwNoTxtFrm::GetGrfArea( SwRect &rRect, SwRect* pOrigRect, 415 sal_Bool ) const 416 { 417 // JP 23.01.2001: currently only used for scaling, cropping and mirroring 418 // the contour of graphics! 419 // all other is handled by the GraphicObject 420 421 //In rRect wird das sichbare Rechteck der Grafik gesteckt. 422 //In pOrigRect werden Pos+Size der Gesamtgrafik gesteck. 423 424 const SwAttrSet& rAttrSet = GetNode()->GetSwAttrSet(); 425 const SwCropGrf& rCrop = rAttrSet.GetCropGrf(); 426 sal_uInt16 nMirror = rAttrSet.GetMirrorGrf().GetValue(); 427 428 if( rAttrSet.GetMirrorGrf().IsGrfToggle() ) 429 { 430 if( !(FindPageFrm()->GetVirtPageNum() % 2) ) 431 { 432 switch ( nMirror ) 433 { 434 case RES_MIRROR_GRAPH_DONT: nMirror = RES_MIRROR_GRAPH_VERT; break; 435 case RES_MIRROR_GRAPH_VERT: nMirror = RES_MIRROR_GRAPH_DONT; break; 436 case RES_MIRROR_GRAPH_HOR: nMirror = RES_MIRROR_GRAPH_BOTH; break; 437 default: nMirror = RES_MIRROR_GRAPH_HOR; break; 438 } 439 } 440 } 441 442 //Grafik wird vom Node eingelesen falls notwendig. Kann aber schiefgehen. 443 long nLeftCrop, nRightCrop, nTopCrop, nBottomCrop; 444 Size aOrigSz( ((SwNoTxtNode*)GetNode())->GetTwipSize() ); 445 if ( !aOrigSz.Width() ) 446 { 447 aOrigSz.Width() = Prt().Width(); 448 nLeftCrop = -rCrop.GetLeft(); 449 nRightCrop = -rCrop.GetRight(); 450 } 451 else 452 { 453 nLeftCrop = Max( aOrigSz.Width() - 454 (rCrop.GetRight() + rCrop.GetLeft()), long(1) ); 455 const double nScale = double(Prt().Width()) / double(nLeftCrop); 456 nLeftCrop = long(nScale * -rCrop.GetLeft() ); 457 nRightCrop = long(nScale * -rCrop.GetRight() ); 458 } 459 460 // crop values have to be mirrored too 461 if( nMirror == RES_MIRROR_GRAPH_VERT || nMirror == RES_MIRROR_GRAPH_BOTH ) 462 { 463 long nTmpCrop = nLeftCrop; 464 nLeftCrop = nRightCrop; 465 nRightCrop= nTmpCrop; 466 } 467 468 if( !aOrigSz.Height() ) 469 { 470 aOrigSz.Height() = Prt().Height(); 471 nTopCrop = -rCrop.GetTop(); 472 nBottomCrop= -rCrop.GetBottom(); 473 } 474 else 475 { 476 nTopCrop = Max( aOrigSz.Height() - (rCrop.GetTop() + rCrop.GetBottom()), long(1) ); 477 const double nScale = double(Prt().Height()) / double(nTopCrop); 478 nTopCrop = long(nScale * -rCrop.GetTop() ); 479 nBottomCrop= long(nScale * -rCrop.GetBottom() ); 480 } 481 482 // crop values have to be mirrored too 483 if( nMirror == RES_MIRROR_GRAPH_HOR || nMirror == RES_MIRROR_GRAPH_BOTH ) 484 { 485 long nTmpCrop = nTopCrop; 486 nTopCrop = nBottomCrop; 487 nBottomCrop= nTmpCrop; 488 } 489 490 Size aVisSz( Prt().SSize() ); 491 Size aGrfSz( aVisSz ); 492 Point aVisPt( Frm().Pos() + Prt().Pos() ); 493 Point aGrfPt( aVisPt ); 494 495 //Erst das 'sichtbare' Rect einstellen. 496 if ( nLeftCrop > 0 ) 497 { 498 aVisPt.X() += nLeftCrop; 499 aVisSz.Width() -= nLeftCrop; 500 } 501 if ( nTopCrop > 0 ) 502 { 503 aVisPt.Y() += nTopCrop; 504 aVisSz.Height() -= nTopCrop; 505 } 506 if ( nRightCrop > 0 ) 507 aVisSz.Width() -= nRightCrop; 508 if ( nBottomCrop > 0 ) 509 aVisSz.Height() -= nBottomCrop; 510 511 rRect.Pos ( aVisPt ); 512 rRect.SSize( aVisSz ); 513 514 //Ggf. Die Gesamtgrafik berechnen 515 if ( pOrigRect ) 516 { 517 Size aTmpSz( aGrfSz ); 518 aGrfPt.X() += nLeftCrop; 519 aTmpSz.Width() -= nLeftCrop + nRightCrop; 520 aGrfPt.Y() += nTopCrop; 521 aTmpSz.Height()-= nTopCrop + nBottomCrop; 522 523 if( RES_MIRROR_GRAPH_DONT != nMirror ) 524 lcl_CalcRect( aGrfPt, aTmpSz, nMirror ); 525 526 pOrigRect->Pos ( aGrfPt ); 527 pOrigRect->SSize( aTmpSz ); 528 } 529 } 530 531 /************************************************************************* 532 |* 533 |* Size SwNoTxtFrm::GetSize() 534 |* 535 |* Beschreibung Gebe die Groesse des umgebenen FLys und 536 |* damit die der Grafik zurueck. 537 |* Ersterstellung JP 04.03.91 538 |* Letzte Aenderung JP 31.08.94 539 |* 540 *************************************************************************/ 541 542 543 const Size& SwNoTxtFrm::GetSize() const 544 { 545 // gebe die Groesse des Frames zurueck 546 const SwFrm *pFly = FindFlyFrm(); 547 if( !pFly ) 548 pFly = this; 549 return pFly->Prt().SSize(); 550 } 551 552 /************************************************************************* 553 |* 554 |* SwNoTxtFrm::MakeAll() 555 |* 556 |* Ersterstellung MA 29. Nov. 96 557 |* Letzte Aenderung MA 29. Nov. 96 558 |* 559 *************************************************************************/ 560 561 562 void SwNoTxtFrm::MakeAll() 563 { 564 SwCntntNotify aNotify( this ); 565 SwBorderAttrAccess aAccess( SwFrm::GetCache(), this ); 566 const SwBorderAttrs &rAttrs = *aAccess.Get(); 567 568 while ( !bValidPos || !bValidSize || !bValidPrtArea ) 569 { 570 MakePos(); 571 572 if ( !bValidSize ) 573 Frm().Width( GetUpper()->Prt().Width() ); 574 575 MakePrtArea( rAttrs ); 576 577 if ( !bValidSize ) 578 { bValidSize = sal_True; 579 Format(); 580 } 581 } 582 } 583 584 /************************************************************************* 585 |* 586 |* SwNoTxtFrm::Format() 587 |* 588 |* Beschreibung Errechne die Groesse der Bitmap, wenn noetig 589 |* Ersterstellung JP 11.03.91 590 |* Letzte Aenderung MA 13. Mar. 96 591 |* 592 *************************************************************************/ 593 594 595 void SwNoTxtFrm::Format( const SwBorderAttrs * ) 596 { 597 const Size aNewSize( GetSize() ); 598 599 // hat sich die Hoehe geaendert? 600 SwTwips nChgHght = IsVertical() ? 601 (SwTwips)(aNewSize.Width() - Prt().Width()) : 602 (SwTwips)(aNewSize.Height() - Prt().Height()); 603 if( nChgHght > 0) 604 Grow( nChgHght ); 605 else if( nChgHght < 0) 606 Shrink( Min(Prt().Height(), -nChgHght) ); 607 } 608 609 /************************************************************************* 610 |* 611 |* SwNoTxtFrm::GetCharRect() 612 |* 613 |* Beschreibung 614 |* Ersterstellung SS 29-Apr-1991 615 |* Letzte Aenderung MA 10. Oct. 94 616 |* 617 |*************************************************************************/ 618 619 620 sal_Bool SwNoTxtFrm::GetCharRect( SwRect &rRect, const SwPosition& rPos, 621 SwCrsrMoveState *pCMS ) const 622 { 623 if ( &rPos.nNode.GetNode() != (SwNode*)GetNode() ) 624 return sal_False; 625 626 Calc(); 627 SwRect aFrameRect( Frm() ); 628 rRect = aFrameRect; 629 rRect.Pos( Frm().Pos() + Prt().Pos() ); 630 rRect.SSize( Prt().SSize() ); 631 632 rRect.Justify(); 633 634 // liegt die Bitmap ueberhaupt im sichtbaren Berich ? 635 if( !aFrameRect.IsOver( rRect ) ) 636 { 637 // wenn nicht dann steht der Cursor auf dem Frame 638 rRect = aFrameRect; 639 rRect.Width( 1 ); 640 } 641 else 642 rRect._Intersection( aFrameRect ); 643 644 if ( pCMS ) 645 { 646 if ( pCMS->bRealHeight ) 647 { 648 pCMS->aRealHeight.Y() = rRect.Height(); 649 pCMS->aRealHeight.X() = 0; 650 } 651 } 652 653 return sal_True; 654 } 655 656 657 sal_Bool SwNoTxtFrm::GetCrsrOfst(SwPosition* pPos, Point& , 658 SwCrsrMoveState* ) const 659 { 660 SwCntntNode* pCNd = (SwCntntNode*)GetNode(); 661 pPos->nNode = *pCNd; 662 pPos->nContent.Assign( pCNd, 0 ); 663 return sal_True; 664 } 665 666 #define CLEARCACHE( pNd ) {\ 667 (pNd)->ReleaseGraphicFromCache();\ 668 SwFlyFrm* pFly = FindFlyFrm();\ 669 if( pFly && pFly->GetFmt()->GetSurround().IsContour() )\ 670 {\ 671 ClrContourCache( pFly->GetVirtDrawObj() );\ 672 pFly->NotifyBackground( FindPageFrm(), Prt(), PREP_FLY_ATTR_CHG );\ 673 }\ 674 } 675 676 void SwNoTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) 677 { 678 sal_uInt16 nWhich = pNew ? pNew->Which() : pOld ? pOld->Which() : 0; 679 680 // --> OD 2007-03-06 #i73788# 681 // no <SwCntntFrm::Modify(..)> for RES_LINKED_GRAPHIC_STREAM_ARRIVED 682 if ( RES_GRAPHIC_PIECE_ARRIVED != nWhich && 683 RES_GRAPHIC_ARRIVED != nWhich && 684 RES_GRF_REREAD_AND_INCACHE != nWhich && 685 RES_LINKED_GRAPHIC_STREAM_ARRIVED != nWhich ) 686 // <-- 687 { 688 SwCntntFrm::Modify( pOld, pNew ); 689 } 690 691 sal_Bool bComplete = sal_True; 692 693 switch( nWhich ) 694 { 695 case RES_OBJECTDYING: 696 break; 697 698 case RES_GRF_REREAD_AND_INCACHE: 699 if( ND_GRFNODE == GetNode()->GetNodeType() ) 700 { 701 bComplete = sal_False; 702 SwGrfNode* pNd = (SwGrfNode*) GetNode(); 703 704 ViewShell *pVSh = 0; 705 pNd->GetDoc()->GetEditShell( &pVSh ); 706 if( pVSh ) 707 { 708 GraphicAttr aAttr; 709 if( pNd->GetGrfObj().IsCached( pVSh->GetOut(), Point(), 710 Prt().SSize(), &pNd->GetGraphicAttr( aAttr, this ) )) 711 { 712 ViewShell *pSh = pVSh; 713 do { 714 SET_CURR_SHELL( pSh ); 715 if( pSh->GetWin() ) 716 { 717 if( pSh->IsPreView() ) 718 ::RepaintPagePreview( pSh, Frm().SVRect() ); 719 else 720 pSh->GetWin()->Invalidate( Frm().SVRect() ); 721 } 722 } while( pVSh != (pSh = (ViewShell*)pSh->GetNext() )); 723 } 724 else 725 pNd->SwapIn(); 726 } 727 } 728 break; 729 730 case RES_UPDATE_ATTR: 731 case RES_FMT_CHG: 732 CLEARCACHE( (SwGrfNode*) GetNode() ) 733 break; 734 735 case RES_ATTRSET_CHG: 736 { 737 sal_uInt16 n; 738 for( n = RES_GRFATR_BEGIN; n < RES_GRFATR_END; ++n ) 739 if( SFX_ITEM_SET == ((SwAttrSetChg*)pOld)->GetChgSet()-> 740 GetItemState( n, sal_False )) 741 { 742 CLEARCACHE( (SwGrfNode*) GetNode() ) 743 break; 744 } 745 if( RES_GRFATR_END == n ) // not found 746 return ; 747 } 748 break; 749 750 case RES_GRAPHIC_PIECE_ARRIVED: 751 case RES_GRAPHIC_ARRIVED: 752 // --> OD 2007-03-06 #i73788# 753 // handle RES_LINKED_GRAPHIC_STREAM_ARRIVED as RES_GRAPHIC_ARRIVED 754 case RES_LINKED_GRAPHIC_STREAM_ARRIVED: 755 // <-- 756 if ( GetNode()->GetNodeType() == ND_GRFNODE ) 757 { 758 bComplete = sal_False; 759 SwGrfNode* pNd = (SwGrfNode*) GetNode(); 760 761 CLEARCACHE( pNd ) 762 763 SwRect aRect( Frm() ); 764 765 ViewShell *pVSh = 0; 766 pNd->GetDoc()->GetEditShell( &pVSh ); 767 if( !pVSh ) 768 break; 769 770 ViewShell *pSh = pVSh; 771 do { 772 SET_CURR_SHELL( pSh ); 773 if( pSh->IsPreView() ) 774 { 775 if( pSh->GetWin() ) 776 ::RepaintPagePreview( pSh, aRect ); 777 } 778 else if ( pSh->VisArea().IsOver( aRect ) && 779 OUTDEV_WINDOW == pSh->GetOut()->GetOutDevType() ) 780 { 781 // OD 27.11.2002 #105519# - invalidate instead of painting 782 pSh->GetWin()->Invalidate( aRect.SVRect() ); 783 } 784 785 pSh = (ViewShell *)pSh->GetNext(); 786 } while( pSh != pVSh ); 787 } 788 break; 789 790 default: 791 if ( !pNew || !isGRFATR(nWhich) ) 792 return; 793 } 794 795 if( bComplete ) 796 { 797 InvalidatePrt(); 798 SetCompletePaint(); 799 } 800 } 801 802 void lcl_correctlyAlignRect( SwRect& rAlignedGrfArea, const SwRect& rInArea, OutputDevice* pOut ) 803 { 804 805 if(!pOut) 806 return; 807 Rectangle aPxRect = pOut->LogicToPixel( rInArea.SVRect() ); 808 Rectangle aNewPxRect( aPxRect ); 809 while( aNewPxRect.Left() < aPxRect.Left() ) 810 { 811 rAlignedGrfArea.Left( rAlignedGrfArea.Left()+1 ); 812 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 813 } 814 while( aNewPxRect.Top() < aPxRect.Top() ) 815 { 816 rAlignedGrfArea.Top( rAlignedGrfArea.Top()+1 ); 817 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 818 } 819 while( aNewPxRect.Bottom() > aPxRect.Bottom() ) 820 { 821 rAlignedGrfArea.Bottom( rAlignedGrfArea.Bottom()-1 ); 822 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 823 } 824 while( aNewPxRect.Right() > aPxRect.Right() ) 825 { 826 rAlignedGrfArea.Right( rAlignedGrfArea.Right()-1 ); 827 aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); 828 } 829 } 830 831 bool paintUsingPrimitivesHelper( 832 OutputDevice& rOutputDevice, 833 const drawinglayer::primitive2d::Primitive2DSequence& rSequence, 834 const basegfx::B2DRange& rSourceRange, 835 const basegfx::B2DRange& rTargetRange) 836 { 837 if(rSequence.hasElements() && !basegfx::fTools::equalZero(rSourceRange.getWidth()) && !basegfx::fTools::equalZero(rSourceRange.getHeight())) 838 { 839 if(!basegfx::fTools::equalZero(rTargetRange.getWidth()) && !basegfx::fTools::equalZero(rTargetRange.getHeight())) 840 { 841 // map graphic range to target range. This will e.g. automatically include 842 // tme mapping from 1/100th mm content to twips if needed when the target 843 // range is defined in twips 844 const basegfx::B2DHomMatrix aMappingTransform( 845 basegfx::tools::createSourceRangeTargetRangeTransform( 846 rSourceRange, 847 rTargetRange)); 848 849 // Fill ViewInformation. Use MappingTransform here, so there is no need to 850 // embed the primitives to it. Use original TargetRange here so there is also 851 // no need to embed the primitives to a MaskPrimitive for cropping. This works 852 // only in this case where the graphic object cannot be rotated, though. 853 const drawinglayer::geometry::ViewInformation2D aViewInformation2D( 854 aMappingTransform, 855 rOutputDevice.GetViewTransformation(), 856 rTargetRange, 857 0, 858 0.0, 859 uno::Sequence< beans::PropertyValue >()); 860 861 // get a primitive processor for rendering 862 drawinglayer::processor2d::BaseProcessor2D* pProcessor2D = drawinglayer::processor2d::createProcessor2DFromOutputDevice( 863 rOutputDevice, 864 aViewInformation2D); 865 866 if(pProcessor2D) 867 { 868 // render and cleanup 869 pProcessor2D->process(rSequence); 870 delete pProcessor2D; 871 return true; 872 } 873 } 874 } 875 876 return false; 877 } 878 879 // Ausgabe der Grafik. Hier wird entweder eine QuickDraw-Bmp oder 880 // eine Grafik vorausgesetzt. Ist nichts davon vorhanden, wird 881 // eine Ersatzdarstellung ausgegeben. 882 /// OD 25.09.2002 #99739# - delete unused 3rd parameter. 883 /// OD 25.09.2002 #99739# - use aligned rectangle for drawing graphic. 884 /// OD 25.09.2002 #99739# - pixel-align coordinations for drawing graphic. 885 void SwNoTxtFrm::PaintPicture( OutputDevice* pOut, const SwRect &rGrfArea ) const 886 { 887 ViewShell* pShell = getRootFrm()->GetCurrShell(); 888 889 SwNoTxtNode& rNoTNd = *(SwNoTxtNode*)GetNode(); 890 SwGrfNode* pGrfNd = rNoTNd.GetGrfNode(); 891 SwOLENode* pOLENd = rNoTNd.GetOLENode(); 892 893 const sal_Bool bPrn = pOut == rNoTNd.getIDocumentDeviceAccess()->getPrinter( false ) || 894 pOut->GetConnectMetaFile(); 895 896 const bool bIsChart = pOLENd && ChartHelper::IsChart( pOLENd->GetOLEObj().GetObject() ); 897 898 /// OD 25.09.2002 #99739# - calculate aligned rectangle from parameter <rGrfArea>. 899 /// Use aligned rectangle <aAlignedGrfArea> instead of <rGrfArea> in 900 /// the following code. 901 SwRect aAlignedGrfArea = rGrfArea; 902 ::SwAlignRect( aAlignedGrfArea, pShell ); 903 904 if( !bIsChart ) 905 { 906 /// OD 25.09.2002 #99739# 907 /// Because for drawing a graphic left-top-corner and size coordinations are 908 /// used, these coordinations have to be determined on pixel level. 909 ::SwAlignGrfRect( &aAlignedGrfArea, *pOut ); 910 } 911 else //if( bIsChart ) 912 { 913 //#i78025# charts own borders are not completely visible 914 //the above pixel correction is not correct - at least not for charts 915 //so a different pixel correction is chosen here 916 //this might be a good idea for all other OLE objects also, 917 //but as I cannot oversee the consequences I fix it only for charts for now 918 lcl_correctlyAlignRect( aAlignedGrfArea, rGrfArea, pOut ); 919 } 920 921 if( pGrfNd ) 922 { 923 sal_Bool bForceSwap = sal_False, bContinue = sal_True; 924 const GraphicObject& rGrfObj = pGrfNd->GetGrfObj(); 925 926 GraphicAttr aGrfAttr; 927 pGrfNd->GetGraphicAttr( aGrfAttr, this ); 928 929 if( !bPrn ) 930 { 931 // --> OD 2007-01-02 #i73788# 932 if ( pGrfNd->IsLinkedInputStreamReady() ) 933 { 934 pGrfNd->UpdateLinkWithInputStream(); 935 } 936 // <-- 937 // --> OD 2008-01-30 #i85717# 938 // --> OD 2008-07-21 #i90395# - check, if asynchronous retrieval 939 // if input stream for the graphic is possible 940 // else if( GRAPHIC_DEFAULT == rGrfObj.GetType() && 941 else if ( ( rGrfObj.GetType() == GRAPHIC_DEFAULT || 942 rGrfObj.GetType() == GRAPHIC_NONE ) && 943 pGrfNd->IsLinkedFile() && 944 pGrfNd->IsAsyncRetrieveInputStreamPossible() ) 945 // <-- 946 { 947 Size aTmpSz; 948 ::sfx2::SvLinkSource* pGrfObj = pGrfNd->GetLink()->GetObj(); 949 String aUrl; 950 GetRealURL( *pGrfNd, aUrl ); 951 if( !pGrfObj || 952 !pGrfObj->IsDataComplete() || 953 !(aTmpSz = pGrfNd->GetTwipSize()).Width() || 954 !aTmpSz.Height() || !pGrfNd->GetAutoFmtLvl() ) 955 { 956 ::sfx2::LinkManager& linkMgr = pShell->GetDoc()->GetLinkManager(); 957 if ( !linkMgr.urlIsVendor( aUrl ) && linkMgr.GetUserAllowsLinkUpdate( pShell->GetWin() ) ) { 958 // --> OD 2006-12-22 #i73788# 959 pGrfNd->TriggerAsyncRetrieveInputStream(); 960 // <-- 961 } 962 } 963 String aTxt( pGrfNd->GetTitle() ); 964 if ( !aTxt.Len() ) 965 aTxt = aUrl; 966 ::lcl_PaintReplacement( aAlignedGrfArea, aTxt, *pShell, this, sal_False ); 967 bContinue = sal_False; 968 } 969 } 970 971 if( bContinue ) 972 { 973 const sal_Bool bSwapped = rGrfObj.IsSwappedOut(); 974 const sal_Bool bSwappedIn = 0 != pGrfNd->SwapIn( bPrn ); 975 if( bSwappedIn && rGrfObj.GetGraphic().IsSupportedGraphic()) 976 { 977 const sal_Bool bAnimate = rGrfObj.IsAnimated() && 978 !pShell->IsPreView() && 979 !pShell->GetAccessibilityOptions()->IsStopAnimatedGraphics() && 980 // --> FME 2004-06-21 #i9684# Stop animation during printing/pdf export 981 pShell->GetWin(); 982 // <-- 983 984 if( bAnimate && 985 FindFlyFrm() != ::GetFlyFromMarked( 0, pShell )) 986 { 987 OutputDevice* pVout; 988 if( pOut == pShell->GetOut() && SwRootFrm::FlushVout() ) 989 pVout = pOut, pOut = pShell->GetOut(); 990 else if( pShell->GetWin() && 991 OUTDEV_VIRDEV == pOut->GetOutDevType() ) 992 pVout = pOut, pOut = pShell->GetWin(); 993 else 994 pVout = 0; 995 996 ASSERT( OUTDEV_VIRDEV != pOut->GetOutDevType() || 997 pShell->GetViewOptions()->IsPDFExport(), 998 "pOut sollte kein virtuelles Device sein" ); 999 1000 pGrfNd->StartGraphicAnimation(pOut, aAlignedGrfArea.Pos(), 1001 aAlignedGrfArea.SSize(), long(this), 1002 0, GRFMGR_DRAW_STANDARD, pVout ); 1003 } 1004 else 1005 { 1006 // unify using GraphicPrimitive2D 1007 // -> the primitive handles all crop and mirror stuff 1008 // -> the primitive renderer will create the needed pdf export data 1009 // -> if bitmap conent, it will be cached system-dependent 1010 const basegfx::B2DRange aTargetRange( 1011 aAlignedGrfArea.Left(), aAlignedGrfArea.Top(), 1012 aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom()); 1013 const basegfx::B2DHomMatrix aTargetTransform( 1014 basegfx::tools::createScaleTranslateB2DHomMatrix( 1015 aTargetRange.getRange(), 1016 aTargetRange.getMinimum())); 1017 drawinglayer::primitive2d::Primitive2DSequence aContent(1); 1018 bool bDone(false); 1019 1020 // #i125171# The mechanism to get lossless jpegs into pdf is based on having the original 1021 // file data (not the bitmap data) at the Graphic in the GfxLink (which has *nothing* to 1022 // do with the graphic being linked). This works well for DrawingLayer GraphicObjects (linked 1023 // and unlinked) but fails for linked Writer GraphicObjects. These have the URL in the 1024 // GraphicObject, but no GfxLink with the original file data when it's a linked graphic. 1025 // Since this blows up PDF size by a factor of 10 (the graphics get embedded as pixel maps 1026 // then) it is okay to add this workaround: In the needed case, load the graphic in a way to 1027 // get the GfxLink in the needed form and use that Graphic temporarily. Do this only when 1028 // - we have PDF export 1029 // - the GraphicObject is linked 1030 // - the Graphic has no GfxLink 1031 // - LosslessCompression is activated 1032 // - it's indeed a jpeg graphic (could be checked by the url ending, but is more reliable to check later) 1033 // In all other cases (normal repaint, print, etc...) use the available Graphic with the 1034 // already loaded pixel graphic as before this change. 1035 if(pOut->GetExtOutDevData() && rGrfObj.HasLink() && !rGrfObj.GetGraphic().IsLink()) 1036 { 1037 const vcl::PDFExtOutDevData* pPDFExt = dynamic_cast< const vcl::PDFExtOutDevData* >(pOut->GetExtOutDevData()); 1038 1039 if(pPDFExt && pPDFExt->GetIsLosslessCompression()) 1040 { 1041 Graphic aTempGraphic; 1042 INetURLObject aURL(rGrfObj.GetLink()); 1043 1044 if(GRFILTER_OK == GraphicFilter::GetGraphicFilter()->ImportGraphic(aTempGraphic, aURL)) 1045 { 1046 if(aTempGraphic.IsLink() && GFX_LINK_TYPE_NATIVE_JPG == aTempGraphic.GetLink().GetType()) 1047 { 1048 aContent[0] = new drawinglayer::primitive2d::GraphicPrimitive2D( 1049 aTargetTransform, 1050 aTempGraphic, 1051 aGrfAttr); 1052 bDone = true; 1053 } 1054 } 1055 } 1056 } 1057 1058 if(!bDone) 1059 { 1060 aContent[0] = new drawinglayer::primitive2d::GraphicPrimitive2D( 1061 aTargetTransform, 1062 rGrfObj.GetGraphic(), 1063 aGrfAttr); 1064 } 1065 1066 paintUsingPrimitivesHelper( 1067 *pOut, 1068 aContent, 1069 aTargetRange, 1070 aTargetRange); 1071 1072 // need to reset the timer manually (was in original paints at GraphicManager) 1073 rGrfObj.restartSwapOutTimer(); 1074 } 1075 } 1076 else 1077 { 1078 sal_uInt16 nResId = 0; 1079 if( bSwappedIn ) 1080 { 1081 if( GRAPHIC_NONE == rGrfObj.GetType() ) 1082 nResId = STR_COMCORE_READERROR; 1083 else if ( !rGrfObj.GetGraphic().IsSupportedGraphic() ) 1084 nResId = STR_COMCORE_CANT_SHOW; 1085 } 1086 ((SwNoTxtFrm*)this)->nWeight = -1; 1087 String aText; 1088 if ( !nResId && 1089 !(aText = pGrfNd->GetTitle()).Len() && 1090 (!GetRealURL( *pGrfNd, aText ) || !aText.Len())) 1091 { 1092 nResId = STR_COMCORE_READERROR; 1093 } 1094 if ( nResId ) 1095 aText = SW_RESSTR( nResId ); 1096 1097 ::lcl_PaintReplacement( aAlignedGrfArea, aText, *pShell, this, sal_True ); 1098 } 1099 1100 //Beim Drucken duerfen wir nicht die Grafiken sammeln... 1101 if( bSwapped && bPrn ) 1102 bForceSwap = sal_True; 1103 } 1104 if( bForceSwap ) 1105 pGrfNd->SwapOut(); 1106 } 1107 else // bIsChart || pOLENd 1108 { 1109 // --> OD 2009-03-05 #i99665# 1110 // Adjust AntiAliasing mode at output device for chart OLE 1111 const sal_uInt16 nFormerAntialiasingAtOutput( pOut->GetAntialiasing() ); 1112 if ( pOLENd->IsChart() && 1113 pShell->Imp()->GetDrawView()->IsAntiAliasing() ) 1114 { 1115 const sal_uInt16 nAntialiasingForChartOLE = 1116 nFormerAntialiasingAtOutput | ANTIALIASING_PIXELSNAPHAIRLINE; 1117 pOut->SetAntialiasing( nAntialiasingForChartOLE ); 1118 } 1119 // <-- 1120 1121 bool bDone(false); 1122 1123 if(bIsChart) 1124 { 1125 const uno::Reference< frame::XModel > aXModel(pOLENd->GetOLEObj().GetOleRef()->getComponent(), uno::UNO_QUERY); 1126 1127 if(aXModel.is()) 1128 { 1129 basegfx::B2DRange aSourceRange; 1130 1131 const drawinglayer::primitive2d::Primitive2DSequence aSequence( 1132 ChartHelper::tryToGetChartContentAsPrimitive2DSequence( 1133 aXModel, 1134 aSourceRange)); 1135 1136 if(aSequence.hasElements() && !aSourceRange.isEmpty()) 1137 { 1138 const basegfx::B2DRange aTargetRange( 1139 aAlignedGrfArea.Left(), aAlignedGrfArea.Top(), 1140 aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom()); 1141 1142 bDone = paintUsingPrimitivesHelper( 1143 *pOut, 1144 aSequence, 1145 aSourceRange, 1146 aTargetRange); 1147 } 1148 } 1149 } 1150 1151 if(!bDone && pOLENd) 1152 { 1153 Point aPosition(aAlignedGrfArea.Pos()); 1154 Size aSize(aAlignedGrfArea.SSize()); 1155 1156 // Im BrowseModus gibt es nicht unbedingt einen Drucker und 1157 // damit kein JobSetup, also legen wir eines an ... 1158 const JobSetup* pJobSetup = pOLENd->getIDocumentDeviceAccess()->getJobsetup(); 1159 sal_Bool bDummyJobSetup = 0 == pJobSetup; 1160 if( bDummyJobSetup ) 1161 pJobSetup = new JobSetup(); 1162 1163 // #i42323# 1164 // The reason for #114233# is gone, so i remove it again 1165 //TODO/LATER: is it a problem that the JopSetup isn't used? 1166 //xRef->DoDraw( pOut, aAlignedGrfArea.Pos(), aAlignedGrfArea.SSize(), *pJobSetup ); 1167 1168 // get hi-contrast image, but never for printing 1169 Graphic* pGraphic = NULL; 1170 if (pOut && !bPrn && Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) 1171 pGraphic = pOLENd->GetHCGraphic(); 1172 1173 // when it is not possible to get HC-representation, the original image should be used 1174 if ( !pGraphic ) 1175 pGraphic = pOLENd->GetGraphic(); 1176 1177 if ( pGraphic && pGraphic->GetType() != GRAPHIC_NONE ) 1178 { 1179 pGraphic->Draw( pOut, aPosition, aSize ); 1180 1181 // shade the representation if the object is activated outplace 1182 uno::Reference < embed::XEmbeddedObject > xObj = pOLENd->GetOLEObj().GetOleRef(); 1183 if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::ACTIVE ) 1184 { 1185 ::svt::EmbeddedObjectRef::DrawShading( Rectangle( aPosition, aSize ), pOut ); 1186 } 1187 } 1188 else 1189 ::svt::EmbeddedObjectRef::DrawPaintReplacement( Rectangle( aPosition, aSize ), pOLENd->GetOLEObj().GetCurrentPersistName(), pOut ); 1190 1191 if( bDummyJobSetup ) 1192 delete pJobSetup; // ... und raeumen wieder auf. 1193 1194 sal_Int64 nMiscStatus = pOLENd->GetOLEObj().GetOleRef()->getStatus( pOLENd->GetAspect() ); 1195 if ( !bPrn && pShell->ISA( SwCrsrShell ) && 1196 nMiscStatus & embed::EmbedMisc::MS_EMBED_ACTIVATEWHENVISIBLE ) 1197 { 1198 const SwFlyFrm *pFly = FindFlyFrm(); 1199 ASSERT( pFly, "OLE not in FlyFrm" ); 1200 ((SwFEShell*)pShell)->ConnectObj( pOLENd->GetOLEObj().GetObject(), pFly->Prt(), pFly->Frm()); 1201 } 1202 } 1203 1204 // --> OD 2009-03-05 #i99665# 1205 if ( pOLENd->IsChart() && 1206 pShell->Imp()->GetDrawView()->IsAntiAliasing() ) 1207 { 1208 pOut->SetAntialiasing( nFormerAntialiasingAtOutput ); 1209 } 1210 // <-- 1211 } 1212 } 1213 1214 1215 sal_Bool SwNoTxtFrm::IsTransparent() const 1216 { 1217 const ViewShell* pSh = getRootFrm()->GetCurrShell(); 1218 if ( !pSh || !pSh->GetViewOptions()->IsGraphic() ) 1219 return sal_True; 1220 1221 const SwGrfNode *pNd; 1222 if( 0 != (pNd = GetNode()->GetGrfNode()) ) 1223 return pNd->IsTransparent(); 1224 1225 //#29381# OLE sind immer Transparent. 1226 return sal_True; 1227 } 1228 1229 1230 void SwNoTxtFrm::StopAnimation( OutputDevice* pOut ) const 1231 { 1232 //animierte Grafiken anhalten 1233 const SwGrfNode* pGrfNd = dynamic_cast< const SwGrfNode* >(GetNode()->GetGrfNode()); 1234 1235 if( pGrfNd && pGrfNd->IsAnimated() ) 1236 { 1237 const_cast< SwGrfNode* >(pGrfNd)->StopGraphicAnimation( pOut, long(this) ); 1238 } 1239 } 1240 1241 1242 sal_Bool SwNoTxtFrm::HasAnimation() const 1243 { 1244 const SwGrfNode* pGrfNd = GetNode()->GetGrfNode(); 1245 return pGrfNd && pGrfNd->IsAnimated(); 1246 } 1247