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 31 32 #include "View.hxx" 33 34 #include <vector> 35 #include <com/sun/star/embed/XEmbedPersist.hpp> 36 #include <tools/ref.hxx> 37 #include <tools/urlobj.hxx> 38 #ifndef _MSGBOX_HXX //autogen 39 #include <vcl/msgbox.hxx> 40 #endif 41 #include <svx/svdetc.hxx> 42 #include <svx/svdoole2.hxx> 43 #include <svx/svdograf.hxx> 44 #include <vcl/graph.hxx> 45 #include <svx/xexch.hxx> 46 #include <svx/svxdlg.hxx> 47 #include <svx/dialogs.hrc> 48 #include <sfx2/docfile.hxx> 49 #include <sfx2/childwin.hxx> 50 #include <svx/svdundo.hxx> 51 #include <svx/svdpagv.hxx> 52 #include <svl/urlbmk.hxx> 53 #include <svl/urlbmk.hxx> 54 #include <editeng/outliner.hxx> 55 #include <svx/xflclit.hxx> 56 #include <svx/dbexch.hrc> 57 #include <sot/formats.hxx> 58 #include <editeng/editeng.hxx> 59 #include <svx/svditer.hxx> 60 #include <svx/obj3d.hxx> 61 #include <svx/scene3d.hxx> 62 63 #include <sfx2/objsh.hxx> 64 #include <svtools/embedtransfer.hxx> 65 66 #include "navigatr.hxx" 67 #include "anminfo.hxx" 68 #include "strings.hrc" 69 #include "glob.hrc" 70 #include "sdxfer.hxx" 71 #include "sdresid.hxx" 72 #include "sdmod.hxx" 73 #include "DrawViewShell.hxx" 74 #include "DrawDocShell.hxx" 75 #include "fudraw.hxx" 76 #include "drawdoc.hxx" 77 #include "Window.hxx" 78 #include "sdpage.hxx" 79 #include "unoaprms.hxx" 80 #include "drawview.hxx" 81 #include "helpids.h" 82 #include <vcl/svapp.hxx> 83 84 #include "slideshow.hxx" 85 86 namespace sd { 87 88 #ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED 89 #define SO2_DECL_SVINPLACEOBJECT_DEFINED 90 SO2_DECL_REF(SvInPlaceObject) 91 #endif 92 #ifndef SO2_DECL_SVSTORAGE_DEFINED 93 #define SO2_DECL_SVSTORAGE_DEFINED 94 SO2_DECL_REF(SvStorage) 95 #endif 96 97 using namespace ::com::sun::star; 98 99 // ------------------------ 100 // - SdNavigatorDropEvent - 101 // ------------------------ 102 103 struct SdNavigatorDropEvent : public ExecuteDropEvent 104 { 105 DropTargetHelper& mrTargetHelper; 106 ::sd::Window* mpTargetWindow; 107 sal_uInt16 mnPage; 108 sal_uInt16 mnLayer; 109 110 SdNavigatorDropEvent ( 111 const ExecuteDropEvent& rEvt, 112 DropTargetHelper& rTargetHelper, 113 ::sd::Window* pTargetWindow, 114 sal_uInt16 nPage, 115 sal_uInt16 nLayer ) 116 : ExecuteDropEvent( rEvt ), 117 mrTargetHelper( rTargetHelper ), 118 mpTargetWindow( pTargetWindow ), 119 mnPage( nPage ), 120 mnLayer( nLayer ) 121 {} 122 }; 123 124 // ----------------------------------------------------------------------------- 125 126 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > View::CreateClipboardDataObject( View*, ::Window& ) 127 { 128 // since SdTransferable::CopyToClipboard is called, this 129 // dynamically created object ist destroyed automatically 130 SdTransferable* pTransferable = new SdTransferable( mpDoc, NULL, sal_False ); 131 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xRet( pTransferable ); 132 133 SD_MOD()->pTransferClip = pTransferable; 134 135 mpDoc->CreatingDataObj( pTransferable ); 136 pTransferable->SetWorkDocument( (SdDrawDocument*) GetAllMarkedModel() ); 137 mpDoc->CreatingDataObj( NULL ); 138 139 // #112978# need to use GetAllMarkedBoundRect instead of GetAllMarkedRect to get 140 // fat lines correctly 141 const Rectangle aMarkRect( GetAllMarkedBoundRect() ); 142 TransferableObjectDescriptor aObjDesc; 143 String aDisplayName; 144 SdrOle2Obj* pSdrOleObj = NULL; 145 SdrPageView* pPgView = GetSdrPageView(); 146 SdPage* pOldPage = pPgView ? ( (SdPage*) pPgView->GetPage() ) : NULL; 147 SdPage* pNewPage = (SdPage*) pTransferable->GetWorkDocument()->GetPage( 0 ); 148 149 if( pOldPage ) 150 { 151 pNewPage->SetSize( pOldPage->GetSize() ); 152 pNewPage->SetLayoutName( pOldPage->GetLayoutName() ); 153 } 154 155 if( GetMarkedObjectCount() == 1 ) 156 { 157 SdrObject* pObj = GetMarkedObjectByIndex(0); 158 159 if( pObj && pObj->ISA(SdrOle2Obj) && ((SdrOle2Obj*) pObj)->GetObjRef().is() ) 160 { 161 // If object has no persistence it must be copied as part of the document 162 try 163 { 164 uno::Reference< embed::XEmbedPersist > xPersObj( ((SdrOle2Obj*)pObj)->GetObjRef(), uno::UNO_QUERY ); 165 if ( xPersObj.is() && xPersObj->hasEntry() ) 166 pSdrOleObj = (SdrOle2Obj*) pObj; 167 } 168 catch( uno::Exception& ) 169 {} 170 } 171 } 172 173 if( pSdrOleObj ) 174 SvEmbedTransferHelper::FillTransferableObjectDescriptor( aObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() ); 175 else 176 pTransferable->GetWorkDocument()->GetDocSh()->FillTransferableObjectDescriptor( aObjDesc ); 177 178 if( mpDocSh ) 179 aObjDesc.maDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); 180 181 aObjDesc.maSize = aMarkRect.GetSize(); 182 183 pTransferable->SetStartPos( aMarkRect.TopLeft() ); 184 pTransferable->SetObjectDescriptor( aObjDesc ); 185 pTransferable->CopyToClipboard( mpViewSh->GetActiveWindow() ); 186 187 return xRet; 188 } 189 190 // ----------------------------------------------------------------------------- 191 192 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > View::CreateDragDataObject( View* pWorkView, ::Window& rWindow, const Point& rDragPos ) 193 { 194 SdTransferable* pTransferable = new SdTransferable( mpDoc, pWorkView, sal_False ); 195 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xRet( pTransferable ); 196 197 SD_MOD()->pTransferDrag = pTransferable; 198 199 TransferableObjectDescriptor aObjDesc; 200 String aDisplayName; 201 SdrOle2Obj* pSdrOleObj = NULL; 202 203 if( GetMarkedObjectCount() == 1 ) 204 { 205 SdrObject* pObj = GetMarkedObjectByIndex( 0 ); 206 207 if( pObj && pObj->ISA( SdrOle2Obj ) && ( (SdrOle2Obj*) pObj )->GetObjRef().is() ) 208 { 209 // If object has no persistence it must be copied as part of the document 210 try 211 { 212 uno::Reference< embed::XEmbedPersist > xPersObj( ((SdrOle2Obj*)pObj)->GetObjRef(), uno::UNO_QUERY ); 213 if ( xPersObj.is() && xPersObj->hasEntry() ) 214 pSdrOleObj = (SdrOle2Obj*) pObj; 215 } 216 catch( uno::Exception& ) 217 {} 218 } 219 } 220 221 if( mpDocSh ) 222 aDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); 223 224 if( pSdrOleObj ) 225 SvEmbedTransferHelper::FillTransferableObjectDescriptor( aObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() ); 226 else 227 mpDocSh->FillTransferableObjectDescriptor( aObjDesc ); 228 229 aObjDesc.maSize = GetAllMarkedRect().GetSize(); 230 aObjDesc.maDragStartPos = rDragPos; 231 aObjDesc.maDisplayName = aDisplayName; 232 aObjDesc.mbCanLink = sal_False; 233 234 pTransferable->SetStartPos( rDragPos ); 235 pTransferable->SetObjectDescriptor( aObjDesc ); 236 pTransferable->StartDrag( &rWindow, DND_ACTION_COPYMOVE | DND_ACTION_LINK ); 237 238 return xRet; 239 } 240 241 // ----------------------------------------------------------------------------- 242 243 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > View::CreateSelectionDataObject( View* pWorkView, ::Window& rWindow ) 244 { 245 SdTransferable* pTransferable = new SdTransferable( mpDoc, pWorkView, sal_True ); 246 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xRet( pTransferable ); 247 TransferableObjectDescriptor aObjDesc; 248 const Rectangle aMarkRect( GetAllMarkedRect() ); 249 String aDisplayName; 250 251 SD_MOD()->pTransferSelection = pTransferable; 252 253 if( mpDocSh ) 254 { 255 aDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); 256 mpDocSh->FillTransferableObjectDescriptor( aObjDesc ); 257 } 258 259 aObjDesc.maSize = aMarkRect.GetSize(); 260 261 pTransferable->SetStartPos( aMarkRect.TopLeft() ); 262 pTransferable->SetObjectDescriptor( aObjDesc ); 263 pTransferable->CopyToSelection( &rWindow ); 264 265 return xRet; 266 } 267 268 // ----------------------------------------------------------------------------- 269 270 void View::UpdateSelectionClipboard( sal_Bool bForceDeselect ) 271 { 272 if( mpViewSh && mpViewSh->GetActiveWindow() ) 273 { 274 if( !bForceDeselect && GetMarkedObjectList().GetMarkCount() ) 275 CreateSelectionDataObject( this, *mpViewSh->GetActiveWindow() ); 276 else if( SD_MOD()->pTransferSelection && ( SD_MOD()->pTransferSelection->GetView() == this ) ) 277 { 278 TransferableHelper::ClearSelection( mpViewSh->GetActiveWindow() ); 279 SD_MOD()->pTransferSelection = NULL; 280 } 281 } 282 } 283 284 // ----------------------------------------------------------------------------- 285 286 void View::DoCut(::Window* ) 287 { 288 const OutlinerView* pOLV = GetTextEditOutlinerView(); 289 290 if( pOLV ) 291 ( (OutlinerView*) pOLV)->Cut(); 292 else if( AreObjectsMarked() ) 293 { 294 String aStr( SdResId(STR_UNDO_CUT) ); 295 296 DoCopy(); 297 BegUndo( ( aStr += sal_Unicode(' ') ) += GetDescriptionOfMarkedObjects() ); 298 DeleteMarked(); 299 EndUndo(); 300 } 301 } 302 303 // ----------------------------------------------------------------------------- 304 305 void View::DoCopy (::Window* pWindow) 306 { 307 const OutlinerView* pOLV = GetTextEditOutlinerView(); 308 309 if( pOLV ) 310 ( (OutlinerView*) pOLV)->Copy(); 311 else if( AreObjectsMarked() ) 312 { 313 BrkAction(); 314 CreateClipboardDataObject( this, *pWindow ); 315 } 316 } 317 318 // ----------------------------------------------------------------------------- 319 320 void View::DoPaste (::Window* pWindow) 321 { 322 TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewSh->GetActiveWindow() ) ); 323 if( !aDataHelper.GetTransferable().is() ) 324 return; // empty clipboard? 325 326 const OutlinerView* pOLV = GetTextEditOutlinerView(); 327 328 if( pOLV && EditEngine::HasValidData( aDataHelper.GetTransferable() ) ) 329 { 330 const_cast< OutlinerView* >(pOLV)->PasteSpecial(); 331 332 SdrObject* pObj = GetTextEditObject(); 333 SdPage* pPage = (SdPage*)( pObj ? pObj->GetPage() : NULL ); 334 ::Outliner* pOutliner = pOLV->GetOutliner(); 335 336 if( pOutliner) 337 { 338 if( pObj && pPage && pPage->GetPresObjKind(pObj) == PRESOBJ_TITLE ) 339 { 340 // remove all hard linebreaks from the title 341 if( pOutliner && pOutliner->GetParagraphCount() > 1 ) 342 { 343 sal_Bool bOldUpdateMode = pOutliner->GetUpdateMode(); 344 345 pOutliner->SetUpdateMode( sal_False ); 346 347 const EditEngine& rEdit = pOutliner->GetEditEngine(); 348 const int nParaCount = rEdit.GetParagraphCount(); 349 350 for( int nPara = nParaCount - 2; nPara >= 0; nPara-- ) 351 { 352 const sal_uInt16 nParaLen = (sal_uInt16)rEdit.GetTextLen( (sal_uInt16)nPara ); 353 pOutliner->QuickDelete( ESelection( (sal_uInt16)nPara, nParaLen, (sal_uInt16)nPara+1, 0 ) ); 354 pOutliner->QuickInsertLineBreak( ESelection( (sal_uInt16)nPara, nParaLen, (sal_uInt16)nPara, nParaLen ) ); 355 } 356 357 DBG_ASSERT( rEdit.GetParagraphCount() <= 1, "Titelobjekt contains hard line breaks" ); 358 pOutliner->SetUpdateMode(bOldUpdateMode); 359 } 360 } 361 362 if( !mpDoc->IsChanged() ) 363 { 364 if( pOutliner && pOutliner->IsModified() ) 365 mpDoc->SetChanged( sal_True ); 366 } 367 } 368 } 369 else 370 { 371 Point aPos; 372 sal_Int8 nDnDAction = DND_ACTION_COPY; 373 374 if( pWindow ) 375 aPos = pWindow->PixelToLogic( Rectangle( aPos, pWindow->GetOutputSizePixel() ).Center() ); 376 377 DrawViewShell* pDrViewSh = (DrawViewShell*) mpDocSh->GetViewShell(); 378 379 if (pDrViewSh != NULL) 380 { 381 if( !InsertData( aDataHelper, aPos, nDnDAction, sal_False ) ) 382 { 383 INetBookmark aINetBookmark( aEmptyStr, aEmptyStr ); 384 385 if( ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) && 386 aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) || 387 ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) && 388 aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR, aINetBookmark ) ) || 389 ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) && 390 aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR, aINetBookmark ) ) ) 391 { 392 pDrViewSh->InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), aEmptyStr, NULL ); 393 } 394 } 395 } 396 } 397 } 398 399 // ----------------------------------------------------------------------------- 400 401 void View::StartDrag( const Point& rStartPos, ::Window* pWindow ) 402 { 403 if( AreObjectsMarked() && IsAction() && mpViewSh && pWindow && !mpDragSrcMarkList ) 404 { 405 BrkAction(); 406 407 if( IsTextEdit() ) 408 SdrEndTextEdit(); 409 410 DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpDocSh ? mpDocSh->GetViewShell() : 0 ); 411 412 if( pDrawViewShell ) 413 { 414 FunctionReference xFunction( pDrawViewShell->GetCurrentFunction() ); 415 416 if( xFunction.is() && xFunction->ISA( FuDraw ) ) 417 static_cast<FuDraw*>(xFunction.get())->ForcePointer( NULL ); 418 } 419 420 mpDragSrcMarkList = new SdrMarkList(GetMarkedObjectList()); 421 mnDragSrcPgNum = GetSdrPageView()->GetPage()->GetPageNum(); 422 423 if( IsUndoEnabled() ) 424 { 425 String aStr( SdResId(STR_UNDO_DRAGDROP) ); 426 aStr += sal_Unicode(' '); 427 aStr += mpDragSrcMarkList->GetMarkDescription(); 428 BegUndo(aStr); 429 } 430 CreateDragDataObject( this, *pWindow, rStartPos ); 431 } 432 } 433 434 // ----------------------------------------------------------------------------- 435 436 void View::DragFinished( sal_Int8 nDropAction ) 437 { 438 const bool bUndo = IsUndoEnabled(); 439 440 SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; 441 442 if( pDragTransferable ) 443 pDragTransferable->SetView( NULL ); 444 445 if( ( nDropAction & DND_ACTION_MOVE ) && 446 pDragTransferable && !pDragTransferable->IsInternalMove() && 447 mpDragSrcMarkList && mpDragSrcMarkList->GetMarkCount() && 448 !IsPresObjSelected() ) 449 { 450 mpDragSrcMarkList->ForceSort(); 451 452 if( bUndo ) 453 BegUndo(); 454 455 sal_uLong nm, nAnz = mpDragSrcMarkList->GetMarkCount(); 456 457 for( nm = nAnz; nm>0; ) 458 { 459 nm--; 460 SdrMark* pM=mpDragSrcMarkList->GetMark(nm); 461 if( bUndo ) 462 AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoDeleteObject(*pM->GetMarkedSdrObj())); 463 } 464 465 mpDragSrcMarkList->GetMark(0)->GetMarkedSdrObj()->GetOrdNum(); 466 467 for (nm=nAnz; nm>0;) 468 { 469 nm--; 470 SdrMark* pM=mpDragSrcMarkList->GetMark(nm); 471 SdrObject* pObj=pM->GetMarkedSdrObj(); 472 sal_uInt32 nOrdNum=pObj->GetOrdNumDirect(); 473 474 if( pObj && pObj->GetPage() ) 475 { 476 #ifdef DBG_UTIL 477 SdrObject* pChkObj = 478 #endif 479 pObj->GetPage()->RemoveObject(nOrdNum); 480 DBG_ASSERT(pChkObj==pObj,"pChkObj!=pObj beim RemoveObject()"); 481 } 482 } 483 484 if( bUndo ) 485 EndUndo(); 486 } 487 488 if( pDragTransferable ) 489 pDragTransferable->SetInternalMove( sal_False ); 490 491 if( bUndo ) 492 EndUndo(); 493 mnDragSrcPgNum = SDRPAGE_NOTFOUND; 494 delete mpDragSrcMarkList; 495 mpDragSrcMarkList = NULL; 496 } 497 498 // ----------------------------------------------------------------------------- 499 500 sal_Int8 View::AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper, 501 ::sd::Window*, sal_uInt16, sal_uInt16 nLayer ) 502 { 503 String aLayerName( GetActiveLayer() ); 504 SdrPageView* pPV = GetSdrPageView(); 505 sal_Int8 nDropAction = rEvt.mnAction; 506 sal_Int8 nRet = DND_ACTION_NONE; 507 508 if( nLayer != SDRLAYER_NOTFOUND ) 509 { 510 SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin(); 511 aLayerName = rLayerAdmin.GetLayerPerID(nLayer)->GetName(); 512 } 513 514 if( mbIsDropAllowed && !pPV->IsLayerLocked( aLayerName ) && pPV->IsLayerVisible( aLayerName ) ) 515 { 516 const OutlinerView* pOLV = GetTextEditOutlinerView(); 517 sal_Bool bIsInsideOutlinerView = sal_False; 518 519 if( pOLV ) 520 { 521 Rectangle aRect( pOLV->GetOutputArea() ); 522 523 if (GetMarkedObjectCount() == 1) 524 { 525 SdrMark* pMark = GetSdrMarkByIndex(0); 526 SdrObject* pObj = pMark->GetMarkedSdrObj(); 527 aRect.Union( pObj->GetLogicRect() ); 528 } 529 530 if( aRect.IsInside( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) ) ) 531 { 532 bIsInsideOutlinerView = sal_True; 533 } 534 } 535 536 if( !bIsInsideOutlinerView ) 537 { 538 SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; 539 540 if( pDragTransferable ) 541 { 542 const View* pSourceView = pDragTransferable->GetView(); 543 544 if( pDragTransferable->IsPageTransferable() ) 545 { 546 nRet = DND_ACTION_COPY; 547 } 548 else if( pSourceView ) 549 { 550 if( !( nDropAction & DND_ACTION_LINK ) || 551 pSourceView->GetDocSh()->GetMedium()->GetName().Len() ) 552 { 553 nRet = nDropAction; 554 } 555 } 556 } 557 else 558 { 559 const sal_Bool bDrawing = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_DRAWING ); 560 const sal_Bool bGraphic = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_SVXB ); 561 const sal_Bool bMtf = rTargetHelper.IsDropFormatSupported( FORMAT_GDIMETAFILE ); 562 const sal_Bool bBitmap = rTargetHelper.IsDropFormatSupported( FORMAT_BITMAP ); 563 sal_Bool bBookmark = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ); 564 sal_Bool bXFillExchange = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_XFA ); 565 566 // check handle insert 567 if( !nRet && ( (bXFillExchange && ( SDRDRAG_GRADIENT == GetDragMode() )) || ( SDRDRAG_TRANSPARENCE == GetDragMode() ) ) ) 568 { 569 const SdrHdlList& rHdlList = GetHdlList(); 570 571 for( sal_uInt32 n = 0; n < rHdlList.GetHdlCount(); n++ ) 572 { 573 SdrHdl* pIAOHandle = rHdlList.GetHdl( n ); 574 575 if( pIAOHandle && ( HDL_COLR == pIAOHandle->GetKind() ) ) 576 { 577 if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel)) 578 { 579 nRet = nDropAction; 580 static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_SELECTED ); 581 } 582 else 583 { 584 static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_NORMAL ); 585 } 586 } 587 } 588 } 589 590 // check object insert 591 if( !nRet && ( bXFillExchange || ( ( bDrawing || bGraphic || bMtf || bBitmap || bBookmark ) && ( nDropAction & DND_ACTION_LINK ) ) ) ) 592 { 593 SdrObject* pPickObj = NULL; 594 SdrPageView* pPageView = NULL; 595 ::sd::Window* pWindow = mpViewSh->GetActiveWindow(); 596 Point aPos( pWindow->PixelToLogic( rEvt.maPosPixel ) ); 597 const sal_Bool bHasPickObj = PickObj( aPos, getHitTolLog(), pPickObj, pPageView ); 598 sal_Bool bIsPresTarget = sal_False; 599 600 if( bHasPickObj && pPickObj && ( pPickObj->IsEmptyPresObj() || pPickObj->GetUserCall() ) ) 601 { 602 SdPage* pPage = (SdPage*) pPickObj->GetPage(); 603 604 if( pPage && pPage->IsMasterPage() ) 605 bIsPresTarget = pPage->IsPresObj( pPickObj ); 606 } 607 608 if( bHasPickObj && !bIsPresTarget && 609 ( !pPickObj->ISA( SdrGrafObj ) || bGraphic || bMtf || bBitmap || ( bXFillExchange && !pPickObj->ISA( SdrGrafObj ) && !pPickObj->ISA( SdrOle2Obj ) ) ) ) 610 { 611 if( mpDropMarkerObj != pPickObj ) 612 { 613 mpDropMarkerObj = pPickObj; 614 ImplClearDrawDropMarker(); 615 616 if(mpDropMarkerObj) 617 { 618 mpDropMarker = new SdrDropMarkerOverlay(*this, *mpDropMarkerObj); 619 } 620 } 621 622 nRet = nDropAction; 623 } 624 else 625 bXFillExchange = sal_False; 626 } 627 628 // check normal insert 629 if( !nRet ) 630 { 631 const sal_Bool bSBAFormat = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_SVX_FORMFIELDEXCH ); 632 const sal_Bool bEditEngine = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_EDITENGINE ); 633 const sal_Bool bString = rTargetHelper.IsDropFormatSupported( FORMAT_STRING ); 634 const sal_Bool bRTF = rTargetHelper.IsDropFormatSupported( FORMAT_RTF ); 635 const sal_Bool bFile = rTargetHelper.IsDropFormatSupported( FORMAT_FILE ); 636 const sal_Bool bFileList = rTargetHelper.IsDropFormatSupported( FORMAT_FILE_LIST ); 637 638 if( mpDropMarker ) 639 { 640 ImplClearDrawDropMarker(); 641 mpDropMarkerObj = NULL; 642 } 643 644 if( bBookmark && bFile && ( nDropAction & DND_ACTION_MOVE ) && mpViewSh && SlideShow::IsRunning(mpViewSh->GetViewShellBase()) ) 645 bBookmark = sal_False; 646 647 if( bDrawing || bGraphic || bMtf || bBitmap || bBookmark || bFile || bFileList || bXFillExchange || bSBAFormat || bEditEngine || bString || bRTF ) 648 nRet = nDropAction; 649 650 // For entries from the navigator, change action copy. 651 if (bBookmark 652 && rTargetHelper.IsDropFormatSupported( 653 SdPageObjsTLB::SdPageObjsTransferable::GetListBoxDropFormatId()) 654 && (nDropAction & DND_ACTION_MOVE)!=0) 655 { 656 nRet = DND_ACTION_COPY; 657 } 658 } 659 } 660 } 661 } 662 663 // destroy drop marker if this is a leaving event 664 if( rEvt.mbLeaving && mpDropMarker ) 665 { 666 ImplClearDrawDropMarker(); 667 mpDropMarkerObj = NULL; 668 } 669 670 return nRet; 671 } 672 673 // ----------------------------------------------------------------------------- 674 675 sal_Int8 View::ExecuteDrop( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper, 676 ::sd::Window* pTargetWindow, sal_uInt16 nPage, sal_uInt16 nLayer ) 677 { 678 SdrPageView* pPV = GetSdrPageView(); 679 String aActiveLayer = GetActiveLayer(); 680 sal_Int8 nDropAction = rEvt.mnAction; 681 sal_Int8 nRet = DND_ACTION_NONE; 682 683 // destroy drop marker if it is shown 684 if( mpDropMarker ) 685 { 686 ImplClearDrawDropMarker(); 687 mpDropMarkerObj = NULL; 688 } 689 690 if( !pPV->IsLayerLocked( aActiveLayer ) ) 691 { 692 const OutlinerView* pOLV = GetTextEditOutlinerView(); 693 sal_Bool bIsInsideOutlinerView = sal_False; 694 695 if( pOLV ) 696 { 697 Rectangle aRect( pOLV->GetOutputArea() ); 698 699 if( GetMarkedObjectCount() == 1 ) 700 { 701 SdrMark* pMark = GetSdrMarkByIndex(0); 702 SdrObject* pObj = pMark->GetMarkedSdrObj(); 703 aRect.Union( pObj->GetLogicRect() ); 704 } 705 706 Point aPos( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) ); 707 708 if( aRect.IsInside( aPos ) ) 709 { 710 bIsInsideOutlinerView = sal_True; 711 } 712 } 713 714 if( !bIsInsideOutlinerView ) 715 { 716 Point aPos; 717 TransferableDataHelper aDataHelper( rEvt.maDropEvent.Transferable ); 718 719 if( pTargetWindow ) 720 aPos = pTargetWindow->PixelToLogic( rEvt.maPosPixel ); 721 722 // handle insert? 723 if( (!nRet && ( SDRDRAG_GRADIENT == GetDragMode() )) || (( SDRDRAG_TRANSPARENCE == GetDragMode() ) && aDataHelper.HasFormat( SOT_FORMATSTR_ID_XFA )) ) 724 { 725 const SdrHdlList& rHdlList = GetHdlList(); 726 727 for( sal_uInt32 n = 0; !nRet && n < rHdlList.GetHdlCount(); n++ ) 728 { 729 SdrHdl* pIAOHandle = rHdlList.GetHdl( n ); 730 731 if( pIAOHandle && ( HDL_COLR == pIAOHandle->GetKind() ) ) 732 { 733 if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel)) 734 { 735 SotStorageStreamRef xStm; 736 737 if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_XFA, xStm ) && xStm.Is() ) 738 { 739 XFillExchangeData aFillData( XFillAttrSetItem( &mpDoc->GetPool() ) ); 740 741 *xStm >> aFillData; 742 const Color aColor( ( (XFillColorItem&) aFillData.GetXFillAttrSetItem()->GetItemSet().Get( XATTR_FILLCOLOR ) ).GetColorValue() ); 743 static_cast< SdrHdlColor* >( pIAOHandle )->SetColor( aColor, sal_True ); 744 nRet = nDropAction; 745 } 746 } 747 } 748 } 749 } 750 751 // standard insert? 752 if( !nRet && InsertData( aDataHelper, aPos, nDropAction, sal_True, 0, nPage, nLayer ) ) 753 nRet = nDropAction; 754 755 // special insert? 756 if( !nRet && mpViewSh ) 757 { 758 String aTmpString1, aTmpString2; 759 INetBookmark aINetBookmark( aTmpString1, aTmpString2 ); 760 761 // insert bookmark 762 if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) && 763 aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) 764 { 765 SdPageObjsTLB::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLB::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() ); 766 767 if( pPageObjsTransferable && 768 ( NAVIGATOR_DRAGTYPE_LINK == pPageObjsTransferable->GetDragType() || 769 NAVIGATOR_DRAGTYPE_EMBEDDED == pPageObjsTransferable->GetDragType() ) ) 770 { 771 // insert bookmark from own navigator (handled async. due to possible message box ) 772 Application::PostUserEvent( LINK( this, View, ExecuteNavigatorDrop ), 773 new SdNavigatorDropEvent( rEvt, rTargetHelper, pTargetWindow, 774 nPage, nLayer ) ); 775 nRet = nDropAction; 776 } 777 else 778 { 779 SdrObject* pPickObj = NULL; 780 SdrPageView* pPageView = NULL; 781 782 if( PickObj( aPos, getHitTolLog(), pPickObj, pPageView ) ) 783 { 784 // insert as clip action => jump 785 rtl::OUString aBookmark( aINetBookmark.GetURL() ); 786 SdAnimationInfo* pInfo = mpDoc->GetAnimationInfo( pPickObj ); 787 sal_Bool bCreated = sal_False; 788 789 if( aBookmark.getLength() ) 790 { 791 presentation::ClickAction eClickAction = presentation::ClickAction_DOCUMENT; 792 793 sal_Int32 nIndex = aBookmark.indexOf( (sal_Unicode)'#' ); 794 if( nIndex != -1 ) 795 { 796 const String aDocName( aBookmark.copy( 0, nIndex ) ); 797 798 if( mpDocSh->GetMedium()->GetName() == aDocName || mpDocSh->GetName() == aDocName ) 799 { 800 // internal jump, only use the part after and including '#' 801 eClickAction = presentation::ClickAction_BOOKMARK; 802 aBookmark = aBookmark.copy( nIndex+1 ); 803 } 804 } 805 806 if( !pInfo ) 807 { 808 pInfo = SdDrawDocument::GetShapeUserData( *pPickObj, true ); 809 bCreated = sal_True; 810 } 811 812 // Undo-Action mit alten und neuen Groessen erzeugen 813 SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction(mpDoc, pPickObj, bCreated); 814 pAction->SetActive(pInfo->mbActive, pInfo->mbActive); 815 pAction->SetEffect(pInfo->meEffect, pInfo->meEffect); 816 pAction->SetTextEffect(pInfo->meTextEffect, pInfo->meTextEffect); 817 pAction->SetSpeed(pInfo->meSpeed, pInfo->meSpeed); 818 pAction->SetDim(pInfo->mbDimPrevious, pInfo->mbDimPrevious); 819 pAction->SetDimColor(pInfo->maDimColor, pInfo->maDimColor); 820 pAction->SetDimHide(pInfo->mbDimHide, pInfo->mbDimHide); 821 pAction->SetSoundOn(pInfo->mbSoundOn, pInfo->mbSoundOn); 822 pAction->SetSound(pInfo->maSoundFile, pInfo->maSoundFile); 823 pAction->SetPlayFull(pInfo->mbPlayFull, pInfo->mbPlayFull); 824 pAction->SetPathObj(pInfo->mpPathObj, pInfo->mpPathObj); 825 pAction->SetClickAction(pInfo->meClickAction, eClickAction); 826 pAction->SetBookmark(pInfo->GetBookmark(), aBookmark); 827 // pAction->SetInvisibleInPres(pInfo->mbInvisibleInPresentation, sal_True); 828 pAction->SetVerb(pInfo->mnVerb, pInfo->mnVerb); 829 pAction->SetSecondEffect(pInfo->meSecondEffect, pInfo->meSecondEffect); 830 pAction->SetSecondSpeed(pInfo->meSecondSpeed, pInfo->meSecondSpeed); 831 pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, pInfo->mbSecondSoundOn); 832 pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull, pInfo->mbSecondPlayFull); 833 834 String aString(SdResId(STR_UNDO_ANIMATION)); 835 pAction->SetComment(aString); 836 mpDocSh->GetUndoManager()->AddUndoAction(pAction); 837 pInfo->meClickAction = eClickAction; 838 pInfo->SetBookmark( aBookmark ); 839 mpDoc->SetChanged(); 840 841 nRet = nDropAction; 842 } 843 } 844 else if( mpViewSh->ISA( DrawViewShell ) ) 845 { 846 // insert as normal URL button 847 ( (DrawViewShell*) mpViewSh )->InsertURLButton( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), String(), &aPos ); 848 nRet = nDropAction; 849 } 850 } 851 } 852 } 853 } 854 } 855 856 return nRet; 857 } 858 859 // ----------------------------------------------------------------------------- 860 861 IMPL_LINK( View, ExecuteNavigatorDrop, SdNavigatorDropEvent*, pSdNavigatorDropEvent ) 862 { 863 TransferableDataHelper aDataHelper( pSdNavigatorDropEvent->maDropEvent.Transferable ); 864 SdPageObjsTLB::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLB::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() ); 865 INetBookmark aINetBookmark; 866 867 if( pPageObjsTransferable && aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) 868 { 869 Point aPos; 870 List aBookmarkList; 871 String aBookmark; 872 SdPage* pPage = (SdPage*) GetSdrPageView()->GetPage(); 873 sal_uInt16 nPgPos = 0xFFFF; 874 875 if( pSdNavigatorDropEvent->mpTargetWindow ) 876 aPos = pSdNavigatorDropEvent->mpTargetWindow->PixelToLogic( pSdNavigatorDropEvent->maPosPixel ); 877 878 const rtl::OUString aURL( aINetBookmark.GetURL() ); 879 sal_Int32 nIndex = aURL.indexOf( (sal_Unicode)'#' ); 880 if( nIndex != -1 ) 881 aBookmark = aURL.copy( nIndex+1 ); 882 aBookmarkList.Insert( &aBookmark ); 883 884 if( !pPage->IsMasterPage() ) 885 { 886 if( pPage->GetPageKind() == PK_STANDARD ) 887 nPgPos = pPage->GetPageNum() + 2; 888 else if( pPage->GetPageKind() == PK_NOTES ) 889 nPgPos = pPage->GetPageNum() + 1; 890 } 891 892 // Um zu gewaehrleisten, dass alle Seitennamen eindeutig sind, werden 893 // die einzufuegenden geprueft und gegebenenfalls in einer Ersatzliste 894 // aufgenommen (bNameOK == sal_False -> Benutzer hat abgebrochen) 895 List* pExchangeList = NULL; 896 sal_Bool bLink = ( NAVIGATOR_DRAGTYPE_LINK == pPageObjsTransferable->GetDragType() ? sal_True : sal_False ); 897 sal_Bool bNameOK = GetExchangeList( pExchangeList, &aBookmarkList, 2 ); 898 sal_Bool bReplace = sal_False; 899 900 // Da man hier nicht weiss, ob es sich um eine Seite oder ein Objekt handelt, 901 // wird eine Liste sowohl mit Seiten, als auch mit Objekten gefuellt. 902 // Sollten Seitennamen und Objektnamen identisch sein gibt es hier natuerlich Probleme !!! 903 if( bNameOK ) 904 { 905 mpDoc->InsertBookmark( &aBookmarkList, pExchangeList, 906 bLink, bReplace, nPgPos, sal_False, 907 &pPageObjsTransferable->GetDocShell(), 908 sal_True, &aPos ); 909 } 910 911 // Loeschen der ExchangeList 912 if( pExchangeList ) 913 { 914 for( void* p = pExchangeList->First(); p; p = pExchangeList->Next() ) 915 delete (String*) p; 916 917 delete pExchangeList; 918 } 919 } 920 921 delete pSdNavigatorDropEvent; 922 923 return 0; 924 } 925 926 /************************************************************************* 927 |* 928 |* Rueckgabeparameter: 929 |* pExchangeList == NULL -> Namen sind alle eindeutig 930 |* bNameOK == sal_False -> Benutzer hat abgebrochen 931 |* nType == 0 -> Seiten 932 |* nType == 1 -> Objekte 933 |* nType == 2 -> Seiten + Objekte 934 |* 935 \************************************************************************/ 936 937 sal_Bool View::GetExchangeList( List*& rpExchangeList, List* pBookmarkList, sal_uInt16 nType ) 938 { 939 DBG_ASSERT( !rpExchangeList, "ExchangeList muss NULL sein!"); 940 941 sal_Bool bListIdentical = sal_True; // BookmarkList und ExchangeList sind gleich 942 sal_Bool bNameOK = sal_True; // Name ist eindeutig 943 944 rpExchangeList = new List(); 945 946 if( pBookmarkList ) 947 { 948 String* pString = (String*) pBookmarkList->First(); 949 950 while( pString && bNameOK ) 951 { 952 String* pNewName = new String( *pString ); 953 954 if( nType == 0 || nType == 2 ) 955 bNameOK = mpDocSh->CheckPageName ( 956 mpViewSh->GetActiveWindow(), *pNewName); 957 958 if( bNameOK && ( nType == 1 || nType == 2 ) ) 959 { 960 if( mpDoc->GetObj( *pNewName ) ) 961 { 962 String aTitle( SdResId( STR_TITLE_NAMEGROUP ) ); 963 String aDesc( SdResId( STR_DESC_NAMEGROUP ) ); 964 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 965 AbstractSvxNameDialog* pDlg = pFact ? pFact->CreateSvxNameDialog( mpViewSh->GetActiveWindow(), *pNewName, aDesc ) : 0; 966 if( pDlg ) 967 { 968 pDlg->SetEditHelpId( HID_SD_NAMEDIALOG_OBJECT ); 969 970 bNameOK = sal_False; 971 pDlg->SetText( aTitle ); 972 973 while( !bNameOK && pDlg->Execute() == RET_OK ) 974 { 975 pDlg->GetName( *pNewName ); 976 977 if( !mpDoc->GetObj( *pNewName ) ) 978 bNameOK = sal_True; 979 } 980 981 delete pDlg; 982 } 983 } 984 } 985 986 if( bListIdentical ) 987 bListIdentical = ( *pString == *pNewName ); 988 989 rpExchangeList->Insert( pNewName, LIST_APPEND ); 990 pString = (String*) pBookmarkList->Next(); 991 } 992 } 993 994 // ExchangeList ist mit BookmarkList identisch 995 if( rpExchangeList && bListIdentical ) 996 { 997 String* pString = (String*) rpExchangeList->First(); 998 while( pString ) 999 { 1000 delete pString; 1001 pString = (String*) rpExchangeList->Next(); 1002 } 1003 delete rpExchangeList; 1004 rpExchangeList = NULL; 1005 } 1006 1007 return( bNameOK ); 1008 } 1009 1010 typedef std::vector< std::pair< sal_uInt32, sal_uInt32 > > PathSurrogateVector; 1011 typedef std::vector< SdrObject* > SdrObjectVector; 1012 1013 void ImplProcessObjectList(SdrObject* pObj, SdrObjectVector& rVector ) 1014 { 1015 sal_Bool bIsGroup(pObj->IsGroupObject()); 1016 if(bIsGroup && pObj->ISA(E3dObject) && !pObj->ISA(E3dScene)) 1017 bIsGroup = sal_False; 1018 1019 rVector.push_back( pObj ); 1020 1021 if(bIsGroup) 1022 { 1023 SdrObjList* pObjList = pObj->GetSubList(); 1024 sal_uInt32 a; 1025 for( a = 0; a < pObjList->GetObjCount(); a++) 1026 ImplProcessObjectList(pObjList->GetObj(a), rVector); 1027 } 1028 } 1029 1030 SdrModel* View::GetMarkedObjModel() const 1031 { 1032 return FmFormView::GetMarkedObjModel();; 1033 } 1034 1035 sal_Bool View::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst /* =NULL */, sal_uInt32 nOptions /* =0 */) 1036 { 1037 return FmFormView::Paste( rMod, rPos, pLst,nOptions );; 1038 } 1039 1040 } // end of namespace sd 1041