1f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5f6e50924SAndrew Rist * distributed with this work for additional information
6f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14f6e50924SAndrew Rist * software distributed under the License is distributed on an
15f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17f6e50924SAndrew Rist * specific language governing permissions and limitations
18f6e50924SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20f6e50924SAndrew Rist *************************************************************/
21f6e50924SAndrew Rist
22f6e50924SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <vector>
28cdf0e10cSrcweir #include <editeng/editeng.hxx>
299f63b866SArmin Le Grand #include <svx/xexch.hxx>
30cdf0e10cSrcweir #include <svx/xflclit.hxx>
31cdf0e10cSrcweir #include <svx/svdxcgv.hxx>
32cdf0e10cSrcweir #include <svx/svdoutl.hxx>
339f63b866SArmin Le Grand #include <svx/svditext.hxx>
34cdf0e10cSrcweir #include <svx/svdetc.hxx>
35cdf0e10cSrcweir #include <svx/svdundo.hxx>
36cdf0e10cSrcweir #include <svx/svdograf.hxx>
37cdf0e10cSrcweir #include <svx/svdoole2.hxx> // fuer kein OLE im SdrClipboardFormat
38cdf0e10cSrcweir #include <svx/svdorect.hxx>
39cdf0e10cSrcweir #include <svx/svdoedge.hxx> // fuer Konnektoren uebers Clipboard
40cdf0e10cSrcweir #include <svx/svdopage.hxx> // fuer Konnektoren uebers Clipboard
41cdf0e10cSrcweir #include <svx/svdpage.hxx>
42cdf0e10cSrcweir #include <svx/svdpagv.hxx>
43cdf0e10cSrcweir #include <svx/svdtrans.hxx> // Fuer GetMapFactor zum umskalieren bei PasteModel
44cdf0e10cSrcweir #include "svx/svdstr.hrc" // Namen aus der Resource
45cdf0e10cSrcweir #include "svx/svdglob.hxx" // StringCache
46cdf0e10cSrcweir #include "svx/xoutbmp.hxx"
47cdf0e10cSrcweir #include <vcl/metaact.hxx>
48cdf0e10cSrcweir #include <svl/poolitem.hxx>
49cdf0e10cSrcweir #include <svl/itempool.hxx>
50cdf0e10cSrcweir #include <tools/bigint.hxx>
51cdf0e10cSrcweir #include <sot/formats.hxx>
52cdf0e10cSrcweir #include <clonelist.hxx>
53cdf0e10cSrcweir #include <vcl/virdev.hxx>
54cdf0e10cSrcweir #include <svl/style.hxx>
559f63b866SArmin Le Grand #include <fmobj.hxx>
569f63b866SArmin Le Grand #include <vcl/svgdata.hxx>
57958da553SArmin Le Grand #include <drawinglayer/primitive2d/baseprimitive2d.hxx>
58958da553SArmin Le Grand #include <drawinglayer/primitive2d/groupprimitive2d.hxx>
59958da553SArmin Le Grand #include <drawinglayer/geometry/viewinformation2d.hxx>
60958da553SArmin Le Grand #include <svx/sdr/contact/viewcontact.hxx>
61958da553SArmin Le Grand #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
62958da553SArmin Le Grand #include <svx/sdr/contact/displayinfo.hxx>
63cdf0e10cSrcweir
64cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
65cdf0e10cSrcweir
SdrExchangeView(SdrModel * pModel1,OutputDevice * pOut)66cdf0e10cSrcweir SdrExchangeView::SdrExchangeView(SdrModel* pModel1, OutputDevice* pOut):
67cdf0e10cSrcweir SdrObjEditView(pModel1,pOut)
68cdf0e10cSrcweir {
69cdf0e10cSrcweir }
70cdf0e10cSrcweir
71cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
72cdf0e10cSrcweir
GetViewCenter(const OutputDevice * pOut) const73cdf0e10cSrcweir Point SdrExchangeView::GetViewCenter(const OutputDevice* pOut) const
74cdf0e10cSrcweir {
75cdf0e10cSrcweir Point aCenter;
76cdf0e10cSrcweir if (pOut==NULL)
77cdf0e10cSrcweir {
78cdf0e10cSrcweir pOut = GetFirstOutputDevice();
79cdf0e10cSrcweir }
80cdf0e10cSrcweir if (pOut!=NULL) {
81cdf0e10cSrcweir Point aOfs=pOut->GetMapMode().GetOrigin();
82cdf0e10cSrcweir Size aOutSiz=pOut->GetOutputSize();
83cdf0e10cSrcweir aOutSiz.Width()/=2;
84cdf0e10cSrcweir aOutSiz.Height()/=2;
85cdf0e10cSrcweir aCenter.X()=aOutSiz.Width() -aOfs.X();
86cdf0e10cSrcweir aCenter.Y()=aOutSiz.Height()-aOfs.Y();
87cdf0e10cSrcweir }
88cdf0e10cSrcweir return aCenter;
89cdf0e10cSrcweir }
90cdf0e10cSrcweir
GetPastePos(SdrObjList * pLst,OutputDevice * pOut)91cdf0e10cSrcweir Point SdrExchangeView::GetPastePos(SdrObjList* pLst, OutputDevice* pOut)
92cdf0e10cSrcweir {
93cdf0e10cSrcweir Point aP(GetViewCenter(pOut));
94cdf0e10cSrcweir SdrPage* pPg=NULL;
95cdf0e10cSrcweir if (pLst!=NULL) pPg=pLst->GetPage();
96cdf0e10cSrcweir if (pPg!=NULL) {
97cdf0e10cSrcweir Size aSiz(pPg->GetSize());
98cdf0e10cSrcweir aP.X()=aSiz.Width()/2;
99cdf0e10cSrcweir aP.Y()=aSiz.Height()/2;
100cdf0e10cSrcweir }
101cdf0e10cSrcweir return aP;
102cdf0e10cSrcweir }
103cdf0e10cSrcweir
ImpLimitToWorkArea(Point & rPt) const104cdf0e10cSrcweir sal_Bool SdrExchangeView::ImpLimitToWorkArea(Point& rPt) const
105cdf0e10cSrcweir {
106cdf0e10cSrcweir sal_Bool bRet(sal_False);
107cdf0e10cSrcweir
108cdf0e10cSrcweir if(!aMaxWorkArea.IsEmpty())
109cdf0e10cSrcweir {
110cdf0e10cSrcweir if(rPt.X()<aMaxWorkArea.Left())
111cdf0e10cSrcweir {
112cdf0e10cSrcweir rPt.X() = aMaxWorkArea.Left();
113cdf0e10cSrcweir bRet = sal_True;
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
116cdf0e10cSrcweir if(rPt.X()>aMaxWorkArea.Right())
117cdf0e10cSrcweir {
118cdf0e10cSrcweir rPt.X() = aMaxWorkArea.Right();
119cdf0e10cSrcweir bRet = sal_True;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir
122cdf0e10cSrcweir if(rPt.Y()<aMaxWorkArea.Top())
123cdf0e10cSrcweir {
124cdf0e10cSrcweir rPt.Y() = aMaxWorkArea.Top();
125cdf0e10cSrcweir bRet = sal_True;
126cdf0e10cSrcweir }
127cdf0e10cSrcweir
128cdf0e10cSrcweir if(rPt.Y()>aMaxWorkArea.Bottom())
129cdf0e10cSrcweir {
130cdf0e10cSrcweir rPt.Y() = aMaxWorkArea.Bottom();
131cdf0e10cSrcweir bRet = sal_True;
132cdf0e10cSrcweir }
133cdf0e10cSrcweir }
134cdf0e10cSrcweir return bRet;
135cdf0e10cSrcweir }
136cdf0e10cSrcweir
ImpGetPasteObjList(Point &,SdrObjList * & rpLst)137cdf0e10cSrcweir void SdrExchangeView::ImpGetPasteObjList(Point& /*rPos*/, SdrObjList*& rpLst)
138cdf0e10cSrcweir {
139cdf0e10cSrcweir if (rpLst==NULL)
140cdf0e10cSrcweir {
141cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView();
142cdf0e10cSrcweir
143cdf0e10cSrcweir if (pPV!=NULL) {
144cdf0e10cSrcweir rpLst=pPV->GetObjList();
145cdf0e10cSrcweir }
146cdf0e10cSrcweir }
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
ImpGetPasteLayer(const SdrObjList * pObjList,SdrLayerID & rLayer) const149cdf0e10cSrcweir sal_Bool SdrExchangeView::ImpGetPasteLayer(const SdrObjList* pObjList, SdrLayerID& rLayer) const
150cdf0e10cSrcweir {
151cdf0e10cSrcweir sal_Bool bRet=sal_False;
152cdf0e10cSrcweir rLayer=0;
153cdf0e10cSrcweir if (pObjList!=NULL) {
154cdf0e10cSrcweir const SdrPage* pPg=pObjList->GetPage();
155cdf0e10cSrcweir if (pPg!=NULL) {
156cdf0e10cSrcweir rLayer=pPg->GetLayerAdmin().GetLayerID(aAktLayer,sal_True);
157cdf0e10cSrcweir if (rLayer==SDRLAYER_NOTFOUND) rLayer=0;
158cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView();
159cdf0e10cSrcweir if (pPV!=NULL) {
160cdf0e10cSrcweir bRet=!pPV->GetLockedLayers().IsSet(rLayer) && pPV->GetVisibleLayers().IsSet(rLayer);
161cdf0e10cSrcweir }
162cdf0e10cSrcweir }
163cdf0e10cSrcweir }
164cdf0e10cSrcweir return bRet;
165cdf0e10cSrcweir }
166cdf0e10cSrcweir
167cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
168cdf0e10cSrcweir
Paste(const GDIMetaFile & rMtf,const Point & rPos,SdrObjList * pLst,sal_uInt32 nOptions)169cdf0e10cSrcweir sal_Bool SdrExchangeView::Paste(const GDIMetaFile& rMtf, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions)
170cdf0e10cSrcweir {
171cdf0e10cSrcweir Point aPos(rPos);
172cdf0e10cSrcweir ImpGetPasteObjList(aPos,pLst);
173cdf0e10cSrcweir ImpLimitToWorkArea( aPos );
174cdf0e10cSrcweir if (pLst==NULL) return sal_False;
175cdf0e10cSrcweir SdrLayerID nLayer;
176cdf0e10cSrcweir if (!ImpGetPasteLayer(pLst,nLayer)) return sal_False;
177cdf0e10cSrcweir sal_Bool bUnmark=(nOptions&(SDRINSERT_DONTMARK|SDRINSERT_ADDMARK))==0 && !IsTextEdit();
178cdf0e10cSrcweir if (bUnmark) UnmarkAllObj();
179cdf0e10cSrcweir SdrGrafObj* pObj=new SdrGrafObj(Graphic(rMtf));
180cdf0e10cSrcweir pObj->SetLayer(nLayer);
181cdf0e10cSrcweir ImpPasteObject(pObj,*pLst,aPos,rMtf.GetPrefSize(),rMtf.GetPrefMapMode(),nOptions);
182cdf0e10cSrcweir return sal_True;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir
Paste(const Bitmap & rBmp,const Point & rPos,SdrObjList * pLst,sal_uInt32 nOptions)185cdf0e10cSrcweir sal_Bool SdrExchangeView::Paste(const Bitmap& rBmp, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions)
186cdf0e10cSrcweir {
187cdf0e10cSrcweir Point aPos(rPos);
188cdf0e10cSrcweir ImpGetPasteObjList(aPos,pLst);
189cdf0e10cSrcweir ImpLimitToWorkArea( aPos );
190cdf0e10cSrcweir if (pLst==NULL) return sal_False;
191cdf0e10cSrcweir SdrLayerID nLayer;
192cdf0e10cSrcweir if (!ImpGetPasteLayer(pLst,nLayer)) return sal_False;
193cdf0e10cSrcweir sal_Bool bUnmark=(nOptions&(SDRINSERT_DONTMARK|SDRINSERT_ADDMARK))==0 && !IsTextEdit();
194cdf0e10cSrcweir if (bUnmark) UnmarkAllObj();
195cdf0e10cSrcweir SdrGrafObj* pObj=new SdrGrafObj(Graphic(rBmp));
196cdf0e10cSrcweir pObj->SetLayer(nLayer);
197cdf0e10cSrcweir ImpPasteObject(pObj,*pLst,aPos,rBmp.GetSizePixel(),MapMode(MAP_PIXEL),nOptions);
198cdf0e10cSrcweir return sal_True;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
Paste(const XubString & rStr,const Point & rPos,SdrObjList * pLst,sal_uInt32 nOptions)201cdf0e10cSrcweir sal_Bool SdrExchangeView::Paste(const XubString& rStr, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions)
202cdf0e10cSrcweir {
203cdf0e10cSrcweir if(!rStr.Len())
204cdf0e10cSrcweir return sal_False;
205cdf0e10cSrcweir
206cdf0e10cSrcweir Point aPos(rPos);
207cdf0e10cSrcweir ImpGetPasteObjList(aPos,pLst);
208cdf0e10cSrcweir ImpLimitToWorkArea( aPos );
209cdf0e10cSrcweir if (pLst==NULL) return sal_False;
210cdf0e10cSrcweir SdrLayerID nLayer;
211cdf0e10cSrcweir if (!ImpGetPasteLayer(pLst,nLayer)) return sal_False;
212cdf0e10cSrcweir sal_Bool bUnmark=(nOptions&(SDRINSERT_DONTMARK|SDRINSERT_ADDMARK))==0 && !IsTextEdit();
213cdf0e10cSrcweir if (bUnmark) UnmarkAllObj();
214cdf0e10cSrcweir Rectangle aTextRect(0,0,500,500);
215cdf0e10cSrcweir SdrPage* pPage=pLst->GetPage();
216cdf0e10cSrcweir if (pPage!=NULL) {
217cdf0e10cSrcweir aTextRect.SetSize(pPage->GetSize());
218cdf0e10cSrcweir }
219cdf0e10cSrcweir SdrRectObj* pObj=new SdrRectObj(OBJ_TEXT,aTextRect);
220cdf0e10cSrcweir pObj->SetModel(pMod);
221cdf0e10cSrcweir pObj->SetLayer(nLayer);
222cdf0e10cSrcweir pObj->NbcSetText(rStr); // #32424# SetText vor SetAttr, weil SetAttr sonst unwirksam!
223cdf0e10cSrcweir if (pDefaultStyleSheet!=NULL) pObj->NbcSetStyleSheet(pDefaultStyleSheet, sal_False);
224cdf0e10cSrcweir
225cdf0e10cSrcweir pObj->SetMergedItemSet(aDefaultAttr);
226cdf0e10cSrcweir
227cdf0e10cSrcweir SfxItemSet aTempAttr(pMod->GetItemPool()); // Keine Fuellung oder Linie
228cdf0e10cSrcweir aTempAttr.Put(XLineStyleItem(XLINE_NONE));
229cdf0e10cSrcweir aTempAttr.Put(XFillStyleItem(XFILL_NONE));
230cdf0e10cSrcweir
231cdf0e10cSrcweir pObj->SetMergedItemSet(aTempAttr);
232cdf0e10cSrcweir
233cdf0e10cSrcweir pObj->FitFrameToTextSize();
234cdf0e10cSrcweir Size aSiz(pObj->GetLogicRect().GetSize());
235cdf0e10cSrcweir MapUnit eMap=pMod->GetScaleUnit();
236cdf0e10cSrcweir Fraction aMap=pMod->GetScaleFraction();
237cdf0e10cSrcweir ImpPasteObject(pObj,*pLst,aPos,aSiz,MapMode(eMap,Point(0,0),aMap,aMap),nOptions);
238cdf0e10cSrcweir return sal_True;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir
Paste(SvStream & rInput,const String & rBaseURL,sal_uInt16 eFormat,const Point & rPos,SdrObjList * pLst,sal_uInt32 nOptions)241cdf0e10cSrcweir sal_Bool SdrExchangeView::Paste(SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions)
242cdf0e10cSrcweir {
243cdf0e10cSrcweir Point aPos(rPos);
244cdf0e10cSrcweir ImpGetPasteObjList(aPos,pLst);
245cdf0e10cSrcweir ImpLimitToWorkArea( aPos );
246cdf0e10cSrcweir if (pLst==NULL) return sal_False;
247cdf0e10cSrcweir SdrLayerID nLayer;
248cdf0e10cSrcweir if (!ImpGetPasteLayer(pLst,nLayer)) return sal_False;
249cdf0e10cSrcweir sal_Bool bUnmark=(nOptions&(SDRINSERT_DONTMARK|SDRINSERT_ADDMARK))==0 && !IsTextEdit();
250cdf0e10cSrcweir if (bUnmark) UnmarkAllObj();
251cdf0e10cSrcweir Rectangle aTextRect(0,0,500,500);
252cdf0e10cSrcweir SdrPage* pPage=pLst->GetPage();
253cdf0e10cSrcweir if (pPage!=NULL) {
254cdf0e10cSrcweir aTextRect.SetSize(pPage->GetSize());
255cdf0e10cSrcweir }
256cdf0e10cSrcweir SdrRectObj* pObj=new SdrRectObj(OBJ_TEXT,aTextRect);
257cdf0e10cSrcweir pObj->SetModel(pMod);
258cdf0e10cSrcweir pObj->SetLayer(nLayer);
259cdf0e10cSrcweir if (pDefaultStyleSheet!=NULL) pObj->NbcSetStyleSheet(pDefaultStyleSheet, sal_False);
260cdf0e10cSrcweir
261cdf0e10cSrcweir pObj->SetMergedItemSet(aDefaultAttr);
262cdf0e10cSrcweir
263cdf0e10cSrcweir SfxItemSet aTempAttr(pMod->GetItemPool()); // Keine Fuellung oder Linie
264cdf0e10cSrcweir aTempAttr.Put(XLineStyleItem(XLINE_NONE));
265cdf0e10cSrcweir aTempAttr.Put(XFillStyleItem(XFILL_NONE));
266cdf0e10cSrcweir
267cdf0e10cSrcweir pObj->SetMergedItemSet(aTempAttr);
268cdf0e10cSrcweir
269cdf0e10cSrcweir pObj->NbcSetText(rInput,rBaseURL,eFormat);
270cdf0e10cSrcweir pObj->FitFrameToTextSize();
271cdf0e10cSrcweir Size aSiz(pObj->GetLogicRect().GetSize());
272cdf0e10cSrcweir MapUnit eMap=pMod->GetScaleUnit();
273cdf0e10cSrcweir Fraction aMap=pMod->GetScaleFraction();
274cdf0e10cSrcweir ImpPasteObject(pObj,*pLst,aPos,aSiz,MapMode(eMap,Point(0,0),aMap,aMap),nOptions);
275cdf0e10cSrcweir
276cdf0e10cSrcweir // b4967543
277cdf0e10cSrcweir if(pObj && pObj->GetModel() && pObj->GetOutlinerParaObject())
278cdf0e10cSrcweir {
279cdf0e10cSrcweir SdrOutliner& rOutliner = pObj->GetModel()->GetHitTestOutliner();
280cdf0e10cSrcweir rOutliner.SetText(*pObj->GetOutlinerParaObject());
281cdf0e10cSrcweir
282cdf0e10cSrcweir if(1L == rOutliner.GetParagraphCount())
283cdf0e10cSrcweir {
284cdf0e10cSrcweir SfxStyleSheet* pCandidate = rOutliner.GetStyleSheet(0L);
285cdf0e10cSrcweir
286cdf0e10cSrcweir if(pCandidate)
287cdf0e10cSrcweir {
288cdf0e10cSrcweir if(pObj->GetModel()->GetStyleSheetPool() == &pCandidate->GetPool())
289cdf0e10cSrcweir {
290cdf0e10cSrcweir pObj->NbcSetStyleSheet(pCandidate, sal_True);
291cdf0e10cSrcweir }
292cdf0e10cSrcweir }
293cdf0e10cSrcweir }
294cdf0e10cSrcweir }
295cdf0e10cSrcweir
296cdf0e10cSrcweir return sal_True;
297cdf0e10cSrcweir }
298cdf0e10cSrcweir
Paste(const SdrModel & rMod,const Point & rPos,SdrObjList * pLst,sal_uInt32 nOptions)299cdf0e10cSrcweir sal_Bool SdrExchangeView::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions)
300cdf0e10cSrcweir {
301cdf0e10cSrcweir const SdrModel* pSrcMod=&rMod;
302cdf0e10cSrcweir if (pSrcMod==pMod)
303cdf0e10cSrcweir return sal_False; // na so geht's ja nun nicht
304cdf0e10cSrcweir
305cdf0e10cSrcweir const bool bUndo = IsUndoEnabled();
306cdf0e10cSrcweir
307cdf0e10cSrcweir if( bUndo )
308cdf0e10cSrcweir BegUndo(ImpGetResStr(STR_ExchangePaste));
309cdf0e10cSrcweir
310cdf0e10cSrcweir if( mxSelectionController.is() && mxSelectionController->PasteObjModel( rMod ) )
311cdf0e10cSrcweir {
312cdf0e10cSrcweir if( bUndo )
313cdf0e10cSrcweir EndUndo();
314cdf0e10cSrcweir return sal_True;
315cdf0e10cSrcweir }
316cdf0e10cSrcweir
317cdf0e10cSrcweir Point aPos(rPos);
318cdf0e10cSrcweir ImpGetPasteObjList(aPos,pLst);
319cdf0e10cSrcweir SdrPageView* pMarkPV=NULL;
320cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView();
321cdf0e10cSrcweir
322cdf0e10cSrcweir if(pPV)
323cdf0e10cSrcweir {
324cdf0e10cSrcweir if ( pPV->GetObjList() == pLst )
325cdf0e10cSrcweir pMarkPV=pPV;
326cdf0e10cSrcweir }
327cdf0e10cSrcweir
328cdf0e10cSrcweir ImpLimitToWorkArea( aPos );
329cdf0e10cSrcweir if (pLst==NULL)
330cdf0e10cSrcweir return sal_False;
331cdf0e10cSrcweir
332cdf0e10cSrcweir sal_Bool bUnmark=(nOptions&(SDRINSERT_DONTMARK|SDRINSERT_ADDMARK))==0 && !IsTextEdit();
333cdf0e10cSrcweir if (bUnmark)
334cdf0e10cSrcweir UnmarkAllObj();
335cdf0e10cSrcweir
336cdf0e10cSrcweir // evtl. umskalieren bei unterschiedlicher MapUnit am Model
337cdf0e10cSrcweir // Dafuer erstmal die Faktoren berechnen
338cdf0e10cSrcweir MapUnit eSrcUnit=pSrcMod->GetScaleUnit();
339cdf0e10cSrcweir MapUnit eDstUnit=pMod->GetScaleUnit();
340cdf0e10cSrcweir sal_Bool bResize=eSrcUnit!=eDstUnit;
341cdf0e10cSrcweir Fraction xResize,yResize;
342cdf0e10cSrcweir Point aPt0;
343cdf0e10cSrcweir if (bResize)
344cdf0e10cSrcweir {
345cdf0e10cSrcweir FrPair aResize(GetMapFactor(eSrcUnit,eDstUnit));
346cdf0e10cSrcweir xResize=aResize.X();
347cdf0e10cSrcweir yResize=aResize.Y();
348cdf0e10cSrcweir }
349cdf0e10cSrcweir SdrObjList* pDstLst=pLst;
350cdf0e10cSrcweir sal_uInt16 nPg,nPgAnz=pSrcMod->GetPageCount();
351cdf0e10cSrcweir for (nPg=0; nPg<nPgAnz; nPg++)
352cdf0e10cSrcweir {
353cdf0e10cSrcweir const SdrPage* pSrcPg=pSrcMod->GetPage(nPg);
354cdf0e10cSrcweir
355cdf0e10cSrcweir // #104148# Use SnapRect, not BoundRect here
356cdf0e10cSrcweir Rectangle aR=pSrcPg->GetAllObjSnapRect();
357cdf0e10cSrcweir
358cdf0e10cSrcweir if (bResize)
359cdf0e10cSrcweir ResizeRect(aR,aPt0,xResize,yResize);
360cdf0e10cSrcweir Point aDist(aPos-aR.Center());
361cdf0e10cSrcweir Size aSiz(aDist.X(),aDist.Y());
362cdf0e10cSrcweir //sal_uIntPtr nDstObjAnz0=pDstLst->GetObjCount();
363cdf0e10cSrcweir sal_uIntPtr nCloneErrCnt=0;
364cdf0e10cSrcweir sal_uIntPtr nOb,nObAnz=pSrcPg->GetObjCount();
365cdf0e10cSrcweir sal_Bool bMark=pMarkPV!=NULL && !IsTextEdit() && (nOptions&SDRINSERT_DONTMARK)==0;
366cdf0e10cSrcweir
367cdf0e10cSrcweir // #i13033#
368cdf0e10cSrcweir // New mechanism to re-create the connections of cloned connectors
369cdf0e10cSrcweir CloneList aCloneList;
370cdf0e10cSrcweir
371cdf0e10cSrcweir for (nOb=0; nOb<nObAnz; nOb++)
372cdf0e10cSrcweir {
373cdf0e10cSrcweir const SdrObject* pSrcOb=pSrcPg->GetObj(nOb);
374cdf0e10cSrcweir
375cdf0e10cSrcweir // #116235#
376cdf0e10cSrcweir SdrObject* pNeuObj = pSrcOb->Clone();
377cdf0e10cSrcweir
378cdf0e10cSrcweir if (pNeuObj!=NULL)
379cdf0e10cSrcweir {
380cdf0e10cSrcweir if(bResize)
381cdf0e10cSrcweir {
382cdf0e10cSrcweir pNeuObj->GetModel()->SetPasteResize(sal_True); // #51139#
383cdf0e10cSrcweir pNeuObj->NbcResize(aPt0,xResize,yResize);
384cdf0e10cSrcweir pNeuObj->GetModel()->SetPasteResize(sal_False); // #51139#
385cdf0e10cSrcweir }
386cdf0e10cSrcweir
387cdf0e10cSrcweir // #i39861#
388cdf0e10cSrcweir pNeuObj->SetModel(pDstLst->GetModel());
389cdf0e10cSrcweir pNeuObj->SetPage(pDstLst->GetPage());
390cdf0e10cSrcweir
391cdf0e10cSrcweir pNeuObj->NbcMove(aSiz);
392cdf0e10cSrcweir
393cdf0e10cSrcweir const SdrPage* pPg = pDstLst->GetPage();
394cdf0e10cSrcweir
395cdf0e10cSrcweir if(pPg)
396cdf0e10cSrcweir {
397cdf0e10cSrcweir // #i72535#
398cdf0e10cSrcweir const SdrLayerAdmin& rAd = pPg->GetLayerAdmin();
399cdf0e10cSrcweir SdrLayerID nLayer(0);
400cdf0e10cSrcweir
401cdf0e10cSrcweir if(pNeuObj->ISA(FmFormObj))
402cdf0e10cSrcweir {
403cdf0e10cSrcweir // for FormControls, force to form layer
404cdf0e10cSrcweir nLayer = rAd.GetLayerID(rAd.GetControlLayerName(), true);
405cdf0e10cSrcweir }
406cdf0e10cSrcweir else
407cdf0e10cSrcweir {
408cdf0e10cSrcweir nLayer = rAd.GetLayerID(aAktLayer, sal_True);
409cdf0e10cSrcweir }
410cdf0e10cSrcweir
411cdf0e10cSrcweir if(SDRLAYER_NOTFOUND == nLayer)
412cdf0e10cSrcweir {
413cdf0e10cSrcweir nLayer = 0;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir
416cdf0e10cSrcweir pNeuObj->SetLayer(nLayer);
417cdf0e10cSrcweir }
418cdf0e10cSrcweir
419cdf0e10cSrcweir SdrInsertReason aReason(SDRREASON_VIEWCALL);
420cdf0e10cSrcweir pDstLst->InsertObject(pNeuObj,CONTAINER_APPEND,&aReason);
421cdf0e10cSrcweir
422cdf0e10cSrcweir if( bUndo )
423cdf0e10cSrcweir AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pNeuObj));
424cdf0e10cSrcweir
425cdf0e10cSrcweir if (bMark) {
426cdf0e10cSrcweir // Markhandles noch nicht sofort setzen!
427cdf0e10cSrcweir // Das erledigt das ModelHasChanged der MarkView.
428cdf0e10cSrcweir MarkObj(pNeuObj,pMarkPV,sal_False,sal_True);
429cdf0e10cSrcweir }
430cdf0e10cSrcweir
431cdf0e10cSrcweir // #i13033#
432cdf0e10cSrcweir aCloneList.AddPair(pSrcOb, pNeuObj);
433cdf0e10cSrcweir }
434cdf0e10cSrcweir else
435cdf0e10cSrcweir {
436cdf0e10cSrcweir nCloneErrCnt++;
437cdf0e10cSrcweir }
438cdf0e10cSrcweir }
439cdf0e10cSrcweir
440cdf0e10cSrcweir // #i13033#
441cdf0e10cSrcweir // New mechanism to re-create the connections of cloned connectors
442cdf0e10cSrcweir aCloneList.CopyConnections();
443cdf0e10cSrcweir
444cdf0e10cSrcweir if(0L != nCloneErrCnt)
445cdf0e10cSrcweir {
446cdf0e10cSrcweir #ifdef DBG_UTIL
447cdf0e10cSrcweir ByteString aStr("SdrExchangeView::Paste(): Fehler beim Clonen ");
448cdf0e10cSrcweir
449cdf0e10cSrcweir if(nCloneErrCnt == 1)
450cdf0e10cSrcweir {
451cdf0e10cSrcweir aStr += "eines Zeichenobjekts.";
452cdf0e10cSrcweir }
453cdf0e10cSrcweir else
454cdf0e10cSrcweir {
455cdf0e10cSrcweir aStr += "von ";
456cdf0e10cSrcweir aStr += ByteString::CreateFromInt32( nCloneErrCnt );
457cdf0e10cSrcweir aStr += " Zeichenobjekten.";
458cdf0e10cSrcweir }
459cdf0e10cSrcweir
460cdf0e10cSrcweir aStr += " Objektverbindungen werden nicht mitkopiert.";
461cdf0e10cSrcweir
462cdf0e10cSrcweir DBG_ERROR(aStr.GetBuffer());
463cdf0e10cSrcweir #endif
464cdf0e10cSrcweir }
465cdf0e10cSrcweir }
466cdf0e10cSrcweir
467cdf0e10cSrcweir if( bUndo )
468cdf0e10cSrcweir EndUndo();
469cdf0e10cSrcweir
470cdf0e10cSrcweir return sal_True;
471cdf0e10cSrcweir }
472cdf0e10cSrcweir
IsExchangeFormatSupported(sal_uIntPtr nFormat) const473cdf0e10cSrcweir sal_Bool SdrExchangeView::IsExchangeFormatSupported(sal_uIntPtr nFormat) const
474cdf0e10cSrcweir {
475cdf0e10cSrcweir return( FORMAT_PRIVATE == nFormat ||
476cdf0e10cSrcweir FORMAT_GDIMETAFILE == nFormat ||
477cdf0e10cSrcweir FORMAT_BITMAP == nFormat ||
478cdf0e10cSrcweir FORMAT_RTF == nFormat ||
479cdf0e10cSrcweir FORMAT_STRING == nFormat ||
480cdf0e10cSrcweir SOT_FORMATSTR_ID_DRAWING == nFormat ||
481cdf0e10cSrcweir SOT_FORMATSTR_ID_EDITENGINE == nFormat );
482cdf0e10cSrcweir }
483cdf0e10cSrcweir
ImpPasteObject(SdrObject * pObj,SdrObjList & rLst,const Point & rCenter,const Size & rSiz,const MapMode & rMap,sal_uInt32 nOptions)484cdf0e10cSrcweir void SdrExchangeView::ImpPasteObject(SdrObject* pObj, SdrObjList& rLst, const Point& rCenter, const Size& rSiz, const MapMode& rMap, sal_uInt32 nOptions)
485cdf0e10cSrcweir {
486cdf0e10cSrcweir BigInt nSizX(rSiz.Width());
487cdf0e10cSrcweir BigInt nSizY(rSiz.Height());
488cdf0e10cSrcweir MapUnit eSrcMU=rMap.GetMapUnit();
489cdf0e10cSrcweir MapUnit eDstMU=pMod->GetScaleUnit();
490cdf0e10cSrcweir FrPair aMapFact(GetMapFactor(eSrcMU,eDstMU));
491cdf0e10cSrcweir Fraction aDstFr(pMod->GetScaleFraction());
492cdf0e10cSrcweir nSizX*=aMapFact.X().GetNumerator();
493cdf0e10cSrcweir nSizX*=rMap.GetScaleX().GetNumerator();
494cdf0e10cSrcweir nSizX*=aDstFr.GetDenominator();
495cdf0e10cSrcweir nSizX/=aMapFact.X().GetDenominator();
496cdf0e10cSrcweir nSizX/=rMap.GetScaleX().GetDenominator();
497cdf0e10cSrcweir nSizX/=aDstFr.GetNumerator();
498cdf0e10cSrcweir nSizY*=aMapFact.Y().GetNumerator();
499cdf0e10cSrcweir nSizY*=rMap.GetScaleY().GetNumerator();
500cdf0e10cSrcweir nSizX*=aDstFr.GetDenominator();
501cdf0e10cSrcweir nSizY/=aMapFact.Y().GetDenominator();
502cdf0e10cSrcweir nSizY/=rMap.GetScaleY().GetDenominator();
503cdf0e10cSrcweir nSizY/=aDstFr.GetNumerator();
504cdf0e10cSrcweir long xs=nSizX;
505cdf0e10cSrcweir long ys=nSizY;
506cdf0e10cSrcweir Point aPos(rCenter.X()-xs/2,rCenter.Y()-ys/2);
507cdf0e10cSrcweir Rectangle aR(aPos.X(),aPos.Y(),aPos.X()+xs,aPos.Y()+ys);
508cdf0e10cSrcweir pObj->SetLogicRect(aR);
509cdf0e10cSrcweir SdrInsertReason aReason(SDRREASON_VIEWCALL);
510cdf0e10cSrcweir rLst.InsertObject(pObj,CONTAINER_APPEND,&aReason);
511cdf0e10cSrcweir
512cdf0e10cSrcweir if( IsUndoEnabled() )
513cdf0e10cSrcweir AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pObj));
514cdf0e10cSrcweir
515cdf0e10cSrcweir SdrPageView* pMarkPV=NULL;
516cdf0e10cSrcweir SdrPageView* pPV = GetSdrPageView();
517cdf0e10cSrcweir
518cdf0e10cSrcweir if(pPV)
519cdf0e10cSrcweir {
520cdf0e10cSrcweir if (pPV->GetObjList()==&rLst)
521cdf0e10cSrcweir pMarkPV=pPV;
522cdf0e10cSrcweir }
523cdf0e10cSrcweir
524cdf0e10cSrcweir sal_Bool bMark=pMarkPV!=NULL && !IsTextEdit() && (nOptions&SDRINSERT_DONTMARK)==0;
525cdf0e10cSrcweir if (bMark)
526cdf0e10cSrcweir { // Obj in der ersten gefundenen PageView markieren
527cdf0e10cSrcweir MarkObj(pObj,pMarkPV);
528cdf0e10cSrcweir }
529cdf0e10cSrcweir }
530cdf0e10cSrcweir
GetMarkedObjBitmapEx(bool bNoVDevIfOneBmpMarked) const531bb18ee55SArmin Le Grand BitmapEx SdrExchangeView::GetMarkedObjBitmapEx(bool bNoVDevIfOneBmpMarked) const
532cdf0e10cSrcweir {
533ddde725dSArmin Le Grand BitmapEx aBmp;
534cdf0e10cSrcweir
535cdf0e10cSrcweir if( AreObjectsMarked() )
536cdf0e10cSrcweir {
537ddde725dSArmin Le Grand if(1 == GetMarkedObjectCount())
538ddde725dSArmin Le Grand {
539cdf0e10cSrcweir if(bNoVDevIfOneBmpMarked)
540cdf0e10cSrcweir {
541cdf0e10cSrcweir SdrObject* pGrafObjTmp = GetMarkedObjectByIndex( 0 );
542cdf0e10cSrcweir SdrGrafObj* pGrafObj = ( GetMarkedObjectCount() == 1 ) ? PTR_CAST( SdrGrafObj, pGrafObjTmp ) : NULL;
543cdf0e10cSrcweir
544cdf0e10cSrcweir if( pGrafObj && ( pGrafObj->GetGraphicType() == GRAPHIC_BITMAP ) )
545ddde725dSArmin Le Grand {
546ddde725dSArmin Le Grand aBmp = pGrafObj->GetTransformedGraphic().GetBitmapEx();
547ddde725dSArmin Le Grand }
548ddde725dSArmin Le Grand }
549ddde725dSArmin Le Grand else
550ddde725dSArmin Le Grand {
551ddde725dSArmin Le Grand const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(GetMarkedObjectByIndex(0));
552ddde725dSArmin Le Grand
553ddde725dSArmin Le Grand if(pSdrGrafObj && pSdrGrafObj->isEmbeddedSvg())
554ddde725dSArmin Le Grand {
555ddde725dSArmin Le Grand aBmp = pSdrGrafObj->GetGraphic().getSvgData()->getReplacement();
556ddde725dSArmin Le Grand }
557ddde725dSArmin Le Grand }
558cdf0e10cSrcweir }
559cdf0e10cSrcweir
560cdf0e10cSrcweir if( !aBmp )
561cdf0e10cSrcweir {
562958da553SArmin Le Grand // choose conversion directly using primitives to bitmap to avoid
563958da553SArmin Le Grand // rendering errors with tiled bitmap fills (these will be tiled in a
564958da553SArmin Le Grand // in-between metafile, but tend to show 'gaps' since the target is *no*
565958da553SArmin Le Grand // bitmap rendering)
566958da553SArmin Le Grand ::std::vector< SdrObject* > aSdrObjects(GetMarkedObjects());
567958da553SArmin Le Grand const sal_uInt32 nCount(aSdrObjects.size());
568cdf0e10cSrcweir
569958da553SArmin Le Grand if(nCount)
570958da553SArmin Le Grand {
571958da553SArmin Le Grand // collect sub-primitives as group objects, thus no expensive append
572958da553SArmin Le Grand // to existing sequence is needed
573958da553SArmin Le Grand drawinglayer::primitive2d::Primitive2DSequence xPrimitives(nCount);
574958da553SArmin Le Grand
575958da553SArmin Le Grand for(sal_uInt32 a(0); a < nCount; a++)
576958da553SArmin Le Grand {
577*0cd7e32bSArmin Le Grand SdrObject* pCandidate = aSdrObjects[a];
578*0cd7e32bSArmin Le Grand SdrGrafObj* pSdrGrafObj = dynamic_cast< SdrGrafObj* >(pCandidate);
579*0cd7e32bSArmin Le Grand
580*0cd7e32bSArmin Le Grand if(pSdrGrafObj)
581*0cd7e32bSArmin Le Grand {
582*0cd7e32bSArmin Le Grand // #122753# To ensure existance of graphic content, force swap in
583*0cd7e32bSArmin Le Grand pSdrGrafObj->ForceSwapIn();
584*0cd7e32bSArmin Le Grand }
585*0cd7e32bSArmin Le Grand
586958da553SArmin Le Grand xPrimitives[a] = new drawinglayer::primitive2d::GroupPrimitive2D(
587*0cd7e32bSArmin Le Grand pCandidate->GetViewContact().getViewIndependentPrimitive2DSequence());
588958da553SArmin Le Grand }
589958da553SArmin Le Grand
590958da553SArmin Le Grand // get logic range
591958da553SArmin Le Grand const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
592958da553SArmin Le Grand const basegfx::B2DRange aRange(
593958da553SArmin Le Grand drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(
594958da553SArmin Le Grand xPrimitives,
595958da553SArmin Le Grand aViewInformation2D));
596958da553SArmin Le Grand
597958da553SArmin Le Grand if(!aRange.isEmpty())
598958da553SArmin Le Grand {
599958da553SArmin Le Grand // if we have geometry and it has a range, convert to BitmapEx using
600958da553SArmin Le Grand // common tooling
601958da553SArmin Le Grand aBmp = convertPrimitive2DSequenceToBitmapEx(
602958da553SArmin Le Grand xPrimitives,
603958da553SArmin Le Grand aRange,
604958da553SArmin Le Grand 500000);
605958da553SArmin Le Grand }
606958da553SArmin Le Grand }
607cdf0e10cSrcweir }
608cdf0e10cSrcweir }
609cdf0e10cSrcweir
610cdf0e10cSrcweir return aBmp;
611cdf0e10cSrcweir }
612cdf0e10cSrcweir
613cdf0e10cSrcweir // -----------------------------------------------------------------------------
614cdf0e10cSrcweir
GetMarkedObjMetaFile(bool bNoVDevIfOneMtfMarked) const615bb18ee55SArmin Le Grand GDIMetaFile SdrExchangeView::GetMarkedObjMetaFile(bool bNoVDevIfOneMtfMarked) const
616cdf0e10cSrcweir {
617cdf0e10cSrcweir GDIMetaFile aMtf;
618cdf0e10cSrcweir
619cdf0e10cSrcweir if( AreObjectsMarked() )
620cdf0e10cSrcweir {
621cdf0e10cSrcweir Rectangle aBound( GetMarkedObjBoundRect() );
622cdf0e10cSrcweir Size aBoundSize( aBound.GetWidth(), aBound.GetHeight() );
623cdf0e10cSrcweir MapMode aMap( pMod->GetScaleUnit(), Point(), pMod->GetScaleFraction(), pMod->GetScaleFraction() );
624cdf0e10cSrcweir
625cdf0e10cSrcweir if( bNoVDevIfOneMtfMarked )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir SdrObject* pGrafObjTmp = GetMarkedObjectByIndex( 0 );
628cdf0e10cSrcweir SdrGrafObj* pGrafObj = ( GetMarkedObjectCount() ==1 ) ? PTR_CAST( SdrGrafObj, pGrafObjTmp ) : NULL;
629cdf0e10cSrcweir
630cdf0e10cSrcweir if( pGrafObj )
631cdf0e10cSrcweir {
632cdf0e10cSrcweir Graphic aGraphic( pGrafObj->GetTransformedGraphic() );
633cdf0e10cSrcweir
634cb0a2370SArmin Le Grand // #119735# just use GetGDIMetaFile, it will create a bufferd version of contained bitmap now automatically
635cdf0e10cSrcweir aMtf = aGraphic.GetGDIMetaFile();
636cdf0e10cSrcweir }
637cdf0e10cSrcweir }
638cdf0e10cSrcweir
639cdf0e10cSrcweir if( !aMtf.GetActionCount() )
640cdf0e10cSrcweir {
641cdf0e10cSrcweir VirtualDevice aOut;
64247a7c0c1SArmin Le Grand const Size aDummySize(2, 2);
643cdf0e10cSrcweir
644cdf0e10cSrcweir aOut.SetOutputSizePixel(aDummySize);
64547a7c0c1SArmin Le Grand aOut.EnableOutput(false);
646cdf0e10cSrcweir aOut.SetMapMode(aMap);
647cdf0e10cSrcweir aMtf.Clear();
648cdf0e10cSrcweir aMtf.Record(&aOut);
649cdf0e10cSrcweir
650cdf0e10cSrcweir DrawMarkedObj(aOut);
651cdf0e10cSrcweir
652cdf0e10cSrcweir aMtf.Stop();
653cdf0e10cSrcweir aMtf.WindStart();
65447a7c0c1SArmin Le Grand
65547a7c0c1SArmin Le Grand // moving the result is more reliable then setting a relative MapMode at the VDev (used
65647a7c0c1SArmin Le Grand // before), also see #i99268# in GetObjGraphic() below. Some draw actions at
65747a7c0c1SArmin Le Grand // the OutDev are simply not handled correctly when a MapMode is set at the
65847a7c0c1SArmin Le Grand // target devive, e.g. MetaFloatTransparentAction. Even the Move for this action
65947a7c0c1SArmin Le Grand // was missing the manipulation of the embedded Metafile
66047a7c0c1SArmin Le Grand aMtf.Move(-aBound.Left(), -aBound.Top());
66147a7c0c1SArmin Le Grand
662cdf0e10cSrcweir aMtf.SetPrefMapMode( aMap );
663cdf0e10cSrcweir
664cdf0e10cSrcweir // removed PrefSize extension. It is principially wrong to set a reduced size at
665cdf0e10cSrcweir // the created MetaFile. The mentioned errors occurr at output time since the integer
666cdf0e10cSrcweir // MapModes from VCL lead to errors. It is now corrected in the VCLRenderer for
667cdf0e10cSrcweir // primitives (and may later be done in breaking up a MetaFile to primitives)
668cdf0e10cSrcweir aMtf.SetPrefSize(aBoundSize);
669cdf0e10cSrcweir }
670cdf0e10cSrcweir }
671cdf0e10cSrcweir
672cdf0e10cSrcweir return aMtf;
673cdf0e10cSrcweir }
674cdf0e10cSrcweir
675cdf0e10cSrcweir // -----------------------------------------------------------------------------
676cdf0e10cSrcweir
GetAllMarkedGraphic() const677cdf0e10cSrcweir Graphic SdrExchangeView::GetAllMarkedGraphic() const
678cdf0e10cSrcweir {
679cdf0e10cSrcweir Graphic aRet;
680cdf0e10cSrcweir
681cdf0e10cSrcweir if( AreObjectsMarked() )
682cdf0e10cSrcweir {
683cdf0e10cSrcweir if( ( 1 == GetMarkedObjectCount() ) && GetSdrMarkByIndex( 0 ) )
684cdf0e10cSrcweir aRet = SdrExchangeView::GetObjGraphic( pMod, GetMarkedObjectByIndex( 0 ) );
685cdf0e10cSrcweir else
686bb18ee55SArmin Le Grand aRet = GetMarkedObjMetaFile(false);
687cdf0e10cSrcweir }
688cdf0e10cSrcweir
689cdf0e10cSrcweir return aRet;
690cdf0e10cSrcweir }
691cdf0e10cSrcweir
692cdf0e10cSrcweir // -----------------------------------------------------------------------------
693cdf0e10cSrcweir
GetObjGraphic(const SdrModel * pModel,const SdrObject * pObj)694cdf0e10cSrcweir Graphic SdrExchangeView::GetObjGraphic( const SdrModel* pModel, const SdrObject* pObj )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir Graphic aRet;
697cdf0e10cSrcweir
698cdf0e10cSrcweir if( pModel && pObj )
699cdf0e10cSrcweir {
700cdf0e10cSrcweir // try to get a graphic from the object first
701cdf0e10cSrcweir const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(pObj);
702cdf0e10cSrcweir const SdrOle2Obj* pSdrOle2Obj = dynamic_cast< const SdrOle2Obj* >(pObj);
703cdf0e10cSrcweir
704cdf0e10cSrcweir if(pSdrGrafObj)
705cdf0e10cSrcweir {
706ddde725dSArmin Le Grand if(pSdrGrafObj->isEmbeddedSvg())
707ddde725dSArmin Le Grand {
708ddde725dSArmin Le Grand // get Metafile for Svg content
709ddde725dSArmin Le Grand aRet = pSdrGrafObj->getMetafileFromEmbeddedSvg();
710ddde725dSArmin Le Grand }
711ddde725dSArmin Le Grand else
712ddde725dSArmin Le Grand {
713cdf0e10cSrcweir // #110981# Make behaviour coherent with metafile
714cdf0e10cSrcweir // recording below (which of course also takes
715cdf0e10cSrcweir // view-transformed objects)
716cdf0e10cSrcweir aRet = pSdrGrafObj->GetTransformedGraphic();
717cdf0e10cSrcweir }
718ddde725dSArmin Le Grand }
719cdf0e10cSrcweir else if(pSdrOle2Obj)
720cdf0e10cSrcweir {
721cdf0e10cSrcweir if ( pSdrOle2Obj->GetGraphic() )
722cdf0e10cSrcweir aRet = *pSdrOle2Obj->GetGraphic();
723cdf0e10cSrcweir }
724cdf0e10cSrcweir
725cdf0e10cSrcweir // if graphic could not be retrieved => go the hard way and create a MetaFile
726cdf0e10cSrcweir if( ( GRAPHIC_NONE == aRet.GetType() ) || ( GRAPHIC_DEFAULT == aRet.GetType() ) )
727cdf0e10cSrcweir {
728cdf0e10cSrcweir VirtualDevice aOut;
729cdf0e10cSrcweir GDIMetaFile aMtf;
730cdf0e10cSrcweir const Rectangle aBoundRect( pObj->GetCurrentBoundRect() );
731cdf0e10cSrcweir const MapMode aMap( pModel->GetScaleUnit(),
732cdf0e10cSrcweir Point(),
733cdf0e10cSrcweir pModel->GetScaleFraction(),
734cdf0e10cSrcweir pModel->GetScaleFraction() );
735cdf0e10cSrcweir
736cdf0e10cSrcweir aOut.EnableOutput( sal_False );
737cdf0e10cSrcweir aOut.SetMapMode( aMap );
738cdf0e10cSrcweir aMtf.Record( &aOut );
739cdf0e10cSrcweir pObj->SingleObjectPainter( aOut ); // #110094#-17
740cdf0e10cSrcweir aMtf.Stop();
741cdf0e10cSrcweir aMtf.WindStart();
742cdf0e10cSrcweir
743cdf0e10cSrcweir // #i99268# replace the original offset from using XOutDev's SetOffset
744cdf0e10cSrcweir // NOT (as tried with #i92760#) with another MapMode which gets recorded
74547a7c0c1SArmin Le Grand // by the Metafile itself (what always leads to problems), but by
74647a7c0c1SArmin Le Grand // moving the result directly
747cdf0e10cSrcweir aMtf.Move(-aBoundRect.Left(), -aBoundRect.Top());
748cdf0e10cSrcweir
749cdf0e10cSrcweir aMtf.SetPrefMapMode( aMap );
750cdf0e10cSrcweir aMtf.SetPrefSize( aBoundRect.GetSize() );
751cdf0e10cSrcweir
752cdf0e10cSrcweir if( aMtf.GetActionCount() )
753cdf0e10cSrcweir aRet = aMtf;
754cdf0e10cSrcweir }
755cdf0e10cSrcweir }
756cdf0e10cSrcweir
757cdf0e10cSrcweir return aRet;
758cdf0e10cSrcweir }
759cdf0e10cSrcweir
760cdf0e10cSrcweir // -----------------------------------------------------------------------------
761cdf0e10cSrcweir
GetMarkedObjects() const762958da553SArmin Le Grand ::std::vector< SdrObject* > SdrExchangeView::GetMarkedObjects() const
763cdf0e10cSrcweir {
764cdf0e10cSrcweir SortMarkedObjects();
765958da553SArmin Le Grand ::std::vector< SdrObject* > aRetval;
766cdf0e10cSrcweir
767cdf0e10cSrcweir ::std::vector< ::std::vector< SdrMark* > > aObjVectors( 2 );
768cdf0e10cSrcweir ::std::vector< SdrMark* >& rObjVector1 = aObjVectors[ 0 ];
769cdf0e10cSrcweir ::std::vector< SdrMark* >& rObjVector2 = aObjVectors[ 1 ];
770cdf0e10cSrcweir const SdrLayerAdmin& rLayerAdmin = pMod->GetLayerAdmin();
771cdf0e10cSrcweir const sal_uInt32 nControlLayerId = rLayerAdmin.GetLayerID( rLayerAdmin.GetControlLayerName(), sal_False );
772cdf0e10cSrcweir sal_uInt32 n, nCount;
773cdf0e10cSrcweir
774cdf0e10cSrcweir for( n = 0, nCount = GetMarkedObjectCount(); n < nCount; n++ )
775cdf0e10cSrcweir {
776cdf0e10cSrcweir SdrMark* pMark = GetSdrMarkByIndex( n );
777cdf0e10cSrcweir
778cdf0e10cSrcweir // paint objects on control layer on top of all otherobjects
779cdf0e10cSrcweir if( nControlLayerId == pMark->GetMarkedSdrObj()->GetLayer() )
780cdf0e10cSrcweir rObjVector2.push_back( pMark );
781cdf0e10cSrcweir else
782cdf0e10cSrcweir rObjVector1.push_back( pMark );
783cdf0e10cSrcweir }
784cdf0e10cSrcweir
785cdf0e10cSrcweir for( n = 0, nCount = aObjVectors.size(); n < nCount; n++ )
786cdf0e10cSrcweir {
787cdf0e10cSrcweir ::std::vector< SdrMark* >& rObjVector = aObjVectors[ n ];
788cdf0e10cSrcweir
789cdf0e10cSrcweir for( sal_uInt32 i = 0; i < rObjVector.size(); i++ )
790cdf0e10cSrcweir {
791cdf0e10cSrcweir SdrMark* pMark = rObjVector[ i ];
792958da553SArmin Le Grand aRetval.push_back(pMark->GetMarkedSdrObj());
793cdf0e10cSrcweir }
794cdf0e10cSrcweir }
795958da553SArmin Le Grand
796958da553SArmin Le Grand return aRetval;
797958da553SArmin Le Grand }
798958da553SArmin Le Grand
799958da553SArmin Le Grand // -----------------------------------------------------------------------------
800958da553SArmin Le Grand
DrawMarkedObj(OutputDevice & rOut) const801958da553SArmin Le Grand void SdrExchangeView::DrawMarkedObj(OutputDevice& rOut) const
802958da553SArmin Le Grand {
803958da553SArmin Le Grand ::std::vector< SdrObject* > aSdrObjects(GetMarkedObjects());
804958da553SArmin Le Grand
805958da553SArmin Le Grand if(aSdrObjects.size())
806958da553SArmin Le Grand {
807958da553SArmin Le Grand sdr::contact::ObjectContactOfObjListPainter aPainter(rOut, aSdrObjects, aSdrObjects[0]->GetPage());
808958da553SArmin Le Grand sdr::contact::DisplayInfo aDisplayInfo;
809958da553SArmin Le Grand
810958da553SArmin Le Grand // do processing
811958da553SArmin Le Grand aPainter.ProcessDisplay(aDisplayInfo);
812958da553SArmin Le Grand }
813cdf0e10cSrcweir }
814cdf0e10cSrcweir
815cdf0e10cSrcweir // -----------------------------------------------------------------------------
816cdf0e10cSrcweir
GetMarkedObjModel() const817cdf0e10cSrcweir SdrModel* SdrExchangeView::GetMarkedObjModel() const
818cdf0e10cSrcweir {
819cdf0e10cSrcweir // Wenn das sortieren der MarkList mal stoeren sollte,
820cdf0e10cSrcweir // werde ich sie mir wohl kopieren muessen.
821cdf0e10cSrcweir SortMarkedObjects();
822cdf0e10cSrcweir SdrModel* pNeuMod=pMod->AllocModel();
823cdf0e10cSrcweir SdrPage* pNeuPag=pNeuMod->AllocPage(sal_False);
824cdf0e10cSrcweir pNeuMod->InsertPage(pNeuPag);
825cdf0e10cSrcweir
826cdf0e10cSrcweir if( !mxSelectionController.is() || !mxSelectionController->GetMarkedObjModel( pNeuPag ) )
827cdf0e10cSrcweir {
828958da553SArmin Le Grand ::std::vector< SdrObject* > aSdrObjects(GetMarkedObjects());
829cdf0e10cSrcweir
830cdf0e10cSrcweir // #i13033#
831cdf0e10cSrcweir // New mechanism to re-create the connections of cloned connectors
832cdf0e10cSrcweir CloneList aCloneList;
833958da553SArmin Le Grand sal_uInt32 nCloneErrCnt(0);
834cdf0e10cSrcweir
835958da553SArmin Le Grand for( sal_uInt32 i(0); i < aSdrObjects.size(); i++ )
836cdf0e10cSrcweir {
837958da553SArmin Le Grand const SdrObject* pObj = aSdrObjects[i];
838cdf0e10cSrcweir SdrObject* pNeuObj;
839cdf0e10cSrcweir
840cdf0e10cSrcweir if( pObj->ISA( SdrPageObj ) )
841cdf0e10cSrcweir {
842cdf0e10cSrcweir // convert SdrPageObj's to a graphic representation, because
843cdf0e10cSrcweir // virtual connection to referenced page gets lost in new model
844cdf0e10cSrcweir pNeuObj = new SdrGrafObj( GetObjGraphic( pMod, pObj ), pObj->GetLogicRect() );
845cdf0e10cSrcweir pNeuObj->SetPage( pNeuPag );
846cdf0e10cSrcweir pNeuObj->SetModel( pNeuMod );
847cdf0e10cSrcweir }
848cdf0e10cSrcweir else
849cdf0e10cSrcweir {
850cdf0e10cSrcweir // #116235#
851cdf0e10cSrcweir // pNeuObj = pObj->Clone( pNeuPag, pNeuMod );
852cdf0e10cSrcweir pNeuObj = pObj->Clone();
853cdf0e10cSrcweir pNeuObj->SetPage( pNeuPag );
854cdf0e10cSrcweir pNeuObj->SetModel( pNeuMod );
855cdf0e10cSrcweir }
856cdf0e10cSrcweir
857cdf0e10cSrcweir if( pNeuObj )
858cdf0e10cSrcweir {
859cdf0e10cSrcweir SdrInsertReason aReason(SDRREASON_VIEWCALL);
860cdf0e10cSrcweir pNeuPag->InsertObject(pNeuObj,CONTAINER_APPEND,&aReason);
861cdf0e10cSrcweir
862cdf0e10cSrcweir // #i13033#
863cdf0e10cSrcweir aCloneList.AddPair(pObj, pNeuObj);
864cdf0e10cSrcweir }
865cdf0e10cSrcweir else
866cdf0e10cSrcweir nCloneErrCnt++;
867cdf0e10cSrcweir }
868cdf0e10cSrcweir
869cdf0e10cSrcweir // #i13033#
870cdf0e10cSrcweir // New mechanism to re-create the connections of cloned connectors
871cdf0e10cSrcweir aCloneList.CopyConnections();
872cdf0e10cSrcweir
873cdf0e10cSrcweir if(0L != nCloneErrCnt)
874cdf0e10cSrcweir {
875cdf0e10cSrcweir #ifdef DBG_UTIL
876cdf0e10cSrcweir ByteString aStr("SdrExchangeView::GetMarkedObjModel(): Fehler beim Clonen ");
877cdf0e10cSrcweir
878cdf0e10cSrcweir if(nCloneErrCnt == 1)
879cdf0e10cSrcweir {
880cdf0e10cSrcweir aStr += "eines Zeichenobjekts.";
881cdf0e10cSrcweir }
882cdf0e10cSrcweir else
883cdf0e10cSrcweir {
884cdf0e10cSrcweir aStr += "von ";
885cdf0e10cSrcweir aStr += ByteString::CreateFromInt32( nCloneErrCnt );
886cdf0e10cSrcweir aStr += " Zeichenobjekten.";
887cdf0e10cSrcweir }
888cdf0e10cSrcweir
889cdf0e10cSrcweir aStr += " Objektverbindungen werden nicht mitkopiert.";
890cdf0e10cSrcweir
891cdf0e10cSrcweir DBG_ERROR(aStr.GetBuffer());
892cdf0e10cSrcweir #endif
893cdf0e10cSrcweir }
894cdf0e10cSrcweir }
895cdf0e10cSrcweir return pNeuMod;
896cdf0e10cSrcweir }
897cdf0e10cSrcweir
898cdf0e10cSrcweir // -----------------------------------------------------------------------------
899cdf0e10cSrcweir
Cut(sal_uIntPtr)900cdf0e10cSrcweir sal_Bool SdrExchangeView::Cut( sal_uIntPtr /*nFormat */)
901cdf0e10cSrcweir {
902cdf0e10cSrcweir DBG_ERROR( "SdrExchangeView::Cut: Not supported anymore" );
903cdf0e10cSrcweir return sal_False;
904cdf0e10cSrcweir }
905cdf0e10cSrcweir
906cdf0e10cSrcweir // -----------------------------------------------------------------------------
907cdf0e10cSrcweir
CutMarked(sal_uIntPtr)908cdf0e10cSrcweir void SdrExchangeView::CutMarked( sal_uIntPtr /*nFormat */)
909cdf0e10cSrcweir {
910cdf0e10cSrcweir DBG_ERROR( "SdrExchangeView::CutMarked: Not supported anymore" );
911cdf0e10cSrcweir }
912cdf0e10cSrcweir
913cdf0e10cSrcweir // -----------------------------------------------------------------------------
914cdf0e10cSrcweir
Yank(sal_uIntPtr)915cdf0e10cSrcweir sal_Bool SdrExchangeView::Yank(sal_uIntPtr /*nFormat*/)
916cdf0e10cSrcweir {
917cdf0e10cSrcweir DBG_ERROR( "SdrExchangeView::Yank: Not supported anymore" );
918cdf0e10cSrcweir return sal_False;
919cdf0e10cSrcweir }
920cdf0e10cSrcweir
921cdf0e10cSrcweir // -----------------------------------------------------------------------------
922cdf0e10cSrcweir
YankMarked(sal_uIntPtr)923cdf0e10cSrcweir void SdrExchangeView::YankMarked(sal_uIntPtr /*nFormat*/)
924cdf0e10cSrcweir {
925cdf0e10cSrcweir DBG_ERROR( "YankMarked: Not supported anymore" );
926cdf0e10cSrcweir }
927cdf0e10cSrcweir
928cdf0e10cSrcweir // -----------------------------------------------------------------------------
929cdf0e10cSrcweir
Paste(Window *,sal_uIntPtr)930cdf0e10cSrcweir sal_Bool SdrExchangeView::Paste(Window* /*pWin*/, sal_uIntPtr /*nFormat*/)
931cdf0e10cSrcweir {
932cdf0e10cSrcweir DBG_ERROR( "SdrExchangeView::Paste: Not supported anymore" );
933cdf0e10cSrcweir return sal_False;
934cdf0e10cSrcweir }
9359f63b866SArmin Le Grand
9369f63b866SArmin Le Grand // eof
937