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