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_sd.hxx" 30 #include <com/sun/star/embed/XTransactedObject.hpp> 31 #include <com/sun/star/embed/XEmbedPersist.hpp> 32 #include <com/sun/star/embed/ElementModes.hpp> 33 #include <com/sun/star/lang/XComponent.hpp> 34 #include <vos/mutex.hxx> 35 #include <unotools/ucbstreamhelper.hxx> 36 #ifndef _UNTOOLS_TEMPFILE_HXX 37 #include <unotools/tempfile.hxx> 38 #endif 39 #include <editeng/eeitem.hxx> 40 #include <editeng/flditem.hxx> 41 #include <svx/svdpagv.hxx> 42 #include <sfx2/app.hxx> 43 #include <vcl/msgbox.hxx> 44 #include <svx/svdoole2.hxx> 45 #include <svx/svdograf.hxx> 46 #include <svx/svdotext.hxx> 47 #include <editeng/outlobj.hxx> 48 #include <sot/storage.hxx> 49 #include <svl/itempool.hxx> 50 #include <editeng/editobj.hxx> 51 #include <svx/fmglob.hxx> 52 #include <svx/svdouno.hxx> 53 #include <tools/urlobj.hxx> 54 #include <sot/formats.hxx> 55 #include <svl/urlbmk.hxx> 56 #include <editeng/outliner.hxx> 57 58 //#ifndef _SVDETC_HXX //autogen 59 //#include <svx/svdetc.hxx> 60 //#endif 61 #include <com/sun/star/form/FormButtonType.hpp> 62 #include <com/sun/star/beans/XPropertySet.hpp> 63 #include <unotools/streamwrap.hxx> 64 65 #include <svx/svdotable.hxx> 66 #include <svx/unomodel.hxx> 67 #include <svx/svditer.hxx> 68 #include <sfx2/docfile.hxx> 69 #include <comphelper/storagehelper.hxx> 70 #include <svtools/embedtransfer.hxx> 71 #include "DrawDocShell.hxx" 72 #include "View.hxx" 73 #include "sdpage.hxx" 74 #include "drawview.hxx" 75 #include "drawdoc.hxx" 76 #include "stlpool.hxx" 77 #include "strings.hrc" 78 #include "sdresid.hxx" 79 #include "imapinfo.hxx" 80 #include "sdxfer.hxx" 81 #include "unomodel.hxx" 82 #include <vcl/virdev.hxx> 83 84 // -------------- 85 // - Namespaces - 86 // -------------- 87 88 using namespace ::com::sun::star; 89 using namespace ::com::sun::star::lang; 90 using namespace ::com::sun::star::uno; 91 using namespace ::com::sun::star::io; 92 using namespace ::com::sun::star::datatransfer; 93 using namespace ::com::sun::star::datatransfer::clipboard; 94 95 // ----------- 96 // - Defines - 97 // ----------- 98 99 #define SDTRANSFER_OBJECTTYPE_DRAWMODEL 0x00000001 100 #define SDTRANSFER_OBJECTTYPE_DRAWOLE 0x00000002 101 102 // ------------------ 103 // - SdTransferable - 104 // ------------------ 105 106 SdTransferable::SdTransferable( SdDrawDocument* pSrcDoc, ::sd::View* pWorkView, sal_Bool bInitOnGetData ) 107 : mpPageDocShell( NULL ) 108 , mpOLEDataHelper( NULL ) 109 , mpObjDesc( NULL ) 110 , mpSdView( pWorkView ) 111 , mpSdViewIntern( pWorkView ) 112 , mpSdDrawDocument( NULL ) 113 , mpSdDrawDocumentIntern( NULL ) 114 , mpSourceDoc( pSrcDoc ) 115 , mpVDev( NULL ) 116 , mpBookmark( NULL ) 117 , mpGraphic( NULL ) 118 , mpImageMap( NULL ) 119 , mbInternalMove( sal_False ) 120 , mbOwnDocument( sal_False ) 121 , mbOwnView( sal_False ) 122 , mbLateInit( bInitOnGetData ) 123 , mbPageTransferable( sal_False ) 124 , mbPageTransferablePersistent( sal_False ) 125 , mbIsUnoObj( false ) 126 , maUserData() 127 { 128 if( mpSourceDoc ) 129 StartListening( *mpSourceDoc ); 130 131 if( pWorkView ) 132 StartListening( *pWorkView ); 133 134 if( !mbLateInit ) 135 CreateData(); 136 } 137 138 // ----------------------------------------------------------------------------- 139 140 SdTransferable::~SdTransferable() 141 { 142 if( mpSourceDoc ) 143 EndListening( *mpSourceDoc ); 144 145 if( mpSdView ) 146 EndListening( *const_cast< sd::View *>( mpSdView) ); 147 148 Application::GetSolarMutex().acquire(); 149 150 ObjectReleased(); 151 152 for( void* p = maPageBookmarks.First(); p; p = maPageBookmarks.Next() ) 153 delete static_cast< String* >( p ); 154 155 if( mbOwnView ) 156 delete mpSdViewIntern; 157 158 delete mpOLEDataHelper; 159 160 if( maDocShellRef.Is() ) 161 { 162 SfxObjectShell* pObj = maDocShellRef; 163 ::sd::DrawDocShell* pDocSh = static_cast< ::sd::DrawDocShell*>(pObj); 164 pDocSh->DoClose(); 165 } 166 167 maDocShellRef.Clear(); 168 169 if( mbOwnDocument ) 170 delete mpSdDrawDocumentIntern; 171 172 delete mpGraphic; 173 delete mpBookmark; 174 delete mpImageMap; 175 176 delete mpVDev; 177 delete mpObjDesc; 178 179 Application::GetSolarMutex().release(); 180 } 181 182 // ----------------------------------------------------------------------------- 183 184 void SdTransferable::CreateObjectReplacement( SdrObject* pObj ) 185 { 186 if( pObj ) 187 { 188 delete mpOLEDataHelper, mpOLEDataHelper = NULL; 189 delete mpGraphic, mpGraphic = NULL; 190 delete mpBookmark, mpBookmark = NULL; 191 delete mpImageMap, mpImageMap = NULL; 192 193 if( pObj->ISA( SdrOle2Obj ) ) 194 { 195 try 196 { 197 uno::Reference < embed::XEmbeddedObject > xObj = static_cast< SdrOle2Obj* >( pObj )->GetObjRef(); 198 uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY ); 199 if( xObj.is() && xPersist.is() && xPersist->hasEntry() ) 200 { 201 mpOLEDataHelper = new TransferableDataHelper( new SvEmbedTransferHelper( xObj, static_cast< SdrOle2Obj* >( pObj )->GetGraphic(), static_cast< SdrOle2Obj* >( pObj )->GetAspect() ) ); 202 203 // TODO/LATER: the standalone handling of the graphic should not be used any more in future 204 // The EmbedDataHelper should bring the graphic in future 205 Graphic* pObjGr = static_cast< SdrOle2Obj* >( pObj )->GetGraphic(); 206 if ( pObjGr ) 207 mpGraphic = new Graphic( *pObjGr ); 208 } 209 } 210 catch( uno::Exception& ) 211 {} 212 } 213 else if( pObj->ISA( SdrGrafObj ) && (mpSourceDoc && !mpSourceDoc->GetAnimationInfo( pObj )) ) 214 { 215 mpGraphic = new Graphic( static_cast< SdrGrafObj* >( pObj )->GetTransformedGraphic() ); 216 } 217 else if( pObj->IsUnoObj() && FmFormInventor == pObj->GetObjInventor() && ( pObj->GetObjIdentifier() == (sal_uInt16) OBJ_FM_BUTTON ) ) 218 { 219 SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pObj ); 220 221 if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor()) 222 { 223 Reference< ::com::sun::star::awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel() ); 224 225 if( !xControlModel.is() ) 226 return; 227 228 Reference< ::com::sun::star::beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY ); 229 230 if( !xPropSet.is() ) 231 return; 232 233 ::com::sun::star::form::FormButtonType eButtonType; 234 Any aTmp( xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" ) ) ) ); 235 236 if( aTmp >>= eButtonType ) 237 { 238 ::rtl::OUString aLabel, aURL; 239 240 xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" ) ) ) >>= aLabel; 241 xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("TargetURL") ) ) >>= aURL; 242 243 mpBookmark = new INetBookmark( String( aURL ), String( aLabel ) ); 244 } 245 } 246 } 247 else if( pObj->ISA( SdrTextObj ) ) 248 { 249 const OutlinerParaObject* pPara; 250 251 if( (pPara = static_cast< SdrTextObj* >( pObj )->GetOutlinerParaObject()) != 0 ) 252 { 253 const SvxFieldItem* pField; 254 255 if( (pField = pPara->GetTextObject().GetField()) != 0 ) 256 { 257 const SvxFieldData* pData = pField->GetField(); 258 259 if( pData && pData->ISA( SvxURLField ) ) 260 { 261 const SvxURLField* pURL = (SvxURLField*) pData; 262 263 mpBookmark = new INetBookmark( pURL->GetURL(), pURL->GetRepresentation() ); 264 } 265 } 266 } 267 } 268 269 SdIMapInfo* pInfo = static_cast< SdDrawDocument* >( pObj->GetModel() )->GetIMapInfo( static_cast< SdrObject* >( pObj ) ); 270 271 if( pInfo ) 272 mpImageMap = new ImageMap( pInfo->GetImageMap() ); 273 274 mbIsUnoObj = pObj && pObj->IsUnoObj(); 275 } 276 } 277 278 // ----------------------------------------------------------------------------- 279 280 void SdTransferable::CreateData() 281 { 282 if( mpSdDrawDocument && !mpSdViewIntern ) 283 { 284 mbOwnView = sal_True; 285 286 SdPage* pPage = mpSdDrawDocument->GetSdPage(0, PK_STANDARD); 287 288 if( 1 == pPage->GetObjCount() ) 289 CreateObjectReplacement( pPage->GetObj( 0 ) ); 290 291 mpVDev = new VirtualDevice( *Application::GetDefaultDevice() ); 292 mpVDev->SetMapMode( MapMode( mpSdDrawDocumentIntern->GetScaleUnit(), Point(), mpSdDrawDocumentIntern->GetScaleFraction(), mpSdDrawDocumentIntern->GetScaleFraction() ) ); 293 mpSdViewIntern = new ::sd::View( mpSdDrawDocumentIntern, mpVDev ); 294 mpSdViewIntern->EndListening(*mpSdDrawDocumentIntern ); 295 mpSdViewIntern->hideMarkHandles(); 296 SdrPageView* pPageView = mpSdViewIntern->ShowSdrPage(pPage); 297 ((SdrMarkView*)mpSdViewIntern)->MarkAllObj(pPageView); 298 } 299 else if( mpSdView && !mpSdDrawDocumentIntern ) 300 { 301 const SdrMarkList& rMarkList = mpSdView->GetMarkedObjectList(); 302 303 if( rMarkList.GetMarkCount() == 1 ) 304 CreateObjectReplacement( rMarkList.GetMark( 0 )->GetMarkedSdrObj() ); 305 306 if( mpSourceDoc ) 307 mpSourceDoc->CreatingDataObj(this); 308 mpSdDrawDocumentIntern = (SdDrawDocument*) mpSdView->GetAllMarkedModel(); 309 if( mpSourceDoc ) 310 mpSourceDoc->CreatingDataObj(0); 311 312 if( !maDocShellRef.Is() && mpSdDrawDocumentIntern->GetDocSh() ) 313 maDocShellRef = mpSdDrawDocumentIntern->GetDocSh(); 314 315 if( !maDocShellRef.Is() ) 316 { 317 DBG_ERROR( "SdTransferable::CreateData(), failed to create a model with persist, clipboard operation will fail for OLE objects!" ); 318 mbOwnDocument = sal_True; 319 } 320 321 // Groesse der Source-Seite uebernehmen 322 SdrPageView* pPgView = mpSdView->GetSdrPageView(); 323 SdPage* pOldPage = (SdPage*) pPgView->GetPage(); 324 SdrModel* pOldModel = mpSdView->GetModel(); 325 SdStyleSheetPool* pOldStylePool = (SdStyleSheetPool*) pOldModel->GetStyleSheetPool(); 326 SdStyleSheetPool* pNewStylePool = (SdStyleSheetPool*) mpSdDrawDocumentIntern->GetStyleSheetPool(); 327 SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PK_STANDARD ); 328 String aOldLayoutName( pOldPage->GetLayoutName() ); 329 330 pPage->SetSize( pOldPage->GetSize() ); 331 pPage->SetLayoutName( aOldLayoutName ); 332 pNewStylePool->CopyGraphicSheets( *pOldStylePool ); 333 pNewStylePool->CopyCellSheets( *pOldStylePool ); 334 pNewStylePool->CopyTableStyles( *pOldStylePool ); 335 aOldLayoutName.Erase( aOldLayoutName.SearchAscii( SD_LT_SEPARATOR ) ); 336 SdStyleSheetVector aCreatedSheets; 337 pNewStylePool->CopyLayoutSheets( aOldLayoutName, *pOldStylePool, aCreatedSheets ); 338 } 339 340 // set VisArea and adjust objects if neccessary 341 if( maVisArea.IsEmpty() && 342 mpSdDrawDocumentIntern && mpSdViewIntern && 343 mpSdDrawDocumentIntern->GetPageCount() ) 344 { 345 SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PK_STANDARD ); 346 347 if( 1 == mpSdDrawDocumentIntern->GetPageCount() ) 348 { 349 // #112978# need to use GetAllMarkedBoundRect instead of GetAllMarkedRect to get 350 // fat lines correctly 351 Point aOrigin( ( maVisArea = mpSdViewIntern->GetAllMarkedBoundRect() ).TopLeft() ); 352 Size aVector( -aOrigin.X(), -aOrigin.Y() ); 353 354 for( sal_uLong nObj = 0, nObjCount = pPage->GetObjCount(); nObj < nObjCount; nObj++ ) 355 { 356 SdrObject* pObj = pPage->GetObj( nObj ); 357 pObj->NbcMove( aVector ); 358 } 359 } 360 else 361 maVisArea.SetSize( pPage->GetSize() ); 362 363 // Die Ausgabe soll am Nullpunkt erfolgen 364 maVisArea.SetPos( Point() ); 365 } 366 } 367 368 // ----------------------------------------------------------------------------- 369 370 sal_Bool lcl_HasOnlyControls( SdrModel* pModel ) 371 { 372 sal_Bool bOnlyControls = sal_False; // default if there are no objects 373 374 if ( pModel ) 375 { 376 SdrPage* pPage = pModel->GetPage(0); 377 if (pPage) 378 { 379 SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); 380 SdrObject* pObj = aIter.Next(); 381 if ( pObj ) 382 { 383 bOnlyControls = sal_True; // only set if there are any objects at all 384 while ( pObj ) 385 { 386 if (!pObj->ISA(SdrUnoObj)) 387 { 388 bOnlyControls = sal_False; 389 break; 390 } 391 pObj = aIter.Next(); 392 } 393 } 394 } 395 } 396 397 return bOnlyControls; 398 } 399 400 // ----------------------------------------------------------------------------- 401 402 bool lcl_HasOnlyOneTable( SdrModel* pModel ) 403 { 404 if ( pModel ) 405 { 406 SdrPage* pPage = pModel->GetPage(0); 407 if (pPage && pPage->GetObjCount() == 1 ) 408 { 409 if( dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) ) != 0 ) 410 return true; 411 } 412 } 413 return false; 414 } 415 416 // ----------------------------------------------------------------------------- 417 418 void SdTransferable::AddSupportedFormats() 419 { 420 if( !mbPageTransferable || mbPageTransferablePersistent ) 421 { 422 if( !mbLateInit ) 423 CreateData(); 424 425 if( mpObjDesc ) 426 AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 427 428 if( mpOLEDataHelper ) 429 { 430 AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ); 431 432 DataFlavorExVector aVector( mpOLEDataHelper->GetDataFlavorExVector() ); 433 DataFlavorExVector::iterator aIter( aVector.begin() ), aEnd( aVector.end() ); 434 435 while( aIter != aEnd ) 436 AddFormat( *aIter++ ); 437 } 438 else if( mpGraphic ) 439 { 440 // #i25616# 441 AddFormat( SOT_FORMATSTR_ID_DRAWING ); 442 443 AddFormat( SOT_FORMATSTR_ID_SVXB ); 444 445 if( mpGraphic->GetType() == GRAPHIC_BITMAP ) 446 { 447 AddFormat( SOT_FORMAT_BITMAP ); 448 AddFormat( SOT_FORMAT_GDIMETAFILE ); 449 } 450 else 451 { 452 AddFormat( SOT_FORMAT_GDIMETAFILE ); 453 AddFormat( SOT_FORMAT_BITMAP ); 454 } 455 } 456 else if( mpBookmark ) 457 { 458 AddFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ); 459 AddFormat( FORMAT_STRING ); 460 } 461 else 462 { 463 AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ); 464 AddFormat( SOT_FORMATSTR_ID_DRAWING ); 465 if( !mpSdDrawDocument || !lcl_HasOnlyControls( mpSdDrawDocument ) ) 466 { 467 AddFormat( SOT_FORMAT_GDIMETAFILE ); 468 AddFormat( SOT_FORMAT_BITMAP ); 469 } 470 471 if( lcl_HasOnlyOneTable( mpSdDrawDocument ) ) 472 AddFormat( SOT_FORMAT_RTF ); 473 } 474 475 if( mpImageMap ) 476 AddFormat( SOT_FORMATSTR_ID_SVIM ); 477 } 478 } 479 480 // ----------------------------------------------------------------------------- 481 482 sal_Bool SdTransferable::GetData( const DataFlavor& rFlavor ) 483 { 484 if (SD_MOD()==NULL) 485 return sal_False; 486 487 sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); 488 sal_Bool bOK = sal_False; 489 490 CreateData(); 491 492 if( nFormat == SOT_FORMAT_RTF && lcl_HasOnlyOneTable( mpSdDrawDocument ) ) 493 { 494 bOK = SetTableRTF( mpSdDrawDocument, rFlavor ); 495 } 496 else if( mpOLEDataHelper && mpOLEDataHelper->HasFormat( rFlavor ) ) 497 { 498 sal_uLong nOldSwapMode = 0; 499 500 if( mpSdDrawDocumentIntern ) 501 { 502 nOldSwapMode = mpSdDrawDocumentIntern->GetSwapGraphicsMode(); 503 mpSdDrawDocumentIntern->SetSwapGraphicsMode( SDR_SWAPGRAPHICSMODE_PURGE ); 504 } 505 506 // TODO/LATER: support all the graphical formats, the embedded object scenario should not have separated handling 507 if( nFormat == FORMAT_GDIMETAFILE && mpGraphic ) 508 bOK = SetGDIMetaFile( mpGraphic->GetGDIMetaFile(), rFlavor ); 509 else 510 bOK = SetAny( mpOLEDataHelper->GetAny( rFlavor ), rFlavor ); 511 512 if( mpSdDrawDocumentIntern ) 513 mpSdDrawDocumentIntern->SetSwapGraphicsMode( nOldSwapMode ); 514 } 515 else if( HasFormat( nFormat ) ) 516 { 517 if( ( nFormat == SOT_FORMATSTR_ID_LINKSRCDESCRIPTOR || nFormat == SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) && mpObjDesc ) 518 { 519 bOK = SetTransferableObjectDescriptor( *mpObjDesc, rFlavor ); 520 } 521 else if( nFormat == SOT_FORMATSTR_ID_DRAWING ) 522 { 523 SfxObjectShellRef aOldRef( maDocShellRef ); 524 525 maDocShellRef.Clear(); 526 527 if( mpSdViewIntern ) 528 { 529 SdDrawDocument* pInternDoc = mpSdViewIntern->GetDoc(); 530 if( pInternDoc ) 531 pInternDoc->CreatingDataObj(this); 532 SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( mpSdViewIntern->GetAllMarkedModel() ); 533 if( pInternDoc ) 534 pInternDoc->CreatingDataObj(0); 535 536 bOK = SetObject( pDoc, SDTRANSFER_OBJECTTYPE_DRAWMODEL, rFlavor ); 537 538 if( maDocShellRef.Is() ) 539 { 540 maDocShellRef->DoClose(); 541 } 542 else 543 { 544 delete pDoc; 545 } 546 } 547 548 maDocShellRef = aOldRef; 549 } 550 else if( nFormat == FORMAT_GDIMETAFILE ) 551 { 552 if( mpSdViewIntern ) 553 bOK = SetGDIMetaFile( mpSdViewIntern->GetAllMarkedMetaFile( sal_True ), rFlavor ); 554 } 555 else if( nFormat == FORMAT_BITMAP ) 556 { 557 if( mpSdViewIntern ) 558 bOK = SetBitmap( mpSdViewIntern->GetAllMarkedBitmap( sal_True ), rFlavor ); 559 } 560 else if( ( nFormat == FORMAT_STRING ) && mpBookmark ) 561 { 562 bOK = SetString( mpBookmark->GetURL(), rFlavor ); 563 } 564 else if( ( nFormat == SOT_FORMATSTR_ID_SVXB ) && mpGraphic ) 565 { 566 bOK = SetGraphic( *mpGraphic, rFlavor ); 567 } 568 else if( ( nFormat == SOT_FORMATSTR_ID_SVIM ) && mpImageMap ) 569 { 570 bOK = SetImageMap( *mpImageMap, rFlavor ); 571 } 572 else if( mpBookmark ) 573 { 574 bOK = SetINetBookmark( *mpBookmark, rFlavor ); 575 } 576 else if( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE ) 577 { 578 sal_uLong nOldSwapMode = 0; 579 580 if( mpSdDrawDocumentIntern ) 581 { 582 nOldSwapMode = mpSdDrawDocumentIntern->GetSwapGraphicsMode(); 583 mpSdDrawDocumentIntern->SetSwapGraphicsMode( SDR_SWAPGRAPHICSMODE_PURGE ); 584 } 585 586 if( !maDocShellRef.Is() ) 587 { 588 maDocShellRef = new ::sd::DrawDocShell( 589 mpSdDrawDocumentIntern, 590 SFX_CREATE_MODE_EMBEDDED, 591 sal_True, 592 mpSdDrawDocumentIntern->GetDocumentType()); 593 mbOwnDocument = sal_False; 594 maDocShellRef->DoInitNew( NULL ); 595 } 596 597 maDocShellRef->SetVisArea( maVisArea ); 598 bOK = SetObject( &maDocShellRef, SDTRANSFER_OBJECTTYPE_DRAWOLE, rFlavor ); 599 600 if( mpSdDrawDocumentIntern ) 601 mpSdDrawDocumentIntern->SetSwapGraphicsMode( nOldSwapMode ); 602 } 603 } 604 605 return bOK; 606 } 607 608 // ----------------------------------------------------------------------------- 609 610 /* testcode 611 #include <sfx2/docfile.hxx> 612 */ 613 614 sal_Bool SdTransferable::WriteObject( SotStorageStreamRef& rxOStm, void* pObject, sal_uInt32 nObjectType, const DataFlavor& ) 615 { 616 sal_Bool bRet = sal_False; 617 618 switch( nObjectType ) 619 { 620 case( SDTRANSFER_OBJECTTYPE_DRAWMODEL ): 621 { 622 try 623 { 624 static const sal_Bool bDontBurnInStyleSheet = ( getenv( "AVOID_BURN_IN_FOR_GALLERY_THEME" ) != NULL ); 625 SdDrawDocument* pDoc = (SdDrawDocument*) pObject; 626 if ( !bDontBurnInStyleSheet ) 627 pDoc->BurnInStyleSheetAttributes(); 628 rxOStm->SetBufferSize( 16348 ); 629 630 Reference< XComponent > xComponent( new SdXImpressDocument( pDoc, sal_True ) ); 631 pDoc->setUnoModel( Reference< XInterface >::query( xComponent ) ); 632 633 { 634 com::sun::star::uno::Reference<com::sun::star::io::XOutputStream> xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) ); 635 if( SvxDrawingLayerExport( pDoc, xDocOut, xComponent, (pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) ? "com.sun.star.comp.Impress.XMLClipboardExporter" : "com.sun.star.comp.DrawingLayer.XMLExporter" ) ) 636 rxOStm->Commit(); 637 } 638 639 /* testcode 640 { 641 const rtl::OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "file:///e:/test.xml" ) ); 642 SfxMedium aMedium( aURL, STREAM_WRITE | STREAM_TRUNC, sal_True ); 643 aMedium.IsRemote(); 644 com::sun::star::uno::Reference<com::sun::star::io::XOutputStream> xDocOut( new utl::OOutputStreamWrapper( *aMedium.GetOutStream() ) ); 645 if( SvxDrawingLayerExport( pDoc, xDocOut, xComponent, (pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) ? "com.sun.star.comp.Impress.XMLClipboardExporter" : "com.sun.star.comp.DrawingLayer.XMLExporter" ) ) 646 aMedium.Commit(); 647 } 648 */ 649 650 xComponent->dispose(); 651 bRet = ( rxOStm->GetError() == ERRCODE_NONE ); 652 } 653 catch( Exception& ) 654 { 655 DBG_ERROR( "sd::SdTransferable::WriteObject(), exception catched!" ); 656 bRet = sal_False; 657 } 658 } 659 break; 660 661 case( SDTRANSFER_OBJECTTYPE_DRAWOLE ): 662 { 663 SfxObjectShell* pEmbObj = (SfxObjectShell*) pObject; 664 ::utl::TempFile aTempFile; 665 aTempFile.EnableKillingFile(); 666 667 try 668 { 669 uno::Reference< embed::XStorage > xWorkStore = 670 ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE ); 671 672 // write document storage 673 pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, sal_False ); 674 // mba: no relative ULRs for clipboard! 675 SfxMedium aMedium( xWorkStore, String() ); 676 bRet = pEmbObj->DoSaveObjectAs( aMedium, sal_False ); 677 pEmbObj->DoSaveCompleted(); 678 679 uno::Reference< embed::XTransactedObject > xTransact( xWorkStore, uno::UNO_QUERY ); 680 if ( xTransact.is() ) 681 xTransact->commit(); 682 683 SvStream* pSrcStm = ::utl::UcbStreamHelper::CreateStream( aTempFile.GetURL(), STREAM_READ ); 684 if( pSrcStm ) 685 { 686 rxOStm->SetBufferSize( 0xff00 ); 687 *rxOStm << *pSrcStm; 688 delete pSrcStm; 689 } 690 691 bRet = sal_True; 692 rxOStm->Commit(); 693 } 694 catch ( Exception& ) 695 {} 696 } 697 698 break; 699 700 default: 701 break; 702 } 703 704 return bRet; 705 } 706 707 // ----------------------------------------------------------------------------- 708 709 void SdTransferable::DragFinished( sal_Int8 nDropAction ) 710 { 711 if( mpSdView ) 712 ( (::sd::View*) mpSdView )->DragFinished( nDropAction ); 713 } 714 715 // ----------------------------------------------------------------------------- 716 717 void SdTransferable::ObjectReleased() 718 { 719 if( this == SD_MOD()->pTransferClip ) 720 SD_MOD()->pTransferClip = NULL; 721 722 if( this == SD_MOD()->pTransferDrag ) 723 SD_MOD()->pTransferDrag = NULL; 724 725 if( this == SD_MOD()->pTransferSelection ) 726 SD_MOD()->pTransferSelection = NULL; 727 } 728 729 // ----------------------------------------------------------------------------- 730 731 void SdTransferable::SetObjectDescriptor( const TransferableObjectDescriptor& rObjDesc ) 732 { 733 delete mpObjDesc; 734 mpObjDesc = new TransferableObjectDescriptor( rObjDesc ); 735 PrepareOLE( rObjDesc ); 736 } 737 738 // ----------------------------------------------------------------------------- 739 740 void SdTransferable::SetPageBookmarks( const List& rPageBookmarks, sal_Bool bPersistent ) 741 { 742 if( mpSourceDoc ) 743 { 744 if( mpSdViewIntern ) 745 mpSdViewIntern->HideSdrPage(); 746 747 // #116168# 748 mpSdDrawDocument->ClearModel(sal_False); 749 750 mpPageDocShell = NULL; 751 752 for( void* p = maPageBookmarks.First(); p; p = maPageBookmarks.Next() ) 753 delete static_cast< String* >( p ); 754 755 if( bPersistent ) 756 { 757 mpSdDrawDocument->CreateFirstPages(mpSourceDoc); 758 mpSdDrawDocument->InsertBookmarkAsPage( const_cast< List* >( &rPageBookmarks ), NULL, sal_False, sal_True, 1, sal_True, mpSourceDoc->GetDocSh(), sal_True, sal_True, sal_False ); 759 } 760 else 761 { 762 mpPageDocShell = mpSourceDoc->GetDocSh(); 763 764 for( sal_uLong i = 0; i < rPageBookmarks.Count(); i++ ) 765 maPageBookmarks.Insert( new String( *static_cast< String* >( rPageBookmarks.GetObject( i ) ) ), LIST_APPEND ); 766 } 767 768 if( mpSdViewIntern && mpSdDrawDocument ) 769 { 770 SdPage* pPage = mpSdDrawDocument->GetSdPage( 0, PK_STANDARD ); 771 772 if( pPage ) 773 { 774 ( (SdrMarkView*) mpSdViewIntern )->MarkAllObj( (SdrPageView*) mpSdViewIntern->ShowSdrPage( pPage ) ); 775 } 776 } 777 778 // set flags for page transferable; if ( mbPageTransferablePersistent == sal_False ), 779 // don't offer any formats => it's just for internal puposes 780 mbPageTransferable = sal_True; 781 mbPageTransferablePersistent = bPersistent; 782 } 783 } 784 785 // ----------------------------------------------------------------------------- 786 787 sal_Int64 SAL_CALL SdTransferable::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( ::com::sun::star::uno::RuntimeException ) 788 { 789 sal_Int64 nRet; 790 791 if( ( rId.getLength() == 16 ) && 792 ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) ) 793 { 794 nRet = sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); 795 } 796 else 797 { 798 nRet = 0; 799 } 800 801 return nRet; 802 } 803 804 805 806 807 SdDrawDocument* SdTransferable::GetSourceDoc (void) const 808 { 809 return mpSourceDoc; 810 } 811 812 813 814 815 void SdTransferable::AddUserData (const ::boost::shared_ptr<UserData>& rpData) 816 { 817 maUserData.push_back(rpData); 818 } 819 820 821 822 823 void SdTransferable::RemoveUserData (const ::boost::shared_ptr<UserData>& rpData) 824 { 825 maUserData.erase(::std::find(maUserData.begin(), maUserData.end(), rpData)); 826 } 827 828 829 830 831 sal_Int32 SdTransferable::GetUserDataCount (void) const 832 { 833 return maUserData.size(); 834 } 835 836 837 838 839 ::boost::shared_ptr<SdTransferable::UserData> SdTransferable::GetUserData (const sal_Int32 nIndex) const 840 { 841 if (nIndex>=0 && nIndex<sal_Int32(maUserData.size())) 842 return maUserData[nIndex]; 843 else 844 return ::boost::shared_ptr<UserData>(); 845 } 846 847 848 849 850 // ----------------------------------------------------------------------------- 851 852 const ::com::sun::star::uno::Sequence< sal_Int8 >& SdTransferable::getUnoTunnelId() 853 { 854 static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq; 855 856 if( !aSeq.getLength() ) 857 { 858 static osl::Mutex aCreateMutex; 859 osl::MutexGuard aGuard( aCreateMutex ); 860 861 aSeq.realloc( 16 ); 862 rtl_createUuid( reinterpret_cast< sal_uInt8* >( aSeq.getArray() ), 0, sal_True ); 863 } 864 865 return aSeq; 866 } 867 868 // ----------------------------------------------------------------------------- 869 870 SdTransferable* SdTransferable::getImplementation( const Reference< XInterface >& rxData ) throw() 871 { 872 try 873 { 874 Reference< ::com::sun::star::lang::XUnoTunnel > xUnoTunnel( rxData, UNO_QUERY_THROW ); 875 return reinterpret_cast<SdTransferable*>(sal::static_int_cast<sal_uIntPtr>(xUnoTunnel->getSomething( SdTransferable::getUnoTunnelId()) ) ); 876 } 877 catch( const ::com::sun::star::uno::Exception& ) 878 { 879 } 880 return NULL; 881 } 882 883 // ----------------------------------------------------------------------------- 884 885 // SfxListener 886 void SdTransferable::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) 887 { 888 const SdrHint* pSdrHint = dynamic_cast< const SdrHint* >( &rHint ); 889 if( pSdrHint ) 890 { 891 if( HINT_MODELCLEARED == pSdrHint->GetKind() ) 892 { 893 EndListening(*mpSourceDoc); 894 mpSourceDoc = 0; 895 } 896 } 897 else 898 { 899 const SfxSimpleHint* pSimpleHint = dynamic_cast< const SfxSimpleHint * >(&rHint); 900 if(pSimpleHint && (pSimpleHint->GetId() == SFX_HINT_DYING) ) 901 { 902 if( &rBC == mpSourceDoc ) 903 mpSourceDoc = 0; 904 if( &rBC == mpSdViewIntern ) 905 mpSdViewIntern = 0; 906 if( &rBC == mpSdView ) 907 mpSdView = 0; 908 } 909 } 910 } 911 912 sal_Bool SdTransferable::SetTableRTF( SdDrawDocument* pModel, const DataFlavor& rFlavor) 913 { 914 if ( pModel ) 915 { 916 SdrPage* pPage = pModel->GetPage(0); 917 if (pPage && pPage->GetObjCount() == 1 ) 918 { 919 sdr::table::SdrTableObj* pTableObj = dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) ); 920 if( pTableObj ) 921 { 922 SvMemoryStream aMemStm( 65535, 65535 ); 923 sdr::table::SdrTableObj::ExportAsRTF( aMemStm, *pTableObj ); 924 return SetAny( Any( Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Seek( STREAM_SEEK_TO_END ) ) ), rFlavor ); 925 } 926 } 927 } 928 929 return sal_False; 930 } 931