/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "View.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "navigatr.hxx" #include "anminfo.hxx" #include "strings.hrc" #include "glob.hrc" #include "sdxfer.hxx" #include "sdresid.hxx" #include "sdmod.hxx" #include "DrawViewShell.hxx" #include "DrawDocShell.hxx" #include "fudraw.hxx" #include "drawdoc.hxx" #include "Window.hxx" #include "sdpage.hxx" #include "unoaprms.hxx" #include "drawview.hxx" #include "helpids.h" #include #include "slideshow.hxx" namespace sd { #ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED #define SO2_DECL_SVINPLACEOBJECT_DEFINED SO2_DECL_REF(SvInPlaceObject) #endif #ifndef SO2_DECL_SVSTORAGE_DEFINED #define SO2_DECL_SVSTORAGE_DEFINED SO2_DECL_REF(SvStorage) #endif using namespace ::com::sun::star; // ------------------------ // - SdNavigatorDropEvent - // ------------------------ struct SdNavigatorDropEvent : public ExecuteDropEvent { DropTargetHelper& mrTargetHelper; ::sd::Window* mpTargetWindow; sal_uInt16 mnPage; sal_uInt16 mnLayer; SdNavigatorDropEvent ( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper, ::sd::Window* pTargetWindow, sal_uInt16 nPage, sal_uInt16 nLayer ) : ExecuteDropEvent( rEvt ), mrTargetHelper( rTargetHelper ), mpTargetWindow( pTargetWindow ), mnPage( nPage ), mnLayer( nLayer ) {} }; // ----------------------------------------------------------------------------- ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > View::CreateClipboardDataObject( View*, ::Window& ) { // since SdTransferable::CopyToClipboard is called, this // dynamically created object ist destroyed automatically SdTransferable* pTransferable = new SdTransferable( &mrDoc, NULL, sal_False ); ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xRet( pTransferable ); SD_MOD()->pTransferClip = pTransferable; mrDoc.CreatingDataObj( pTransferable ); pTransferable->SetWorkDocument( (SdDrawDocument*) GetAllMarkedModel() ); mrDoc.CreatingDataObj( NULL ); // #112978# need to use GetAllMarkedBoundRect instead of GetAllMarkedRect to get // fat lines correctly const Rectangle aMarkRect( GetAllMarkedBoundRect() ); TransferableObjectDescriptor aObjDesc; String aDisplayName; SdrOle2Obj* pSdrOleObj = NULL; SdrPageView* pPgView = GetSdrPageView(); SdPage* pOldPage = pPgView ? ( (SdPage*) pPgView->GetPage() ) : NULL; SdPage* pNewPage = (SdPage*) pTransferable->GetWorkDocument()->GetPage( 0 ); if( pOldPage ) { pNewPage->SetSize( pOldPage->GetSize() ); pNewPage->SetLayoutName( pOldPage->GetLayoutName() ); } if( GetMarkedObjectCount() == 1 ) { SdrObject* pObj = GetMarkedObjectByIndex(0); if( pObj && pObj->ISA(SdrOle2Obj) && ((SdrOle2Obj*) pObj)->GetObjRef().is() ) { // If object has no persistence it must be copied as part of the document try { uno::Reference< embed::XEmbedPersist > xPersObj( ((SdrOle2Obj*)pObj)->GetObjRef(), uno::UNO_QUERY ); if ( xPersObj.is() && xPersObj->hasEntry() ) pSdrOleObj = (SdrOle2Obj*) pObj; } catch( uno::Exception& ) {} } } if( pSdrOleObj ) SvEmbedTransferHelper::FillTransferableObjectDescriptor( aObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() ); else pTransferable->GetWorkDocument()->GetDocSh()->FillTransferableObjectDescriptor( aObjDesc ); if( mpDocSh ) aObjDesc.maDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); aObjDesc.maSize = aMarkRect.GetSize(); pTransferable->SetStartPos( aMarkRect.TopLeft() ); pTransferable->SetObjectDescriptor( aObjDesc ); pTransferable->CopyToClipboard( mpViewSh->GetActiveWindow() ); return xRet; } // ----------------------------------------------------------------------------- ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > View::CreateDragDataObject( View* pWorkView, ::Window& rWindow, const Point& rDragPos ) { SdTransferable* pTransferable = new SdTransferable( &mrDoc, pWorkView, sal_False ); ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xRet( pTransferable ); SD_MOD()->pTransferDrag = pTransferable; TransferableObjectDescriptor aObjDesc; String aDisplayName; SdrOle2Obj* pSdrOleObj = NULL; if( GetMarkedObjectCount() == 1 ) { SdrObject* pObj = GetMarkedObjectByIndex( 0 ); if( pObj && pObj->ISA( SdrOle2Obj ) && ( (SdrOle2Obj*) pObj )->GetObjRef().is() ) { // If object has no persistence it must be copied as part of the document try { uno::Reference< embed::XEmbedPersist > xPersObj( ((SdrOle2Obj*)pObj)->GetObjRef(), uno::UNO_QUERY ); if ( xPersObj.is() && xPersObj->hasEntry() ) pSdrOleObj = (SdrOle2Obj*) pObj; } catch( uno::Exception& ) {} } } if( mpDocSh ) aDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); if( pSdrOleObj ) SvEmbedTransferHelper::FillTransferableObjectDescriptor( aObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() ); else mpDocSh->FillTransferableObjectDescriptor( aObjDesc ); aObjDesc.maSize = GetAllMarkedRect().GetSize(); aObjDesc.maDragStartPos = rDragPos; aObjDesc.maDisplayName = aDisplayName; aObjDesc.mbCanLink = sal_False; pTransferable->SetStartPos( rDragPos ); pTransferable->SetObjectDescriptor( aObjDesc ); pTransferable->StartDrag( &rWindow, DND_ACTION_COPYMOVE | DND_ACTION_LINK ); return xRet; } // ----------------------------------------------------------------------------- ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > View::CreateSelectionDataObject( View* pWorkView, ::Window& rWindow ) { SdTransferable* pTransferable = new SdTransferable( &mrDoc, pWorkView, sal_True ); ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xRet( pTransferable ); TransferableObjectDescriptor aObjDesc; const Rectangle aMarkRect( GetAllMarkedRect() ); String aDisplayName; SD_MOD()->pTransferSelection = pTransferable; if( mpDocSh ) { aDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass(); mpDocSh->FillTransferableObjectDescriptor( aObjDesc ); } aObjDesc.maSize = aMarkRect.GetSize(); pTransferable->SetStartPos( aMarkRect.TopLeft() ); pTransferable->SetObjectDescriptor( aObjDesc ); pTransferable->CopyToSelection( &rWindow ); return xRet; } // ----------------------------------------------------------------------------- void View::UpdateSelectionClipboard( sal_Bool bForceDeselect ) { if( mpViewSh && mpViewSh->GetActiveWindow() ) { if( !bForceDeselect && GetMarkedObjectList().GetMarkCount() ) CreateSelectionDataObject( this, *mpViewSh->GetActiveWindow() ); else if( SD_MOD()->pTransferSelection && ( SD_MOD()->pTransferSelection->GetView() == this ) ) { TransferableHelper::ClearSelection( mpViewSh->GetActiveWindow() ); SD_MOD()->pTransferSelection = NULL; } } } // ----------------------------------------------------------------------------- void View::DoCut(::Window* ) { const OutlinerView* pOLV = GetTextEditOutlinerView(); if( pOLV ) ( (OutlinerView*) pOLV)->Cut(); else if( AreObjectsMarked() ) { String aStr( SdResId(STR_UNDO_CUT) ); DoCopy(); BegUndo( ( aStr += sal_Unicode(' ') ) += GetDescriptionOfMarkedObjects() ); DeleteMarked(); EndUndo(); } } // ----------------------------------------------------------------------------- void View::DoCopy (::Window* pWindow) { const OutlinerView* pOLV = GetTextEditOutlinerView(); if( pOLV ) ( (OutlinerView*) pOLV)->Copy(); else if( AreObjectsMarked() ) { BrkAction(); CreateClipboardDataObject( this, *pWindow ); } } // ----------------------------------------------------------------------------- void View::DoPaste (::Window* pWindow) { TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewSh->GetActiveWindow() ) ); if( !aDataHelper.GetTransferable().is() ) return; // empty clipboard? const OutlinerView* pOLV = GetTextEditOutlinerView(); if( pOLV && EditEngine::HasValidData( aDataHelper.GetTransferable() ) ) { const_cast< OutlinerView* >(pOLV)->PasteSpecial(); SdrObject* pObj = GetTextEditObject(); SdPage* pPage = (SdPage*)( pObj ? pObj->GetPage() : NULL ); ::Outliner* pOutliner = pOLV->GetOutliner(); if( pOutliner) { if( pObj && pPage && pPage->GetPresObjKind(pObj) == PRESOBJ_TITLE ) { // remove all hard linebreaks from the title if( pOutliner && pOutliner->GetParagraphCount() > 1 ) { sal_Bool bOldUpdateMode = pOutliner->GetUpdateMode(); pOutliner->SetUpdateMode( sal_False ); const EditEngine& rEdit = pOutliner->GetEditEngine(); const int nParaCount = rEdit.GetParagraphCount(); for( int nPara = nParaCount - 2; nPara >= 0; nPara-- ) { const sal_uInt16 nParaLen = (sal_uInt16)rEdit.GetTextLen( (sal_uInt16)nPara ); pOutliner->QuickDelete( ESelection( (sal_uInt16)nPara, nParaLen, (sal_uInt16)nPara+1, 0 ) ); pOutliner->QuickInsertLineBreak( ESelection( (sal_uInt16)nPara, nParaLen, (sal_uInt16)nPara, nParaLen ) ); } DBG_ASSERT( rEdit.GetParagraphCount() <= 1, "Titelobjekt contains hard line breaks" ); pOutliner->SetUpdateMode(bOldUpdateMode); } } if( !mrDoc.IsChanged() ) { if( pOutliner && pOutliner->IsModified() ) mrDoc.SetChanged( sal_True ); } } } else { Point aPos; sal_Int8 nDnDAction = DND_ACTION_COPY; if( pWindow ) aPos = pWindow->PixelToLogic( Rectangle( aPos, pWindow->GetOutputSizePixel() ).Center() ); DrawViewShell* pDrViewSh = (DrawViewShell*) mpDocSh->GetViewShell(); if (pDrViewSh != NULL) { if( !InsertData( aDataHelper, aPos, nDnDAction, sal_False ) ) { INetBookmark aINetBookmark( aEmptyStr, aEmptyStr ); if( ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) && aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) || ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) && aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR, aINetBookmark ) ) || ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) && aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR, aINetBookmark ) ) ) { pDrViewSh->InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), aEmptyStr, NULL ); } } } } } // ----------------------------------------------------------------------------- void View::StartDrag( const Point& rStartPos, ::Window* pWindow ) { if( AreObjectsMarked() && IsAction() && mpViewSh && pWindow && !mpDragSrcMarkList ) { BrkAction(); if( IsTextEdit() ) SdrEndTextEdit(); DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpDocSh ? mpDocSh->GetViewShell() : 0 ); if( pDrawViewShell ) { FunctionReference xFunction( pDrawViewShell->GetCurrentFunction() ); if( xFunction.is() && xFunction->ISA( FuDraw ) ) static_cast(xFunction.get())->ForcePointer( NULL ); } mpDragSrcMarkList = new SdrMarkList(GetMarkedObjectList()); mnDragSrcPgNum = GetSdrPageView()->GetPage()->GetPageNum(); if( IsUndoEnabled() ) { String aStr( SdResId(STR_UNDO_DRAGDROP) ); aStr += sal_Unicode(' '); aStr += mpDragSrcMarkList->GetMarkDescription(); BegUndo(aStr); } CreateDragDataObject( this, *pWindow, rStartPos ); } } // ----------------------------------------------------------------------------- void View::DragFinished( sal_Int8 nDropAction ) { const bool bUndo = IsUndoEnabled(); SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; if( pDragTransferable ) pDragTransferable->SetView( NULL ); if( ( nDropAction & DND_ACTION_MOVE ) && pDragTransferable && !pDragTransferable->IsInternalMove() && mpDragSrcMarkList && mpDragSrcMarkList->GetMarkCount() && !IsPresObjSelected() ) { mpDragSrcMarkList->ForceSort(); if( bUndo ) BegUndo(); sal_uLong nm, nAnz = mpDragSrcMarkList->GetMarkCount(); for( nm = nAnz; nm>0; ) { nm--; SdrMark* pM=mpDragSrcMarkList->GetMark(nm); if( bUndo ) AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeleteObject(*pM->GetMarkedSdrObj())); } mpDragSrcMarkList->GetMark(0)->GetMarkedSdrObj()->GetOrdNum(); for (nm=nAnz; nm>0;) { nm--; SdrMark* pM=mpDragSrcMarkList->GetMark(nm); SdrObject* pObj=pM->GetMarkedSdrObj(); if( pObj && pObj->GetPage() ) { sal_uInt32 nOrdNum=pObj->GetOrdNumDirect(); #ifdef DBG_UTIL SdrObject* pChkObj = #endif pObj->GetPage()->RemoveObject(nOrdNum); DBG_ASSERT(pChkObj==pObj,"pChkObj!=pObj beim RemoveObject()"); } } if( bUndo ) EndUndo(); } if( pDragTransferable ) pDragTransferable->SetInternalMove( sal_False ); if( bUndo ) EndUndo(); mnDragSrcPgNum = SDRPAGE_NOTFOUND; delete mpDragSrcMarkList; mpDragSrcMarkList = NULL; } // ----------------------------------------------------------------------------- sal_Int8 View::AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper, ::sd::Window*, sal_uInt16, sal_uInt16 nLayer ) { String aLayerName( GetActiveLayer() ); SdrPageView* pPV = GetSdrPageView(); sal_Int8 nDropAction = rEvt.mnAction; sal_Int8 nRet = DND_ACTION_NONE; if( nLayer != SDRLAYER_NOTFOUND ) { SdrLayerAdmin& rLayerAdmin = mrDoc.GetLayerAdmin(); aLayerName = rLayerAdmin.GetLayerPerID(nLayer)->GetName(); } if( mbIsDropAllowed && !pPV->IsLayerLocked( aLayerName ) && pPV->IsLayerVisible( aLayerName ) ) { const OutlinerView* pOLV = GetTextEditOutlinerView(); sal_Bool bIsInsideOutlinerView = sal_False; if( pOLV ) { Rectangle aRect( pOLV->GetOutputArea() ); if (GetMarkedObjectCount() == 1) { SdrMark* pMark = GetSdrMarkByIndex(0); SdrObject* pObj = pMark->GetMarkedSdrObj(); aRect.Union( pObj->GetLogicRect() ); } if( aRect.IsInside( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) ) ) { bIsInsideOutlinerView = sal_True; } } if( !bIsInsideOutlinerView ) { SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag; if( pDragTransferable ) { const View* pSourceView = pDragTransferable->GetView(); if( pDragTransferable->IsPageTransferable() ) { nRet = DND_ACTION_COPY; } else if( pSourceView ) { if( !( nDropAction & DND_ACTION_LINK ) || pSourceView->GetDocSh()->GetMedium()->GetName().Len() ) { nRet = nDropAction; } } } else { const sal_Bool bDrawing = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_DRAWING ); const sal_Bool bGraphic = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_SVXB ); const sal_Bool bMtf = rTargetHelper.IsDropFormatSupported( FORMAT_GDIMETAFILE ); const sal_Bool bBitmap = rTargetHelper.IsDropFormatSupported( FORMAT_BITMAP ); sal_Bool bBookmark = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ); sal_Bool bXFillExchange = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_XFA ); // check handle insert if( !nRet && ( (bXFillExchange && ( SDRDRAG_GRADIENT == GetDragMode() )) || ( SDRDRAG_TRANSPARENCE == GetDragMode() ) ) ) { const SdrHdlList& rHdlList = GetHdlList(); for( sal_uInt32 n = 0; n < rHdlList.GetHdlCount(); n++ ) { SdrHdl* pIAOHandle = rHdlList.GetHdl( n ); if( pIAOHandle && ( HDL_COLR == pIAOHandle->GetKind() ) ) { if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel)) { nRet = nDropAction; static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_SELECTED ); } else { static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_NORMAL ); } } } } // check object insert if( !nRet && ( bXFillExchange || ( ( bDrawing || bGraphic || bMtf || bBitmap || bBookmark ) && ( nDropAction & DND_ACTION_LINK ) ) ) ) { SdrObject* pPickObj = NULL; SdrPageView* pPageView = NULL; ::sd::Window* pWindow = mpViewSh->GetActiveWindow(); Point aPos( pWindow->PixelToLogic( rEvt.maPosPixel ) ); const sal_Bool bHasPickObj = PickObj( aPos, getHitTolLog(), pPickObj, pPageView ); sal_Bool bIsPresTarget = sal_False; if( bHasPickObj && pPickObj && ( pPickObj->IsEmptyPresObj() || pPickObj->GetUserCall() ) ) { SdPage* pPage = (SdPage*) pPickObj->GetPage(); if( pPage && pPage->IsMasterPage() ) bIsPresTarget = pPage->IsPresObj( pPickObj ); } if( bHasPickObj && !bIsPresTarget && ( !pPickObj->ISA( SdrGrafObj ) || bGraphic || bMtf || bBitmap || ( bXFillExchange && !pPickObj->ISA( SdrGrafObj ) && !pPickObj->ISA( SdrOle2Obj ) ) ) ) { if( mpDropMarkerObj != pPickObj ) { mpDropMarkerObj = pPickObj; ImplClearDrawDropMarker(); if(mpDropMarkerObj) { mpDropMarker = new SdrDropMarkerOverlay(*this, *mpDropMarkerObj); } } nRet = nDropAction; } else bXFillExchange = sal_False; } // check normal insert if( !nRet ) { const sal_Bool bSBAFormat = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_SVX_FORMFIELDEXCH ); const sal_Bool bEditEngine = rTargetHelper.IsDropFormatSupported( SOT_FORMATSTR_ID_EDITENGINE ); const sal_Bool bString = rTargetHelper.IsDropFormatSupported( FORMAT_STRING ); const sal_Bool bRTF = rTargetHelper.IsDropFormatSupported( FORMAT_RTF ); const sal_Bool bFile = rTargetHelper.IsDropFormatSupported( FORMAT_FILE ); const sal_Bool bFileList = rTargetHelper.IsDropFormatSupported( FORMAT_FILE_LIST ); if( mpDropMarker ) { ImplClearDrawDropMarker(); mpDropMarkerObj = NULL; } if( bBookmark && bFile && ( nDropAction & DND_ACTION_MOVE ) && mpViewSh && SlideShow::IsRunning(mpViewSh->GetViewShellBase()) ) bBookmark = sal_False; if( bDrawing || bGraphic || bMtf || bBitmap || bBookmark || bFile || bFileList || bXFillExchange || bSBAFormat || bEditEngine || bString || bRTF ) nRet = nDropAction; // For entries from the navigator, change action copy. if (bBookmark && rTargetHelper.IsDropFormatSupported( SdPageObjsTLB::SdPageObjsTransferable::GetListBoxDropFormatId()) && (nDropAction & DND_ACTION_MOVE)!=0) { nRet = DND_ACTION_COPY; } } } } } // destroy drop marker if this is a leaving event if( rEvt.mbLeaving && mpDropMarker ) { ImplClearDrawDropMarker(); mpDropMarkerObj = NULL; } return nRet; } // ----------------------------------------------------------------------------- sal_Int8 View::ExecuteDrop( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper, ::sd::Window* pTargetWindow, sal_uInt16 nPage, sal_uInt16 nLayer ) { SdrPageView* pPV = GetSdrPageView(); String aActiveLayer = GetActiveLayer(); sal_Int8 nDropAction = rEvt.mnAction; sal_Int8 nRet = DND_ACTION_NONE; // destroy drop marker if it is shown if( mpDropMarker ) { ImplClearDrawDropMarker(); mpDropMarkerObj = NULL; } if( !pPV->IsLayerLocked( aActiveLayer ) ) { const OutlinerView* pOLV = GetTextEditOutlinerView(); sal_Bool bIsInsideOutlinerView = sal_False; if( pOLV ) { Rectangle aRect( pOLV->GetOutputArea() ); if( GetMarkedObjectCount() == 1 ) { SdrMark* pMark = GetSdrMarkByIndex(0); SdrObject* pObj = pMark->GetMarkedSdrObj(); aRect.Union( pObj->GetLogicRect() ); } Point aPos( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) ); if( aRect.IsInside( aPos ) ) { bIsInsideOutlinerView = sal_True; } } if( !bIsInsideOutlinerView ) { Point aPos; TransferableDataHelper aDataHelper( rEvt.maDropEvent.Transferable ); if( pTargetWindow ) aPos = pTargetWindow->PixelToLogic( rEvt.maPosPixel ); // handle insert? if( (!nRet && ( SDRDRAG_GRADIENT == GetDragMode() )) || (( SDRDRAG_TRANSPARENCE == GetDragMode() ) && aDataHelper.HasFormat( SOT_FORMATSTR_ID_XFA )) ) { const SdrHdlList& rHdlList = GetHdlList(); for( sal_uInt32 n = 0; !nRet && n < rHdlList.GetHdlCount(); n++ ) { SdrHdl* pIAOHandle = rHdlList.GetHdl( n ); if( pIAOHandle && ( HDL_COLR == pIAOHandle->GetKind() ) ) { if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel)) { SotStorageStreamRef xStm; if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_XFA, xStm ) && xStm.Is() ) { XFillExchangeData aFillData( XFillAttrSetItem( &mrDoc.GetPool() ) ); *xStm >> aFillData; const Color aColor( ( (XFillColorItem&) aFillData.GetXFillAttrSetItem()->GetItemSet().Get( XATTR_FILLCOLOR ) ).GetColorValue() ); static_cast< SdrHdlColor* >( pIAOHandle )->SetColor( aColor, sal_True ); nRet = nDropAction; } } } } } // standard insert? if( !nRet && InsertData( aDataHelper, aPos, nDropAction, sal_True, 0, nPage, nLayer ) ) nRet = nDropAction; // special insert? if( !nRet && mpViewSh ) { String aTmpString1, aTmpString2; INetBookmark aINetBookmark( aTmpString1, aTmpString2 ); // insert bookmark if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) && aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) { SdPageObjsTLB::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLB::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() ); if( pPageObjsTransferable && ( NAVIGATOR_DRAGTYPE_LINK == pPageObjsTransferable->GetDragType() || NAVIGATOR_DRAGTYPE_EMBEDDED == pPageObjsTransferable->GetDragType() ) ) { // insert bookmark from own navigator (handled async. due to possible message box ) Application::PostUserEvent( LINK( this, View, ExecuteNavigatorDrop ), new SdNavigatorDropEvent( rEvt, rTargetHelper, pTargetWindow, nPage, nLayer ) ); nRet = nDropAction; } else { SdrObject* pPickObj = NULL; SdrPageView* pPageView = NULL; if( PickObj( aPos, getHitTolLog(), pPickObj, pPageView ) ) { // insert as clip action => jump rtl::OUString aBookmark( aINetBookmark.GetURL() ); SdAnimationInfo* pInfo = mrDoc.GetAnimationInfo( pPickObj ); sal_Bool bCreated = sal_False; if( !aBookmark.isEmpty() ) { presentation::ClickAction eClickAction = presentation::ClickAction_DOCUMENT; sal_Int32 nIndex = aBookmark.indexOf( (sal_Unicode)'#' ); if( nIndex != -1 ) { const String aDocName( aBookmark.copy( 0, nIndex ) ); if( mpDocSh->GetMedium()->GetName() == aDocName || mpDocSh->GetName() == aDocName ) { // internal jump, only use the part after and including '#' eClickAction = presentation::ClickAction_BOOKMARK; aBookmark = aBookmark.copy( nIndex+1 ); } } if( !pInfo ) { pInfo = SdDrawDocument::GetShapeUserData( *pPickObj, true ); bCreated = sal_True; } // Undo-Action mit alten und neuen Groessen erzeugen SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction(&mrDoc, pPickObj, bCreated); pAction->SetActive(pInfo->mbActive, pInfo->mbActive); pAction->SetEffect(pInfo->meEffect, pInfo->meEffect); pAction->SetTextEffect(pInfo->meTextEffect, pInfo->meTextEffect); pAction->SetSpeed(pInfo->meSpeed, pInfo->meSpeed); pAction->SetDim(pInfo->mbDimPrevious, pInfo->mbDimPrevious); pAction->SetDimColor(pInfo->maDimColor, pInfo->maDimColor); pAction->SetDimHide(pInfo->mbDimHide, pInfo->mbDimHide); pAction->SetSoundOn(pInfo->mbSoundOn, pInfo->mbSoundOn); pAction->SetSound(pInfo->maSoundFile, pInfo->maSoundFile); pAction->SetPlayFull(pInfo->mbPlayFull, pInfo->mbPlayFull); pAction->SetPathObj(pInfo->mpPathObj, pInfo->mpPathObj); pAction->SetClickAction(pInfo->meClickAction, eClickAction); pAction->SetBookmark(pInfo->GetBookmark(), aBookmark); pAction->SetVerb(pInfo->mnVerb, pInfo->mnVerb); pAction->SetSecondEffect(pInfo->meSecondEffect, pInfo->meSecondEffect); pAction->SetSecondSpeed(pInfo->meSecondSpeed, pInfo->meSecondSpeed); pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, pInfo->mbSecondSoundOn); pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull, pInfo->mbSecondPlayFull); String aString(SdResId(STR_UNDO_ANIMATION)); pAction->SetComment(aString); mpDocSh->GetUndoManager()->AddUndoAction(pAction); pInfo->meClickAction = eClickAction; pInfo->SetBookmark( aBookmark ); mrDoc.SetChanged(); nRet = nDropAction; } } else if( mpViewSh->ISA( DrawViewShell ) ) { // insert as normal URL button ( (DrawViewShell*) mpViewSh )->InsertURLButton( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), String(), &aPos ); nRet = nDropAction; } } } } } } return nRet; } // ----------------------------------------------------------------------------- IMPL_LINK( View, ExecuteNavigatorDrop, SdNavigatorDropEvent*, pSdNavigatorDropEvent ) { TransferableDataHelper aDataHelper( pSdNavigatorDropEvent->maDropEvent.Transferable ); SdPageObjsTLB::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLB::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() ); INetBookmark aINetBookmark; if( pPageObjsTransferable && aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) { Point aPos; rtl::OUString aBookmark; SdPage* pPage = (SdPage*) GetSdrPageView()->GetPage(); sal_uInt16 nPgPos = 0xFFFF; if( pSdNavigatorDropEvent->mpTargetWindow ) aPos = pSdNavigatorDropEvent->mpTargetWindow->PixelToLogic( pSdNavigatorDropEvent->maPosPixel ); const rtl::OUString aURL( aINetBookmark.GetURL() ); sal_Int32 nIndex = aURL.indexOf( (sal_Unicode)'#' ); if( nIndex != -1 ) aBookmark = aURL.copy( nIndex+1 ); std::vector aExchangeList; std::vector aBookmarkList(1,aBookmark); if( !pPage->IsMasterPage() ) { if( pPage->GetPageKind() == PK_STANDARD ) nPgPos = pPage->GetPageNum() + 2; else if( pPage->GetPageKind() == PK_NOTES ) nPgPos = pPage->GetPageNum() + 1; } // Um zu gewaehrleisten, dass alle Seitennamen eindeutig sind, werden // die einzufuegenden geprueft und gegebenenfalls in einer Ersatzliste // aufgenommen (bNameOK == sal_False -> Benutzer hat abgebrochen) sal_Bool bLink = ( NAVIGATOR_DRAGTYPE_LINK == pPageObjsTransferable->GetDragType() ? sal_True : sal_False ); sal_Bool bNameOK = GetExchangeList( aExchangeList, aBookmarkList, 2 ); sal_Bool bReplace = sal_False; // Da man hier nicht weiss, ob es sich um eine Seite oder ein Objekt handelt, // wird eine Liste sowohl mit Seiten, als auch mit Objekten gefuellt. // Sollten Seitennamen und Objektnamen identisch sein gibt es hier natuerlich Probleme !!! if( bNameOK ) { mrDoc.InsertBookmark( aBookmarkList, aExchangeList, bLink, bReplace, nPgPos, sal_False, &pPageObjsTransferable->GetDocShell(), sal_True, &aPos ); } } delete pSdNavigatorDropEvent; return 0; } bool View::GetExchangeList (std::vector &rExchangeList, std::vector &rBookmarkList, const sal_uInt16 nType) { assert(rExchangeList.empty()); bool bListIdentical = true; // BookmarkList und ExchangeList sind gleich bool bNameOK = true; // Name ist eindeutig std::vector::const_iterator pIter; for ( pIter = rBookmarkList.begin(); bNameOK && pIter != rBookmarkList.end(); ++pIter ) { String aNewName = *pIter; if( nType == 0 || nType == 2 ) bNameOK = mpDocSh->CheckPageName(mpViewSh->GetActiveWindow(), aNewName); if( bNameOK && ( nType == 1 || nType == 2 ) ) { if( mrDoc.GetObj( aNewName ) ) { rtl::OUString aTitle(SD_RESSTR(STR_TITLE_NAMEGROUP)); rtl::OUString aDesc(SD_RESSTR(STR_DESC_NAMEGROUP)); SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); AbstractSvxNameDialog* pDlg = 0; if (pFact) pDlg = pFact->CreateSvxNameDialog( mpViewSh->GetActiveWindow(), aNewName, aDesc ); if( pDlg ) { pDlg->SetEditHelpId( HID_SD_NAMEDIALOG_OBJECT ); bNameOK = false; pDlg->SetText( aTitle ); while( !bNameOK && pDlg->Execute() == RET_OK ) { pDlg->GetName( aNewName ); if( !mrDoc.GetObj( aNewName ) ) bNameOK = true; } delete pDlg; } } } bListIdentical = pIter->equals(aNewName); rExchangeList.push_back(aNewName); } // ExchangeList ist mit BookmarkList identisch if( !rExchangeList.empty() && bListIdentical ) rExchangeList.clear(); return bNameOK; } typedef std::vector< SdrObject* > SdrObjectVector; void ImplProcessObjectList(SdrObject* pObj, SdrObjectVector& rVector ) { sal_Bool bIsGroup(pObj->IsGroupObject()); if(bIsGroup && pObj->ISA(E3dObject) && !pObj->ISA(E3dScene)) bIsGroup = sal_False; rVector.push_back( pObj ); if(bIsGroup) { SdrObjList* pObjList = pObj->GetSubList(); sal_uInt32 a; for( a = 0; a < pObjList->GetObjCount(); a++) ImplProcessObjectList(pObjList->GetObj(a), rVector); } } SdrModel* View::GetMarkedObjModel() const { return FmFormView::GetMarkedObjModel();; } sal_Bool View::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst /* =NULL */, sal_uInt32 nOptions /* =0 */) { return FmFormView::Paste( rMod, rPos, pLst,nOptions );; } } // end of namespace sd /* vim:set shiftwidth=4 softtabstop=4 expandtab: */