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