xref: /trunk/main/sc/source/ui/view/viewfun7.cxx (revision fe9b7f6a5f0c378e0c911bf69d0633ad596c6f08)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_sc.hxx"
24cdf0e10cSrcweir #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <svx/svditer.hxx>
29cdf0e10cSrcweir #include <svx/svdograf.hxx>
30cdf0e10cSrcweir #include <svx/svdoole2.hxx>
31cdf0e10cSrcweir #include <svx/svdouno.hxx>
32cdf0e10cSrcweir #include <svx/svdpage.hxx>
33cdf0e10cSrcweir #include <svx/svdpagv.hxx>
34cdf0e10cSrcweir #include <svx/svdundo.hxx>
35cdf0e10cSrcweir #include <svx/xbtmpit.hxx>
36cdf0e10cSrcweir #include <svx/xoutbmp.hxx>
37cdf0e10cSrcweir #include <sfx2/objsh.hxx>
38cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
39cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
40cdf0e10cSrcweir #include <com/sun/star/embed/Aspects.hpp>
41cdf0e10cSrcweir 
42*fe9b7f6aSmseidel #include "document.hxx" // für MapMode Initialisierung in PasteDraw
43cdf0e10cSrcweir #include "viewfunc.hxx"
44cdf0e10cSrcweir #include "tabvwsh.hxx"
45cdf0e10cSrcweir #include "drawview.hxx"
46cdf0e10cSrcweir #include "scmod.hxx"
47cdf0e10cSrcweir #include "drwlayer.hxx"
48cdf0e10cSrcweir #include "drwtrans.hxx"
49cdf0e10cSrcweir #include "globstr.hrc"
50cdf0e10cSrcweir #include "chartlis.hxx"
51cdf0e10cSrcweir #include "docuno.hxx"
52cdf0e10cSrcweir #include "docsh.hxx"
53cdf0e10cSrcweir #include "convuno.hxx"
54cdf0e10cSrcweir 
55cdf0e10cSrcweir extern Point aDragStartDiff;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
58cdf0e10cSrcweir 
59cdf0e10cSrcweir sal_Bool bPasteIsMove = sal_False;
60cdf0e10cSrcweir 
61cdf0e10cSrcweir using namespace com::sun::star;
62cdf0e10cSrcweir 
63cdf0e10cSrcweir //==================================================================
64cdf0e10cSrcweir 
lcl_AdjustInsertPos(ScViewData * pData,Point & rPos,Size & rSize)65cdf0e10cSrcweir void lcl_AdjustInsertPos( ScViewData* pData, Point& rPos, Size& rSize )
66cdf0e10cSrcweir {
67cdf0e10cSrcweir //  SdrPage* pPage = pData->GetDocument()->GetDrawLayer()->GetPage( pData->GetTabNo() );
68cdf0e10cSrcweir     SdrPage* pPage = pData->GetScDrawView()->GetModel()->GetPage( static_cast<sal_uInt16>(pData->GetTabNo()) );
69cdf0e10cSrcweir     DBG_ASSERT(pPage,"pPage ???");
70cdf0e10cSrcweir     Size aPgSize( pPage->GetSize() );
71cdf0e10cSrcweir     if (aPgSize.Width() < 0)
72cdf0e10cSrcweir         aPgSize.Width() = -aPgSize.Width();
73cdf0e10cSrcweir     long x = aPgSize.Width() - rPos.X() - rSize.Width();
74cdf0e10cSrcweir     long y = aPgSize.Height() - rPos.Y() - rSize.Height();
75cdf0e10cSrcweir     // ggf. Ajustments (80/200) fuer Pixel-Rundungsfehler
76cdf0e10cSrcweir     if( x < 0 )
77cdf0e10cSrcweir         rPos.X() += x + 80;
78cdf0e10cSrcweir     if( y < 0 )
79cdf0e10cSrcweir         rPos.Y() += y + 200;
80cdf0e10cSrcweir     rPos.X() += rSize.Width() / 2; // Position bei Paste gibt Mittelpunkt an
81cdf0e10cSrcweir     rPos.Y() += rSize.Height() / 2;
82cdf0e10cSrcweir }
83cdf0e10cSrcweir 
PasteDraw(const Point & rLogicPos,SdrModel * pModel,sal_Bool bGroup,sal_Bool bSameDocClipboard)84cdf0e10cSrcweir void ScViewFunc::PasteDraw( const Point& rLogicPos, SdrModel* pModel,
85cdf0e10cSrcweir         sal_Bool bGroup, sal_Bool bSameDocClipboard )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir     MakeDrawLayer();
88cdf0e10cSrcweir     Point aPos( rLogicPos );
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     //  #64184# MapMode am Outliner-RefDevice muss stimmen (wie in FuText::MakeOutliner)
91cdf0e10cSrcweir     //! mit FuText::MakeOutliner zusammenfassen?
92cdf0e10cSrcweir     MapMode aOldMapMode;
93cdf0e10cSrcweir     OutputDevice* pRef = GetViewData()->GetDocument()->GetDrawLayer()->GetRefDevice();
94cdf0e10cSrcweir     if (pRef)
95cdf0e10cSrcweir     {
96cdf0e10cSrcweir         aOldMapMode = pRef->GetMapMode();
97cdf0e10cSrcweir         pRef->SetMapMode( MapMode(MAP_100TH_MM) );
98cdf0e10cSrcweir     }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir     sal_Bool bNegativePage = GetViewData()->GetDocument()->IsNegativePage( GetViewData()->GetTabNo() );
101cdf0e10cSrcweir 
102cdf0e10cSrcweir     SdrView* pDragEditView = NULL;
103cdf0e10cSrcweir     ScModule* pScMod = SC_MOD();
104cdf0e10cSrcweir     const ScDragData& rData = pScMod->GetDragData();
105cdf0e10cSrcweir     ScDrawTransferObj* pDrawTrans = rData.pDrawTransfer;
106cdf0e10cSrcweir     if (pDrawTrans)
107cdf0e10cSrcweir     {
108cdf0e10cSrcweir         pDragEditView = pDrawTrans->GetDragSourceView();
109cdf0e10cSrcweir 
110cdf0e10cSrcweir         aPos -= aDragStartDiff;
111cdf0e10cSrcweir         if ( bNegativePage )
112cdf0e10cSrcweir         {
113cdf0e10cSrcweir             if (aPos.X() > 0) aPos.X() = 0;
114cdf0e10cSrcweir         }
115cdf0e10cSrcweir         else
116cdf0e10cSrcweir         {
117cdf0e10cSrcweir             if (aPos.X() < 0) aPos.X() = 0;
118cdf0e10cSrcweir         }
119cdf0e10cSrcweir         if (aPos.Y() < 0) aPos.Y() = 0;
120cdf0e10cSrcweir     }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     ScDrawView* pScDrawView = GetScDrawView();
123cdf0e10cSrcweir     if (bGroup)
124cdf0e10cSrcweir         pScDrawView->BegUndo( ScGlobal::GetRscString( STR_UNDO_PASTE ) );
125cdf0e10cSrcweir 
126cdf0e10cSrcweir     sal_Bool bSameDoc = ( pDragEditView && pDragEditView->GetModel() == pScDrawView->GetModel() );
127cdf0e10cSrcweir     if (bSameDoc)
128cdf0e10cSrcweir     {
129cdf0e10cSrcweir             // lokal kopieren - incl. Charts
130cdf0e10cSrcweir 
131cdf0e10cSrcweir         Point aSourceStart = pDragEditView->GetAllMarkedRect().TopLeft();
132cdf0e10cSrcweir         long nDiffX = aPos.X() - aSourceStart.X();
133cdf0e10cSrcweir         long nDiffY = aPos.Y() - aSourceStart.Y();
134cdf0e10cSrcweir 
135cdf0e10cSrcweir             // innerhalb einer Page verschieben?
136cdf0e10cSrcweir 
137cdf0e10cSrcweir         if ( bPasteIsMove &&
138cdf0e10cSrcweir                 pScDrawView->GetSdrPageView()->GetPage() ==
139cdf0e10cSrcweir                 pDragEditView->GetSdrPageView()->GetPage() )
140cdf0e10cSrcweir         {
141cdf0e10cSrcweir             if ( nDiffX != 0 || nDiffY != 0 )
142cdf0e10cSrcweir                 pDragEditView->MoveAllMarked(Size(nDiffX,nDiffY), sal_False);
143cdf0e10cSrcweir         }
144cdf0e10cSrcweir         else
145cdf0e10cSrcweir         {
146cdf0e10cSrcweir             SdrModel* pDrawModel = pDragEditView->GetModel();
147cdf0e10cSrcweir             SCTAB nTab = GetViewData()->GetTabNo();
148cdf0e10cSrcweir             SdrPage* pDestPage = pDrawModel->GetPage( static_cast< sal_uInt16 >( nTab ) );
149cdf0e10cSrcweir             DBG_ASSERT(pDestPage,"nanu, Page?");
150cdf0e10cSrcweir 
151cdf0e10cSrcweir             ::std::vector< ::rtl::OUString > aExcludedChartNames;
152cdf0e10cSrcweir             if ( pDestPage )
153cdf0e10cSrcweir             {
154cdf0e10cSrcweir                 ScChartHelper::GetChartNames( aExcludedChartNames, pDestPage );
155cdf0e10cSrcweir             }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir             SdrMarkList aMark = pDragEditView->GetMarkedObjectList();
158cdf0e10cSrcweir             aMark.ForceSort();
159cdf0e10cSrcweir             sal_uLong nMarkAnz=aMark.GetMarkCount();
160cdf0e10cSrcweir             for (sal_uLong nm=0; nm<nMarkAnz; nm++) {
161cdf0e10cSrcweir                 const SdrMark* pM=aMark.GetMark(nm);
162cdf0e10cSrcweir                 const SdrObject* pObj=pM->GetMarkedSdrObj();
163cdf0e10cSrcweir 
164cdf0e10cSrcweir                 // #116235#
165*fe9b7f6aSmseidel                 SdrObject* pNewObj=pObj->Clone();
166*fe9b7f6aSmseidel                 //SdrObject* pNewObj=pObj->Clone(pDestPage,pDrawModel);
167cdf0e10cSrcweir 
168*fe9b7f6aSmseidel                 if (pNewObj!=NULL)
169cdf0e10cSrcweir                 {
170*fe9b7f6aSmseidel                     pNewObj->SetModel(pDrawModel);
171*fe9b7f6aSmseidel                     pNewObj->SetPage(pDestPage);
172cdf0e10cSrcweir 
173cdf0e10cSrcweir                     //  #68787# copy graphics within the same model - always needs new name
174*fe9b7f6aSmseidel                     if ( pNewObj->ISA(SdrGrafObj) && !bPasteIsMove )
175*fe9b7f6aSmseidel                         pNewObj->SetName(((ScDrawLayer*)pDrawModel)->GetNewGraphicName());
176cdf0e10cSrcweir 
177cdf0e10cSrcweir                     if (nDiffX!=0 || nDiffY!=0)
178*fe9b7f6aSmseidel                         pNewObj->NbcMove(Size(nDiffX,nDiffY));
179*fe9b7f6aSmseidel                     pDestPage->InsertObject( pNewObj );
180*fe9b7f6aSmseidel                     pScDrawView->AddUndo(new SdrUndoInsertObj( *pNewObj ));
181cdf0e10cSrcweir 
182cdf0e10cSrcweir                     //  Chart braucht nicht mehr getrennt behandelt zu werden,
183cdf0e10cSrcweir                     //  weil es seine Daten jetzt selber hat
184cdf0e10cSrcweir                 }
185cdf0e10cSrcweir             }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir             if (bPasteIsMove)
188cdf0e10cSrcweir                 pDragEditView->DeleteMarked();
189cdf0e10cSrcweir 
190cdf0e10cSrcweir             ScDocument* pDocument = GetViewData()->GetDocument();
191cdf0e10cSrcweir             ScDocShell* pDocShell = GetViewData()->GetDocShell();
192cdf0e10cSrcweir             ScModelObj* pModelObj = ( pDocShell ? ScModelObj::getImplementation( pDocShell->GetModel() ) : NULL );
193cdf0e10cSrcweir             if ( pDocument && pDestPage && pModelObj && pDrawTrans )
194cdf0e10cSrcweir             {
195cdf0e10cSrcweir                 const ScRangeListVector& rProtectedChartRangesVector( pDrawTrans->GetProtectedChartRangesVector() );
196cdf0e10cSrcweir                 ScChartHelper::CreateProtectedChartListenersAndNotify( pDocument, pDestPage, pModelObj, nTab,
197cdf0e10cSrcweir                     rProtectedChartRangesVector, aExcludedChartNames, bSameDoc );
198cdf0e10cSrcweir             }
199cdf0e10cSrcweir         }
200cdf0e10cSrcweir     }
201cdf0e10cSrcweir     else
202cdf0e10cSrcweir     {
203cdf0e10cSrcweir         bPasteIsMove = sal_False; // kein internes Verschieben passiert
204cdf0e10cSrcweir 
205cdf0e10cSrcweir         SdrView aView(pModel); // #i71529# never create a base class of SdrView directly!
206cdf0e10cSrcweir         SdrPageView* pPv = aView.ShowSdrPage(aView.GetModel()->GetPage(0));
207cdf0e10cSrcweir         aView.MarkAllObj(pPv);
208cdf0e10cSrcweir         Size aSize = aView.GetAllMarkedRect().GetSize();
209cdf0e10cSrcweir         lcl_AdjustInsertPos( GetViewData(), aPos, aSize );
210cdf0e10cSrcweir 
211*fe9b7f6aSmseidel         //  #41333# Markierung nicht ändern, wenn Ole-Objekt aktiv
212*fe9b7f6aSmseidel         //  (bei Drop aus OLE-Objekt würde sonst mitten im ExecuteDrag deaktiviert!)
213cdf0e10cSrcweir 
214cdf0e10cSrcweir         sal_uLong nOptions = 0;
215cdf0e10cSrcweir         SfxInPlaceClient* pClient = GetViewData()->GetViewShell()->GetIPClient();
216cdf0e10cSrcweir         if ( pClient && pClient->IsObjectInPlaceActive() )
217cdf0e10cSrcweir             nOptions |= SDRINSERT_DONTMARK;
218cdf0e10cSrcweir 
219cdf0e10cSrcweir         ::std::vector< ::rtl::OUString > aExcludedChartNames;
220cdf0e10cSrcweir         SCTAB nTab = GetViewData()->GetTabNo();
221cdf0e10cSrcweir         SdrPage* pPage = pScDrawView->GetModel()->GetPage( static_cast< sal_uInt16 >( nTab ) );
222cdf0e10cSrcweir         DBG_ASSERT( pPage, "Page?" );
223cdf0e10cSrcweir         if ( pPage )
224cdf0e10cSrcweir         {
225cdf0e10cSrcweir             ScChartHelper::GetChartNames( aExcludedChartNames, pPage );
226cdf0e10cSrcweir         }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir         // #89247# Set flag for ScDocument::UpdateChartListeners() which is
229cdf0e10cSrcweir         // called during paste.
230cdf0e10cSrcweir         if ( !bSameDocClipboard )
231cdf0e10cSrcweir             GetViewData()->GetDocument()->SetPastingDrawFromOtherDoc( sal_True );
232cdf0e10cSrcweir 
233cdf0e10cSrcweir         pScDrawView->Paste( *pModel, aPos, NULL, nOptions );
234cdf0e10cSrcweir 
235cdf0e10cSrcweir         if ( !bSameDocClipboard )
236cdf0e10cSrcweir             GetViewData()->GetDocument()->SetPastingDrawFromOtherDoc( sal_False );
237cdf0e10cSrcweir 
238cdf0e10cSrcweir         // #68991# Paste puts all objects on the active (front) layer
239cdf0e10cSrcweir         // controls must be on SC_LAYER_CONTROLS
240cdf0e10cSrcweir         if (pPage)
241cdf0e10cSrcweir         {
242cdf0e10cSrcweir             SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
243cdf0e10cSrcweir             SdrObject* pObject = aIter.Next();
244cdf0e10cSrcweir             while (pObject)
245cdf0e10cSrcweir             {
246cdf0e10cSrcweir                 if ( pObject->ISA(SdrUnoObj) && pObject->GetLayer() != SC_LAYER_CONTROLS )
247cdf0e10cSrcweir                     pObject->NbcSetLayer(SC_LAYER_CONTROLS);
248cdf0e10cSrcweir                 pObject = aIter.Next();
249cdf0e10cSrcweir             }
250cdf0e10cSrcweir         }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir         // #75299# all graphics objects must have names
253cdf0e10cSrcweir         GetViewData()->GetDocument()->EnsureGraphicNames();
254cdf0e10cSrcweir 
255cdf0e10cSrcweir         ScDocument* pDocument = GetViewData()->GetDocument();
256cdf0e10cSrcweir         ScDocShell* pDocShell = GetViewData()->GetDocShell();
257cdf0e10cSrcweir         ScModelObj* pModelObj = ( pDocShell ? ScModelObj::getImplementation( pDocShell->GetModel() ) : NULL );
258cdf0e10cSrcweir         ScDrawTransferObj* pTransferObj = ScDrawTransferObj::GetOwnClipboard( NULL );
259cdf0e10cSrcweir         if ( pDocument && pPage && pModelObj && ( pTransferObj || pDrawTrans ) )
260cdf0e10cSrcweir         {
261cdf0e10cSrcweir             const ScRangeListVector& rProtectedChartRangesVector(
262cdf0e10cSrcweir                 pTransferObj ? pTransferObj->GetProtectedChartRangesVector() : pDrawTrans->GetProtectedChartRangesVector() );
263cdf0e10cSrcweir             ScChartHelper::CreateProtectedChartListenersAndNotify( pDocument, pPage, pModelObj, nTab,
264cdf0e10cSrcweir                 rProtectedChartRangesVector, aExcludedChartNames, bSameDocClipboard );
265cdf0e10cSrcweir         }
266cdf0e10cSrcweir     }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     if (bGroup)
269cdf0e10cSrcweir     {
270cdf0e10cSrcweir         pScDrawView->GroupMarked();
271cdf0e10cSrcweir         pScDrawView->EndUndo();
272cdf0e10cSrcweir     }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     if (pRef)
275cdf0e10cSrcweir         pRef->SetMapMode( aOldMapMode );
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     // GetViewData()->GetViewShell()->SetDrawShell( sal_True );
278cdf0e10cSrcweir     // #99759# It is not sufficient to just set the DrawShell if we pasted, for
279cdf0e10cSrcweir     // example, a chart. SetDrawShellOrSub() would only work for D&D in the
280cdf0e10cSrcweir     // same document but not if inserting from the clipboard, therefore
281cdf0e10cSrcweir     // MarkListHasChanged() is what we need.
282cdf0e10cSrcweir     pScDrawView->MarkListHasChanged();
283cdf0e10cSrcweir 
284cdf0e10cSrcweir }
285cdf0e10cSrcweir 
PasteObject(const Point & rPos,const uno::Reference<embed::XEmbeddedObject> & xObj,const Size * pDescSize,const Graphic * pReplGraph,const::rtl::OUString & aMediaType,sal_Int64 nAspect)286cdf0e10cSrcweir sal_Bool ScViewFunc::PasteObject( const Point& rPos, const uno::Reference < embed::XEmbeddedObject >& xObj,
287cdf0e10cSrcweir                                 const Size* pDescSize, const Graphic* pReplGraph, const ::rtl::OUString& aMediaType, sal_Int64 nAspect )
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     MakeDrawLayer();
290cdf0e10cSrcweir     if ( xObj.is() )
291cdf0e10cSrcweir     {
292cdf0e10cSrcweir         ::rtl::OUString aName;
293cdf0e10cSrcweir         //TODO/MBA: is that OK?
294cdf0e10cSrcweir         comphelper::EmbeddedObjectContainer& aCnt = GetViewData()->GetViewShell()->GetObjectShell()->GetEmbeddedObjectContainer();
295cdf0e10cSrcweir         if ( !aCnt.HasEmbeddedObject( xObj ) )
296cdf0e10cSrcweir             aCnt.InsertEmbeddedObject( xObj, aName );
297cdf0e10cSrcweir         else
298cdf0e10cSrcweir             aName = aCnt.GetEmbeddedObjectName( xObj );
299cdf0e10cSrcweir 
300cdf0e10cSrcweir         svt::EmbeddedObjectRef aObjRef( xObj, nAspect );
301cdf0e10cSrcweir         if ( pReplGraph )
302cdf0e10cSrcweir             aObjRef.SetGraphic( *pReplGraph, aMediaType );
303cdf0e10cSrcweir 
304cdf0e10cSrcweir         Size aSize;
305cdf0e10cSrcweir         if ( nAspect == embed::Aspects::MSOLE_ICON )
306cdf0e10cSrcweir         {
307cdf0e10cSrcweir             MapMode aMapMode( MAP_100TH_MM );
308cdf0e10cSrcweir             aSize = aObjRef.GetSize( &aMapMode );
309cdf0e10cSrcweir         }
310cdf0e10cSrcweir         else
311cdf0e10cSrcweir         {
312cdf0e10cSrcweir             // working with visual area can switch object to running state
313cdf0e10cSrcweir             MapUnit aMapObj = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
314cdf0e10cSrcweir             MapUnit aMap100 = MAP_100TH_MM;
315cdf0e10cSrcweir 
316cdf0e10cSrcweir             if ( pDescSize && pDescSize->Width() && pDescSize->Height() )
317cdf0e10cSrcweir             {
318cdf0e10cSrcweir                 // use size from object descriptor if given
319cdf0e10cSrcweir                 aSize = OutputDevice::LogicToLogic( *pDescSize, aMap100, aMapObj );
320cdf0e10cSrcweir                 awt::Size aSz;
321cdf0e10cSrcweir                 aSz.Width = aSize.Width();
322cdf0e10cSrcweir                 aSz.Height = aSize.Height();
323cdf0e10cSrcweir                 xObj->setVisualAreaSize( nAspect, aSz );
324cdf0e10cSrcweir             }
325cdf0e10cSrcweir 
326cdf0e10cSrcweir             awt::Size aSz;
327cdf0e10cSrcweir             try
328cdf0e10cSrcweir             {
329cdf0e10cSrcweir                 aSz = xObj->getVisualAreaSize( nAspect );
330cdf0e10cSrcweir             }
331cdf0e10cSrcweir             catch ( embed::NoVisualAreaSizeException& )
332cdf0e10cSrcweir             {
333cdf0e10cSrcweir                 // the default size will be set later
334cdf0e10cSrcweir             }
335cdf0e10cSrcweir 
336cdf0e10cSrcweir             aSize = Size( aSz.Width, aSz.Height );
337cdf0e10cSrcweir             aSize = OutputDevice::LogicToLogic( aSize, aMapObj, aMap100 );  // fuer SdrOle2Obj
338cdf0e10cSrcweir 
339cdf0e10cSrcweir             if( aSize.Height() == 0 || aSize.Width() == 0 )
340cdf0e10cSrcweir             {
341cdf0e10cSrcweir                 DBG_ERROR("SvObjectDescriptor::GetSize == 0");
342cdf0e10cSrcweir                 aSize.Width() = 5000;
343cdf0e10cSrcweir                 aSize.Height() = 5000;
344cdf0e10cSrcweir                 aSize = OutputDevice::LogicToLogic( aSize, aMap100, aMapObj );
345cdf0e10cSrcweir                 aSz.Width = aSize.Width();
346cdf0e10cSrcweir                 aSz.Height = aSize.Height();
347cdf0e10cSrcweir                 xObj->setVisualAreaSize( nAspect, aSz );
348cdf0e10cSrcweir             }
349cdf0e10cSrcweir         }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir         // don't call AdjustInsertPos
352cdf0e10cSrcweir         Point aInsPos = rPos;
353cdf0e10cSrcweir         if ( GetViewData()->GetDocument()->IsNegativePage( GetViewData()->GetTabNo() ) )
354cdf0e10cSrcweir             aInsPos.X() -= aSize.Width();
355cdf0e10cSrcweir         Rectangle aRect( aInsPos, aSize );
356cdf0e10cSrcweir 
357cdf0e10cSrcweir         ScDrawView* pDrView = GetScDrawView();
358cdf0e10cSrcweir         SdrOle2Obj* pSdrObj = new SdrOle2Obj( aObjRef, aName, aRect );
359cdf0e10cSrcweir 
360cdf0e10cSrcweir         SdrPageView* pPV = pDrView->GetSdrPageView();
361cdf0e10cSrcweir         pDrView->InsertObjectSafe( pSdrObj, *pPV );             // nicht markieren wenn Ole
362cdf0e10cSrcweir         GetViewData()->GetViewShell()->SetDrawShell( sal_True );
363cdf0e10cSrcweir         return sal_True;
364cdf0e10cSrcweir     }
365cdf0e10cSrcweir     else
366cdf0e10cSrcweir         return sal_False;
367cdf0e10cSrcweir }
368cdf0e10cSrcweir 
PasteBitmapEx(const Point & rPos,const BitmapEx & rBmpEx)36945fd3b9aSArmin Le Grand sal_Bool ScViewFunc::PasteBitmapEx( const Point& rPos, const BitmapEx& rBmpEx )
370cdf0e10cSrcweir {
371cdf0e10cSrcweir     String aEmpty;
37245fd3b9aSArmin Le Grand     Graphic aGraphic(rBmpEx);
373cdf0e10cSrcweir     return PasteGraphic( rPos, aGraphic, aEmpty, aEmpty );
374cdf0e10cSrcweir }
375cdf0e10cSrcweir 
PasteMetaFile(const Point & rPos,const GDIMetaFile & rMtf)376cdf0e10cSrcweir sal_Bool ScViewFunc::PasteMetaFile( const Point& rPos, const GDIMetaFile& rMtf )
377cdf0e10cSrcweir {
378cdf0e10cSrcweir     String aEmpty;
379cdf0e10cSrcweir     Graphic aGraphic(rMtf);
380cdf0e10cSrcweir     return PasteGraphic( rPos, aGraphic, aEmpty, aEmpty );
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
PasteGraphic(const Point & rPos,const Graphic & rGraphic,const String & rFile,const String & rFilter)383cdf0e10cSrcweir sal_Bool ScViewFunc::PasteGraphic( const Point& rPos, const Graphic& rGraphic,
384cdf0e10cSrcweir                                 const String& rFile, const String& rFilter )
385cdf0e10cSrcweir {
386cdf0e10cSrcweir     MakeDrawLayer();
387cdf0e10cSrcweir     ScDrawView* pScDrawView = GetScDrawView();
388cdf0e10cSrcweir 
38952f1c2eeSArmin Le Grand     // #123922# check if the drop was over an existing object; if yes, evtl. replace
39052f1c2eeSArmin Le Grand     // the graphic for a SdrGraphObj (including link state updates) or adapt the fill
39152f1c2eeSArmin Le Grand     // style for other objects
39252f1c2eeSArmin Le Grand     if(pScDrawView)
39352f1c2eeSArmin Le Grand     {
39452f1c2eeSArmin Le Grand         SdrObject* pPickObj = 0;
39552f1c2eeSArmin Le Grand         SdrPageView* pPageView = pScDrawView->GetSdrPageView();
39652f1c2eeSArmin Le Grand 
39752f1c2eeSArmin Le Grand         if(pPageView)
39852f1c2eeSArmin Le Grand         {
39952f1c2eeSArmin Le Grand             pScDrawView->PickObj(rPos, pScDrawView->getHitTolLog(), pPickObj, pPageView);
40052f1c2eeSArmin Le Grand         }
40152f1c2eeSArmin Le Grand 
40252f1c2eeSArmin Le Grand         if(pPickObj)
40352f1c2eeSArmin Le Grand         {
40452f1c2eeSArmin Le Grand             const String aBeginUndo(ScGlobal::GetRscString(STR_UNDO_DRAGDROP));
40552f1c2eeSArmin Le Grand             SdrObject* pResult = pScDrawView->ApplyGraphicToObject(
40652f1c2eeSArmin Le Grand                 *pPickObj,
40752f1c2eeSArmin Le Grand                 rGraphic,
40852f1c2eeSArmin Le Grand                 aBeginUndo,
40952f1c2eeSArmin Le Grand                 rFile,
41052f1c2eeSArmin Le Grand                 rFilter);
41152f1c2eeSArmin Le Grand 
41252f1c2eeSArmin Le Grand             if(pResult)
41352f1c2eeSArmin Le Grand             {
41452f1c2eeSArmin Le Grand                 // we are done; mark the modified/new object
41552f1c2eeSArmin Le Grand                 pScDrawView->MarkObj(pResult, pScDrawView->GetSdrPageView());
41652f1c2eeSArmin Le Grand                 return sal_True;
41752f1c2eeSArmin Le Grand             }
41852f1c2eeSArmin Le Grand         }
41952f1c2eeSArmin Le Grand     }
42052f1c2eeSArmin Le Grand 
421cdf0e10cSrcweir     Point aPos( rPos );
422cdf0e10cSrcweir     Window* pWin = GetActiveWin();
423cdf0e10cSrcweir     MapMode aSourceMap = rGraphic.GetPrefMapMode();
424cdf0e10cSrcweir     MapMode aDestMap( MAP_100TH_MM );
425cdf0e10cSrcweir 
426cdf0e10cSrcweir     if (aSourceMap.GetMapUnit() == MAP_PIXEL)
427cdf0e10cSrcweir     {
428*fe9b7f6aSmseidel             //  Pixel-Korrektur berücksichtigen, damit Bitmap auf dem Bildschirm stimmt
429cdf0e10cSrcweir 
430cdf0e10cSrcweir         Fraction aScaleX, aScaleY;
431cdf0e10cSrcweir         pScDrawView->CalcNormScale( aScaleX, aScaleY );
432cdf0e10cSrcweir         aDestMap.SetScaleX(aScaleX);
433cdf0e10cSrcweir         aDestMap.SetScaleY(aScaleY);
434cdf0e10cSrcweir     }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir     Size aSize = pWin->LogicToLogic( rGraphic.GetPrefSize(), &aSourceMap, &aDestMap );
437cdf0e10cSrcweir //  lcl_AdjustInsertPos( GetViewData(), aPos, aSize );
438cdf0e10cSrcweir     if ( GetViewData()->GetDocument()->IsNegativePage( GetViewData()->GetTabNo() ) )
439cdf0e10cSrcweir         aPos.X() -= aSize.Width();
440cdf0e10cSrcweir 
441cdf0e10cSrcweir     GetViewData()->GetViewShell()->SetDrawShell( sal_True );
442cdf0e10cSrcweir     Rectangle aRect(aPos, aSize);
443cdf0e10cSrcweir     SdrGrafObj* pGrafObj = new SdrGrafObj(rGraphic, aRect);
444cdf0e10cSrcweir 
445cdf0e10cSrcweir     // #118522# calling SetGraphicLink here doesn't work
446cdf0e10cSrcweir 
447cdf0e10cSrcweir     // #49961# Pfad wird nicht mehr als Name der Grafik gesetzt
448cdf0e10cSrcweir 
449cdf0e10cSrcweir     ScDrawLayer* pLayer = (ScDrawLayer*) pScDrawView->GetModel();
450cdf0e10cSrcweir     String aName = pLayer->GetNewGraphicName();                 // "Grafik x"
451cdf0e10cSrcweir     pGrafObj->SetName(aName);
452cdf0e10cSrcweir 
453cdf0e10cSrcweir     // nicht markieren wenn Ole
454cdf0e10cSrcweir     pScDrawView->InsertObjectSafe(pGrafObj, *pScDrawView->GetSdrPageView());
455cdf0e10cSrcweir 
456cdf0e10cSrcweir     // #118522# SetGraphicLink has to be used after inserting the object,
457cdf0e10cSrcweir     // otherwise an empty graphic is swapped in and the contact stuff crashes.
458cdf0e10cSrcweir     // See #i37444#.
459cdf0e10cSrcweir     if (rFile.Len())
460cdf0e10cSrcweir         pGrafObj->SetGraphicLink( rFile, rFilter );
461cdf0e10cSrcweir 
462cdf0e10cSrcweir     return sal_True;
463cdf0e10cSrcweir }
464*fe9b7f6aSmseidel 
465*fe9b7f6aSmseidel /* vim: set noet sw=4 ts=4: */
466