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