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 #define _ANIMATION 32 #include <unotools/streamwrap.hxx> 33 34 #include <sfx2/lnkbase.hxx> 35 #include <math.h> 36 #include <vcl/salbtype.hxx> 37 #include <sot/formats.hxx> 38 #include <sot/storage.hxx> 39 #include <unotools/ucbstreamhelper.hxx> 40 #include <unotools/localfilehelper.hxx> 41 #include <svl/style.hxx> 42 #include <svtools/filter.hxx> 43 #include <svl/urihelper.hxx> 44 #include <svtools/grfmgr.hxx> 45 #include <vcl/svapp.hxx> 46 47 #include <sfx2/linkmgr.hxx> 48 #include <sfx2/docfile.hxx> 49 #include <svx/svdetc.hxx> 50 #include "svx/svdglob.hxx" 51 #include "svx/svdstr.hrc" 52 #include <svx/svdpool.hxx> 53 #include <svx/svdmodel.hxx> 54 #include <svx/svdpage.hxx> 55 #include <svx/svdmrkv.hxx> 56 #include <svx/svdpagv.hxx> 57 #include "svx/svdviter.hxx" 58 #include <svx/svdview.hxx> 59 #include "svtools/filter.hxx" 60 #include <svx/svdograf.hxx> 61 #include <svx/svdogrp.hxx> 62 #include <svx/xbitmap.hxx> 63 #include <svx/xbtmpit.hxx> 64 #include <svx/xflbmtit.hxx> 65 #include <svx/svdundo.hxx> 66 #include "svdfmtf.hxx" 67 #include <svx/sdgcpitm.hxx> 68 #include <editeng/eeitem.hxx> 69 #include <svx/sdr/properties/graphicproperties.hxx> 70 #include <svx/sdr/contact/viewcontactofgraphic.hxx> 71 #include <basegfx/polygon/b2dpolygon.hxx> 72 #include <basegfx/polygon/b2dpolygontools.hxx> 73 #include <osl/thread.hxx> 74 #include <vos/mutex.hxx> 75 76 using namespace ::com::sun::star::uno; 77 using namespace ::com::sun::star::io; 78 79 // ----------- 80 // - Defines - 81 // ----------- 82 83 #define GRAFSTREAMPOS_INVALID 0xffffffff 84 #define SWAPGRAPHIC_TIMEOUT 5000 85 86 87 // ------------------ 88 // - SdrGraphicLink - 89 // ------------------ 90 91 92 const Graphic ImpLoadLinkedGraphic( const String aFileName, const String aFilterName ) 93 { 94 Graphic aGraphic; 95 96 SfxMedium xMed( aFileName, STREAM_STD_READ, sal_True ); 97 xMed.DownLoad(); 98 99 SvStream* pInStrm = xMed.GetInStream(); 100 if ( pInStrm ) 101 { 102 pInStrm->Seek( STREAM_SEEK_TO_BEGIN ); 103 GraphicFilter* pGF = GraphicFilter::GetGraphicFilter(); 104 105 const sal_uInt16 nFilter = aFilterName.Len() && pGF->GetImportFormatCount() 106 ? pGF->GetImportFormatNumber( aFilterName ) 107 : GRFILTER_FORMAT_DONTKNOW; 108 109 String aEmptyStr; 110 com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > aFilterData( 1 ); 111 112 // Room for improvment: 113 // As this is a linked graphic the GfxLink is not needed if saving/loading our own format. 114 // But this link is required by some filters to access the native graphic (pdf export/ms export), 115 // there we should create a new service to provide this data if needed 116 aFilterData[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) ); 117 aFilterData[ 0 ].Value = Any( sal_True ); 118 pGF->ImportGraphic( aGraphic, aEmptyStr, *pInStrm, nFilter, NULL, 0, &aFilterData ); 119 } 120 return aGraphic; 121 } 122 123 class SdrGraphicUpdater; 124 class SdrGraphicLink : public sfx2::SvBaseLink 125 { 126 SdrGrafObj* pGrafObj; 127 SdrGraphicUpdater* pGraphicUpdater; 128 129 public: 130 SdrGraphicLink(SdrGrafObj* pObj); 131 virtual ~SdrGraphicLink(); 132 133 virtual void Closed(); 134 virtual void DataChanged( const String& rMimeType, 135 const ::com::sun::star::uno::Any & rValue ); 136 void DataChanged( const Graphic& rGraphic ); 137 138 sal_Bool Connect() { return 0 != GetRealObject(); } 139 void UpdateAsynchron(); 140 void RemoveGraphicUpdater(); 141 }; 142 143 class SdrGraphicUpdater : public ::osl::Thread 144 { 145 public: 146 SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& ); 147 virtual ~SdrGraphicUpdater( void ); 148 149 void SAL_CALL Terminate( void ); 150 151 sal_Bool GraphicLinkChanged( const String& rFileName ){ return maFileName != rFileName; }; 152 153 protected: 154 155 /** is called from the inherited create method and acts as the 156 main function of this thread. 157 */ 158 virtual void SAL_CALL run(void); 159 160 /** Called after the thread is terminated via the terminate 161 method. Used to kill the thread by calling delete on this. 162 */ 163 virtual void SAL_CALL onTerminated(void); 164 165 private: 166 167 const String maFileName; 168 const String maFilterName; 169 SdrGraphicLink& mrGraphicLink; 170 171 volatile bool mbIsTerminated; 172 }; 173 174 SdrGraphicUpdater::SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& rGraphicLink ) 175 : maFileName( rFileName ) 176 , maFilterName( rFilterName ) 177 , mrGraphicLink( rGraphicLink ) 178 , mbIsTerminated( sal_False ) 179 { 180 create(); 181 } 182 183 SdrGraphicUpdater::~SdrGraphicUpdater( void ) 184 { 185 } 186 187 void SdrGraphicUpdater::Terminate() 188 { 189 mbIsTerminated = sal_True; 190 } 191 192 void SAL_CALL SdrGraphicUpdater::onTerminated(void) 193 { 194 delete this; 195 } 196 197 void SAL_CALL SdrGraphicUpdater::run(void) 198 { 199 Graphic aGraphic( ImpLoadLinkedGraphic( maFileName, maFilterName ) ); 200 vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 201 if ( !mbIsTerminated ) 202 { 203 mrGraphicLink.DataChanged( aGraphic ); 204 mrGraphicLink.RemoveGraphicUpdater(); 205 } 206 } 207 208 // ----------------------------------------------------------------------------- 209 210 SdrGraphicLink::SdrGraphicLink(SdrGrafObj* pObj) 211 : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, SOT_FORMATSTR_ID_SVXB ) 212 , pGrafObj( pObj ) 213 , pGraphicUpdater( NULL ) 214 { 215 SetSynchron( sal_False ); 216 } 217 218 // ----------------------------------------------------------------------------- 219 220 SdrGraphicLink::~SdrGraphicLink() 221 { 222 if ( pGraphicUpdater ) 223 pGraphicUpdater->Terminate(); 224 } 225 226 // ----------------------------------------------------------------------------- 227 228 void SdrGraphicLink::DataChanged( const Graphic& rGraphic ) 229 { 230 pGrafObj->ImpSetLinkedGraphic( rGraphic ); 231 } 232 233 // ----------------------------------------------------------------------------- 234 235 void SdrGraphicLink::RemoveGraphicUpdater() 236 { 237 pGraphicUpdater = NULL; 238 } 239 240 // ----------------------------------------------------------------------------- 241 242 void SdrGraphicLink::DataChanged( const String& rMimeType, 243 const ::com::sun::star::uno::Any & rValue ) 244 { 245 SdrModel* pModel = pGrafObj ? pGrafObj->GetModel() : 0; 246 sfx2::LinkManager* pLinkManager= pModel ? pModel->GetLinkManager() : 0; 247 248 if( pLinkManager && rValue.hasValue() ) 249 { 250 pLinkManager->GetDisplayNames( this, 0, &pGrafObj->aFileName, 0, &pGrafObj->aFilterName ); 251 252 Graphic aGraphic; 253 if( sfx2::LinkManager::GetGraphicFromAny( rMimeType, rValue, aGraphic )) 254 { 255 pGrafObj->NbcSetGraphic( aGraphic ); 256 pGrafObj->ActionChanged(); 257 } 258 else if( SotExchange::GetFormatIdFromMimeType( rMimeType ) != sfx2::LinkManager::RegisterStatusInfoId() ) 259 { 260 // broadcasting, to update slidesorter 261 pGrafObj->BroadcastObjectChange(); 262 } 263 } 264 } 265 266 // ----------------------------------------------------------------------------- 267 268 void SdrGraphicLink::Closed() 269 { 270 // Die Verbindung wird aufgehoben; pLink des Objekts auf NULL setzen, da die Link-Instanz ja gerade destruiert wird. 271 pGrafObj->ForceSwapIn(); 272 pGrafObj->pGraphicLink=NULL; 273 pGrafObj->ReleaseGraphicLink(); 274 SvBaseLink::Closed(); 275 } 276 277 // ----------------------------------------------------------------------------- 278 279 void SdrGraphicLink::UpdateAsynchron() 280 { 281 if( GetObj() ) 282 { 283 if ( pGraphicUpdater ) 284 { 285 if ( pGraphicUpdater->GraphicLinkChanged( pGrafObj->GetFileName() ) ) 286 { 287 pGraphicUpdater->Terminate(); 288 pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this ); 289 } 290 } 291 else 292 pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this ); 293 } 294 } 295 296 // -------------- 297 // - SdrGrafObj - 298 // -------------- 299 300 ////////////////////////////////////////////////////////////////////////////// 301 // BaseProperties section 302 303 sdr::properties::BaseProperties* SdrGrafObj::CreateObjectSpecificProperties() 304 { 305 return new sdr::properties::GraphicProperties(*this); 306 } 307 308 ////////////////////////////////////////////////////////////////////////////// 309 // DrawContact section 310 311 sdr::contact::ViewContact* SdrGrafObj::CreateObjectSpecificViewContact() 312 { 313 return new sdr::contact::ViewContactOfGraphic(*this); 314 } 315 316 ////////////////////////////////////////////////////////////////////////////// 317 318 TYPEINIT1(SdrGrafObj,SdrRectObj); 319 320 // ----------------------------------------------------------------------------- 321 322 SdrGrafObj::SdrGrafObj() 323 : SdrRectObj(), 324 pGraphicLink ( NULL ), 325 bMirrored ( sal_False ) 326 { 327 pGraphic = new GraphicObject; 328 pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT ); 329 330 // #i118485# Shear allowed and possible now 331 bNoShear = false; 332 333 // #111096# 334 mbGrafAnimationAllowed = sal_True; 335 336 // #i25616# 337 mbLineIsOutsideGeometry = sal_True; 338 mbInsidePaint = sal_False; 339 mbIsPreview = sal_False; 340 341 // #i25616# 342 mbSupportTextIndentingOnLineWidthChange = sal_False; 343 } 344 345 // ----------------------------------------------------------------------------- 346 347 SdrGrafObj::SdrGrafObj(const Graphic& rGrf, const Rectangle& rRect) 348 : SdrRectObj ( rRect ), 349 pGraphicLink ( NULL ), 350 bMirrored ( sal_False ) 351 { 352 pGraphic = new GraphicObject( rGrf ); 353 pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT ); 354 355 // #i118485# Shear allowed and possible now 356 bNoShear = false; 357 358 // #111096# 359 mbGrafAnimationAllowed = sal_True; 360 361 // #i25616# 362 mbLineIsOutsideGeometry = sal_True; 363 mbInsidePaint = sal_False; 364 mbIsPreview = sal_False; 365 366 // #i25616# 367 mbSupportTextIndentingOnLineWidthChange = sal_False; 368 } 369 370 // ----------------------------------------------------------------------------- 371 372 SdrGrafObj::SdrGrafObj( const Graphic& rGrf ) 373 : SdrRectObj(), 374 pGraphicLink ( NULL ), 375 bMirrored ( sal_False ) 376 { 377 pGraphic = new GraphicObject( rGrf ); 378 pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT ); 379 380 // #i118485# Shear allowed and possible now 381 bNoShear = false; 382 383 // #111096# 384 mbGrafAnimationAllowed = sal_True; 385 386 // #i25616# 387 mbLineIsOutsideGeometry = sal_True; 388 mbInsidePaint = sal_False; 389 mbIsPreview = sal_False; 390 391 // #i25616# 392 mbSupportTextIndentingOnLineWidthChange = sal_False; 393 } 394 395 // ----------------------------------------------------------------------------- 396 397 SdrGrafObj::~SdrGrafObj() 398 { 399 delete pGraphic; 400 ImpLinkAbmeldung(); 401 } 402 403 // ----------------------------------------------------------------------------- 404 405 void SdrGrafObj::SetGraphicObject( const GraphicObject& rGrfObj ) 406 { 407 *pGraphic = rGrfObj; 408 pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT ); 409 pGraphic->SetUserData(); 410 mbIsPreview = sal_False; 411 SetChanged(); 412 BroadcastObjectChange(); 413 } 414 415 // ----------------------------------------------------------------------------- 416 417 const GraphicObject& SdrGrafObj::GetGraphicObject(bool bForceSwapIn) const 418 { 419 if(bForceSwapIn) 420 { 421 ForceSwapIn(); 422 } 423 424 return *pGraphic; 425 } 426 427 // ----------------------------------------------------------------------------- 428 429 void SdrGrafObj::NbcSetGraphic( const Graphic& rGrf ) 430 { 431 pGraphic->SetGraphic( rGrf ); 432 pGraphic->SetUserData(); 433 mbIsPreview = sal_False; 434 } 435 436 void SdrGrafObj::SetGraphic( const Graphic& rGrf ) 437 { 438 NbcSetGraphic(rGrf); 439 SetChanged(); 440 BroadcastObjectChange(); 441 } 442 443 // ----------------------------------------------------------------------------- 444 445 const Graphic& SdrGrafObj::GetGraphic() const 446 { 447 ForceSwapIn(); 448 return pGraphic->GetGraphic(); 449 } 450 451 // ----------------------------------------------------------------------------- 452 453 Graphic SdrGrafObj::GetTransformedGraphic( sal_uIntPtr nTransformFlags ) const 454 { 455 // #107947# Refactored most of the code to GraphicObject, where 456 // everybody can use e.g. the cropping functionality 457 458 GraphicType eType = GetGraphicType(); 459 MapMode aDestMap( pModel->GetScaleUnit(), Point(), pModel->GetScaleFraction(), pModel->GetScaleFraction() ); 460 const Size aDestSize( GetLogicRect().GetSize() ); 461 const sal_Bool bMirror = ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_MIRROR ) != 0; 462 const sal_Bool bRotate = ( ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_ROTATE ) != 0 ) && 463 ( aGeo.nDrehWink && aGeo.nDrehWink != 18000 ) && ( GRAPHIC_NONE != eType ); 464 465 // #104115# Need cropping info earlier 466 ( (SdrGrafObj*) this )->ImpSetAttrToGrafInfo(); 467 GraphicAttr aActAttr; 468 469 if( SDRGRAFOBJ_TRANSFORMATTR_NONE != nTransformFlags && 470 GRAPHIC_NONE != eType ) 471 { 472 // actually transform the graphic only in this case. On the 473 // other hand, cropping will always happen 474 aActAttr = aGrafInfo; 475 476 if( bMirror ) 477 { 478 sal_uInt16 nMirrorCase = ( aGeo.nDrehWink == 18000 ) ? ( bMirrored ? 3 : 4 ) : ( bMirrored ? 2 : 1 ); 479 FASTBOOL bHMirr = nMirrorCase == 2 || nMirrorCase == 4; 480 FASTBOOL bVMirr = nMirrorCase == 3 || nMirrorCase == 4; 481 482 aActAttr.SetMirrorFlags( ( bHMirr ? BMP_MIRROR_HORZ : 0 ) | ( bVMirr ? BMP_MIRROR_VERT : 0 ) ); 483 } 484 485 if( bRotate ) 486 aActAttr.SetRotation( sal_uInt16(aGeo.nDrehWink / 10) ); 487 } 488 489 // #107947# Delegate to moved code in GraphicObject 490 return GetGraphicObject().GetTransformedGraphic( aDestSize, aDestMap, aActAttr ); 491 } 492 493 // ----------------------------------------------------------------------------- 494 495 GraphicType SdrGrafObj::GetGraphicType() const 496 { 497 return pGraphic->GetType(); 498 } 499 500 sal_Bool SdrGrafObj::IsAnimated() const 501 { 502 return pGraphic->IsAnimated(); 503 } 504 505 sal_Bool SdrGrafObj::IsEPS() const 506 { 507 return pGraphic->IsEPS(); 508 } 509 510 sal_Bool SdrGrafObj::IsRenderGraphic() const 511 { 512 return pGraphic->IsRenderGraphic(); 513 } 514 515 sal_Bool SdrGrafObj::HasRenderGraphic() const 516 { 517 return pGraphic->HasRenderGraphic(); 518 } 519 520 sal_Bool SdrGrafObj::IsSwappedOut() const 521 { 522 return mbIsPreview ? sal_True : pGraphic->IsSwappedOut(); 523 } 524 525 const MapMode& SdrGrafObj::GetGrafPrefMapMode() const 526 { 527 return pGraphic->GetPrefMapMode(); 528 } 529 530 const Size& SdrGrafObj::GetGrafPrefSize() const 531 { 532 return pGraphic->GetPrefSize(); 533 } 534 535 // ----------------------------------------------------------------------------- 536 537 void SdrGrafObj::SetGrafStreamURL( const String& rGraphicStreamURL ) 538 { 539 mbIsPreview = sal_False; 540 if( !rGraphicStreamURL.Len() ) 541 { 542 pGraphic->SetUserData(); 543 } 544 else if( pModel->IsSwapGraphics() ) 545 { 546 pGraphic->SetUserData( rGraphicStreamURL ); 547 548 // set state of graphic object to 'swapped out' 549 if( pGraphic->GetType() == GRAPHIC_NONE ) 550 pGraphic->SetSwapState(); 551 } 552 } 553 554 // ----------------------------------------------------------------------------- 555 556 String SdrGrafObj::GetGrafStreamURL() const 557 { 558 return pGraphic->GetUserData(); 559 } 560 561 // ----------------------------------------------------------------------------- 562 563 void SdrGrafObj::SetFileName(const String& rFileName) 564 { 565 aFileName = rFileName; 566 SetChanged(); 567 } 568 569 // ----------------------------------------------------------------------------- 570 571 void SdrGrafObj::SetFilterName(const String& rFilterName) 572 { 573 aFilterName = rFilterName; 574 SetChanged(); 575 } 576 577 // ----------------------------------------------------------------------------- 578 579 void SdrGrafObj::ForceSwapIn() const 580 { 581 if( mbIsPreview ) 582 { 583 // removing preview graphic 584 const String aUserData( pGraphic->GetUserData() ); 585 586 Graphic aEmpty; 587 pGraphic->SetGraphic( aEmpty ); 588 pGraphic->SetUserData( aUserData ); 589 pGraphic->SetSwapState(); 590 591 const_cast< SdrGrafObj* >( this )->mbIsPreview = sal_False; 592 } 593 if ( pGraphicLink && pGraphic->IsSwappedOut() ) 594 ImpUpdateGraphicLink( sal_False ); 595 else 596 pGraphic->FireSwapInRequest(); 597 598 if( pGraphic->IsSwappedOut() || 599 ( pGraphic->GetType() == GRAPHIC_NONE ) || 600 ( pGraphic->GetType() == GRAPHIC_DEFAULT ) ) 601 { 602 Graphic aDefaultGraphic; 603 aDefaultGraphic.SetDefaultType(); 604 pGraphic->SetGraphic( aDefaultGraphic ); 605 } 606 } 607 608 // ----------------------------------------------------------------------------- 609 610 void SdrGrafObj::ForceSwapOut() const 611 { 612 pGraphic->FireSwapOutRequest(); 613 } 614 615 // ----------------------------------------------------------------------------- 616 617 void SdrGrafObj::ImpLinkAnmeldung() 618 { 619 sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL; 620 621 if( pLinkManager != NULL && pGraphicLink == NULL ) 622 { 623 if( aFileName.Len() ) 624 { 625 pGraphicLink = new SdrGraphicLink( this ); 626 pLinkManager->InsertFileLink( *pGraphicLink, OBJECT_CLIENT_GRF, aFileName, ( aFilterName.Len() ? &aFilterName : NULL ), NULL ); 627 pGraphicLink->Connect(); 628 } 629 } 630 } 631 632 // ----------------------------------------------------------------------------- 633 634 void SdrGrafObj::ImpLinkAbmeldung() 635 { 636 sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL; 637 638 if( pLinkManager != NULL && pGraphicLink!=NULL) 639 { 640 // Bei Remove wird *pGraphicLink implizit deleted 641 pLinkManager->Remove( pGraphicLink ); 642 pGraphicLink=NULL; 643 } 644 } 645 646 // ----------------------------------------------------------------------------- 647 648 void SdrGrafObj::SetGraphicLink( const String& rFileName, const String& rFilterName ) 649 { 650 ImpLinkAbmeldung(); 651 aFileName = rFileName; 652 aFilterName = rFilterName; 653 ImpLinkAnmeldung(); 654 pGraphic->SetUserData(); 655 656 // #92205# A linked graphic is per definition swapped out (has to be loaded) 657 pGraphic->SetSwapState(); 658 } 659 660 // ----------------------------------------------------------------------------- 661 662 void SdrGrafObj::ReleaseGraphicLink() 663 { 664 ImpLinkAbmeldung(); 665 aFileName = String(); 666 aFilterName = String(); 667 } 668 669 // ----------------------------------------------------------------------------- 670 671 void SdrGrafObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const 672 { 673 FASTBOOL bAnim = pGraphic->IsAnimated(); 674 FASTBOOL bRenderGraphic = pGraphic->HasRenderGraphic(); 675 FASTBOOL bNoPresGrf = ( pGraphic->GetType() != GRAPHIC_NONE ) && !bEmptyPresObj; 676 677 rInfo.bResizeFreeAllowed = aGeo.nDrehWink % 9000 == 0 || 678 aGeo.nDrehWink % 18000 == 0 || 679 aGeo.nDrehWink % 27000 == 0; 680 681 rInfo.bResizePropAllowed = sal_True; 682 rInfo.bRotateFreeAllowed = bNoPresGrf && !bAnim && !bRenderGraphic; 683 rInfo.bRotate90Allowed = bNoPresGrf && !bAnim && !bRenderGraphic; 684 rInfo.bMirrorFreeAllowed = bNoPresGrf && !bAnim && !bRenderGraphic; 685 rInfo.bMirror45Allowed = bNoPresGrf && !bAnim && !bRenderGraphic; 686 rInfo.bMirror90Allowed = !bEmptyPresObj && !bRenderGraphic; 687 rInfo.bTransparenceAllowed = sal_False; 688 rInfo.bGradientAllowed = sal_False; 689 690 // #i118485# Shear allowed and possible now 691 rInfo.bShearAllowed = true; 692 693 rInfo.bEdgeRadiusAllowed=sal_False; 694 rInfo.bCanConvToPath = !IsEPS() && !bRenderGraphic; 695 rInfo.bCanConvToPathLineToArea = sal_False; 696 rInfo.bCanConvToPolyLineToArea = sal_False; 697 rInfo.bCanConvToPoly = !IsEPS() && !bRenderGraphic; 698 rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary()); 699 } 700 701 // ----------------------------------------------------------------------------- 702 703 sal_uInt16 SdrGrafObj::GetObjIdentifier() const 704 { 705 return sal_uInt16( OBJ_GRAF ); 706 } 707 708 // ----------------------------------------------------------------------------- 709 710 /* The graphic of the GraphicLink will be loaded. If it is called with 711 bAsynchron = true then the graphic will be set later via DataChanged 712 */ 713 sal_Bool SdrGrafObj::ImpUpdateGraphicLink( sal_Bool bAsynchron ) const 714 { 715 sal_Bool bRet = sal_False; 716 if( pGraphicLink ) 717 { 718 if ( bAsynchron ) 719 pGraphicLink->UpdateAsynchron(); 720 else 721 pGraphicLink->DataChanged( ImpLoadLinkedGraphic( aFileName, aFilterName ) ); 722 bRet = sal_True; 723 } 724 return bRet; 725 } 726 727 // ----------------------------------------------------------------------------- 728 729 void SdrGrafObj::ImpSetLinkedGraphic( const Graphic& rGraphic ) 730 { 731 const sal_Bool bIsChanged = GetModel()->IsChanged(); 732 NbcSetGraphic( rGraphic ); 733 ActionChanged(); 734 BroadcastObjectChange(); 735 GetModel()->SetChanged( bIsChanged ); 736 } 737 738 // ----------------------------------------------------------------------------- 739 740 void SdrGrafObj::TakeObjNameSingul(XubString& rName) const 741 { 742 switch( pGraphic->GetType() ) 743 { 744 case GRAPHIC_BITMAP: 745 { 746 const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ? 747 ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPTRANSLNK : STR_ObjNameSingulGRAFBMPTRANS ) : 748 ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPLNK : STR_ObjNameSingulGRAFBMP ) ); 749 750 rName=ImpGetResStr( nId ); 751 } 752 break; 753 754 case GRAPHIC_GDIMETAFILE: 755 rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFMTFLNK : STR_ObjNameSingulGRAFMTF ); 756 break; 757 758 case GRAPHIC_NONE: 759 rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFNONELNK : STR_ObjNameSingulGRAFNONE ); 760 break; 761 762 default: 763 rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFLNK : STR_ObjNameSingulGRAF ); 764 break; 765 } 766 767 const String aName(GetName()); 768 769 if( aName.Len() ) 770 { 771 rName.AppendAscii( " '" ); 772 rName += aName; 773 rName += sal_Unicode( '\'' ); 774 } 775 } 776 777 // ----------------------------------------------------------------------------- 778 779 void SdrGrafObj::TakeObjNamePlural( XubString& rName ) const 780 { 781 switch( pGraphic->GetType() ) 782 { 783 case GRAPHIC_BITMAP: 784 { 785 const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ? 786 ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPTRANSLNK : STR_ObjNamePluralGRAFBMPTRANS ) : 787 ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPLNK : STR_ObjNamePluralGRAFBMP ) ); 788 789 rName=ImpGetResStr( nId ); 790 } 791 break; 792 793 case GRAPHIC_GDIMETAFILE: 794 rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFMTFLNK : STR_ObjNamePluralGRAFMTF ); 795 break; 796 797 case GRAPHIC_NONE: 798 rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFNONELNK : STR_ObjNamePluralGRAFNONE ); 799 break; 800 801 default: 802 rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFLNK : STR_ObjNamePluralGRAF ); 803 break; 804 } 805 806 const String aName(GetName()); 807 808 if( aName.Len() ) 809 { 810 rName.AppendAscii( " '" ); 811 rName += aName; 812 rName += sal_Unicode( '\'' ); 813 } 814 } 815 816 // ----------------------------------------------------------------------------- 817 818 SdrObject* SdrGrafObj::getFullDragClone() const 819 { 820 // call parent 821 SdrGrafObj* pRetval = static_cast< SdrGrafObj* >(SdrRectObj::getFullDragClone()); 822 823 // #i103116# the full drag clone leads to problems 824 // with linked graphics, so reset the link in this 825 // temporary interaction object and load graphic 826 if(pRetval && IsLinkedGraphic()) 827 { 828 pRetval->ForceSwapIn(); 829 pRetval->ReleaseGraphicLink(); 830 } 831 832 return pRetval; 833 } 834 835 void SdrGrafObj::operator=( const SdrObject& rObj ) 836 { 837 SdrRectObj::operator=( rObj ); 838 839 const SdrGrafObj& rGraf = (SdrGrafObj&) rObj; 840 841 pGraphic->SetGraphic( rGraf.GetGraphic(), &rGraf.GetGraphicObject() ); 842 aCropRect = rGraf.aCropRect; 843 aFileName = rGraf.aFileName; 844 aFilterName = rGraf.aFilterName; 845 bMirrored = rGraf.bMirrored; 846 847 if( rGraf.pGraphicLink != NULL) 848 { 849 SetGraphicLink( aFileName, aFilterName ); 850 } 851 852 ImpSetAttrToGrafInfo(); 853 } 854 855 // ----------------------------------------------------------------------------- 856 // #i25616# 857 858 basegfx::B2DPolyPolygon SdrGrafObj::TakeXorPoly() const 859 { 860 if(mbInsidePaint) 861 { 862 basegfx::B2DPolyPolygon aRetval; 863 864 // take grown rectangle 865 const sal_Int32 nHalfLineWidth(ImpGetLineWdt() / 2); 866 const Rectangle aGrownRect( 867 aRect.Left() - nHalfLineWidth, 868 aRect.Top() - nHalfLineWidth, 869 aRect.Right() + nHalfLineWidth, 870 aRect.Bottom() + nHalfLineWidth); 871 872 XPolygon aXPoly(ImpCalcXPoly(aGrownRect, GetEckenradius())); 873 aRetval.append(aXPoly.getB2DPolygon()); 874 875 return aRetval; 876 } 877 else 878 { 879 // call parent 880 return SdrRectObj::TakeXorPoly(); 881 } 882 } 883 884 // ----------------------------------------------------------------------------- 885 886 sal_uInt32 SdrGrafObj::GetHdlCount() const 887 { 888 return 8L; 889 } 890 891 // ----------------------------------------------------------------------------- 892 893 SdrHdl* SdrGrafObj::GetHdl(sal_uInt32 nHdlNum) const 894 { 895 return SdrRectObj::GetHdl( nHdlNum + 1L ); 896 } 897 898 // ----------------------------------------------------------------------------- 899 900 void SdrGrafObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) 901 { 902 SdrRectObj::NbcResize( rRef, xFact, yFact ); 903 904 FASTBOOL bMirrX = xFact.GetNumerator() < 0; 905 FASTBOOL bMirrY = yFact.GetNumerator() < 0; 906 907 if( bMirrX != bMirrY ) 908 bMirrored = !bMirrored; 909 } 910 911 // ----------------------------------------------------------------------------- 912 913 void SdrGrafObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs) 914 { 915 SdrRectObj::NbcRotate(rRef,nWink,sn,cs); 916 } 917 918 // ----------------------------------------------------------------------------- 919 920 void SdrGrafObj::NbcMirror(const Point& rRef1, const Point& rRef2) 921 { 922 SdrRectObj::NbcMirror(rRef1,rRef2); 923 bMirrored = !bMirrored; 924 } 925 926 // ----------------------------------------------------------------------------- 927 928 void SdrGrafObj::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear) 929 { 930 // #i118485# Call Shear now, old version redirected to rotate 931 SdrRectObj::NbcShear(rRef, nWink, tn, bVShear); 932 } 933 934 // ----------------------------------------------------------------------------- 935 936 void SdrGrafObj::NbcSetSnapRect(const Rectangle& rRect) 937 { 938 SdrRectObj::NbcSetSnapRect(rRect); 939 } 940 941 // ----------------------------------------------------------------------------- 942 943 void SdrGrafObj::NbcSetLogicRect( const Rectangle& rRect) 944 { 945 //int bChg=rRect.GetSize()!=aRect.GetSize(); 946 SdrRectObj::NbcSetLogicRect(rRect); 947 } 948 949 // ----------------------------------------------------------------------------- 950 951 SdrObjGeoData* SdrGrafObj::NewGeoData() const 952 { 953 return new SdrGrafObjGeoData; 954 } 955 956 // ----------------------------------------------------------------------------- 957 958 void SdrGrafObj::SaveGeoData(SdrObjGeoData& rGeo) const 959 { 960 SdrRectObj::SaveGeoData(rGeo); 961 SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo; 962 rGGeo.bMirrored=bMirrored; 963 } 964 965 // ----------------------------------------------------------------------------- 966 967 void SdrGrafObj::RestGeoData(const SdrObjGeoData& rGeo) 968 { 969 //long nDrehMerk = aGeo.nDrehWink; 970 //long nShearMerk = aGeo.nShearWink; 971 //int bMirrMerk = bMirrored; 972 Size aSizMerk( aRect.GetSize() ); 973 974 SdrRectObj::RestGeoData(rGeo); 975 SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo; 976 bMirrored=rGGeo.bMirrored; 977 } 978 979 // ----------------------------------------------------------------------------- 980 981 void SdrGrafObj::SetPage( SdrPage* pNewPage ) 982 { 983 FASTBOOL bRemove = pNewPage == NULL && pPage != NULL; 984 FASTBOOL bInsert = pNewPage != NULL && pPage == NULL; 985 986 if( bRemove ) 987 { 988 // hier kein SwapIn noetig, weil wenn nicht geladen, dann auch nicht animiert. 989 if( pGraphic->IsAnimated()) 990 pGraphic->StopAnimation(); 991 992 if( pGraphicLink != NULL ) 993 ImpLinkAbmeldung(); 994 } 995 996 SdrRectObj::SetPage( pNewPage ); 997 998 if(aFileName.Len() && bInsert) 999 ImpLinkAnmeldung(); 1000 } 1001 1002 // ----------------------------------------------------------------------------- 1003 1004 void SdrGrafObj::SetModel( SdrModel* pNewModel ) 1005 { 1006 FASTBOOL bChg = pNewModel != pModel; 1007 1008 if( bChg ) 1009 { 1010 if( pGraphic->HasUserData() ) 1011 { 1012 ForceSwapIn(); 1013 pGraphic->SetUserData(); 1014 } 1015 1016 if( pGraphicLink != NULL ) 1017 ImpLinkAbmeldung(); 1018 } 1019 1020 // Model umsetzen 1021 SdrRectObj::SetModel(pNewModel); 1022 1023 if( bChg && aFileName.Len() ) 1024 ImpLinkAnmeldung(); 1025 } 1026 1027 // ----------------------------------------------------------------------------- 1028 1029 void SdrGrafObj::StartAnimation( OutputDevice* /*pOutDev*/, const Point& /*rPoint*/, const Size& /*rSize*/, long /*nExtraData*/) 1030 { 1031 // #111096# 1032 // use new graf animation 1033 SetGrafAnimationAllowed(sal_True); 1034 } 1035 1036 // ----------------------------------------------------------------------------- 1037 1038 void SdrGrafObj::StopAnimation(OutputDevice* /*pOutDev*/, long /*nExtraData*/) 1039 { 1040 // #111096# 1041 // use new graf animation 1042 SetGrafAnimationAllowed(sal_False); 1043 } 1044 1045 // ----------------------------------------------------------------------------- 1046 1047 FASTBOOL SdrGrafObj::HasGDIMetaFile() const 1048 { 1049 return( pGraphic->GetType() == GRAPHIC_GDIMETAFILE ); 1050 } 1051 1052 // ----------------------------------------------------------------------------- 1053 1054 const GDIMetaFile* SdrGrafObj::GetGDIMetaFile() const 1055 { 1056 DBG_ERROR( "Invalid return value! Don't use it! (KA)" ); 1057 return &GetGraphic().GetGDIMetaFile(); 1058 } 1059 1060 // ----------------------------------------------------------------------------- 1061 1062 SdrObject* SdrGrafObj::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const 1063 { 1064 SdrObject* pRetval = NULL; 1065 1066 switch( GetGraphicType() ) 1067 { 1068 case GRAPHIC_GDIMETAFILE: 1069 { 1070 // NUR die aus dem MetaFile erzeugbaren Objekte in eine Gruppe packen und zurueckliefern 1071 ImpSdrGDIMetaFileImport aFilter(*GetModel()); 1072 aFilter.SetScaleRect(aRect); 1073 aFilter.SetLayer(GetLayer()); 1074 1075 SdrObjGroup* pGrp = new SdrObjGroup(); 1076 sal_uInt32 nInsAnz = aFilter.DoImport(GetTransformedGraphic( 1077 SDRGRAFOBJ_TRANSFORMATTR_COLOR|SDRGRAFOBJ_TRANSFORMATTR_MIRROR).GetGDIMetaFile(), 1078 *pGrp->GetSubList(), 0); 1079 1080 if(nInsAnz) 1081 { 1082 { 1083 // copy transformation 1084 GeoStat aGeoStat(GetGeoStat()); 1085 1086 if(aGeoStat.nShearWink) 1087 { 1088 aGeoStat.RecalcTan(); 1089 pGrp->NbcShear(aRect.TopLeft(), aGeoStat.nShearWink, aGeoStat.nTan, false); 1090 } 1091 1092 if(aGeoStat.nDrehWink) 1093 { 1094 aGeoStat.RecalcSinCos(); 1095 pGrp->NbcRotate(aRect.TopLeft(), aGeoStat.nDrehWink, aGeoStat.nSin, aGeoStat.nCos); 1096 } 1097 } 1098 1099 pRetval = pGrp; 1100 pGrp->NbcSetLayer(GetLayer()); 1101 pGrp->SetModel(GetModel()); 1102 1103 if(bAddText) 1104 { 1105 pRetval = ImpConvertAddText(pRetval, bBezier); 1106 } 1107 1108 // convert all children 1109 if( pRetval ) 1110 { 1111 SdrObject* pHalfDone = pRetval; 1112 pRetval = pHalfDone->DoConvertToPolyObj(bBezier, bAddText); 1113 SdrObject::Free( pHalfDone ); // resulting object is newly created 1114 1115 if( pRetval ) 1116 { 1117 // flatten subgroups. As we call 1118 // DoConvertToPolyObj() on the resulting group 1119 // objects, subgroups can exist (e.g. text is 1120 // a group object for every line). 1121 SdrObjList* pList = pRetval->GetSubList(); 1122 if( pList ) 1123 pList->FlattenGroups(); 1124 } 1125 } 1126 } 1127 else 1128 { 1129 delete pGrp; 1130 } 1131 1132 // #i118485# convert line and fill 1133 SdrObject* pLineFill = SdrRectObj::DoConvertToPolyObj(bBezier, false); 1134 1135 if(pLineFill) 1136 { 1137 if(pRetval) 1138 { 1139 pGrp = dynamic_cast< SdrObjGroup* >(pRetval); 1140 1141 if(!pGrp) 1142 { 1143 pGrp = new SdrObjGroup(); 1144 1145 pGrp->NbcSetLayer(GetLayer()); 1146 pGrp->SetModel(GetModel()); 1147 pGrp->GetSubList()->NbcInsertObject(pRetval); 1148 } 1149 1150 pGrp->GetSubList()->NbcInsertObject(pLineFill, 0); 1151 } 1152 else 1153 { 1154 pRetval = pLineFill; 1155 } 1156 } 1157 1158 break; 1159 } 1160 case GRAPHIC_BITMAP: 1161 { 1162 // Grundobjekt kreieren und Fuellung ergaenzen 1163 pRetval = SdrRectObj::DoConvertToPolyObj(bBezier, bAddText); 1164 1165 // Bitmap als Attribut retten 1166 if(pRetval) 1167 { 1168 // Bitmap als Fuellung holen 1169 SfxItemSet aSet(GetObjectItemSet()); 1170 1171 aSet.Put(XFillStyleItem(XFILL_BITMAP)); 1172 Bitmap aBitmap( GetTransformedGraphic().GetBitmap() ); 1173 XOBitmap aXBmp(aBitmap, XBITMAP_STRETCH); 1174 aSet.Put(XFillBitmapItem(String(), aXBmp)); 1175 aSet.Put(XFillBmpTileItem(sal_False)); 1176 1177 pRetval->SetMergedItemSet(aSet); 1178 } 1179 break; 1180 } 1181 case GRAPHIC_NONE: 1182 case GRAPHIC_DEFAULT: 1183 { 1184 pRetval = SdrRectObj::DoConvertToPolyObj(bBezier, bAddText); 1185 break; 1186 } 1187 } 1188 1189 return pRetval; 1190 } 1191 1192 // ----------------------------------------------------------------------------- 1193 1194 void SdrGrafObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) 1195 { 1196 SetXPolyDirty(); 1197 SdrRectObj::Notify( rBC, rHint ); 1198 ImpSetAttrToGrafInfo(); 1199 } 1200 1201 void SdrGrafObj::ImpSetAttrToGrafInfo() 1202 { 1203 const SfxItemSet& rSet = GetObjectItemSet(); 1204 const sal_uInt16 nTrans = ( (SdrGrafTransparenceItem&) rSet.Get( SDRATTR_GRAFTRANSPARENCE ) ).GetValue(); 1205 const SdrGrafCropItem& rCrop = (const SdrGrafCropItem&) rSet.Get( SDRATTR_GRAFCROP ); 1206 1207 aGrafInfo.SetLuminance( ( (SdrGrafLuminanceItem&) rSet.Get( SDRATTR_GRAFLUMINANCE ) ).GetValue() ); 1208 aGrafInfo.SetContrast( ( (SdrGrafContrastItem&) rSet.Get( SDRATTR_GRAFCONTRAST ) ).GetValue() ); 1209 aGrafInfo.SetChannelR( ( (SdrGrafRedItem&) rSet.Get( SDRATTR_GRAFRED ) ).GetValue() ); 1210 aGrafInfo.SetChannelG( ( (SdrGrafGreenItem&) rSet.Get( SDRATTR_GRAFGREEN ) ).GetValue() ); 1211 aGrafInfo.SetChannelB( ( (SdrGrafBlueItem&) rSet.Get( SDRATTR_GRAFBLUE ) ).GetValue() ); 1212 aGrafInfo.SetGamma( ( (SdrGrafGamma100Item&) rSet.Get( SDRATTR_GRAFGAMMA ) ).GetValue() * 0.01 ); 1213 aGrafInfo.SetTransparency( (sal_uInt8) FRound( Min( nTrans, (sal_uInt16) 100 ) * 2.55 ) ); 1214 aGrafInfo.SetInvert( ( (SdrGrafInvertItem&) rSet.Get( SDRATTR_GRAFINVERT ) ).GetValue() ); 1215 aGrafInfo.SetDrawMode( ( (SdrGrafModeItem&) rSet.Get( SDRATTR_GRAFMODE ) ).GetValue() ); 1216 aGrafInfo.SetCrop( rCrop.GetLeft(), rCrop.GetTop(), rCrop.GetRight(), rCrop.GetBottom() ); 1217 1218 SetXPolyDirty(); 1219 SetRectsDirty(); 1220 } 1221 1222 // ----------------------------------------------------------------------------- 1223 1224 void SdrGrafObj::ImpSetGrafInfoToAttr() 1225 { 1226 SetObjectItem( SdrGrafLuminanceItem( aGrafInfo.GetLuminance() ) ); 1227 SetObjectItem( SdrGrafContrastItem( aGrafInfo.GetContrast() ) ); 1228 SetObjectItem( SdrGrafRedItem( aGrafInfo.GetChannelR() ) ); 1229 SetObjectItem( SdrGrafGreenItem( aGrafInfo.GetChannelG() ) ); 1230 SetObjectItem( SdrGrafBlueItem( aGrafInfo.GetChannelB() ) ); 1231 SetObjectItem( SdrGrafGamma100Item( FRound( aGrafInfo.GetGamma() * 100.0 ) ) ); 1232 SetObjectItem( SdrGrafTransparenceItem( (sal_uInt16) FRound( aGrafInfo.GetTransparency() / 2.55 ) ) ); 1233 SetObjectItem( SdrGrafInvertItem( aGrafInfo.IsInvert() ) ); 1234 SetObjectItem( SdrGrafModeItem( aGrafInfo.GetDrawMode() ) ); 1235 SetObjectItem( SdrGrafCropItem( aGrafInfo.GetLeftCrop(), aGrafInfo.GetTopCrop(), aGrafInfo.GetRightCrop(), aGrafInfo.GetBottomCrop() ) ); 1236 } 1237 1238 // ----------------------------------------------------------------------------- 1239 1240 void SdrGrafObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly ) 1241 { 1242 Size aSize; 1243 Size aMaxSize( rMaxRect.GetSize() ); 1244 if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL ) 1245 aSize = Application::GetDefaultDevice()->PixelToLogic( pGraphic->GetPrefSize(), MAP_100TH_MM ); 1246 else 1247 aSize = OutputDevice::LogicToLogic( pGraphic->GetPrefSize(), 1248 pGraphic->GetPrefMapMode(), 1249 MapMode( MAP_100TH_MM ) ); 1250 1251 if( aSize.Height() != 0 && aSize.Width() != 0 ) 1252 { 1253 Point aPos( rMaxRect.TopLeft() ); 1254 1255 // Falls Grafik zu gross, wird die Grafik 1256 // in die Seite eingepasst 1257 if ( (!bShrinkOnly || 1258 ( aSize.Height() > aMaxSize.Height() ) || 1259 ( aSize.Width() > aMaxSize.Width() ) )&& 1260 aSize.Height() && aMaxSize.Height() ) 1261 { 1262 float fGrfWH = (float)aSize.Width() / 1263 (float)aSize.Height(); 1264 float fWinWH = (float)aMaxSize.Width() / 1265 (float)aMaxSize.Height(); 1266 1267 // Grafik an Pagesize anpassen (skaliert) 1268 if ( fGrfWH < fWinWH ) 1269 { 1270 aSize.Width() = (long)(aMaxSize.Height() * fGrfWH); 1271 aSize.Height()= aMaxSize.Height(); 1272 } 1273 else if ( fGrfWH > 0.F ) 1274 { 1275 aSize.Width() = aMaxSize.Width(); 1276 aSize.Height()= (long)(aMaxSize.Width() / fGrfWH); 1277 } 1278 1279 aPos = rMaxRect.Center(); 1280 } 1281 1282 if( bShrinkOnly ) 1283 aPos = aRect.TopLeft(); 1284 1285 aPos.X() -= aSize.Width() / 2; 1286 aPos.Y() -= aSize.Height() / 2; 1287 SetLogicRect( Rectangle( aPos, aSize ) ); 1288 } 1289 } 1290 1291 // ----------------------------------------------------------------------------- 1292 1293 IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO ) 1294 { 1295 SvStream* pRet = GRFMGR_AUTOSWAPSTREAM_NONE; 1296 1297 if( pO->IsInSwapOut() ) 1298 { 1299 if( pModel && !mbIsPreview && pModel->IsSwapGraphics() && pGraphic->GetSizeBytes() > 20480 ) 1300 { 1301 // test if this object is visualized from someone 1302 // ## test only if there are VOCs other than the preview renderer 1303 if(!GetViewContact().HasViewObjectContacts(true)) 1304 { 1305 const sal_uIntPtr nSwapMode = pModel->GetSwapGraphicsMode(); 1306 1307 if( ( pGraphic->HasUserData() || pGraphicLink ) && 1308 ( nSwapMode & SDR_SWAPGRAPHICSMODE_PURGE ) ) 1309 { 1310 pRet = GRFMGR_AUTOSWAPSTREAM_LINK; 1311 } 1312 else if( nSwapMode & SDR_SWAPGRAPHICSMODE_TEMP ) 1313 { 1314 pRet = GRFMGR_AUTOSWAPSTREAM_TEMP; 1315 pGraphic->SetUserData(); 1316 } 1317 1318 // #i102380# 1319 sdr::contact::ViewContactOfGraphic* pVC = dynamic_cast< sdr::contact::ViewContactOfGraphic* >(&GetViewContact()); 1320 1321 if(pVC) 1322 { 1323 pVC->flushGraphicObjects(); 1324 } 1325 } 1326 } 1327 } 1328 else if( pO->IsInSwapIn() ) 1329 { 1330 // kann aus dem original Doc-Stream nachgeladen werden... 1331 if( pModel != NULL ) 1332 { 1333 if( pGraphic->HasUserData() ) 1334 { 1335 SdrDocumentStreamInfo aStreamInfo; 1336 1337 aStreamInfo.mbDeleteAfterUse = sal_False; 1338 aStreamInfo.maUserData = pGraphic->GetUserData(); 1339 1340 SvStream* pStream = pModel->GetDocumentStream( aStreamInfo ); 1341 1342 if( pStream != NULL ) 1343 { 1344 Graphic aGraphic; 1345 1346 com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData = NULL; 1347 1348 if(mbInsidePaint && !GetViewContact().HasViewObjectContacts(true)) 1349 { 1350 // Rectangle aSnapRect(GetSnapRect()); 1351 // const Rectangle aSnapRectPixel(pOutDev->LogicToPixel(aSnapRect)); 1352 1353 pFilterData = new com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >( 3 ); 1354 1355 com::sun::star::awt::Size aPreviewSizeHint( 64, 64 ); 1356 sal_Bool bAllowPartialStreamRead = sal_True; 1357 sal_Bool bCreateNativeLink = sal_False; 1358 (*pFilterData)[ 0 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "PreviewSizeHint" ) ); 1359 (*pFilterData)[ 0 ].Value <<= aPreviewSizeHint; 1360 (*pFilterData)[ 1 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "AllowPartialStreamRead" ) ); 1361 (*pFilterData)[ 1 ].Value <<= bAllowPartialStreamRead; 1362 (*pFilterData)[ 2 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) ); 1363 (*pFilterData)[ 2 ].Value <<= bCreateNativeLink; 1364 1365 mbIsPreview = sal_True; 1366 } 1367 1368 if( !GraphicFilter::GetGraphicFilter()->ImportGraphic( aGraphic, String(), *pStream, 1369 GRFILTER_FORMAT_DONTKNOW, NULL, 0, pFilterData ) ) 1370 { 1371 const String aUserData( pGraphic->GetUserData() ); 1372 1373 pGraphic->SetGraphic( aGraphic ); 1374 pGraphic->SetUserData( aUserData ); 1375 1376 // #142146# Graphic successfully swapped in. 1377 pRet = GRFMGR_AUTOSWAPSTREAM_LOADED; 1378 } 1379 delete pFilterData; 1380 1381 pStream->ResetError(); 1382 1383 if( aStreamInfo.mbDeleteAfterUse || aStreamInfo.mxStorageRef.is() ) 1384 { 1385 if ( aStreamInfo.mxStorageRef.is() ) 1386 { 1387 aStreamInfo.mxStorageRef->dispose(); 1388 aStreamInfo.mxStorageRef = 0; 1389 } 1390 1391 delete pStream; 1392 } 1393 } 1394 } 1395 else if( !ImpUpdateGraphicLink( sal_False ) ) 1396 { 1397 pRet = GRFMGR_AUTOSWAPSTREAM_TEMP; 1398 } 1399 else 1400 { 1401 pRet = GRFMGR_AUTOSWAPSTREAM_LOADED; 1402 } 1403 } 1404 else 1405 pRet = GRFMGR_AUTOSWAPSTREAM_TEMP; 1406 } 1407 1408 return (long)(void*) pRet; 1409 } 1410 1411 // ----------------------------------------------------------------------------- 1412 1413 // #111096# 1414 // Access to GrafAnimationAllowed flag 1415 sal_Bool SdrGrafObj::IsGrafAnimationAllowed() const 1416 { 1417 return mbGrafAnimationAllowed; 1418 } 1419 1420 void SdrGrafObj::SetGrafAnimationAllowed(sal_Bool bNew) 1421 { 1422 if(mbGrafAnimationAllowed != bNew) 1423 { 1424 mbGrafAnimationAllowed = bNew; 1425 ActionChanged(); 1426 } 1427 } 1428 1429 // #i25616# 1430 sal_Bool SdrGrafObj::IsObjectTransparent() const 1431 { 1432 if(((const SdrGrafTransparenceItem&)GetObjectItem(SDRATTR_GRAFTRANSPARENCE)).GetValue() 1433 || pGraphic->IsTransparent()) 1434 { 1435 return sal_True; 1436 } 1437 1438 return sal_False; 1439 } 1440 1441 Reference< XInputStream > SdrGrafObj::getInputStream() 1442 { 1443 Reference< XInputStream > xStream; 1444 1445 if( pModel ) 1446 { 1447 // if( !pGraphic->HasUserData() ) 1448 // pGraphic->SwapOut(); 1449 1450 // kann aus dem original Doc-Stream nachgeladen werden... 1451 if( pGraphic->HasUserData() ) 1452 { 1453 SdrDocumentStreamInfo aStreamInfo; 1454 1455 aStreamInfo.mbDeleteAfterUse = sal_False; 1456 aStreamInfo.maUserData = pGraphic->GetUserData(); 1457 1458 SvStream* pStream = pModel->GetDocumentStream( aStreamInfo ); 1459 1460 if( pStream ) 1461 xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) ); 1462 } 1463 else if( pGraphic && GetGraphic().IsLink() ) 1464 { 1465 Graphic aGraphic( GetGraphic() ); 1466 GfxLink aLink( aGraphic.GetLink() ); 1467 sal_uInt32 nSize = aLink.GetDataSize(); 1468 const void* pSourceData = (const void*)aLink.GetData(); 1469 if( nSize && pSourceData ) 1470 { 1471 sal_uInt8 * pBuffer = new sal_uInt8[ nSize ]; 1472 if( pBuffer ) 1473 { 1474 memcpy( pBuffer, pSourceData, nSize ); 1475 1476 SvMemoryStream* pStream = new SvMemoryStream( (void*)pBuffer, (sal_Size)nSize, STREAM_READ ); 1477 pStream->ObjectOwnsMemory( sal_True ); 1478 xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) ); 1479 } 1480 } 1481 } 1482 1483 if( !xStream.is() && aFileName.Len() ) 1484 { 1485 SvFileStream* pStream = new SvFileStream( aFileName, STREAM_READ ); 1486 if( pStream ) 1487 xStream.set( new utl::OInputStreamWrapper( pStream ) ); 1488 } 1489 } 1490 1491 return xStream; 1492 } 1493 1494 // eof 1495