xref: /aoo42x/main/sd/source/ui/view/sdview3.cxx (revision 0415cdef)
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 
27 #include "View.hxx"
28 #include <com/sun/star/embed/XEmbedObjectClipboardCreator.hpp>
29 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
30 #include <com/sun/star/lang/XComponent.hpp>
31 #include <sot/filelist.hxx>
32 #include <unotools/pathoptions.hxx>
33 #include <editeng/editdata.hxx>
34 #include <svl/urlbmk.hxx>
35 #include <svx/xexch.hxx>
36 #include <svx/xflclit.hxx>
37 #include <svx/xlnclit.hxx>
38 #include <svx/svdpagv.hxx>
39 #include <editeng/eeitem.hxx>
40 #include <editeng/colritem.hxx>
41 #include <sfx2/docfile.hxx>
42 #include <svx/svditer.hxx>
43 #include <svx/svdogrp.hxx>
44 #include <svx/svdoole2.hxx>
45 #include <svx/svdograf.hxx>
46 #include <svx/svdetc.hxx>
47 #include <svx/svdundo.hxx>
48 #include <sfx2/app.hxx>
49 #include <svl/itempool.hxx>
50 #include <sot/clsids.hxx>
51 #include <svx/fmmodel.hxx>
52 #include <sot/formats.hxx>
53 #include <editeng/outliner.hxx>
54 #include <editeng/editeng.hxx>
55 #include <svx/obj3d.hxx>
56 #include <svx/e3dundo.hxx>
57 #include <svx/dbexch.hrc>
58 #include <svx/unomodel.hxx>
59 #include <unotools/streamwrap.hxx>
60 #include <vcl/metaact.hxx>
61 #include <svx/svxids.hrc>
62 #include <toolkit/helper/vclunohelper.hxx>
63 
64 #include "DrawDocShell.hxx"
65 #include "fupoor.hxx"
66 #include "Window.hxx"
67 #include "sdxfer.hxx"
68 #include "sdpage.hxx"
69 #include "DrawViewShell.hxx"
70 #include "drawdoc.hxx"
71 #include "sdresid.hxx"
72 #include "strings.hrc"
73 #include "imapinfo.hxx"
74 #include "SlideSorterViewShell.hxx"
75 #include "strmname.h"
76 #include "unomodel.hxx"
77 #include "ViewClipboard.hxx"
78 
79 #include <sfx2/ipclient.hxx>
80 #include <comphelper/storagehelper.hxx>
81 #include <comphelper/processfactory.hxx>
82 #include <tools/stream.hxx>
83 #include <vcl/cvtgrf.hxx>
84 #include <svx/sdrhittesthelper.hxx>
85 
86 // --------------
87 // - Namespaces -
88 // --------------
89 
90 using namespace ::com::sun::star;
91 using namespace ::com::sun::star::lang;
92 using namespace ::com::sun::star::uno;
93 using namespace ::com::sun::star::io;
94 using namespace ::com::sun::star::datatransfer;
95 using namespace ::com::sun::star::datatransfer::clipboard;
96 
97 namespace sd {
98 
99 #define CHECK_FORMAT_TRANS( _def_Type ) ( ( nFormat == (_def_Type) || !nFormat ) && aDataHelper.HasFormat( _def_Type ) )
100 
101 /*************************************************************************
102 |*
103 |* Paste
104 |*
105 \************************************************************************/
106 
107 // #83525#
108 struct ImpRememberOrigAndClone
109 {
110 	SdrObject*		pOrig;
111 	SdrObject*		pClone;
112 };
113 
114 SdrObject* ImpGetClone(Container& aConnectorContainer, SdrObject* pConnObj)
115 {
116 	for(sal_uInt32 a(0); a < aConnectorContainer.Count(); a++)
117 	{
118 		if(pConnObj == ((ImpRememberOrigAndClone*)aConnectorContainer.GetObject(a))->pOrig)
119 			return ((ImpRememberOrigAndClone*)aConnectorContainer.GetObject(a))->pClone;
120 	}
121 	return 0L;
122 }
123 
124 // #90129# restrict movement to WorkArea
125 void ImpCheckInsertPos(Point& rPos, const Size& rSize, const Rectangle& rWorkArea)
126 {
127 	if(!rWorkArea.IsEmpty())
128 	{
129 		Rectangle aMarkRect(Point(rPos.X() - (rSize.Width() / 2), rPos.Y() - (rSize.Height() / 2)), rSize);
130 
131 		if(!aMarkRect.IsInside(rWorkArea))
132 		{
133 			if(aMarkRect.Left() < rWorkArea.Left())
134 			{
135 				rPos.X() += rWorkArea.Left() - aMarkRect.Left();
136 			}
137 
138 			if(aMarkRect.Right() > rWorkArea.Right())
139 			{
140 				rPos.X() -= aMarkRect.Right() - rWorkArea.Right();
141 			}
142 
143 			if(aMarkRect.Top() < rWorkArea.Top())
144 			{
145 				rPos.Y() += rWorkArea.Top() - aMarkRect.Top();
146 			}
147 
148 			if(aMarkRect.Bottom() > rWorkArea.Bottom())
149 			{
150 				rPos.Y() -= aMarkRect.Bottom() - rWorkArea.Bottom();
151 			}
152 		}
153 	}
154 }
155 
156 bool View::InsertMetaFile( TransferableDataHelper& rDataHelper, const Point& rPos, ImageMap* pImageMap, bool bOptimize )
157 {
158 	GDIMetaFile aMtf;
159 
160 	if( !rDataHelper.GetGDIMetaFile( FORMAT_GDIMETAFILE, aMtf ) )
161 		return false;
162 
163 /*
164 SvFileStream	aSvOutputStream( String( RTL_CONSTASCII_USTRINGPARAM( "/tmp/test.png" ) ), STREAM_WRITE | STREAM_TRUNC );
165 Graphic			aMtfGraphic( aMtf );
166 Size			aPreviewSizePixel( OutputDevice::LogicToLogic( aMtf.GetPrefSize(), aMtf.GetPrefMapMode(), MAP_PIXEL ) );
167 
168 if( aPreviewSizePixel.Width() && aPreviewSizePixel.Height() )
169 {
170 	const double fWH = static_cast< double >( aPreviewSizePixel.Width() ) / static_cast< double >( aPreviewSizePixel.Height() );
171 
172 	if( fWH <= 1.0 )
173 		aPreviewSizePixel.Width() = static_cast< long >( 128.0 * fWH ), aPreviewSizePixel.Height() = 128;
174 	else
175 		aPreviewSizePixel.Width() = 128, aPreviewSizePixel.Height() = static_cast< long >( 128.0 / fWH );
176 
177 	if( GraphicConverter::Export( aSvOutputStream, aMtfGraphic.GetBitmapEx( &aPreviewSizePixel ), CVT_PNG ) )
178 	{
179 		// handle errror case here
180 	}
181 	else
182 	{
183 		// Success
184 	}
185 }
186 */
187 	bool bVector = false;
188 	Graphic aGraphic;
189 
190 	// check if metafile only contains a pixel image, if so insert a bitmap instead
191 	if( bOptimize )
192 	{
193 		MetaAction* pAction = aMtf.FirstAction();
194 		while( pAction && !bVector )
195 		{
196 			switch( pAction->GetType() )
197 			{
198 				case META_POINT_ACTION:
199 				case META_LINE_ACTION:
200 				case META_RECT_ACTION:
201 				case META_ROUNDRECT_ACTION:
202 				case META_ELLIPSE_ACTION:
203 				case META_ARC_ACTION:
204 				case META_PIE_ACTION:
205 				case META_CHORD_ACTION:
206 				case META_POLYLINE_ACTION:
207 				case META_POLYGON_ACTION:
208 				case META_POLYPOLYGON_ACTION:
209 				case META_TEXT_ACTION:
210 				case META_TEXTARRAY_ACTION:
211 				case META_STRETCHTEXT_ACTION:
212 				case META_TEXTRECT_ACTION:
213 				case META_GRADIENT_ACTION:
214 				case META_HATCH_ACTION:
215 				case META_WALLPAPER_ACTION:
216 				case META_EPS_ACTION:
217 				case META_TEXTLINE_ACTION:
218 				case META_FLOATTRANSPARENT_ACTION:
219 				case META_GRADIENTEX_ACTION:
220 				case META_BMPSCALEPART_ACTION:
221 				case META_BMPEXSCALEPART_ACTION:
222 					bVector = true;
223 					break;
224 				case META_BMP_ACTION:
225 				case META_BMPSCALE_ACTION:
226 				case META_BMPEX_ACTION:
227 				case META_BMPEXSCALE_ACTION:
228 					if( aGraphic.GetType() != GRAPHIC_NONE )
229 					{
230 						bVector = true;
231 					}
232 					else switch( pAction->GetType() )
233 					{
234 						case META_BMP_ACTION:
235 							{
236 								MetaBmpAction* pBmpAction = dynamic_cast< MetaBmpAction* >( pAction );
237 								if( pBmpAction )
238 									aGraphic = Graphic( pBmpAction->GetBitmap() );
239 							}
240 							break;
241 						case META_BMPSCALE_ACTION:
242 							{
243 								MetaBmpScaleAction* pBmpScaleAction = dynamic_cast< MetaBmpScaleAction* >( pAction );
244 								if( pBmpScaleAction )
245 									aGraphic = Graphic( pBmpScaleAction->GetBitmap() );
246 							}
247 							break;
248 						case META_BMPEX_ACTION:
249 							{
250 								MetaBmpExAction* pBmpExAction = dynamic_cast< MetaBmpExAction* >( pAction );
251 								if( pBmpExAction )
252 									aGraphic = Graphic( pBmpExAction->GetBitmapEx() );
253 							}
254 							break;
255 						case META_BMPEXSCALE_ACTION:
256 							{
257 								MetaBmpExScaleAction* pBmpExScaleAction = dynamic_cast< MetaBmpExScaleAction* >( pAction );
258 								if( pBmpExScaleAction )
259 									aGraphic = Graphic( pBmpExScaleAction->GetBitmapEx() );
260 							}
261 							break;
262 					}
263 			}
264 
265 			pAction = aMtf.NextAction();
266 		}
267 	}
268 
269 	// it is not a vector metafile but it also has no graphic?
270 	if( !bVector && (aGraphic.GetType() == GRAPHIC_NONE) )
271 		bVector = true;
272 
273 	// #90129# restrict movement to WorkArea
274 	Point aInsertPos( rPos );
275 	Size aImageSize;
276 	aImageSize = bVector ? aMtf.GetPrefSize() : aGraphic.GetSizePixel();
277 	ImpCheckInsertPos(aInsertPos, aImageSize, GetWorkArea());
278 
279 	if( bVector )
280 		aGraphic = Graphic( aMtf );
281 
282 	aGraphic.SetPrefMapMode( aMtf.GetPrefMapMode() );
283 	aGraphic.SetPrefSize( aMtf.GetPrefSize() );
284 	InsertGraphic( aGraphic, mnAction, aInsertPos, NULL, pImageMap );
285 
286 	return true;
287 }
288 
289 sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper,
290 						 const Point& rPos, sal_Int8& rDnDAction, sal_Bool bDrag,
291 						 sal_uLong nFormat, sal_uInt16 nPage, sal_uInt16 nLayer )
292 {
293 	maDropPos = rPos;
294 	mnAction = rDnDAction;
295 	mbIsDropAllowed = sal_False;
296 
297 	TransferableDataHelper	aDataHelper( rDataHelper );
298 	SdrObject*				pPickObj = NULL;
299 	SdPage*					pPage = NULL;
300 	ImageMap*				pImageMap = NULL;
301 	sal_Bool					bReturn = sal_False;
302 	sal_Bool					bLink = ( ( mnAction & DND_ACTION_LINK ) != 0 );
303 	sal_Bool					bCopy = ( ( ( mnAction & DND_ACTION_COPY ) != 0 ) || bLink );
304 	sal_uLong					nPasteOptions = SDRINSERT_SETDEFLAYER;
305 
306     if (mpViewSh != NULL)
307     {
308         OSL_ASSERT (mpViewSh->GetViewShell()!=NULL);
309         SfxInPlaceClient* pIpClient = mpViewSh->GetViewShell()->GetIPClient();
310         if( mpViewSh->ISA(::sd::slidesorter::SlideSorterViewShell)
311             || (pIpClient!=NULL && pIpClient->IsObjectInPlaceActive()))
312         nPasteOptions |= SDRINSERT_DONTMARK;
313     }
314 
315 	if( bDrag )
316 	{
317 		SdrPageView* pPV = NULL;
318 		PickObj( rPos, getHitTolLog(), pPickObj, pPV );
319 	}
320 
321 	if( nPage != SDRPAGE_NOTFOUND )
322 		pPage = (SdPage*) mpDoc->GetPage( nPage );
323 
324 	SdTransferable* pOwnData = NULL;
325     SdTransferable* pImplementation = SdTransferable::getImplementation( aDataHelper.GetTransferable() );
326 
327 	// try to get own transfer data
328 	if( pImplementation )
329 	{
330 		if( SD_MOD()->pTransferClip == (SdTransferable*) pImplementation )
331 			pOwnData = SD_MOD()->pTransferClip;
332 		else if( SD_MOD()->pTransferDrag == (SdTransferable*) pImplementation )
333 			pOwnData = SD_MOD()->pTransferDrag;
334 		else if( SD_MOD()->pTransferSelection == (SdTransferable*) pImplementation )
335 			pOwnData = SD_MOD()->pTransferSelection;
336 	}
337 
338 	// ImageMap?
339 	if( !pOwnData && aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVIM ) )
340 	{
341 		SotStorageStreamRef xStm;
342 
343 		if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_SVIM, xStm ) )
344 		{
345 			pImageMap = new ImageMap;
346             // mba: clipboard always must contain absolute URLs (could be from alien source)
347             pImageMap->Read( *xStm, String() );
348 		}
349 	}
350 
351 	bool bTable = false;
352 	// check special cases for pasting table formats as RTL
353 	if( !bLink && (!nFormat || (nFormat == SOT_FORMAT_RTF)) )
354 	{
355 		// if the objekt supports rtf and there is a table involved, default is to create a table
356 		if( aDataHelper.HasFormat( SOT_FORMAT_RTF ) && ! aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) )
357 		{
358 			SotStorageStreamRef xStm;
359 
360 			if( aDataHelper.GetSotStorageStream( FORMAT_RTF, xStm ) )
361 			{
362 				xStm->Seek( 0 );
363 
364 				ByteString aLine;
365 				while( xStm->ReadLine(aLine) )
366 				{
367 					xub_StrLen x = aLine.Search( "\\trowd" );
368 					if( x != STRING_NOTFOUND )
369 					{
370 						bTable = true;
371 						nFormat = FORMAT_RTF;
372 						break;
373 					}
374 				}
375 			}
376 		}
377 	}
378 
379 	if( pOwnData && !nFormat )
380 	{
381 		const View* pSourceView = pOwnData->GetView();
382 
383 
384         if( pOwnData->GetDocShell() && pOwnData->IsPageTransferable() && ISA( View ) )
385 		{
386             mpClipboard->HandlePageDrop (*pOwnData);
387 		}
388         else if( pSourceView )
389 		{
390 			if( pSourceView == this )
391 			{
392 				// same view
393 				if( nLayer != SDRLAYER_NOTFOUND )
394 				{
395 					// drop on layer tab bar
396 					SdrLayerAdmin&	rLayerAdmin = mpDoc->GetLayerAdmin();
397 					SdrLayer*		pLayer = rLayerAdmin.GetLayerPerID( nLayer );
398 					SdrPageView*	pPV = GetSdrPageView();
399 					String			aLayer( pLayer->GetName() );
400 
401 					if( !pPV->IsLayerLocked( aLayer ) )
402 					{
403 						pOwnData->SetInternalMove( sal_True );
404 						SortMarkedObjects();
405 
406 						for( sal_uLong nM = 0; nM < GetMarkedObjectCount(); nM++ )
407 						{
408 							SdrMark*	pM = GetSdrMarkByIndex( nM );
409 							SdrObject*	pO = pM->GetMarkedSdrObj();
410 
411 							if( pO )
412 							{
413 								// #i11702#
414 								if( IsUndoEnabled() )
415 								{
416 									BegUndo(String(SdResId(STR_MODIFYLAYER)));
417 									AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoObjectLayerChange(*pO, pO->GetLayer(), (SdrLayerID)nLayer));
418 									EndUndo();
419 								}
420 
421 								pO->SetLayer( (SdrLayerID) nLayer );
422 							}
423 						}
424 
425 						bReturn = sal_True;
426 					}
427 				}
428 				else
429 				{
430 					SdrPageView*	pPV = GetSdrPageView();
431 					sal_Bool			bDropOnTabBar = sal_True;
432 
433 					if( !pPage && pPV->GetPage()->GetPageNum() != mnDragSrcPgNum )
434 					{
435 						pPage = (SdPage*) pPV->GetPage();
436 						bDropOnTabBar = sal_False;
437 					}
438 
439 					if( pPage )
440 					{
441 						// drop on other page
442 						String aActiveLayer( GetActiveLayer() );
443 
444 						if( !pPV->IsLayerLocked( aActiveLayer ) )
445 						{
446 							if( !IsPresObjSelected() )
447 							{
448 								SdrMarkList* pMarkList;
449 
450 								if( (mnDragSrcPgNum != SDRPAGE_NOTFOUND) && (mnDragSrcPgNum != pPV->GetPage()->GetPageNum()) )
451 								{
452 									pMarkList = mpDragSrcMarkList;
453 								}
454 								else
455 								{
456 									// actual mark list is used
457 									pMarkList = new SdrMarkList( GetMarkedObjectList());
458 								}
459 
460 								pMarkList->ForceSort();
461 
462 								// #83525# stuff to remember originals and clones
463 								Container	aConnectorContainer(0);
464 								sal_uInt32	a, nConnectorCount(0L);
465 								Point		aCurPos;
466 
467 								// calculate real position of current
468 								// source objects, if necessary (#103207)
469 								if( pOwnData == SD_MOD()->pTransferSelection )
470 								{
471 									Rectangle aCurBoundRect;
472 
473 									if( pMarkList->TakeBoundRect( pPV, aCurBoundRect ) )
474 										aCurPos = aCurBoundRect.TopLeft();
475 									else
476 										aCurPos = pOwnData->GetStartPos();
477 								}
478 								else
479 									aCurPos = pOwnData->GetStartPos();
480 
481 								const Size aVector( maDropPos.X() - aCurPos.X(), maDropPos.Y() - aCurPos.Y() );
482 
483 								for(a = 0; a < pMarkList->GetMarkCount(); a++)
484 								{
485 									SdrMark* pM = pMarkList->GetMark(a);
486 									SdrObject* pObj = pM->GetMarkedSdrObj()->Clone();
487 
488 									if(pObj)
489 									{
490 										if(!bDropOnTabBar)
491 										{
492 											// #83525# do a NbcMove(...) instead of setting SnapRects here
493 											pObj->NbcMove(aVector);
494 										}
495 
496 										pPage->InsertObject(pObj);
497 
498 										if( IsUndoEnabled() )
499 										{
500 											BegUndo(String(SdResId(STR_UNDO_DRAGDROP)));
501 											AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pObj));
502 											EndUndo();
503 										}
504 
505 										// #83525#
506 										ImpRememberOrigAndClone* pRem = new ImpRememberOrigAndClone;
507 										pRem->pOrig = pM->GetMarkedSdrObj();
508 										pRem->pClone = pObj;
509 										aConnectorContainer.Insert(pRem, CONTAINER_APPEND);
510 
511 										if(pObj->ISA(SdrEdgeObj))
512 											nConnectorCount++;
513 									}
514 								}
515 
516 								// #83525# try to re-establish connections at clones
517 								if(nConnectorCount)
518 								{
519 									for(a = 0; a < aConnectorContainer.Count(); a++)
520 									{
521 										ImpRememberOrigAndClone* pRem = (ImpRememberOrigAndClone*)aConnectorContainer.GetObject(a);
522 
523 										if(pRem->pClone->ISA(SdrEdgeObj))
524 										{
525 											SdrEdgeObj* pOrigEdge = (SdrEdgeObj*)pRem->pOrig;
526 											SdrEdgeObj* pCloneEdge = (SdrEdgeObj*)pRem->pClone;
527 
528 											// test first connection
529 											SdrObjConnection& rConn0 = pOrigEdge->GetConnection(sal_False);
530 											SdrObject* pConnObj = rConn0.GetObject();
531 											if(pConnObj)
532 											{
533 												SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj);
534 												if(pConnClone)
535 												{
536 													// if dest obj was cloned, too, re-establish connection
537 													pCloneEdge->ConnectToNode(sal_False, pConnClone);
538 													pCloneEdge->GetConnection(sal_False).SetConnectorId(rConn0.GetConnectorId());
539 												}
540 												else
541 												{
542 													// set position of connection point of original connected object
543 													const SdrGluePointList* pGlueList = pConnObj->GetGluePointList();
544 													if(pGlueList)
545 													{
546 														sal_uInt16 nInd = pGlueList->FindGluePoint(rConn0.GetConnectorId());
547 
548 														if(SDRGLUEPOINT_NOTFOUND != nInd)
549 														{
550 															const SdrGluePoint& rGluePoint = (*pGlueList)[nInd];
551 															Point aPosition = rGluePoint.GetAbsolutePos(*pConnObj);
552 															aPosition.X() += aVector.A();
553 															aPosition.Y() += aVector.B();
554 															pCloneEdge->SetTailPoint(sal_False, aPosition);
555 														}
556 													}
557 												}
558 											}
559 
560 											// test second connection
561 											SdrObjConnection& rConn1 = pOrigEdge->GetConnection(sal_True);
562 											pConnObj = rConn1.GetObject();
563 											if(pConnObj)
564 											{
565 												SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj);
566 												if(pConnClone)
567 												{
568 													// if dest obj was cloned, too, re-establish connection
569 													pCloneEdge->ConnectToNode(sal_True, pConnClone);
570 													pCloneEdge->GetConnection(sal_True).SetConnectorId(rConn1.GetConnectorId());
571 												}
572 												else
573 												{
574 													// set position of connection point of original connected object
575 													const SdrGluePointList* pGlueList = pConnObj->GetGluePointList();
576 													if(pGlueList)
577 													{
578 														sal_uInt16 nInd = pGlueList->FindGluePoint(rConn1.GetConnectorId());
579 
580 														if(SDRGLUEPOINT_NOTFOUND != nInd)
581 														{
582 															const SdrGluePoint& rGluePoint = (*pGlueList)[nInd];
583 															Point aPosition = rGluePoint.GetAbsolutePos(*pConnObj);
584 															aPosition.X() += aVector.A();
585 															aPosition.Y() += aVector.B();
586 															pCloneEdge->SetTailPoint(sal_True, aPosition);
587 														}
588 													}
589 												}
590 											}
591 										}
592 									}
593 								}
594 
595 								// #83525# cleanup remember classes
596 								for(a = 0; a < aConnectorContainer.Count(); a++)
597 									delete (ImpRememberOrigAndClone*)aConnectorContainer.GetObject(a);
598 
599 								if( pMarkList != mpDragSrcMarkList )
600 									delete pMarkList;
601 
602 								bReturn = sal_True;
603 							}
604 							else
605 							{
606 								maDropErrorTimer.Start();
607 								bReturn = sal_False;
608 							}
609 						}
610 					}
611 					else
612 					{
613 						pOwnData->SetInternalMove( sal_True );
614 						MoveAllMarked( Size( maDropPos.X() - pOwnData->GetStartPos().X(),
615 											 maDropPos.Y() - pOwnData->GetStartPos().Y() ), bCopy );
616 						bReturn = sal_True;
617 					}
618 				}
619 			}
620 			else
621 			{
622 				// different views
623 				if( !pSourceView->IsPresObjSelected() )
624 				{
625 					// model is owned by from AllocModel() created DocShell
626 					SdDrawDocument* pSourceDoc = (SdDrawDocument*) pSourceView->GetModel();
627 					pSourceDoc->CreatingDataObj( pOwnData );
628 					SdDrawDocument* pModel = (SdDrawDocument*) pSourceView->GetAllMarkedModel();
629 					bReturn = Paste( *pModel, maDropPos, pPage, nPasteOptions );
630 
631 					if( !pPage )
632 						pPage = (SdPage*) GetSdrPageView()->GetPage();
633 
634 					String aLayout( pPage->GetLayoutName() );
635 					aLayout.Erase( aLayout.SearchAscii( SD_LT_SEPARATOR ) );
636 					pPage->SetPresentationLayout( aLayout, sal_False, sal_False );
637 					pSourceDoc->CreatingDataObj( NULL );
638 				}
639 				else
640 				{
641 					maDropErrorTimer.Start();
642 					bReturn = sal_False;
643 				}
644 			}
645 		}
646 		else
647 		{
648 		    SdDrawDocument*	pWorkModel = (SdDrawDocument*) pOwnData->GetWorkDocument();
649 		    SdPage*			pWorkPage = (SdPage*) pWorkModel->GetSdPage( 0, PK_STANDARD );
650 
651 		    pWorkPage->SetRectsDirty();
652 
653             // #120393# Clipboard data uses full object geometry range
654 		    const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
655 
656 		    maDropPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
657 		    maDropPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
658 
659 		    // delete pages, that are not of any interest for us
660 		    for( long i = ( pWorkModel->GetPageCount() - 1 ); i >= 0; i-- )
661 		    {
662 			    SdPage* pP = static_cast< SdPage* >( pWorkModel->GetPage( (sal_uInt16) i ) );
663 
664 			    if( pP->GetPageKind() != PK_STANDARD )
665 				    pWorkModel->DeletePage( (sal_uInt16) i );
666 		    }
667 
668 		    bReturn = Paste( *pWorkModel, maDropPos, pPage, nPasteOptions );
669 
670 		    if( !pPage )
671 			    pPage = (SdPage*) GetSdrPageView()->GetPage();
672 
673 		    String aLayout(pPage->GetLayoutName());
674 		    aLayout.Erase(aLayout.SearchAscii(SD_LT_SEPARATOR));
675 		    pPage->SetPresentationLayout( aLayout, sal_False, sal_False );
676 	   }
677 	}
678 	else if( CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_DRAWING ) )
679 	{
680 		SotStorageStreamRef xStm;
681 
682 		if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xStm ) )
683 		{
684 			sal_Bool bChanged = sal_False;
685 
686             DrawDocShellRef xShell = new DrawDocShell(SFX_CREATE_MODE_INTERNAL);
687             xShell->DoInitNew(0);
688 
689 			SdDrawDocument* pModel = xShell->GetDoc();
690             pModel->InsertPage(pModel->AllocPage(false));
691 
692             Reference< XComponent > xComponent( xShell->GetModel(), UNO_QUERY );
693 			xStm->Seek( 0 );
694 
695 			com::sun::star::uno::Reference< com::sun::star::io::XInputStream > xInputStream( new utl::OInputStreamWrapper( *xStm ) );
696 			bReturn = SvxDrawingLayerImport( pModel, xInputStream, xComponent, "com.sun.star.comp.Impress.XMLOasisImporter" );
697 
698 			if( pModel->GetPageCount() == 0 )
699 			{
700 				DBG_ERROR("empty or invalid drawing xml document on clipboard!" );
701 			}
702 			else
703 			{
704 				if( bReturn )
705 				{
706 					if( pModel->GetSdPage( 0, PK_STANDARD )->GetObjCount() == 1 )
707 					{
708 						// only one object
709 						SdrObject*		pObj = pModel->GetSdPage( 0, PK_STANDARD )->GetObj( 0 );
710 						SdrObject*		pPickObj2 = NULL;
711 						SdrPageView*	pPV = NULL;
712 						PickObj( rPos, getHitTolLog(), pPickObj2, pPV );
713 
714 						if( ( mnAction & DND_ACTION_MOVE ) && pPickObj2 && pObj )
715 						{
716 							// replace object
717 							SdrObject*	pNewObj = pObj->Clone();
718 							Rectangle	aPickObjRect( pPickObj2->GetCurrentBoundRect() );
719 							Size		aPickObjSize( aPickObjRect.GetSize() );
720 							Point		aVec( aPickObjRect.TopLeft() );
721 							Rectangle	aObjRect( pNewObj->GetCurrentBoundRect() );
722 							Size		aObjSize( aObjRect.GetSize() );
723 
724 							Fraction aScaleWidth( aPickObjSize.Width(), aObjSize.Width() );
725 							Fraction aScaleHeight( aPickObjSize.Height(), aObjSize.Height() );
726 							pNewObj->NbcResize( aObjRect.TopLeft(), aScaleWidth, aScaleHeight );
727 
728 							aVec -= aObjRect.TopLeft();
729 							pNewObj->NbcMove( Size( aVec.X(), aVec.Y() ) );
730 
731 							const bool bUndo = IsUndoEnabled();
732 
733 							if( bUndo )
734 								BegUndo( String( SdResId(STR_UNDO_DRAGDROP ) ) );
735 							pNewObj->NbcSetLayer( pPickObj->GetLayer() );
736 							SdrPage* pWorkPage = GetSdrPageView()->GetPage();
737 							pWorkPage->InsertObject( pNewObj );
738 							if( bUndo )
739 							{
740 								AddUndo( mpDoc->GetSdrUndoFactory().CreateUndoNewObject( *pNewObj ) );
741 								AddUndo( mpDoc->GetSdrUndoFactory().CreateUndoDeleteObject( *pPickObj2 ) );
742 							}
743 							pWorkPage->RemoveObject( pPickObj2->GetOrdNum() );
744 
745 							if( bUndo )
746 							{
747 								EndUndo();
748 							}
749 							else
750 							{
751 								SdrObject::Free(pPickObj2 );
752 							}
753 							bChanged = sal_True;
754 							mnAction = DND_ACTION_COPY;
755 						}
756 						else if( ( mnAction & DND_ACTION_LINK ) && pPickObj && pObj && !pPickObj->ISA( SdrGrafObj ) && !pPickObj->ISA( SdrOle2Obj ) )
757 						{
758 							SfxItemSet aSet( mpDoc->GetPool() );
759 
760 							// set new attributes to object
761 							const bool bUndo = IsUndoEnabled();
762 							if( bUndo )
763 							{
764 								BegUndo( String( SdResId( STR_UNDO_DRAGDROP ) ) );
765 								AddUndo( mpDoc->GetSdrUndoFactory().CreateUndoAttrObject( *pPickObj ) );
766 							}
767 							aSet.Put( pObj->GetMergedItemSet() );
768 
769 							// Eckenradius soll nicht uebernommen werden.
770 							// In der Gallery stehen Farbverlauefe (Rechtecke)
771 							// welche den Eckenradius == 0 haben. Dieser soll
772 							// nicht auf das Objekt uebertragen werden.
773 							aSet.ClearItem( SDRATTR_ECKENRADIUS );
774 
775 							pPickObj->SetMergedItemSetAndBroadcast( aSet );
776 
777 							if( pPickObj->ISA( E3dObject ) && pObj->ISA( E3dObject ) )
778 							{
779 								// Zusaetzlich 3D Attribute handeln
780 								SfxItemSet aNewSet( mpDoc->GetPool(), SID_ATTR_3D_START, SID_ATTR_3D_END, 0 );
781 								SfxItemSet aOldSet( mpDoc->GetPool(), SID_ATTR_3D_START, SID_ATTR_3D_END, 0 );
782 
783 								aOldSet.Put(pPickObj->GetMergedItemSet());
784 								aNewSet.Put( pObj->GetMergedItemSet() );
785 
786 								if( bUndo )
787 									AddUndo( new E3dAttributesUndoAction( *mpDoc, this, (E3dObject*) pPickObj, aNewSet, aOldSet, sal_False ) );
788 								pPickObj->SetMergedItemSetAndBroadcast( aNewSet );
789 							}
790 
791 							if( bUndo )
792 								EndUndo();
793 							bChanged = sal_True;
794 						}
795 					}
796 				}
797 
798 				if( !bChanged )
799 				{
800 					SdrPage* pWorkPage = pModel->GetSdPage( 0, PK_STANDARD );
801 
802 					pWorkPage->SetRectsDirty();
803 
804 					if( pOwnData )
805 					{
806                         // #120393# Clipboard data uses full object geometry range
807 						const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
808 
809 						maDropPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
810 						maDropPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
811 					}
812 
813 					bReturn = Paste( *pModel, maDropPos, pPage, nPasteOptions );
814 				}
815 
816                 xShell->DoClose();
817 			}
818 		}
819 	}
820 	else if( CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE ) )
821 	{
822 		::rtl::OUString aOUString;
823 
824 		if( aDataHelper.GetString( SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE, aOUString ) )
825 		{
826 			SdrObject* pObj = CreateFieldControl( aOUString );
827 
828 			if( pObj )
829 			{
830 				Rectangle	aRect( pObj->GetLogicRect() );
831 				Size		aSize( aRect.GetSize() );
832 
833 				maDropPos.X() -= ( aSize.Width() >> 1 );
834 				maDropPos.Y() -= ( aSize.Height() >> 1 );
835 
836 				aRect.SetPos( maDropPos );
837 				pObj->SetLogicRect( aRect );
838 				InsertObjectAtView( pObj, *GetSdrPageView(), SDRINSERT_SETDEFLAYER );
839 				bReturn = sal_True;
840 			}
841 		}
842 	}
843 	else if( !bLink &&
844 			 ( CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_EMBED_SOURCE ) ||
845 			   CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_EMBEDDED_OBJ ) )  &&
846 			   aDataHelper.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) )
847 	{
848         //TODO/LATER: is it possible that this format is binary?! (from old versions of SO)
849         uno::Reference < io::XInputStream > xStm;
850 		TransferableObjectDescriptor	aObjDesc;
851 
852 		if( aDataHelper.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc ) &&
853             ( aDataHelper.GetInputStream( nFormat ? nFormat : SOT_FORMATSTR_ID_EMBED_SOURCE, xStm ) ||
854               aDataHelper.GetInputStream( SOT_FORMATSTR_ID_EMBEDDED_OBJ, xStm ) ) )
855 		{
856 			if( mpDoc->GetDocSh() && ( mpDoc->GetDocSh()->GetClassName() == aObjDesc.maClassName ) )
857 			{
858                 uno::Reference < embed::XStorage > xStore( ::comphelper::OStorageHelper::GetStorageFromInputStream( xStm ) );
859 				::sd::DrawDocShellRef xDocShRef( new ::sd::DrawDocShell( SFX_CREATE_MODE_EMBEDDED, sal_True, mpDoc->GetDocumentType() ) );
860 
861                 // mba: BaseURL doesn't make sense for clipboard functionality
862                 SfxMedium *pMedium = new SfxMedium( xStore, String() );
863                 if( xDocShRef->DoLoad( pMedium ) )
864                 {
865 					SdDrawDocument*	pModel = (SdDrawDocument*) xDocShRef->GetDoc();
866 					SdPage*			pWorkPage = (SdPage*) pModel->GetSdPage( 0, PK_STANDARD );
867 
868 					pWorkPage->SetRectsDirty();
869 
870 					if( pOwnData )
871 					{
872                         // #120393# Clipboard data uses full object geometry range
873 						const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
874 
875 						maDropPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
876 						maDropPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
877 					}
878 
879 					// delete pages, that are not of any interest for us
880 					for( long i = ( pModel->GetPageCount() - 1 ); i >= 0; i-- )
881 					{
882 						SdPage* pP = static_cast< SdPage* >( pModel->GetPage( (sal_uInt16) i ) );
883 
884 						if( pP->GetPageKind() != PK_STANDARD )
885 							pModel->DeletePage( (sal_uInt16) i );
886 					}
887 
888 					bReturn = Paste( *pModel, maDropPos, pPage, nPasteOptions );
889 
890 					if( !pPage )
891 						pPage = (SdPage*) GetSdrPageView()->GetPage();
892 
893 					String aLayout(pPage->GetLayoutName());
894 					aLayout.Erase(aLayout.SearchAscii(SD_LT_SEPARATOR));
895 					pPage->SetPresentationLayout( aLayout, sal_False, sal_False );
896 				}
897 
898 				xDocShRef->DoClose();
899 				xDocShRef.Clear();
900 
901 			}
902 			else
903 			{
904                 ::rtl::OUString aName;
905                 uno::Reference < embed::XEmbeddedObject > xObj = mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
906                 if ( xObj.is() )
907                 {
908 					svt::EmbeddedObjectRef aObjRef( xObj, aObjDesc.mnViewAspect );
909 
910 					// try to get the replacement image from the clipboard
911 					Graphic aGraphic;
912 					sal_uLong nGrFormat = 0;
913 
914 // (wg. Selection Manager bei Trustet Solaris)
915 #ifndef SOLARIS
916 /*
917                     if( aDataHelper.GetGraphic( SOT_FORMATSTR_ID_SVXB, aGraphic ) )
918 						nGrFormat = SOT_FORMATSTR_ID_SVXB;
919 					else if( aDataHelper.GetGraphic( FORMAT_GDIMETAFILE, aGraphic ) )
920 						nGrFormat = SOT_FORMAT_GDIMETAFILE;
921 					else if( aDataHelper.GetGraphic( FORMAT_BITMAP, aGraphic ) )
922 						nGrFormat = SOT_FORMAT_BITMAP;
923 */
924 #endif
925 
926 					// insert replacement image ( if there is one ) into the object helper
927 					if ( nGrFormat )
928 					{
929 						datatransfer::DataFlavor aDataFlavor;
930 						SotExchange::GetFormatDataFlavor( nGrFormat, aDataFlavor );
931 						aObjRef.SetGraphic( aGraphic, aDataFlavor.MimeType );
932 					}
933 
934 					Size aSize;
935 					if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON )
936 					{
937                     	if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
938 							aSize = aObjDesc.maSize;
939 						else
940 						{
941 							MapMode aMapMode( MAP_100TH_MM );
942 							aSize = aObjRef.GetSize( &aMapMode );
943 						}
944 					}
945 					else
946 					{
947                     	awt::Size aSz;
948                     	MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( aObjDesc.mnViewAspect ) );
949                     	if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
950                     	{
951                         	Size aTmp( OutputDevice::LogicToLogic( aObjDesc.maSize, MAP_100TH_MM, aMapUnit ) );
952                         	aSz.Width = aTmp.Width();
953                         	aSz.Height = aTmp.Height();
954                         	xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
955                     	}
956 
957 						try
958 						{
959                     		aSz = xObj->getVisualAreaSize( aObjDesc.mnViewAspect );
960 						}
961 						catch( embed::NoVisualAreaSizeException& )
962 						{
963 							// if the size still was not set the default size will be set later
964 						}
965 
966                     	aSize = Size( aSz.Width, aSz.Height );
967 
968                     	if( !aSize.Width() || !aSize.Height() )
969                     	{
970                         	aSize.Width()  = 14100;
971                         	aSize.Height() = 10000;
972                         	aSize = OutputDevice::LogicToLogic( Size(14100, 10000), MAP_100TH_MM, aMapUnit );
973                         	aSz.Width = aSize.Width();
974                         	aSz.Height = aSize.Height();
975                         	xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
976                     	}
977 
978                     	aSize = OutputDevice::LogicToLogic( aSize, aMapUnit, MAP_100TH_MM );
979 					}
980 
981                     Size aMaxSize( mpDoc->GetMaxObjSize() );
982 
983                     maDropPos.X() -= Min( aSize.Width(), aMaxSize.Width() ) >> 1;
984                     maDropPos.Y() -= Min( aSize.Height(), aMaxSize.Height() ) >> 1;
985 
986                     Rectangle       aRect( maDropPos, aSize );
987                     SdrOle2Obj*     pObj = new SdrOle2Obj( aObjRef, aName, aRect );
988                     SdrPageView*    pPV = GetSdrPageView();
989                     sal_uLong           nOptions = SDRINSERT_SETDEFLAYER;
990 
991                     if (mpViewSh!=NULL)
992                     {
993                         OSL_ASSERT (mpViewSh->GetViewShell()!=NULL);
994                         SfxInPlaceClient* pIpClient
995                             = mpViewSh->GetViewShell()->GetIPClient();
996                         if (pIpClient!=NULL && pIpClient->IsObjectInPlaceActive())
997                             nOptions |= SDRINSERT_DONTMARK;
998                     }
999 
1000                     InsertObjectAtView( pObj, *pPV, nOptions );
1001 
1002                     if( pImageMap )
1003                         pObj->InsertUserData( new SdIMapInfo( *pImageMap ) );
1004 
1005                     if ( pObj && pObj->IsChart() )
1006                     {
1007                         bool bDisableDataTableDialog = false;
1008                         svt::EmbeddedObjectRef::TryRunningState( xObj );
1009                         uno::Reference< beans::XPropertySet > xProps( xObj->getComponent(), uno::UNO_QUERY );
1010                         if ( xProps.is() &&
1011                              ( xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableDataTableDialog" ) ) ) >>= bDisableDataTableDialog ) &&
1012                              bDisableDataTableDialog )
1013                         {
1014                             xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableDataTableDialog" ) ),
1015                                 uno::makeAny( sal_False ) );
1016                             xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableComplexChartTypes" ) ),
1017                                 uno::makeAny( sal_False ) );
1018                             uno::Reference< util::XModifiable > xModifiable( xProps, uno::UNO_QUERY );
1019                             if ( xModifiable.is() )
1020                             {
1021                                 xModifiable->setModified( sal_True );
1022                             }
1023                         }
1024                     }
1025 
1026                     bReturn = sal_True;
1027                 }
1028 			}
1029 		}
1030 	}
1031 	else if( !bLink &&
1032 			 ( CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE ) ||
1033 			   CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE ) ) &&
1034 			   aDataHelper.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR_OLE ) )
1035 	{
1036 		// online insert ole if format is forced or no gdi metafile is available
1037 		if( (nFormat != 0) || !aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) )
1038 		{
1039 			uno::Reference < io::XInputStream > xStm;
1040 			TransferableObjectDescriptor	aObjDesc;
1041 
1042 			if ( aDataHelper.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR_OLE, aObjDesc ) )
1043 			{
1044 				uno::Reference < embed::XEmbeddedObject > xObj;
1045 				::rtl::OUString aName;
1046 
1047 				if ( aDataHelper.GetInputStream( nFormat ? nFormat : SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, xStm ) ||
1048 					aDataHelper.GetInputStream( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, xStm ) )
1049 				{
1050             		xObj = mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
1051 				}
1052 				else
1053 				{
1054 					try
1055 					{
1056 						uno::Reference< embed::XStorage > xTmpStor = ::comphelper::OStorageHelper::GetTemporaryStorage();
1057 						uno::Reference < embed::XEmbedObjectClipboardCreator > xClipboardCreator(
1058 							::comphelper::getProcessServiceFactory()->createInstance(
1059                            		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.MSOLEObjectSystemCreator")) ),
1060 							uno::UNO_QUERY_THROW );
1061 
1062 						embed::InsertedObjectInfo aInfo = xClipboardCreator->createInstanceInitFromClipboard(
1063 																xTmpStor,
1064 																::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "DummyName" ) ),
1065 																uno::Sequence< beans::PropertyValue >() );
1066 
1067 						// TODO/LATER: in future InsertedObjectInfo will be used to get container related information
1068 						// for example whether the object should be an iconified one
1069 						xObj = aInfo.Object;
1070 						if ( xObj.is() )
1071 							mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName );
1072 					}
1073 					catch( uno::Exception& )
1074 					{}
1075 				}
1076 
1077 				if ( xObj.is() )
1078 				{
1079 					svt::EmbeddedObjectRef aObjRef( xObj, aObjDesc.mnViewAspect );
1080 
1081 					// try to get the replacement image from the clipboard
1082 					Graphic aGraphic;
1083 					sal_uLong nGrFormat = 0;
1084 
1085 // (wg. Selection Manager bei Trustet Solaris)
1086 #ifndef SOLARIS
1087                     if( aDataHelper.GetGraphic( SOT_FORMATSTR_ID_SVXB, aGraphic ) )
1088 						nGrFormat = SOT_FORMATSTR_ID_SVXB;
1089 					else if( aDataHelper.GetGraphic( FORMAT_GDIMETAFILE, aGraphic ) )
1090 						nGrFormat = SOT_FORMAT_GDIMETAFILE;
1091 					else if( aDataHelper.GetGraphic( FORMAT_BITMAP, aGraphic ) )
1092 						nGrFormat = SOT_FORMAT_BITMAP;
1093 #endif
1094 
1095 					// insert replacement image ( if there is one ) into the object helper
1096 					if ( nGrFormat )
1097 					{
1098 						datatransfer::DataFlavor aDataFlavor;
1099 						SotExchange::GetFormatDataFlavor( nGrFormat, aDataFlavor );
1100 						aObjRef.SetGraphic( aGraphic, aDataFlavor.MimeType );
1101 					}
1102 
1103 					Size aSize;
1104 					if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON )
1105 					{
1106                     	if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
1107 							aSize = aObjDesc.maSize;
1108 						else
1109 						{
1110 							MapMode aMapMode( MAP_100TH_MM );
1111 							aSize = aObjRef.GetSize( &aMapMode );
1112 						}
1113 					}
1114 					else
1115 					{
1116             			MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( aObjDesc.mnViewAspect ) );
1117 
1118             			awt::Size aSz;
1119 						try{
1120 							aSz = xObj->getVisualAreaSize( aObjDesc.mnViewAspect );
1121 						}
1122 						catch( embed::NoVisualAreaSizeException& )
1123 						{
1124 							// the default size will be set later
1125 						}
1126 
1127             			if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
1128             			{
1129                 			Size aTmp( OutputDevice::LogicToLogic( aObjDesc.maSize, MAP_100TH_MM, aMapUnit ) );
1130 							if ( aSz.Width != aTmp.Width() || aSz.Height != aTmp.Height() )
1131 							{
1132                 				aSz.Width = aTmp.Width();
1133                 				aSz.Height = aTmp.Height();
1134                 				xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
1135 							}
1136             			}
1137 
1138             			aSize = Size( aSz.Width, aSz.Height );
1139 
1140             			if( !aSize.Width() || !aSize.Height() )
1141             			{
1142                 			aSize = OutputDevice::LogicToLogic( Size(14100, 10000), MAP_100TH_MM, aMapUnit );
1143                 			aSz.Width = aSize.Width();
1144                 			aSz.Height = aSize.Height();
1145                 			xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
1146             			}
1147 
1148             			aSize = OutputDevice::LogicToLogic( aSize, aMapUnit, MAP_100TH_MM );
1149 					}
1150 
1151             		Size aMaxSize( mpDoc->GetMaxObjSize() );
1152 
1153             		maDropPos.X() -= Min( aSize.Width(), aMaxSize.Width() ) >> 1;
1154             		maDropPos.Y() -= Min( aSize.Height(), aMaxSize.Height() ) >> 1;
1155 
1156             		Rectangle       aRect( maDropPos, aSize );
1157             		SdrOle2Obj*     pObj = new SdrOle2Obj( aObjRef, aName, aRect );
1158             		SdrPageView*    pPV = GetSdrPageView();
1159             		sal_uLong           nOptions = SDRINSERT_SETDEFLAYER;
1160 
1161             		if (mpViewSh!=NULL)
1162             		{
1163                 		OSL_ASSERT (mpViewSh->GetViewShell()!=NULL);
1164                 		SfxInPlaceClient* pIpClient
1165                     		= mpViewSh->GetViewShell()->GetIPClient();
1166                 		if (pIpClient!=NULL && pIpClient->IsObjectInPlaceActive())
1167                     		nOptions |= SDRINSERT_DONTMARK;
1168             		}
1169 
1170             		InsertObjectAtView( pObj, *pPV, nOptions );
1171 
1172             		if( pImageMap )
1173                 		pObj->InsertUserData( new SdIMapInfo( *pImageMap ) );
1174 
1175 					// let the object stay in loaded state after insertion
1176 					pObj->Unload();
1177             		bReturn = sal_True;
1178 				}
1179 			}
1180 		}
1181 
1182 		if( !bReturn && aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) )
1183 		{
1184 			// if no object was inserted, insert a picture
1185 			InsertMetaFile( aDataHelper, rPos, pImageMap, true );
1186 		}
1187 	}
1188 	else if( ( !bLink || pPickObj ) && CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_SVXB ) )
1189 	{
1190 		SotStorageStreamRef xStm;
1191 
1192 		if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_SVXB, xStm ) )
1193 		{
1194 			Point   aInsertPos( rPos );
1195 			Graphic aGraphic;
1196 
1197 			*xStm >> aGraphic;
1198 
1199 			if( pOwnData && pOwnData->GetWorkDocument() )
1200 			{
1201 		        const SdDrawDocument*	pWorkModel = pOwnData->GetWorkDocument();
1202                 SdrPage*	            pWorkPage = (SdrPage*) ( ( pWorkModel->GetPageCount() > 1 ) ?
1203                                                     pWorkModel->GetSdPage( 0, PK_STANDARD ) :
1204                                                     pWorkModel->GetPage( 0 ) );
1205 
1206 				pWorkPage->SetRectsDirty();
1207 
1208                 // #120393# Clipboard data uses full object geometry range
1209 				const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
1210 
1211 				aInsertPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
1212 				aInsertPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
1213 			}
1214 
1215 			// #90129# restrict movement to WorkArea
1216 			Size aImageMapSize = OutputDevice::LogicToLogic(aGraphic.GetPrefSize(),
1217 				aGraphic.GetPrefMapMode(), MapMode(MAP_100TH_MM));
1218 
1219 			ImpCheckInsertPos(aInsertPos, aImageMapSize, GetWorkArea());
1220 
1221 			InsertGraphic( aGraphic, mnAction, aInsertPos, NULL, pImageMap );
1222 			bReturn = sal_True;
1223 		}
1224 	}
1225 	else if( ( !bLink || pPickObj ) && CHECK_FORMAT_TRANS( FORMAT_GDIMETAFILE ) )
1226 	{
1227 		Point aInsertPos( rPos );
1228 
1229 		if( pOwnData && pOwnData->GetWorkDocument() )
1230 
1231 		{
1232 			const SdDrawDocument*	pWorkModel = pOwnData->GetWorkDocument();
1233             SdrPage*	            pWorkPage = (SdrPage*) ( ( pWorkModel->GetPageCount() > 1 ) ?
1234                                                 pWorkModel->GetSdPage( 0, PK_STANDARD ) :
1235                                                 pWorkModel->GetPage( 0 ) );
1236 
1237 			pWorkPage->SetRectsDirty();
1238 
1239             // #120393# Clipboard data uses full object geometry range
1240 			const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
1241 
1242 			aInsertPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
1243 			aInsertPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
1244 		}
1245 
1246 		bReturn = InsertMetaFile( aDataHelper, aInsertPos, pImageMap, nFormat == 0 ? true : false ) ? sal_True : sal_False;
1247 	}
1248 	else if( ( !bLink || pPickObj ) && CHECK_FORMAT_TRANS( FORMAT_BITMAP ) )
1249 	{
1250 		Bitmap aBmp;
1251 
1252 		if( aDataHelper.GetBitmap( FORMAT_BITMAP, aBmp ) )
1253 		{
1254 			Point aInsertPos( rPos );
1255 
1256 			if( pOwnData && pOwnData->GetWorkDocument() )
1257 			{
1258 			    const SdDrawDocument*	pWorkModel = pOwnData->GetWorkDocument();
1259                 SdrPage*	            pWorkPage = (SdrPage*) ( ( pWorkModel->GetPageCount() > 1 ) ?
1260                                                     pWorkModel->GetSdPage( 0, PK_STANDARD ) :
1261                                                     pWorkModel->GetPage( 0 ) );
1262 
1263 				pWorkPage->SetRectsDirty();
1264 
1265                 // #120393# Clipboard data uses full object geometry range
1266 				const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
1267 
1268 				aInsertPos.X() = pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 );
1269 				aInsertPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 );
1270 			}
1271 
1272 			// #90129# restrict movement to WorkArea
1273 			Size aImageMapSize(aBmp.GetPrefSize());
1274 			ImpCheckInsertPos(aInsertPos, aImageMapSize, GetWorkArea());
1275 
1276 			InsertGraphic( aBmp, mnAction, aInsertPos, NULL, pImageMap );
1277 			bReturn = sal_True;
1278 		}
1279 	}
1280 	else if( pPickObj && CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_XFA ) )
1281 	{
1282 		SotStorageStreamRef xStm;
1283 
1284 		if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_XFA, xStm ) )
1285 		{
1286 			XFillExchangeData aFillData( XFillAttrSetItem( &mpDoc->GetPool() ) );
1287 
1288 			*xStm >> aFillData;
1289 
1290 			if( IsUndoEnabled() )
1291 			{
1292 				BegUndo( String( SdResId( STR_UNDO_DRAGDROP ) ) );
1293 				AddUndo( GetModel()->GetSdrUndoFactory().CreateUndoAttrObject( *pPickObj ) );
1294 				EndUndo();
1295 			}
1296 
1297 			XFillAttrSetItem*	pSetItem = aFillData.GetXFillAttrSetItem();
1298 			SfxItemSet			rSet = pSetItem->GetItemSet();
1299 			XFillStyle			eFill= ( (XFillStyleItem&) rSet.Get( XATTR_FILLSTYLE ) ).GetValue();
1300 
1301 			if( eFill == XFILL_SOLID || eFill == XFILL_NONE )
1302 			{
1303 				const XFillColorItem&	rColItem = (XFillColorItem&) rSet.Get( XATTR_FILLCOLOR );
1304 				Color					aColor( rColItem.GetColorValue() );
1305 				String					aName( rColItem.GetName() );
1306 				SfxItemSet				aSet( mpDoc->GetPool() );
1307 				sal_Bool					bClosed = pPickObj->IsClosedObj();
1308 				::sd::Window* pWin = mpViewSh->GetActiveWindow();
1309 				sal_uInt16 nHitLog = (sal_uInt16) pWin->PixelToLogic(
1310                     Size(FuPoor::HITPIX, 0 ) ).Width();
1311 				const long				n2HitLog = nHitLog << 1;
1312 				Point					aHitPosR( rPos );
1313 				Point					aHitPosL( rPos );
1314 				Point					aHitPosT( rPos );
1315 				Point					aHitPosB( rPos );
1316 				const SetOfByte*		pVisiLayer = &GetSdrPageView()->GetVisibleLayers();
1317 
1318 				aHitPosR.X() += n2HitLog;
1319 				aHitPosL.X() -= n2HitLog;
1320 				aHitPosT.Y() += n2HitLog;
1321 				aHitPosB.Y() -= n2HitLog;
1322 
1323 				if( bClosed &&
1324 					SdrObjectPrimitiveHit(*pPickObj, aHitPosR, nHitLog, *GetSdrPageView(), pVisiLayer, false) &&
1325 					SdrObjectPrimitiveHit(*pPickObj, aHitPosL, nHitLog, *GetSdrPageView(), pVisiLayer, false) &&
1326 					SdrObjectPrimitiveHit(*pPickObj, aHitPosT, nHitLog, *GetSdrPageView(), pVisiLayer, false) &&
1327 					SdrObjectPrimitiveHit(*pPickObj, aHitPosB, nHitLog, *GetSdrPageView(), pVisiLayer, false) )
1328 				{
1329 					// area fill
1330 					if(eFill == XFILL_SOLID )
1331 						aSet.Put(XFillColorItem(aName, aColor));
1332 
1333 					aSet.Put( XFillStyleItem( eFill ) );
1334 				}
1335 				else
1336 					aSet.Put( XLineColorItem( aName, aColor ) );
1337 
1338 				// Textfarbe hinzufuegen
1339 				pPickObj->SetMergedItemSetAndBroadcast( aSet );
1340 			}
1341 		}
1342 	}
1343 	else if( !bLink && CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_HTML ) )
1344 	{
1345 		SotStorageStreamRef xStm;
1346 
1347 		if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_HTML, xStm ) )
1348 		{
1349 			xStm->Seek( 0 );
1350             // mba: clipboard always must contain absolute URLs (could be from alien source)
1351             bReturn = SdrView::Paste( *xStm, String(), EE_FORMAT_HTML, maDropPos, pPage, nPasteOptions );
1352 		}
1353 	}
1354 	else if( !bLink && CHECK_FORMAT_TRANS( SOT_FORMATSTR_ID_EDITENGINE ) )
1355 	{
1356 		SotStorageStreamRef xStm;
1357 
1358 		if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_EDITENGINE, xStm ) )
1359 		{
1360 			OutlinerView* pOLV = GetTextEditOutlinerView();
1361 
1362             xStm->Seek( 0 );
1363 
1364 			if( pOLV )
1365 			{
1366 				Rectangle   aRect( pOLV->GetOutputArea() );
1367    				Point       aPos( pOLV->GetWindow()->PixelToLogic( maDropPos ) );
1368 
1369 				if( aRect.IsInside( aPos ) || ( !bDrag && IsTextEdit() ) )
1370 				{
1371                     // mba: clipboard always must contain absolute URLs (could be from alien source)
1372                     pOLV->Read( *xStm, String(), EE_FORMAT_BIN, sal_False, mpDocSh->GetHeaderAttributes() );
1373 					bReturn = sal_True;
1374 				}
1375 			}
1376 
1377 			if( !bReturn )
1378                 // mba: clipboard always must contain absolute URLs (could be from alien source)
1379                 bReturn = SdrView::Paste( *xStm, String(), EE_FORMAT_BIN, maDropPos, pPage, nPasteOptions );
1380 		}
1381 	}
1382 	else if( !bLink && CHECK_FORMAT_TRANS( FORMAT_RTF ) )
1383 	{
1384 		SotStorageStreamRef xStm;
1385 
1386 		if( aDataHelper.GetSotStorageStream( FORMAT_RTF, xStm ) )
1387 		{
1388             xStm->Seek( 0 );
1389 
1390 			if( bTable )
1391 			{
1392 				bReturn = PasteRTFTable( xStm, pPage, nPasteOptions );
1393 			}
1394 			else
1395 			{
1396 				OutlinerView* pOLV = GetTextEditOutlinerView();
1397 
1398 				if( pOLV )
1399 				{
1400 					Rectangle   aRect( pOLV->GetOutputArea() );
1401    					Point       aPos( pOLV->GetWindow()->PixelToLogic( maDropPos ) );
1402 
1403 					if( aRect.IsInside( aPos ) || ( !bDrag && IsTextEdit() ) )
1404 					{
1405 						// mba: clipboard always must contain absolute URLs (could be from alien source)
1406 						pOLV->Read( *xStm, String(), EE_FORMAT_RTF, sal_False, mpDocSh->GetHeaderAttributes() );
1407 						bReturn = sal_True;
1408 					}
1409 				}
1410 
1411 				if( !bReturn )
1412 					// mba: clipboard always must contain absolute URLs (could be from alien source)
1413 					bReturn = SdrView::Paste( *xStm, String(), EE_FORMAT_RTF, maDropPos, pPage, nPasteOptions );
1414 			}
1415 		}
1416 	}
1417 	else if( CHECK_FORMAT_TRANS( FORMAT_FILE_LIST ) )
1418 	{
1419         FileList aDropFileList;
1420 
1421         if( aDataHelper.GetFileList( FORMAT_FILE_LIST, aDropFileList ) )
1422         {
1423             maDropFileVector.clear();
1424 
1425             for( sal_uLong i = 0, nCount = aDropFileList.Count(); i < nCount; i++ )
1426                 maDropFileVector.push_back( aDropFileList.GetFile( i ) );
1427 
1428             maDropInsertFileTimer.Start();
1429         }
1430 
1431 		bReturn = sal_True;
1432 	}
1433 	else if( CHECK_FORMAT_TRANS( FORMAT_FILE ) )
1434 	{
1435         String aDropFile;
1436 
1437         if( aDataHelper.GetString( FORMAT_FILE, aDropFile ) )
1438         {
1439             maDropFileVector.clear();
1440             maDropFileVector.push_back( aDropFile );
1441 			maDropInsertFileTimer.Start();
1442         }
1443 
1444 		bReturn = sal_True;
1445 	}
1446 	else if( !bLink && CHECK_FORMAT_TRANS( FORMAT_STRING ) )
1447 	{
1448 		if( ( FORMAT_STRING == nFormat ) ||
1449             ( !aDataHelper.HasFormat( SOT_FORMATSTR_ID_SOLK ) &&
1450 			  !aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) &&
1451 			  !aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILENAME ) ) )
1452 		{
1453 			::rtl::OUString aOUString;
1454 
1455 			if( aDataHelper.GetString( FORMAT_STRING, aOUString ) )
1456 			{
1457 				OutlinerView* pOLV = GetTextEditOutlinerView();
1458 
1459 				if( pOLV )
1460 				{
1461 					pOLV->InsertText( aOUString );
1462 					bReturn = sal_True;
1463 				}
1464 
1465                 if( !bReturn )
1466                     bReturn = SdrView::Paste( aOUString, maDropPos, pPage, nPasteOptions );
1467 			}
1468 		}
1469 	}
1470 
1471 	MarkListHasChanged();
1472 	mbIsDropAllowed = sal_True;
1473 	rDnDAction = mnAction;
1474 	delete pImageMap;
1475 
1476 	return bReturn;
1477 }
1478 
1479 extern void CreateTableFromRTF( SvStream& rStream, SdDrawDocument* pModel  );
1480 
1481 bool View::PasteRTFTable( SotStorageStreamRef xStm, SdrPage* pPage, sal_uLong nPasteOptions )
1482 {
1483 	SdDrawDocument* pModel = new SdDrawDocument( DOCUMENT_TYPE_IMPRESS, mpDocSh );
1484 	pModel->NewOrLoadCompleted(NEW_DOC);
1485 	pModel->GetItemPool().SetDefaultMetric(SFX_MAPUNIT_100TH_MM);
1486 	pModel->InsertPage(pModel->AllocPage(false));
1487 
1488 	Reference< XComponent > xComponent( new SdXImpressDocument( pModel, sal_True ) );
1489 	pModel->setUnoModel( Reference< XInterface >::query( xComponent ) );
1490 
1491 	CreateTableFromRTF( *xStm, pModel );
1492 	bool bRet = Paste( *pModel, maDropPos, pPage, nPasteOptions );
1493 
1494 	xComponent->dispose();
1495 	xComponent.clear();
1496 
1497 	delete pModel;
1498 
1499 	return bRet;
1500 }
1501 
1502 } // end of namespace sd
1503