summaryrefslogtreecommitdiff
path: root/sd/source/ui/app/sdxfer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/app/sdxfer.cxx')
-rw-r--r--sd/source/ui/app/sdxfer.cxx881
1 files changed, 881 insertions, 0 deletions
diff --git a/sd/source/ui/app/sdxfer.cxx b/sd/source/ui/app/sdxfer.cxx
new file mode 100644
index 000000000000..ddbc0698a341
--- /dev/null
+++ b/sd/source/ui/app/sdxfer.cxx
@@ -0,0 +1,881 @@
+/*************************************************************************
+ *
+ * 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+#include <com/sun/star/embed/XTransactedObject.hpp>
+#include <com/sun/star/embed/XEmbedPersist.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <vos/mutex.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#ifndef _UNTOOLS_TEMPFILE_HXX
+#include <unotools/tempfile.hxx>
+#endif
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <svx/svdpagv.hxx>
+#include <sfx2/app.hxx>
+#include <vcl/msgbox.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdotext.hxx>
+#include <editeng/outlobj.hxx>
+#include <sot/storage.hxx>
+#include <svl/itempool.hxx>
+#include <editeng/editobj.hxx>
+#include <svx/fmglob.hxx>
+#include <svx/svdouno.hxx>
+#include <tools/urlobj.hxx>
+#include <sot/formats.hxx>
+#include <svl/urlbmk.hxx>
+#include <editeng/outliner.hxx>
+
+//#ifndef _SVDETC_HXX //autogen
+//#include <svx/svdetc.hxx>
+//#endif
+#include <com/sun/star/form/FormButtonType.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <unotools/streamwrap.hxx>
+
+#include <svx/svdotable.hxx>
+#include <svx/unomodel.hxx>
+#include <svx/svditer.hxx>
+#include <sfx2/docfile.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <svtools/embedtransfer.hxx>
+#include "DrawDocShell.hxx"
+#include "View.hxx"
+#include "sdpage.hxx"
+#include "drawview.hxx"
+#include "drawdoc.hxx"
+#include "stlpool.hxx"
+#include "strings.hrc"
+#include "sdresid.hxx"
+#include "imapinfo.hxx"
+#include "sdxfer.hxx"
+#include "unomodel.hxx"
+#include <vcl/virdev.hxx>
+
+// --------------
+// - Namespaces -
+// --------------
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::datatransfer;
+using namespace ::com::sun::star::datatransfer::clipboard;
+
+// -----------
+// - Defines -
+// -----------
+
+#define SDTRANSFER_OBJECTTYPE_DRAWMODEL 0x00000001
+#define SDTRANSFER_OBJECTTYPE_DRAWOLE 0x00000002
+
+// ------------------
+// - SdTransferable -
+// ------------------
+
+SdTransferable::SdTransferable( SdDrawDocument* pSrcDoc, ::sd::View* pWorkView, BOOL bInitOnGetData )
+: mpPageDocShell( NULL )
+, mpOLEDataHelper( NULL )
+, mpObjDesc( NULL )
+, mpSdView( pWorkView )
+, mpSdViewIntern( pWorkView )
+, mpSdDrawDocument( NULL )
+, mpSdDrawDocumentIntern( NULL )
+, mpSourceDoc( pSrcDoc )
+, mpVDev( NULL )
+, mpBookmark( NULL )
+, mpGraphic( NULL )
+, mpImageMap( NULL )
+, mbInternalMove( FALSE )
+, mbOwnDocument( FALSE )
+, mbOwnView( FALSE )
+, mbLateInit( bInitOnGetData )
+, mbPageTransferable( FALSE )
+, mbPageTransferablePersistent( FALSE )
+, mbIsUnoObj( false )
+{
+ if( mpSourceDoc )
+ StartListening( *mpSourceDoc );
+
+ if( pWorkView )
+ StartListening( *pWorkView );
+
+ if( !mbLateInit )
+ CreateData();
+}
+
+// -----------------------------------------------------------------------------
+
+SdTransferable::~SdTransferable()
+{
+ if( mpSourceDoc )
+ EndListening( *mpSourceDoc );
+
+ if( mpSdView )
+ EndListening( *const_cast< sd::View *>( mpSdView) );
+
+ Application::GetSolarMutex().acquire();
+
+ ObjectReleased();
+
+ for( void* p = maPageBookmarks.First(); p; p = maPageBookmarks.Next() )
+ delete static_cast< String* >( p );
+
+ if( mbOwnView )
+ delete mpSdViewIntern;
+
+ delete mpOLEDataHelper;
+
+ if( maDocShellRef.Is() )
+ {
+ SfxObjectShell* pObj = maDocShellRef;
+ ::sd::DrawDocShell* pDocSh = static_cast< ::sd::DrawDocShell*>(pObj);
+ pDocSh->DoClose();
+ }
+
+ maDocShellRef.Clear();
+
+ if( mbOwnDocument )
+ delete mpSdDrawDocumentIntern;
+
+ delete mpGraphic;
+ delete mpBookmark;
+ delete mpImageMap;
+
+ delete mpVDev;
+ delete mpObjDesc;
+
+ Application::GetSolarMutex().release();
+}
+
+// -----------------------------------------------------------------------------
+
+void SdTransferable::CreateObjectReplacement( SdrObject* pObj )
+{
+ if( pObj )
+ {
+ delete mpOLEDataHelper, mpOLEDataHelper = NULL;
+ delete mpGraphic, mpGraphic = NULL;
+ delete mpBookmark, mpBookmark = NULL;
+ delete mpImageMap, mpImageMap = NULL;
+
+ if( pObj->ISA( SdrOle2Obj ) )
+ {
+ try
+ {
+ uno::Reference < embed::XEmbeddedObject > xObj = static_cast< SdrOle2Obj* >( pObj )->GetObjRef();
+ uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY );
+ if( xObj.is() && xPersist.is() && xPersist->hasEntry() )
+ {
+ mpOLEDataHelper = new TransferableDataHelper( new SvEmbedTransferHelper( xObj, static_cast< SdrOle2Obj* >( pObj )->GetGraphic(), static_cast< SdrOle2Obj* >( pObj )->GetAspect() ) );
+
+ // TODO/LATER: the standalone handling of the graphic should not be used any more in future
+ // The EmbedDataHelper should bring the graphic in future
+ Graphic* pObjGr = static_cast< SdrOle2Obj* >( pObj )->GetGraphic();
+ if ( pObjGr )
+ mpGraphic = new Graphic( *pObjGr );
+ }
+ }
+ catch( uno::Exception& )
+ {}
+ }
+ else if( pObj->ISA( SdrGrafObj ) && (mpSourceDoc && !mpSourceDoc->GetAnimationInfo( pObj )) )
+ {
+ mpGraphic = new Graphic( static_cast< SdrGrafObj* >( pObj )->GetTransformedGraphic() );
+ }
+ else if( pObj->IsUnoObj() && FmFormInventor == pObj->GetObjInventor() && ( pObj->GetObjIdentifier() == (UINT16) OBJ_FM_BUTTON ) )
+ {
+ SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pObj );
+
+ if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
+ {
+ Reference< ::com::sun::star::awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel() );
+
+ if( !xControlModel.is() )
+ return;
+
+ Reference< ::com::sun::star::beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY );
+
+ if( !xPropSet.is() )
+ return;
+
+ ::com::sun::star::form::FormButtonType eButtonType;
+ Any aTmp( xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" ) ) ) );
+
+ if( aTmp >>= eButtonType )
+ {
+ ::rtl::OUString aLabel, aURL;
+
+ xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" ) ) ) >>= aLabel;
+ xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("TargetURL") ) ) >>= aURL;
+
+ mpBookmark = new INetBookmark( String( aURL ), String( aLabel ) );
+ }
+ }
+ }
+ else if( pObj->ISA( SdrTextObj ) )
+ {
+ const OutlinerParaObject* pPara;
+
+ if( (pPara = static_cast< SdrTextObj* >( pObj )->GetOutlinerParaObject()) != 0 )
+ {
+ const SvxFieldItem* pField;
+
+ if( (pField = pPara->GetTextObject().GetField()) != 0 )
+ {
+ const SvxFieldData* pData = pField->GetField();
+
+ if( pData && pData->ISA( SvxURLField ) )
+ {
+ const SvxURLField* pURL = (SvxURLField*) pData;
+
+ mpBookmark = new INetBookmark( pURL->GetURL(), pURL->GetRepresentation() );
+ }
+ }
+ }
+ }
+
+ SdIMapInfo* pInfo = static_cast< SdDrawDocument* >( pObj->GetModel() )->GetIMapInfo( static_cast< SdrObject* >( pObj ) );
+
+ if( pInfo )
+ mpImageMap = new ImageMap( pInfo->GetImageMap() );
+
+ mbIsUnoObj = pObj && pObj->IsUnoObj();
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+void SdTransferable::CreateData()
+{
+ if( mpSdDrawDocument && !mpSdViewIntern )
+ {
+ mbOwnView = TRUE;
+
+ SdPage* pPage = mpSdDrawDocument->GetSdPage(0, PK_STANDARD);
+
+ if( 1 == pPage->GetObjCount() )
+ CreateObjectReplacement( pPage->GetObj( 0 ) );
+
+ mpVDev = new VirtualDevice( *Application::GetDefaultDevice() );
+ mpVDev->SetMapMode( MapMode( mpSdDrawDocumentIntern->GetScaleUnit(), Point(), mpSdDrawDocumentIntern->GetScaleFraction(), mpSdDrawDocumentIntern->GetScaleFraction() ) );
+ mpSdViewIntern = new ::sd::View( mpSdDrawDocumentIntern, mpVDev );
+ mpSdViewIntern->EndListening(*mpSdDrawDocumentIntern );
+ mpSdViewIntern->hideMarkHandles();
+ SdrPageView* pPageView = mpSdViewIntern->ShowSdrPage(pPage);
+ ((SdrMarkView*)mpSdViewIntern)->MarkAllObj(pPageView);
+ }
+ else if( mpSdView && !mpSdDrawDocumentIntern )
+ {
+ const SdrMarkList& rMarkList = mpSdView->GetMarkedObjectList();
+
+ if( rMarkList.GetMarkCount() == 1 )
+ CreateObjectReplacement( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
+
+ if( mpSourceDoc )
+ mpSourceDoc->CreatingDataObj(this);
+ mpSdDrawDocumentIntern = (SdDrawDocument*) mpSdView->GetAllMarkedModel();
+ if( mpSourceDoc )
+ mpSourceDoc->CreatingDataObj(0);
+
+ if( !maDocShellRef.Is() && mpSdDrawDocumentIntern->GetDocSh() )
+ maDocShellRef = mpSdDrawDocumentIntern->GetDocSh();
+
+ if( !maDocShellRef.Is() )
+ {
+ DBG_ERROR( "SdTransferable::CreateData(), failed to create a model with persist, clipboard operation will fail for OLE objects!" );
+ mbOwnDocument = TRUE;
+ }
+
+ // Groesse der Source-Seite uebernehmen
+ SdrPageView* pPgView = mpSdView->GetSdrPageView();
+ SdPage* pOldPage = (SdPage*) pPgView->GetPage();
+ SdrModel* pOldModel = mpSdView->GetModel();
+ SdStyleSheetPool* pOldStylePool = (SdStyleSheetPool*) pOldModel->GetStyleSheetPool();
+ SdStyleSheetPool* pNewStylePool = (SdStyleSheetPool*) mpSdDrawDocumentIntern->GetStyleSheetPool();
+ SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PK_STANDARD );
+ String aOldLayoutName( pOldPage->GetLayoutName() );
+
+ pPage->SetSize( pOldPage->GetSize() );
+ pPage->SetLayoutName( aOldLayoutName );
+ pNewStylePool->CopyGraphicSheets( *pOldStylePool );
+ pNewStylePool->CopyCellSheets( *pOldStylePool );
+ pNewStylePool->CopyTableStyles( *pOldStylePool );
+ aOldLayoutName.Erase( aOldLayoutName.SearchAscii( SD_LT_SEPARATOR ) );
+ SdStyleSheetVector aCreatedSheets;
+ pNewStylePool->CopyLayoutSheets( aOldLayoutName, *pOldStylePool, aCreatedSheets );
+ }
+
+ // set VisArea and adjust objects if neccessary
+ if( maVisArea.IsEmpty() &&
+ mpSdDrawDocumentIntern && mpSdViewIntern &&
+ mpSdDrawDocumentIntern->GetPageCount() )
+ {
+ SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PK_STANDARD );
+
+ if( 1 == mpSdDrawDocumentIntern->GetPageCount() )
+ {
+ Point aOrigin( ( maVisArea = mpSdViewIntern->GetAllMarkedRect() ).TopLeft() );
+ Size aVector( -aOrigin.X(), -aOrigin.Y() );
+
+ for( ULONG nObj = 0, nObjCount = pPage->GetObjCount(); nObj < nObjCount; nObj++ )
+ {
+ SdrObject* pObj = pPage->GetObj( nObj );
+ pObj->NbcMove( aVector );
+ }
+ }
+ else
+ maVisArea.SetSize( pPage->GetSize() );
+
+ // Die Ausgabe soll am Nullpunkt erfolgen
+ maVisArea.SetPos( Point() );
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+BOOL lcl_HasOnlyControls( SdrModel* pModel )
+{
+ BOOL bOnlyControls = FALSE; // default if there are no objects
+
+ if ( pModel )
+ {
+ SdrPage* pPage = pModel->GetPage(0);
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
+ SdrObject* pObj = aIter.Next();
+ if ( pObj )
+ {
+ bOnlyControls = TRUE; // only set if there are any objects at all
+ while ( pObj )
+ {
+ if (!pObj->ISA(SdrUnoObj))
+ {
+ bOnlyControls = FALSE;
+ break;
+ }
+ pObj = aIter.Next();
+ }
+ }
+ }
+ }
+
+ return bOnlyControls;
+}
+
+// -----------------------------------------------------------------------------
+
+bool lcl_HasOnlyOneTable( SdrModel* pModel )
+{
+ if ( pModel )
+ {
+ SdrPage* pPage = pModel->GetPage(0);
+ if (pPage && pPage->GetObjCount() == 1 )
+ {
+ if( dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) ) != 0 )
+ return true;
+ }
+ }
+ return false;
+}
+
+// -----------------------------------------------------------------------------
+
+void SdTransferable::AddSupportedFormats()
+{
+ if( !mbPageTransferable || mbPageTransferablePersistent )
+ {
+ if( !mbLateInit )
+ CreateData();
+
+ if( mpObjDesc )
+ AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR );
+
+ if( mpOLEDataHelper )
+ {
+ AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE );
+
+ DataFlavorExVector aVector( mpOLEDataHelper->GetDataFlavorExVector() );
+ DataFlavorExVector::iterator aIter( aVector.begin() ), aEnd( aVector.end() );
+
+ while( aIter != aEnd )
+ AddFormat( *aIter++ );
+ }
+ else if( mpGraphic )
+ {
+ // #i25616#
+ AddFormat( SOT_FORMATSTR_ID_DRAWING );
+
+ AddFormat( SOT_FORMATSTR_ID_SVXB );
+
+ if( mpGraphic->GetType() == GRAPHIC_BITMAP )
+ {
+ AddFormat( SOT_FORMAT_BITMAP );
+ AddFormat( SOT_FORMAT_GDIMETAFILE );
+ }
+ else
+ {
+ AddFormat( SOT_FORMAT_GDIMETAFILE );
+ AddFormat( SOT_FORMAT_BITMAP );
+ }
+ }
+ else if( mpBookmark )
+ {
+ AddFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK );
+ AddFormat( FORMAT_STRING );
+ }
+ else
+ {
+ AddFormat( SOT_FORMATSTR_ID_EMBED_SOURCE );
+ AddFormat( SOT_FORMATSTR_ID_DRAWING );
+ if( !mpSdDrawDocument || !lcl_HasOnlyControls( mpSdDrawDocument ) )
+ {
+ AddFormat( SOT_FORMAT_GDIMETAFILE );
+ AddFormat( SOT_FORMAT_BITMAP );
+ }
+
+ if( lcl_HasOnlyOneTable( mpSdDrawDocument ) )
+ AddFormat( SOT_FORMAT_RTF );
+ }
+
+ if( mpImageMap )
+ AddFormat( SOT_FORMATSTR_ID_SVIM );
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+sal_Bool SdTransferable::GetData( const DataFlavor& rFlavor )
+{
+ if (SD_MOD()==NULL)
+ return sal_False;
+
+ sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor );
+ sal_Bool bOK = sal_False;
+
+ CreateData();
+
+ if( nFormat == SOT_FORMAT_RTF && lcl_HasOnlyOneTable( mpSdDrawDocument ) )
+ {
+ bOK = SetTableRTF( mpSdDrawDocument, rFlavor );
+ }
+ else if( mpOLEDataHelper && mpOLEDataHelper->HasFormat( rFlavor ) )
+ {
+ ULONG nOldSwapMode = 0;
+
+ if( mpSdDrawDocumentIntern )
+ {
+ nOldSwapMode = mpSdDrawDocumentIntern->GetSwapGraphicsMode();
+ mpSdDrawDocumentIntern->SetSwapGraphicsMode( SDR_SWAPGRAPHICSMODE_PURGE );
+ }
+
+ // TODO/LATER: support all the graphical formats, the embedded object scenario should not have separated handling
+ if( nFormat == FORMAT_GDIMETAFILE && mpGraphic )
+ bOK = SetGDIMetaFile( mpGraphic->GetGDIMetaFile(), rFlavor );
+ else
+ bOK = SetAny( mpOLEDataHelper->GetAny( rFlavor ), rFlavor );
+
+ if( mpSdDrawDocumentIntern )
+ mpSdDrawDocumentIntern->SetSwapGraphicsMode( nOldSwapMode );
+ }
+ else if( HasFormat( nFormat ) )
+ {
+ if( ( nFormat == SOT_FORMATSTR_ID_LINKSRCDESCRIPTOR || nFormat == SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) && mpObjDesc )
+ {
+ bOK = SetTransferableObjectDescriptor( *mpObjDesc, rFlavor );
+ }
+ else if( nFormat == SOT_FORMATSTR_ID_DRAWING )
+ {
+ SfxObjectShellRef aOldRef( maDocShellRef );
+
+ maDocShellRef.Clear();
+
+ if( mpSdViewIntern )
+ {
+ SdDrawDocument* pInternDoc = mpSdViewIntern->GetDoc();
+ if( pInternDoc )
+ pInternDoc->CreatingDataObj(this);
+ SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( mpSdViewIntern->GetAllMarkedModel() );
+ if( pInternDoc )
+ pInternDoc->CreatingDataObj(0);
+
+ bOK = SetObject( pDoc, SDTRANSFER_OBJECTTYPE_DRAWMODEL, rFlavor );
+
+ if( maDocShellRef.Is() )
+ {
+ maDocShellRef->DoClose();
+ }
+ else
+ {
+ delete pDoc;
+ }
+ }
+
+ maDocShellRef = aOldRef;
+ }
+ else if( nFormat == FORMAT_GDIMETAFILE )
+ {
+ if( mpSdViewIntern )
+ bOK = SetGDIMetaFile( mpSdViewIntern->GetAllMarkedMetaFile( TRUE ), rFlavor );
+ }
+ else if( nFormat == FORMAT_BITMAP )
+ {
+ if( mpSdViewIntern )
+ bOK = SetBitmap( mpSdViewIntern->GetAllMarkedBitmap( TRUE ), rFlavor );
+ }
+ else if( ( nFormat == FORMAT_STRING ) && mpBookmark )
+ {
+ bOK = SetString( mpBookmark->GetURL(), rFlavor );
+ }
+ else if( ( nFormat == SOT_FORMATSTR_ID_SVXB ) && mpGraphic )
+ {
+ bOK = SetGraphic( *mpGraphic, rFlavor );
+ }
+ else if( ( nFormat == SOT_FORMATSTR_ID_SVIM ) && mpImageMap )
+ {
+ bOK = SetImageMap( *mpImageMap, rFlavor );
+ }
+ else if( mpBookmark )
+ {
+ bOK = SetINetBookmark( *mpBookmark, rFlavor );
+ }
+ else if( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE )
+ {
+ ULONG nOldSwapMode = 0;
+
+ if( mpSdDrawDocumentIntern )
+ {
+ nOldSwapMode = mpSdDrawDocumentIntern->GetSwapGraphicsMode();
+ mpSdDrawDocumentIntern->SetSwapGraphicsMode( SDR_SWAPGRAPHICSMODE_PURGE );
+ }
+
+ if( !maDocShellRef.Is() )
+ {
+ maDocShellRef = new ::sd::DrawDocShell(
+ mpSdDrawDocumentIntern,
+ SFX_CREATE_MODE_EMBEDDED,
+ TRUE,
+ mpSdDrawDocumentIntern->GetDocumentType());
+ mbOwnDocument = FALSE;
+ maDocShellRef->DoInitNew( NULL );
+ }
+
+ maDocShellRef->SetVisArea( maVisArea );
+ bOK = SetObject( &maDocShellRef, SDTRANSFER_OBJECTTYPE_DRAWOLE, rFlavor );
+
+ if( mpSdDrawDocumentIntern )
+ mpSdDrawDocumentIntern->SetSwapGraphicsMode( nOldSwapMode );
+ }
+ }
+
+ return bOK;
+}
+
+// -----------------------------------------------------------------------------
+
+/* testcode
+#include <sfx2/docfile.hxx>
+*/
+
+sal_Bool SdTransferable::WriteObject( SotStorageStreamRef& rxOStm, void* pObject, sal_uInt32 nObjectType, const DataFlavor& )
+{
+ sal_Bool bRet = sal_False;
+
+ switch( nObjectType )
+ {
+ case( SDTRANSFER_OBJECTTYPE_DRAWMODEL ):
+ {
+ try
+ {
+ static const BOOL bDontBurnInStyleSheet = ( getenv( "AVOID_BURN_IN_FOR_GALLERY_THEME" ) != NULL );
+ SdDrawDocument* pDoc = (SdDrawDocument*) pObject;
+ if ( !bDontBurnInStyleSheet )
+ pDoc->BurnInStyleSheetAttributes();
+ rxOStm->SetBufferSize( 16348 );
+
+ Reference< XComponent > xComponent( new SdXImpressDocument( pDoc, sal_True ) );
+ pDoc->setUnoModel( Reference< XInterface >::query( xComponent ) );
+
+ {
+ com::sun::star::uno::Reference<com::sun::star::io::XOutputStream> xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) );
+ if( SvxDrawingLayerExport( pDoc, xDocOut, xComponent, (pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) ? "com.sun.star.comp.Impress.XMLClipboardExporter" : "com.sun.star.comp.DrawingLayer.XMLExporter" ) )
+ rxOStm->Commit();
+ }
+
+ /* testcode
+ {
+ const rtl::OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "file:///e:/test.xml" ) );
+ SfxMedium aMedium( aURL, STREAM_WRITE | STREAM_TRUNC, TRUE );
+ aMedium.IsRemote();
+ com::sun::star::uno::Reference<com::sun::star::io::XOutputStream> xDocOut( new utl::OOutputStreamWrapper( *aMedium.GetOutStream() ) );
+ if( SvxDrawingLayerExport( pDoc, xDocOut, xComponent, (pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) ? "com.sun.star.comp.Impress.XMLClipboardExporter" : "com.sun.star.comp.DrawingLayer.XMLExporter" ) )
+ aMedium.Commit();
+ }
+ */
+
+ xComponent->dispose();
+ bRet = ( rxOStm->GetError() == ERRCODE_NONE );
+ }
+ catch( Exception& )
+ {
+ DBG_ERROR( "sd::SdTransferable::WriteObject(), exception catched!" );
+ bRet = FALSE;
+ }
+ }
+ break;
+
+ case( SDTRANSFER_OBJECTTYPE_DRAWOLE ):
+ {
+ SfxObjectShell* pEmbObj = (SfxObjectShell*) pObject;
+ ::utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ try
+ {
+ uno::Reference< embed::XStorage > xWorkStore =
+ ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE );
+
+ // write document storage
+ pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, sal_False );
+ // mba: no relative ULRs for clipboard!
+ SfxMedium aMedium( xWorkStore, String() );
+ bRet = pEmbObj->DoSaveObjectAs( aMedium, FALSE );
+ pEmbObj->DoSaveCompleted();
+
+ uno::Reference< embed::XTransactedObject > xTransact( xWorkStore, uno::UNO_QUERY );
+ if ( xTransact.is() )
+ xTransact->commit();
+
+ SvStream* pSrcStm = ::utl::UcbStreamHelper::CreateStream( aTempFile.GetURL(), STREAM_READ );
+ if( pSrcStm )
+ {
+ rxOStm->SetBufferSize( 0xff00 );
+ *rxOStm << *pSrcStm;
+ delete pSrcStm;
+ }
+
+ bRet = TRUE;
+ rxOStm->Commit();
+ }
+ catch ( Exception& )
+ {}
+ }
+
+ break;
+
+ default:
+ break;
+ }
+
+ return bRet;
+}
+
+// -----------------------------------------------------------------------------
+
+void SdTransferable::DragFinished( sal_Int8 nDropAction )
+{
+ if( mpSdView )
+ ( (::sd::View*) mpSdView )->DragFinished( nDropAction );
+}
+
+// -----------------------------------------------------------------------------
+
+void SdTransferable::ObjectReleased()
+{
+ if( this == SD_MOD()->pTransferClip )
+ SD_MOD()->pTransferClip = NULL;
+
+ if( this == SD_MOD()->pTransferDrag )
+ SD_MOD()->pTransferDrag = NULL;
+
+ if( this == SD_MOD()->pTransferSelection )
+ SD_MOD()->pTransferSelection = NULL;
+}
+
+// -----------------------------------------------------------------------------
+
+void SdTransferable::SetObjectDescriptor( const TransferableObjectDescriptor& rObjDesc )
+{
+ delete mpObjDesc;
+ mpObjDesc = new TransferableObjectDescriptor( rObjDesc );
+ PrepareOLE( rObjDesc );
+}
+
+// -----------------------------------------------------------------------------
+
+void SdTransferable::SetPageBookmarks( const List& rPageBookmarks, BOOL bPersistent )
+{
+ if( mpSourceDoc )
+ {
+ if( mpSdViewIntern )
+ mpSdViewIntern->HideSdrPage();
+
+ // #116168#
+ mpSdDrawDocument->ClearModel(sal_False);
+
+ mpPageDocShell = NULL;
+
+ for( void* p = maPageBookmarks.First(); p; p = maPageBookmarks.Next() )
+ delete static_cast< String* >( p );
+
+ if( bPersistent )
+ {
+ mpSdDrawDocument->CreateFirstPages(mpSourceDoc);
+ mpSdDrawDocument->InsertBookmarkAsPage( const_cast< List* >( &rPageBookmarks ), NULL, FALSE, TRUE, 1, TRUE, mpSourceDoc->GetDocSh(), TRUE, TRUE, FALSE );
+ }
+ else
+ {
+ mpPageDocShell = mpSourceDoc->GetDocSh();
+
+ for( ULONG i = 0; i < rPageBookmarks.Count(); i++ )
+ maPageBookmarks.Insert( new String( *static_cast< String* >( rPageBookmarks.GetObject( i ) ) ), LIST_APPEND );
+ }
+
+ if( mpSdViewIntern && mpSdDrawDocument )
+ {
+ SdPage* pPage = mpSdDrawDocument->GetSdPage( 0, PK_STANDARD );
+
+ if( pPage )
+ {
+ ( (SdrMarkView*) mpSdViewIntern )->MarkAllObj( (SdrPageView*) mpSdViewIntern->ShowSdrPage( pPage ) );
+ }
+ }
+
+ // set flags for page transferable; if ( mbPageTransferablePersistent == FALSE ),
+ // don't offer any formats => it's just for internal puposes
+ mbPageTransferable = TRUE;
+ mbPageTransferablePersistent = bPersistent;
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+sal_Int64 SAL_CALL SdTransferable::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( ::com::sun::star::uno::RuntimeException )
+{
+ sal_Int64 nRet;
+
+ if( ( rId.getLength() == 16 ) &&
+ ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) )
+ {
+ nRet = sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
+ }
+ else
+ {
+ nRet = 0;
+ }
+
+ return nRet;
+}
+
+// -----------------------------------------------------------------------------
+
+const ::com::sun::star::uno::Sequence< sal_Int8 >& SdTransferable::getUnoTunnelId()
+{
+ static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq;
+
+ if( !aSeq.getLength() )
+ {
+ static osl::Mutex aCreateMutex;
+ osl::MutexGuard aGuard( aCreateMutex );
+
+ aSeq.realloc( 16 );
+ rtl_createUuid( reinterpret_cast< sal_uInt8* >( aSeq.getArray() ), 0, sal_True );
+ }
+
+ return aSeq;
+}
+
+// -----------------------------------------------------------------------------
+
+SdTransferable* SdTransferable::getImplementation( const Reference< XInterface >& rxData ) throw()
+{
+ try
+ {
+ Reference< ::com::sun::star::lang::XUnoTunnel > xUnoTunnel( rxData, UNO_QUERY_THROW );
+ return reinterpret_cast<SdTransferable*>(sal::static_int_cast<sal_uIntPtr>(xUnoTunnel->getSomething( SdTransferable::getUnoTunnelId()) ) );
+ }
+ catch( const ::com::sun::star::uno::Exception& )
+ {
+ }
+ return NULL;
+}
+
+// -----------------------------------------------------------------------------
+
+// SfxListener
+void SdTransferable::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
+{
+ const SdrHint* pSdrHint = dynamic_cast< const SdrHint* >( &rHint );
+ if( pSdrHint )
+ {
+ if( HINT_MODELCLEARED == pSdrHint->GetKind() )
+ {
+ EndListening(*mpSourceDoc);
+ mpSourceDoc = 0;
+ }
+ }
+ else
+ {
+ const SfxSimpleHint* pSimpleHint = dynamic_cast< const SfxSimpleHint * >(&rHint);
+ if(pSimpleHint && (pSimpleHint->GetId() == SFX_HINT_DYING) )
+ {
+ if( &rBC == mpSourceDoc )
+ mpSourceDoc = 0;
+ if( &rBC == mpSdViewIntern )
+ mpSdViewIntern = 0;
+ if( &rBC == mpSdView )
+ mpSdView = 0;
+ }
+ }
+}
+
+sal_Bool SdTransferable::SetTableRTF( SdDrawDocument* pModel, const DataFlavor& rFlavor)
+{
+ if ( pModel )
+ {
+ SdrPage* pPage = pModel->GetPage(0);
+ if (pPage && pPage->GetObjCount() == 1 )
+ {
+ sdr::table::SdrTableObj* pTableObj = dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) );
+ if( pTableObj )
+ {
+ SvMemoryStream aMemStm( 65535, 65535 );
+ sdr::table::SdrTableObj::ExportAsRTF( aMemStm, *pTableObj );
+ return SetAny( Any( Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Seek( STREAM_SEEK_TO_END ) ) ), rFlavor );
+ }
+ }
+ }
+
+ return sal_False;
+}