1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 // INCLUDE --------------------------------------------------------------- 28 29 30 #include <com/sun/star/embed/XTransactedObject.hpp> 31 #include <com/sun/star/embed/XEmbedPersist.hpp> 32 #include <com/sun/star/uno/Exception.hpp> 33 34 #include <com/sun/star/beans/XPropertySet.hpp> 35 #include <com/sun/star/beans/XPropertySetInfo.hpp> 36 #include <com/sun/star/form/FormButtonType.hpp> 37 #include <toolkit/helper/vclunohelper.hxx> 38 #include <unotools/streamwrap.hxx> 39 40 #include <svx/unomodel.hxx> 41 #include <unotools/tempfile.hxx> 42 #include <unotools/ucbstreamhelper.hxx> 43 #include <comphelper/storagehelper.hxx> 44 45 #include <svtools/embedtransfer.hxx> 46 #include <sot/storage.hxx> 47 #include <vcl/virdev.hxx> 48 #include <svx/fmglob.hxx> 49 #include <svx/svditer.hxx> 50 #include <svx/svdograf.hxx> 51 #include <svx/svdoole2.hxx> 52 #include <svx/svdouno.hxx> 53 #include <svx/svdpage.hxx> 54 #include <svx/svdxcgv.hxx> 55 #include <sfx2/docfile.hxx> 56 #include <svl/itempool.hxx> 57 #include <svl/urlbmk.hxx> 58 #include <tools/urlobj.hxx> 59 #include <vos/mutex.hxx> 60 61 #include "drwtrans.hxx" 62 #include "docsh.hxx" 63 #include "drwlayer.hxx" 64 #include "drawview.hxx" 65 #include "viewdata.hxx" 66 #include "scmod.hxx" 67 #include "chartlis.hxx" 68 #include "rangeutl.hxx" 69 #include "formula/grammar.hxx" 70 71 // #108584# 72 #include "scitems.hxx" 73 74 // #108584# 75 #include <editeng/eeitem.hxx> 76 77 // #108584# 78 #include <editeng/fhgtitem.hxx> 79 #include <vcl/svapp.hxx> 80 81 82 using namespace com::sun::star; 83 84 // ----------------------------------------------------------------------- 85 86 #define SCDRAWTRANS_TYPE_EMBOBJ 1 87 #define SCDRAWTRANS_TYPE_DRAWMODEL 2 88 #define SCDRAWTRANS_TYPE_DOCUMENT 3 89 90 // ----------------------------------------------------------------------- 91 92 // ----------------------------------------------------------------------- 93 94 ScDrawTransferObj::ScDrawTransferObj( SdrModel* pClipModel, ScDocShell* pContainerShell, 95 const TransferableObjectDescriptor& rDesc ) : 96 pModel( pClipModel ), 97 aObjDesc( rDesc ), 98 pBookmark( NULL ), 99 bGraphic( sal_False ), 100 bGrIsBit( sal_False ), 101 bOleObj( sal_False ), 102 pDragSourceView( NULL ), 103 nDragSourceFlags( 0 ), 104 bDragWasInternal( sal_False ), 105 nSourceDocID( 0 ) 106 { 107 // 108 // check what kind of objects are contained 109 // 110 111 SdrPage* pPage = pModel->GetPage(0); 112 if (pPage) 113 { 114 SdrObjListIter aIter( *pPage, IM_FLAT ); 115 SdrObject* pObject = aIter.Next(); 116 if (pObject && !aIter.Next()) // exactly one object? 117 { 118 // 119 // OLE object 120 // 121 122 sal_uInt16 nSdrObjKind = pObject->GetObjIdentifier(); 123 if (nSdrObjKind == OBJ_OLE2) 124 { 125 // if object has no persistence it must be copied as a part of document 126 try 127 { 128 uno::Reference< embed::XEmbedPersist > xPersObj( ((SdrOle2Obj*)pObject)->GetObjRef(), uno::UNO_QUERY ); 129 if ( xPersObj.is() && xPersObj->hasEntry() ) 130 bOleObj = sal_True; 131 } 132 catch( uno::Exception& ) 133 {} 134 // aOleData is initialized later 135 } 136 137 // 138 // Graphic object 139 // 140 141 if (nSdrObjKind == OBJ_GRAF) 142 { 143 bGraphic = sal_True; 144 if ( ((SdrGrafObj*)pObject)->GetGraphic().GetType() == GRAPHIC_BITMAP ) 145 bGrIsBit = sal_True; 146 } 147 148 // 149 // URL button 150 // 151 152 SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, pObject); 153 if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor()) 154 { 155 uno::Reference<awt::XControlModel> xControlModel = pUnoCtrl->GetUnoControlModel(); 156 DBG_ASSERT( xControlModel.is(), "uno control without model" ); 157 if ( xControlModel.is() ) 158 { 159 uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY ); 160 uno::Reference< beans::XPropertySetInfo > xInfo = xPropSet->getPropertySetInfo(); 161 162 rtl::OUString sPropButtonType = rtl::OUString::createFromAscii( "ButtonType" ); 163 rtl::OUString sPropTargetURL = rtl::OUString::createFromAscii( "TargetURL" ); 164 rtl::OUString sPropLabel = rtl::OUString::createFromAscii( "Label" ); 165 166 if(xInfo->hasPropertyByName( sPropButtonType )) 167 { 168 uno::Any aAny = xPropSet->getPropertyValue( sPropButtonType ); 169 form::FormButtonType eTmp; 170 if ( (aAny >>= eTmp) && eTmp == form::FormButtonType_URL ) 171 { 172 // URL 173 if(xInfo->hasPropertyByName( sPropTargetURL )) 174 { 175 aAny = xPropSet->getPropertyValue( sPropTargetURL ); 176 rtl::OUString sTmp; 177 if ( (aAny >>= sTmp) && sTmp.getLength() ) 178 { 179 String aUrl = sTmp; 180 String aAbs; 181 const SfxMedium* pMedium; 182 if (pContainerShell && (pMedium = pContainerShell->GetMedium()) != NULL) 183 { 184 bool bWasAbs = true; 185 aAbs = pMedium->GetURLObject().smartRel2Abs( aUrl, bWasAbs ). 186 GetMainURL(INetURLObject::NO_DECODE); 187 // full path as stored INetBookmark must be encoded 188 } 189 else 190 aAbs = aUrl; 191 192 // Label 193 String aLabel; 194 if(xInfo->hasPropertyByName( sPropLabel )) 195 { 196 aAny = xPropSet->getPropertyValue( sPropLabel ); 197 if ( (aAny >>= sTmp) && sTmp.getLength() ) 198 { 199 aLabel = String(sTmp); 200 } 201 } 202 pBookmark = new INetBookmark( aAbs, aLabel ); 203 } 204 } 205 } 206 } 207 } 208 } 209 } 210 } 211 212 // 213 // get size for object descriptor 214 // 215 216 // #i71538# use complete SdrViews 217 // SdrExchangeView aView(pModel); 218 SdrView aView(pModel); 219 SdrPageView* pPv = aView.ShowSdrPage(aView.GetModel()->GetPage(0)); 220 aView.MarkAllObj(pPv); 221 aSrcSize = aView.GetAllMarkedRect().GetSize(); 222 223 if ( bOleObj ) // single OLE object 224 { 225 SdrOle2Obj* pObj = GetSingleObject(); 226 if ( pObj && pObj->GetObjRef().is() ) 227 SvEmbedTransferHelper::FillTransferableObjectDescriptor( aObjDesc, pObj->GetObjRef(), pObj->GetGraphic(), pObj->GetAspect() ); 228 } 229 230 aObjDesc.maSize = aSrcSize; 231 PrepareOLE( aObjDesc ); 232 233 // 234 // remember a unique ID of the source document 235 // 236 if ( pContainerShell ) 237 { 238 ScDocument* pDoc = pContainerShell->GetDocument(); 239 if ( pDoc ) 240 { 241 nSourceDocID = pDoc->GetDocumentID(); 242 if ( pPage ) 243 { 244 ScChartHelper::FillProtectedChartRangesVector( m_aProtectedChartRangesVector, pDoc, pPage ); 245 } 246 } 247 } 248 } 249 250 ScDrawTransferObj::~ScDrawTransferObj() 251 { 252 Application::GetSolarMutex().acquire(); //! ??? 253 254 ScModule* pScMod = SC_MOD(); 255 if ( pScMod->GetClipData().pDrawClipboard == this ) 256 { 257 DBG_ERROR("ScDrawTransferObj wasn't released"); 258 pScMod->SetClipObject( NULL, NULL ); 259 } 260 if ( pScMod->GetDragData().pDrawTransfer == this ) 261 { 262 DBG_ERROR("ScDrawTransferObj wasn't released"); 263 pScMod->ResetDragObject(); 264 } 265 266 aOleData = TransferableDataHelper(); // clear before releasing the mutex 267 aDocShellRef.Clear(); 268 269 delete pModel; 270 aDrawPersistRef.Clear(); // after the model 271 272 delete pBookmark; 273 delete pDragSourceView; 274 275 Application::GetSolarMutex().release(); //! ??? 276 } 277 278 // static 279 ScDrawTransferObj* ScDrawTransferObj::GetOwnClipboard( Window* ) 280 { 281 ScDrawTransferObj* pObj = SC_MOD()->GetClipData().pDrawClipboard; 282 return pObj; 283 } 284 285 sal_Bool lcl_HasOnlyControls( SdrModel* pModel ) 286 { 287 sal_Bool bOnlyControls = sal_False; // default if there are no objects 288 289 if ( pModel ) 290 { 291 SdrPage* pPage = pModel->GetPage(0); 292 if (pPage) 293 { 294 SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); 295 SdrObject* pObj = aIter.Next(); 296 if ( pObj ) 297 { 298 bOnlyControls = sal_True; // only set if there are any objects at all 299 while ( pObj ) 300 { 301 if (!pObj->ISA(SdrUnoObj)) 302 { 303 bOnlyControls = sal_False; 304 break; 305 } 306 pObj = aIter.Next(); 307 } 308 } 309 } 310 } 311 312 return bOnlyControls; 313 } 314 315 void ScDrawTransferObj::AddSupportedFormats() 316 { 317 if ( bGrIsBit ) // single bitmap graphic 318 { 319 AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 320 AddFormat( SOT_FORMATSTR_ID_SVXB ); 321 AddFormat( SOT_FORMATSTR_ID_PNG ); 322 AddFormat( SOT_FORMAT_BITMAP ); 323 AddFormat( SOT_FORMAT_GDIMETAFILE ); 324 } 325 else if ( bGraphic ) // other graphic 326 { 327 // #i25616# 328 AddFormat( SOT_FORMATSTR_ID_DRAWING ); 329 330 AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 331 AddFormat( SOT_FORMATSTR_ID_SVXB ); 332 AddFormat( SOT_FORMAT_GDIMETAFILE ); 333 AddFormat( SOT_FORMATSTR_ID_PNG ); 334 AddFormat( SOT_FORMAT_BITMAP ); 335 } 336 else if ( pBookmark ) // url button 337 { 338 // AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ); 339 AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 340 AddFormat( SOT_FORMATSTR_ID_SOLK ); 341 AddFormat( SOT_FORMAT_STRING ); 342 AddFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ); 343 AddFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ); 344 AddFormat( SOT_FORMATSTR_ID_DRAWING ); 345 } 346 else if ( bOleObj ) // single OLE object 347 { 348 AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ); 349 AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 350 AddFormat( SOT_FORMAT_GDIMETAFILE ); 351 352 if ( !aOleData.GetTransferable().is() ) 353 { 354 SdrOle2Obj* pObj = GetSingleObject(); 355 if ( pObj && pObj->GetObjRef().is() ) 356 aOleData = TransferableDataHelper( new SvEmbedTransferHelper( pObj->GetObjRef(), pObj->GetGraphic(), pObj->GetAspect() ) ) ; 357 } 358 if ( aOleData.GetTransferable().is() ) 359 { 360 // get format list from object snapshot 361 // (this must be after inserting the default formats!) 362 363 DataFlavorExVector aVector( aOleData.GetDataFlavorExVector() ); 364 DataFlavorExVector::iterator aIter( aVector.begin() ), aEnd( aVector.end() ); 365 366 while( aIter != aEnd ) 367 AddFormat( *aIter++ ); 368 } 369 } 370 else // any drawing objects 371 { 372 AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ); 373 AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 374 AddFormat( SOT_FORMATSTR_ID_DRAWING ); 375 376 // #103556# leave out bitmap and metafile if there are only controls 377 if ( !lcl_HasOnlyControls( pModel ) ) 378 { 379 AddFormat( SOT_FORMATSTR_ID_PNG ); 380 AddFormat( SOT_FORMAT_BITMAP ); 381 AddFormat( SOT_FORMAT_GDIMETAFILE ); 382 } 383 } 384 385 // if( pImageMap ) 386 // AddFormat( SOT_FORMATSTR_ID_SVIM ); 387 } 388 389 sal_Bool ScDrawTransferObj::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) 390 { 391 sal_Bool bOK = sal_False; 392 sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); 393 394 if ( bOleObj && nFormat != SOT_FORMAT_GDIMETAFILE ) 395 { 396 if ( !aOleData.GetTransferable().is() ) 397 { 398 SdrOle2Obj* pObj = GetSingleObject(); 399 if ( pObj && pObj->GetObjRef().is() ) 400 aOleData = TransferableDataHelper( new SvEmbedTransferHelper( pObj->GetObjRef(), pObj->GetGraphic(), pObj->GetAspect() ) ) ; 401 } 402 403 if( aOleData.GetTransferable().is() && aOleData.HasFormat( rFlavor ) ) 404 { 405 sal_uLong nOldSwapMode = 0; 406 407 if( pModel ) 408 { 409 nOldSwapMode = pModel->GetSwapGraphicsMode(); 410 pModel->SetSwapGraphicsMode( SDR_SWAPGRAPHICSMODE_PURGE ); 411 } 412 413 bOK = SetAny( aOleData.GetAny( rFlavor ), rFlavor ); 414 415 if( pModel ) 416 pModel->SetSwapGraphicsMode( nOldSwapMode ); 417 418 return bOK; 419 } 420 } 421 422 if( HasFormat( nFormat ) ) 423 { 424 if ( nFormat == SOT_FORMATSTR_ID_LINKSRCDESCRIPTOR || nFormat == SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) 425 { 426 bOK = SetTransferableObjectDescriptor( aObjDesc, rFlavor ); 427 } 428 else if ( nFormat == SOT_FORMATSTR_ID_DRAWING ) 429 { 430 bOK = SetObject( pModel, SCDRAWTRANS_TYPE_DRAWMODEL, rFlavor ); 431 } 432 else if ( nFormat == SOT_FORMAT_BITMAP 433 || nFormat == SOT_FORMATSTR_ID_PNG 434 || nFormat == SOT_FORMAT_GDIMETAFILE ) 435 { 436 // #i71538# use complete SdrViews 437 // SdrExchangeView aView( pModel ); 438 SdrView aView( pModel ); 439 SdrPageView* pPv = aView.ShowSdrPage(aView.GetModel()->GetPage(0)); 440 DBG_ASSERT( pPv, "pPv not there..." ); 441 aView.MarkAllObj( pPv ); 442 if ( nFormat == SOT_FORMAT_GDIMETAFILE ) 443 bOK = SetGDIMetaFile( aView.GetMarkedObjMetaFile(true), rFlavor ); 444 else 445 bOK = SetBitmapEx( aView.GetMarkedObjBitmapEx(true), rFlavor ); 446 } 447 else if ( nFormat == SOT_FORMATSTR_ID_SVXB ) 448 { 449 // only enabled for single graphics object 450 451 SdrPage* pPage = pModel->GetPage(0); 452 if (pPage) 453 { 454 SdrObjListIter aIter( *pPage, IM_FLAT ); 455 SdrObject* pObject = aIter.Next(); 456 if (pObject && pObject->GetObjIdentifier() == OBJ_GRAF) 457 { 458 SdrGrafObj* pGraphObj = (SdrGrafObj*) pObject; 459 bOK = SetGraphic( pGraphObj->GetGraphic(), rFlavor ); 460 } 461 } 462 } 463 else if ( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE ) 464 { 465 if ( bOleObj ) // single OLE object 466 { 467 SdrOle2Obj* pObj = GetSingleObject(); 468 if ( pObj && pObj->GetObjRef().is() ) 469 { 470 bOK = SetObject( pObj->GetObjRef().get(), SCDRAWTRANS_TYPE_EMBOBJ, rFlavor ); 471 } 472 } 473 else // create object from contents 474 { 475 //TODO/LATER: needs new Format, because now single OLE and "this" are different 476 InitDocShell(); // set aDocShellRef 477 478 SfxObjectShell* pEmbObj = aDocShellRef; 479 bOK = SetObject( pEmbObj, SCDRAWTRANS_TYPE_DOCUMENT, rFlavor ); 480 } 481 } 482 else if( pBookmark ) 483 { 484 bOK = SetINetBookmark( *pBookmark, rFlavor ); 485 } 486 } 487 return bOK; 488 } 489 490 sal_Bool ScDrawTransferObj::WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, 491 const ::com::sun::star::datatransfer::DataFlavor& /* rFlavor */ ) 492 { 493 // called from SetObject, put data into stream 494 495 sal_Bool bRet = sal_False; 496 switch (nUserObjectId) 497 { 498 case SCDRAWTRANS_TYPE_DRAWMODEL: 499 { 500 SdrModel* pDrawModel = (SdrModel*)pUserObject; 501 rxOStm->SetBufferSize( 0xff00 ); 502 503 // #108584# 504 // for the changed pool defaults from drawing layer pool set those 505 // attributes as hard attributes to preserve them for saving 506 const SfxItemPool& rItemPool = pModel->GetItemPool(); 507 const SvxFontHeightItem& rDefaultFontHeight = (const SvxFontHeightItem&)rItemPool.GetDefaultItem(EE_CHAR_FONTHEIGHT); 508 509 // SW should have no MasterPages 510 DBG_ASSERT(0L == pModel->GetMasterPageCount(), "SW with MasterPages (!)"); 511 512 for(sal_uInt16 a(0); a < pModel->GetPageCount(); a++) 513 { 514 const SdrPage* pPage = pModel->GetPage(a); 515 SdrObjListIter aIter(*pPage, IM_DEEPNOGROUPS); 516 517 while(aIter.IsMore()) 518 { 519 SdrObject* pObj = aIter.Next(); 520 const SvxFontHeightItem& rItem = (const SvxFontHeightItem&)pObj->GetMergedItem(EE_CHAR_FONTHEIGHT); 521 522 if(rItem.GetHeight() == rDefaultFontHeight.GetHeight()) 523 { 524 pObj->SetMergedItem(rDefaultFontHeight); 525 } 526 } 527 } 528 529 { 530 com::sun::star::uno::Reference<com::sun::star::io::XOutputStream> xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) ); 531 if( SvxDrawingLayerExport( pDrawModel, xDocOut ) ) 532 rxOStm->Commit(); 533 } 534 535 bRet = ( rxOStm->GetError() == ERRCODE_NONE ); 536 } 537 break; 538 539 case SCDRAWTRANS_TYPE_EMBOBJ: 540 { 541 // impl. for "single OLE" 542 embed::XEmbeddedObject* pEmbObj = (embed::XEmbeddedObject*) pUserObject; 543 544 ::utl::TempFile aTempFile; 545 aTempFile.EnableKillingFile(); 546 uno::Reference< embed::XStorage > xWorkStore = 547 ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE ); 548 549 uno::Reference < embed::XEmbedPersist > xPers( (embed::XVisualObject*)pEmbObj, uno::UNO_QUERY ); 550 if ( xPers.is() ) 551 { 552 try 553 { 554 uno::Sequence < beans::PropertyValue > aSeq; 555 ::rtl::OUString aDummyName = ::rtl::OUString::createFromAscii("Dummy"); 556 xPers->storeToEntry( xWorkStore, aDummyName, aSeq, aSeq ); 557 if ( xWorkStore->isStreamElement( aDummyName ) ) 558 { 559 uno::Reference < io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) ); 560 uno::Reference < io::XStream > xNewStream = xWorkStore->openStreamElement( aDummyName, embed::ElementModes::READ ); 561 ::comphelper::OStorageHelper::CopyInputToOutput( xNewStream->getInputStream(), xDocOut ); 562 } 563 else 564 { 565 uno::Reference < io::XStream > xDocStr( new utl::OStreamWrapper( *rxOStm ) ); 566 uno::Reference< embed::XStorage > xDocStg = ::comphelper::OStorageHelper::GetStorageFromStream( xDocStr ); 567 uno::Reference < embed::XStorage > xNewStg = xWorkStore->openStorageElement( aDummyName, embed::ElementModes::READ ); 568 xNewStg->copyToStorage( xDocStg ); 569 uno::Reference < embed::XTransactedObject > xTrans( xDocStg, uno::UNO_QUERY ); 570 if ( xTrans.is() ) 571 xTrans->commit(); 572 } 573 574 rxOStm->Commit(); 575 } 576 catch ( uno::Exception& ) 577 { 578 } 579 } 580 581 break; 582 } 583 case SCDRAWTRANS_TYPE_DOCUMENT: 584 { 585 // impl. for "DocShell" 586 SfxObjectShell* pEmbObj = (SfxObjectShell*) pUserObject; 587 588 try 589 { 590 ::utl::TempFile aTempFile; 591 aTempFile.EnableKillingFile(); 592 uno::Reference< embed::XStorage > xWorkStore = 593 ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE ); 594 595 // write document storage 596 pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, sal_False ); 597 598 // mba: no relative ULRs for clipboard! 599 SfxMedium aMedium( xWorkStore, String() ); 600 bRet = pEmbObj->DoSaveObjectAs( aMedium, sal_False ); 601 pEmbObj->DoSaveCompleted(); 602 603 uno::Reference< embed::XTransactedObject > xTransact( xWorkStore, uno::UNO_QUERY ); 604 if ( xTransact.is() ) 605 xTransact->commit(); 606 607 SvStream* pSrcStm = ::utl::UcbStreamHelper::CreateStream( aTempFile.GetURL(), STREAM_READ ); 608 if( pSrcStm ) 609 { 610 rxOStm->SetBufferSize( 0xff00 ); 611 *rxOStm << *pSrcStm; 612 delete pSrcStm; 613 } 614 615 bRet = sal_True; 616 617 xWorkStore->dispose(); 618 xWorkStore = uno::Reference < embed::XStorage >(); 619 rxOStm->Commit(); 620 } 621 catch ( uno::Exception& ) 622 {} 623 624 bRet = ( rxOStm->GetError() == ERRCODE_NONE ); 625 } 626 break; 627 628 default: 629 DBG_ERROR("unknown object id"); 630 } 631 return bRet; 632 } 633 634 void ScDrawTransferObj::ObjectReleased() 635 { 636 ScModule* pScMod = SC_MOD(); 637 if ( pScMod->GetClipData().pDrawClipboard == this ) 638 pScMod->SetClipObject( NULL, NULL ); 639 640 TransferableHelper::ObjectReleased(); 641 } 642 643 void ScDrawTransferObj::DragFinished( sal_Int8 nDropAction ) 644 { 645 if ( nDropAction == DND_ACTION_MOVE && !bDragWasInternal && !(nDragSourceFlags & SC_DROP_NAVIGATOR) ) 646 { 647 // move: delete source objects 648 649 if ( pDragSourceView ) 650 pDragSourceView->DeleteMarked(); 651 } 652 653 ScModule* pScMod = SC_MOD(); 654 if ( pScMod->GetDragData().pDrawTransfer == this ) 655 pScMod->ResetDragObject(); 656 657 DELETEZ( pDragSourceView ); 658 659 TransferableHelper::DragFinished( nDropAction ); 660 } 661 662 void ScDrawTransferObj::SetDrawPersist( const SfxObjectShellRef& rRef ) 663 { 664 aDrawPersistRef = rRef; 665 } 666 667 void lcl_InitMarks( SdrMarkView& rDest, const SdrMarkView& rSource, SCTAB nTab ) 668 { 669 rDest.ShowSdrPage(rDest.GetModel()->GetPage(nTab)); 670 SdrPageView* pDestPV = rDest.GetSdrPageView(); 671 DBG_ASSERT(pDestPV,"PageView ?"); 672 673 const SdrMarkList& rMarkList = rSource.GetMarkedObjectList(); 674 sal_uLong nCount = rMarkList.GetMarkCount(); 675 for (sal_uLong i=0; i<nCount; i++) 676 { 677 SdrMark* pMark = rMarkList.GetMark(i); 678 SdrObject* pObj = pMark->GetMarkedSdrObj(); 679 680 rDest.MarkObj(pObj, pDestPV); 681 } 682 } 683 684 void ScDrawTransferObj::SetDragSource( ScDrawView* pView ) 685 { 686 DELETEZ( pDragSourceView ); 687 pDragSourceView = new SdrView( pView->GetModel() ); 688 lcl_InitMarks( *pDragSourceView, *pView, pView->GetTab() ); 689 690 //! add as listener with document, delete pDragSourceView if document gone 691 } 692 693 void ScDrawTransferObj::SetDragSourceObj( SdrObject* pObj, SCTAB nTab ) 694 { 695 DELETEZ( pDragSourceView ); 696 pDragSourceView = new SdrView( pObj->GetModel() ); 697 pDragSourceView->ShowSdrPage(pDragSourceView->GetModel()->GetPage(nTab)); 698 SdrPageView* pPV = pDragSourceView->GetSdrPageView(); 699 pDragSourceView->MarkObj(pObj, pPV); 700 701 //! add as listener with document, delete pDragSourceView if document gone 702 } 703 704 void ScDrawTransferObj::SetDragSourceFlags( sal_uInt16 nFlags ) 705 { 706 nDragSourceFlags = nFlags; 707 } 708 709 void ScDrawTransferObj::SetDragWasInternal() 710 { 711 bDragWasInternal = sal_True; 712 } 713 714 SdrOle2Obj* ScDrawTransferObj::GetSingleObject() 715 { 716 // if single OLE object was copied, get its object 717 718 SdrPage* pPage = pModel->GetPage(0); 719 if (pPage) 720 { 721 SdrObjListIter aIter( *pPage, IM_FLAT ); 722 SdrObject* pObject = aIter.Next(); 723 if (pObject && pObject->GetObjIdentifier() == OBJ_OLE2) 724 { 725 return (SdrOle2Obj*) pObject; 726 } 727 } 728 729 return NULL; 730 } 731 732 // 733 // initialize aDocShellRef with a live document from the ClipDoc 734 // 735 736 void ScDrawTransferObj::InitDocShell() 737 { 738 if ( !aDocShellRef.Is() ) 739 { 740 ScDocShell* pDocSh = new ScDocShell; 741 aDocShellRef = pDocSh; // ref must be there before InitNew 742 743 pDocSh->DoInitNew(NULL); 744 745 ScDocument* pDestDoc = pDocSh->GetDocument(); 746 pDestDoc->InitDrawLayer( pDocSh ); 747 748 SdrModel* pDestModel = pDestDoc->GetDrawLayer(); 749 // #i71538# use complete SdrViews 750 // SdrExchangeView aDestView( pDestModel ); 751 SdrView aDestView( pDestModel ); 752 aDestView.ShowSdrPage(aDestView.GetModel()->GetPage(0)); 753 aDestView.Paste( *pModel, Point( aSrcSize.Width()/2, aSrcSize.Height()/2 ) ); 754 755 // put objects to right layer (see ScViewFunc::PasteDataFormat for SOT_FORMATSTR_ID_DRAWING) 756 757 SdrPage* pPage = pDestModel->GetPage(0); 758 if (pPage) 759 { 760 SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS ); 761 SdrObject* pObject = aIter.Next(); 762 while (pObject) 763 { 764 if ( pObject->ISA(SdrUnoObj) ) 765 pObject->NbcSetLayer(SC_LAYER_CONTROLS); 766 else 767 pObject->NbcSetLayer(SC_LAYER_FRONT); 768 pObject = aIter.Next(); 769 } 770 } 771 772 Point aTmpPoint; 773 Rectangle aDestArea( aTmpPoint, aSrcSize ); 774 pDocSh->SetVisArea( aDestArea ); 775 776 ScViewOptions aViewOpt( pDestDoc->GetViewOptions() ); 777 aViewOpt.SetOption( VOPT_GRID, sal_False ); 778 pDestDoc->SetViewOptions( aViewOpt ); 779 780 ScViewData aViewData( pDocSh, NULL ); 781 aViewData.SetTabNo( 0 ); 782 aViewData.SetScreen( aDestArea ); 783 aViewData.SetCurX( 0 ); 784 aViewData.SetCurY( 0 ); 785 pDocSh->UpdateOle(&aViewData, sal_True); 786 } 787 } 788 789 const com::sun::star::uno::Sequence< sal_Int8 >& ScDrawTransferObj::getUnoTunnelId() 790 { 791 static com::sun::star::uno::Sequence< sal_Int8 > aSeq; 792 if( !aSeq.getLength() ) 793 { 794 static osl::Mutex aCreateMutex; 795 osl::Guard< osl::Mutex > aGuard( aCreateMutex ); 796 aSeq.realloc( 16 ); 797 rtl_createUuid( reinterpret_cast< sal_uInt8* >( aSeq.getArray() ), 0, sal_True ); 798 } 799 return aSeq; 800 } 801 802 sal_Int64 SAL_CALL ScDrawTransferObj::getSomething( const com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( com::sun::star::uno::RuntimeException ) 803 { 804 sal_Int64 nRet; 805 if( ( rId.getLength() == 16 ) && 806 ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) ) 807 { 808 nRet = reinterpret_cast< sal_Int64 >( this ); 809 } 810 else 811 nRet = TransferableHelper::getSomething(rId); 812 return nRet; 813 } 814 815 816