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