xref: /AOO41X/main/svx/source/svdraw/svdogrp.cxx (revision ca62e2c2083b5d0995f1245bad6c2edfb455fbec)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <sfx2/linkmgr.hxx>
27 
28 #include <ucbhelper/content.hxx>
29 #include <ucbhelper/contentbroker.hxx>
30 #include <unotools/datetime.hxx>
31 
32 #include <svx/svdogrp.hxx>
33 
34 #include <sfx2/lnkbase.hxx>
35 #include <tools/urlobj.hxx>
36 
37 #include <svl/urihelper.hxx>
38 
39 #include <svx/xpool.hxx>
40 #include <svx/xpoly.hxx>
41 
42 #include <svx/svdmodel.hxx>
43 #include <svx/svdpage.hxx>
44 #include "svx/svditer.hxx"
45 #include <svx/svdobj.hxx>
46 #include <svx/svdtrans.hxx>
47 #include <svx/svdetc.hxx>
48 #include <svx/svdattrx.hxx>  // NotPersistItems
49 #include <svx/svdoedge.hxx>  // #32383# Die Verbinder nach Move nochmal anbroadcasten
50 #include "svx/svdglob.hxx"   // StringCache
51 #include "svx/svdstr.hrc"    // Objektname
52 
53 #include <svx/svxids.hrc>
54 #include <svl/whiter.hxx>
55 #include <svx/svdpool.hxx>
56 #include <svx/sdr/properties/groupproperties.hxx>
57 
58 // #110094#
59 #include <svx/sdr/contact/viewcontactofgroup.hxx>
60 #include <basegfx/range/b2drange.hxx>
61 #include <basegfx/polygon/b2dpolygontools.hxx>
62 #include <basegfx/polygon/b2dpolygon.hxx>
63 
64 ////////////////////////////////////////////////////////////////////////////////////////////////////
65 //
66 //   @@@@  @@@@@  @@@@@@   @@@@  @@@@@   @@@@  @@  @@ @@@@@
67 //  @@  @@ @@  @@     @@  @@     @@  @@ @@  @@ @@  @@ @@  @@
68 //  @@  @@ @@@@@      @@  @@ @@@ @@@@@  @@  @@ @@  @@ @@@@@
69 //  @@  @@ @@  @@ @@  @@  @@  @@ @@  @@ @@  @@ @@  @@ @@
70 //   @@@@  @@@@@   @@@@    @@@@@ @@  @@  @@@@   @@@@  @@
71 //
72 ////////////////////////////////////////////////////////////////////////////////////////////////////
73 
74 //////////////////////////////////////////////////////////////////////////////
75 // BaseProperties section
76 
CreateObjectSpecificProperties()77 sdr::properties::BaseProperties* SdrObjGroup::CreateObjectSpecificProperties()
78 {
79     return new sdr::properties::GroupProperties(*this);
80 }
81 
82 //////////////////////////////////////////////////////////////////////////////
83 // #110094# DrawContact section
84 
CreateObjectSpecificViewContact()85 sdr::contact::ViewContact* SdrObjGroup::CreateObjectSpecificViewContact()
86 {
87     return new sdr::contact::ViewContactOfGroup(*this);
88 }
89 
90 //////////////////////////////////////////////////////////////////////////////
91 
92 TYPEINIT1(SdrObjGroup,SdrObject);
93 
SdrObjGroup()94 SdrObjGroup::SdrObjGroup()
95 {
96     pSub=new SdrObjList(NULL,NULL);
97     pSub->SetOwnerObj(this);
98     pSub->SetListKind(SDROBJLIST_GROUPOBJ);
99     bRefPoint=sal_False;
100     bClosedObj=sal_False;
101 }
102 
103 
~SdrObjGroup()104 SdrObjGroup::~SdrObjGroup()
105 {
106     delete pSub;
107 }
108 
TakeObjInfo(SdrObjTransformInfoRec & rInfo) const109 void SdrObjGroup::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
110 {
111     rInfo.bNoContortion=sal_False;
112     SdrObjList* pOL=pSub;
113     sal_uIntPtr nObjAnz=pOL->GetObjCount();
114     for (sal_uIntPtr i=0; i<nObjAnz; i++) {
115         SdrObject* pObj=pOL->GetObj(i);
116         SdrObjTransformInfoRec aInfo;
117         pObj->TakeObjInfo(aInfo);
118         if (!aInfo.bMoveAllowed            ) rInfo.bMoveAllowed            =sal_False;
119         if (!aInfo.bResizeFreeAllowed      ) rInfo.bResizeFreeAllowed      =sal_False;
120         if (!aInfo.bResizePropAllowed      ) rInfo.bResizePropAllowed      =sal_False;
121         if (!aInfo.bRotateFreeAllowed      ) rInfo.bRotateFreeAllowed      =sal_False;
122         if (!aInfo.bRotate90Allowed        ) rInfo.bRotate90Allowed        =sal_False;
123         if (!aInfo.bMirrorFreeAllowed      ) rInfo.bMirrorFreeAllowed      =sal_False;
124         if (!aInfo.bMirror45Allowed        ) rInfo.bMirror45Allowed        =sal_False;
125         if (!aInfo.bMirror90Allowed        ) rInfo.bMirror90Allowed        =sal_False;
126         if (!aInfo.bShearAllowed           ) rInfo.bShearAllowed           =sal_False;
127         if (!aInfo.bEdgeRadiusAllowed      ) rInfo.bEdgeRadiusAllowed      =sal_False;
128         if (!aInfo.bNoOrthoDesired         ) rInfo.bNoOrthoDesired         =sal_False;
129         if (aInfo.bNoContortion            ) rInfo.bNoContortion           =sal_True;
130         if (!aInfo.bCanConvToPath          ) rInfo.bCanConvToPath          =sal_False;
131 
132         if(!aInfo.bCanConvToContour)
133             rInfo.bCanConvToContour = sal_False;
134 
135         if (!aInfo.bCanConvToPoly          ) rInfo.bCanConvToPoly          =sal_False;
136         if (!aInfo.bCanConvToPathLineToArea) rInfo.bCanConvToPathLineToArea=sal_False;
137         if (!aInfo.bCanConvToPolyLineToArea) rInfo.bCanConvToPolyLineToArea=sal_False;
138     }
139     if (nObjAnz==0) {
140         rInfo.bRotateFreeAllowed=sal_False;
141         rInfo.bRotate90Allowed  =sal_False;
142         rInfo.bMirrorFreeAllowed=sal_False;
143         rInfo.bMirror45Allowed  =sal_False;
144         rInfo.bMirror90Allowed  =sal_False;
145         rInfo.bTransparenceAllowed = sal_False;
146         rInfo.bGradientAllowed = sal_False;
147         rInfo.bShearAllowed     =sal_False;
148         rInfo.bEdgeRadiusAllowed=sal_False;
149         rInfo.bNoContortion     =sal_True;
150     }
151     if(nObjAnz != 1)
152     {
153         // only allowed if single object selected
154         rInfo.bTransparenceAllowed = sal_False;
155         rInfo.bGradientAllowed = sal_False;
156     }
157 }
158 
159 
SetBoundRectDirty()160 void SdrObjGroup::SetBoundRectDirty()
161 {
162     // avoid resetting aOutRect which in case of this object is model data,
163     // not re-creatable view data
164 }
165 
GetObjIdentifier() const166 sal_uInt16 SdrObjGroup::GetObjIdentifier() const
167 {
168     return sal_uInt16(OBJ_GRUP);
169 }
170 
171 
GetLayer() const172 SdrLayerID SdrObjGroup::GetLayer() const
173 {
174     FASTBOOL b1st=sal_True;
175     SdrLayerID nLay=SdrLayerID(SdrObject::GetLayer());
176     SdrObjList* pOL=pSub;
177     sal_uIntPtr nObjAnz=pOL->GetObjCount();
178     for (sal_uIntPtr i=0; i<nObjAnz; i++) {
179         SdrLayerID nLay1=pOL->GetObj(i)->GetLayer();
180         if (b1st) { nLay=nLay1; b1st=sal_False; }
181         else if (nLay1!=nLay) return 0;
182     }
183     return nLay;
184 }
185 
186 
NbcSetLayer(SdrLayerID nLayer)187 void SdrObjGroup::NbcSetLayer(SdrLayerID nLayer)
188 {
189     SdrObject::NbcSetLayer(nLayer);
190     SdrObjList* pOL=pSub;
191     sal_uIntPtr nObjAnz=pOL->GetObjCount();
192     for (sal_uIntPtr i=0; i<nObjAnz; i++) {
193         pOL->GetObj(i)->NbcSetLayer(nLayer);
194     }
195 }
196 
197 
SetObjList(SdrObjList * pNewObjList)198 void SdrObjGroup::SetObjList(SdrObjList* pNewObjList)
199 {
200     SdrObject::SetObjList(pNewObjList);
201     pSub->SetUpList(pNewObjList);
202 }
203 
204 
SetPage(SdrPage * pNewPage)205 void SdrObjGroup::SetPage(SdrPage* pNewPage)
206 {
207     SdrObject::SetPage(pNewPage);
208     pSub->SetPage(pNewPage);
209 }
210 
211 
SetModel(SdrModel * pNewModel)212 void SdrObjGroup::SetModel(SdrModel* pNewModel)
213 {
214     if(pNewModel!=pModel)
215     {
216         // #i30648#
217         // This method also needs to migrate the used ItemSet
218         // when the destination model uses a different pool
219         // than the current one. Else it is possible to create
220         // SdrObjGroups which reference the old pool which might
221         // be destroyed (as the bug shows).
222         SdrModel* pOldModel = pModel;
223 
224         // test for correct pool in ItemSet; move to new pool if necessary
225         if(pNewModel && GetObjectItemPool() && GetObjectItemPool() != &pNewModel->GetItemPool())
226         {
227             MigrateItemPool(GetObjectItemPool(), &pNewModel->GetItemPool(), pNewModel);
228         }
229 
230         // call parent
231         SdrObject::SetModel(pNewModel);
232 
233         // set new model at content
234         pSub->SetModel(pNewModel);
235 
236         // modify properties
237         GetProperties().SetModel(pOldModel, pNewModel);
238     }
239 }
240 
241 
HasRefPoint() const242 FASTBOOL SdrObjGroup::HasRefPoint() const
243 {
244     return bRefPoint;
245 }
246 
247 
GetRefPoint() const248 Point SdrObjGroup::GetRefPoint() const
249 {
250     return aRefPoint;
251 }
252 
253 
SetRefPoint(const Point & rPnt)254 void SdrObjGroup::SetRefPoint(const Point& rPnt)
255 {
256     bRefPoint=sal_True;
257     aRefPoint=rPnt;
258 }
259 
260 
GetSubList() const261 SdrObjList* SdrObjGroup::GetSubList() const
262 {
263     return pSub;
264 }
265 
GetCurrentBoundRect() const266 const Rectangle& SdrObjGroup::GetCurrentBoundRect() const
267 {
268     // --> OD 2007-02-01 #144962#
269     // <aOutRect> has to contain the bounding rectangle
270     if ( pSub->GetObjCount()!=0 )
271     {
272         const_cast<SdrObjGroup*>(this)->aOutRect = pSub->GetAllObjBoundRect();
273     }
274 
275     return aOutRect;
276     // <--
277 }
278 
GetSnapRect() const279 const Rectangle& SdrObjGroup::GetSnapRect() const
280 {
281     // --> OD 2007-02-01 #144962#
282     // <aOutRect> has to contain the bounding rectangle
283     if ( pSub->GetObjCount()!=0 )
284     {
285         return pSub->GetAllObjSnapRect();
286     }
287     else
288     {
289         return aOutRect;
290     }
291     // <--
292 }
293 
operator =(const SdrObject & rObj)294 void SdrObjGroup::operator=(const SdrObject& rObj)
295 {
296     if(rObj.IsGroupObject())
297     {
298         // copy SdrObject stuff
299         SdrObject::operator=(rObj);
300 
301         // #i36404#
302         // copy SubList, init model and page first
303         SdrObjList& rSourceSubList = *rObj.GetSubList();
304         pSub->SetPage(rSourceSubList.GetPage());
305         pSub->SetModel(rSourceSubList.GetModel());
306         pSub->CopyObjects(*rObj.GetSubList());
307 
308         // copy local paremeters
309         aRefPoint  =((SdrObjGroup&)rObj).aRefPoint;
310         bRefPoint  =((SdrObjGroup&)rObj).bRefPoint;
311     }
312 }
313 
314 
TakeObjNameSingul(XubString & rName) const315 void SdrObjGroup::TakeObjNameSingul(XubString& rName) const
316 {
317     if(!pSub->GetObjCount())
318     {
319         rName = ImpGetResStr(STR_ObjNameSingulGRUPEMPTY);
320     }
321     else
322     {
323         rName = ImpGetResStr(STR_ObjNameSingulGRUP);
324     }
325 
326     const String aName(GetName());
327 
328     if(aName.Len())
329     {
330         rName += sal_Unicode(' ');
331         rName += sal_Unicode('\'');
332         rName += aName;
333         rName += sal_Unicode('\'');
334     }
335 }
336 
337 
TakeObjNamePlural(XubString & rName) const338 void SdrObjGroup::TakeObjNamePlural(XubString& rName) const
339 {
340     if (pSub->GetObjCount()==0) {
341         rName=ImpGetResStr(STR_ObjNamePluralGRUPEMPTY);
342     } else {
343         rName=ImpGetResStr(STR_ObjNamePluralGRUP);
344     }
345 }
346 
347 
RecalcSnapRect()348 void SdrObjGroup::RecalcSnapRect()
349 {
350     // nicht erforderlich, da die Rects von der SubList verwendet werden.
351 }
352 
TakeXorPoly() const353 basegfx::B2DPolyPolygon SdrObjGroup::TakeXorPoly() const
354 {
355     basegfx::B2DPolyPolygon aRetval;
356     const sal_uInt32 nObjCount(pSub->GetObjCount());
357 
358     for(sal_uInt32 a(0L); a < nObjCount; a++)
359     {
360         SdrObject* pObj = pSub->GetObj(a);
361         aRetval.append(pObj->TakeXorPoly());
362     }
363 
364     if(!aRetval.count())
365     {
366         const basegfx::B2DRange aRange(aOutRect.Left(), aOutRect.Top(), aOutRect.Right(), aOutRect.Bottom());
367         aRetval.append(basegfx::tools::createPolygonFromRect(aRange));
368     }
369 
370     return aRetval;
371 }
372 
beginSpecialDrag(SdrDragStat &) const373 bool SdrObjGroup::beginSpecialDrag(SdrDragStat& /*rDrag*/) const
374 {
375     return false;
376 }
377 
378 
BegCreate(SdrDragStat &)379 FASTBOOL SdrObjGroup::BegCreate(SdrDragStat& /*rStat*/)
380 {
381     return sal_False;
382 }
383 
384 
GetRotateAngle() const385 long SdrObjGroup::GetRotateAngle() const
386 {
387     const sal_uInt32 nObjCount(pSub->GetObjCount());
388     long nRetval(0);
389 
390     if(nObjCount)
391     {
392         SdrObject* pObj = pSub->GetObj(0);
393 
394         nRetval = pObj->GetRotateAngle();
395     }
396 
397     return nRetval;
398 }
399 
400 
GetShearAngle(FASTBOOL) const401 long SdrObjGroup::GetShearAngle(FASTBOOL /*bVertical*/) const
402 {
403     const sal_uInt32 nObjCount(pSub->GetObjCount());
404     long nRetval(0);
405 
406     if(nObjCount)
407     {
408         SdrObject* pObj = pSub->GetObj(0);
409 
410         nRetval = pObj->GetShearAngle();
411     }
412 
413     return nRetval;
414 }
415 
416 
NbcSetSnapRect(const Rectangle & rRect)417 void SdrObjGroup::NbcSetSnapRect(const Rectangle& rRect)
418 {
419     Rectangle aOld(GetSnapRect());
420     long nMulX=rRect.Right()-rRect.Left();
421     long nDivX=aOld.Right()-aOld.Left();
422     long nMulY=rRect.Bottom()-rRect.Top();
423     long nDivY=aOld.Bottom()-aOld.Top();
424     if (nDivX==0) { nMulX=1; nDivX=1; }
425     if (nDivY==0) { nMulY=1; nDivY=1; }
426     if (nMulX!=nDivX || nMulY!=nDivY) {
427         Fraction aX(nMulX,nDivX);
428         Fraction aY(nMulY,nDivY);
429         NbcResize(aOld.TopLeft(),aX,aY);
430     }
431     if (rRect.Left()!=aOld.Left() || rRect.Top()!=aOld.Top()) {
432         NbcMove(Size(rRect.Left()-aOld.Left(),rRect.Top()-aOld.Top()));
433     }
434 }
435 
436 
NbcSetLogicRect(const Rectangle & rRect)437 void SdrObjGroup::NbcSetLogicRect(const Rectangle& rRect)
438 {
439     NbcSetSnapRect(rRect);
440 }
441 
442 
NbcMove(const Size & rSiz)443 void SdrObjGroup::NbcMove(const Size& rSiz)
444 {
445     MovePoint(aRefPoint,rSiz);
446     if (pSub->GetObjCount()!=0) {
447         SdrObjList* pOL=pSub;
448         sal_uIntPtr nObjAnz=pOL->GetObjCount();
449         for (sal_uIntPtr i=0; i<nObjAnz; i++) {
450             SdrObject* pObj=pOL->GetObj(i);
451             pObj->NbcMove(rSiz);
452         }
453     } else {
454         MoveRect(aOutRect,rSiz);
455         SetRectsDirty();
456     }
457 }
458 
459 
NbcResize(const Point & rRef,const Fraction & xFact,const Fraction & yFact)460 void SdrObjGroup::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
461 {
462     FASTBOOL bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0);
463     FASTBOOL bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0);
464     if (bXMirr || bYMirr) {
465         Point aRef1(GetSnapRect().Center());
466         if (bXMirr) {
467             Point aRef2(aRef1);
468             aRef2.Y()++;
469             NbcMirrorGluePoints(aRef1,aRef2);
470         }
471         if (bYMirr) {
472             Point aRef2(aRef1);
473             aRef2.X()++;
474             NbcMirrorGluePoints(aRef1,aRef2);
475         }
476     }
477     ResizePoint(aRefPoint,rRef,xFact,yFact);
478     if (pSub->GetObjCount()!=0) {
479         SdrObjList* pOL=pSub;
480         sal_uIntPtr nObjAnz=pOL->GetObjCount();
481         for (sal_uIntPtr i=0; i<nObjAnz; i++) {
482             SdrObject* pObj=pOL->GetObj(i);
483             pObj->NbcResize(rRef,xFact,yFact);
484         }
485     } else {
486         ResizeRect(aOutRect,rRef,xFact,yFact);
487         SetRectsDirty();
488     }
489 }
490 
491 
NbcRotate(const Point & rRef,long nWink,double sn,double cs)492 void SdrObjGroup::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
493 {
494     SetGlueReallyAbsolute(sal_True);
495     RotatePoint(aRefPoint,rRef,sn,cs);
496     SdrObjList* pOL=pSub;
497     sal_uIntPtr nObjAnz=pOL->GetObjCount();
498     for (sal_uIntPtr i=0; i<nObjAnz; i++) {
499         SdrObject* pObj=pOL->GetObj(i);
500         pObj->NbcRotate(rRef,nWink,sn,cs);
501     }
502     NbcRotateGluePoints(rRef,nWink,sn,cs);
503     SetGlueReallyAbsolute(sal_False);
504 }
505 
506 
NbcMirror(const Point & rRef1,const Point & rRef2)507 void SdrObjGroup::NbcMirror(const Point& rRef1, const Point& rRef2)
508 {
509     SetGlueReallyAbsolute(sal_True);
510     MirrorPoint(aRefPoint,rRef1,rRef2); // fehlende Implementation in SvdEtc !!!
511     SdrObjList* pOL=pSub;
512     sal_uIntPtr nObjAnz=pOL->GetObjCount();
513     for (sal_uIntPtr i=0; i<nObjAnz; i++) {
514         SdrObject* pObj=pOL->GetObj(i);
515         pObj->NbcMirror(rRef1,rRef2);
516     }
517     NbcMirrorGluePoints(rRef1,rRef2);
518     SetGlueReallyAbsolute(sal_False);
519 }
520 
521 
NbcShear(const Point & rRef,long nWink,double tn,FASTBOOL bVShear)522 void SdrObjGroup::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
523 {
524     SetGlueReallyAbsolute(sal_True);
525     ShearPoint(aRefPoint,rRef,tn);
526     SdrObjList* pOL=pSub;
527     sal_uIntPtr nObjAnz=pOL->GetObjCount();
528     for (sal_uIntPtr i=0; i<nObjAnz; i++) {
529         SdrObject* pObj=pOL->GetObj(i);
530         pObj->NbcShear(rRef,nWink,tn,bVShear);
531     }
532     NbcShearGluePoints(rRef,nWink,tn,bVShear);
533     SetGlueReallyAbsolute(sal_False);
534 }
535 
536 
NbcSetAnchorPos(const Point & rPnt)537 void SdrObjGroup::NbcSetAnchorPos(const Point& rPnt)
538 {
539     aAnchor=rPnt;
540     Size aSiz(rPnt.X()-aAnchor.X(),rPnt.Y()-aAnchor.Y());
541     MovePoint(aRefPoint,aSiz);
542     SdrObjList* pOL=pSub;
543     sal_uIntPtr nObjAnz=pOL->GetObjCount();
544     for (sal_uIntPtr i=0; i<nObjAnz; i++) {
545         SdrObject* pObj=pOL->GetObj(i);
546         pObj->NbcSetAnchorPos(rPnt);
547     }
548 }
549 
550 
SetSnapRect(const Rectangle & rRect)551 void SdrObjGroup::SetSnapRect(const Rectangle& rRect)
552 {
553     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
554     Rectangle aOld(GetSnapRect());
555     long nMulX=rRect.Right()-rRect.Left();
556     long nDivX=aOld.Right()-aOld.Left();
557     long nMulY=rRect.Bottom()-rRect.Top();
558     long nDivY=aOld.Bottom()-aOld.Top();
559     if (nDivX==0) { nMulX=1; nDivX=1; }
560     if (nDivY==0) { nMulY=1; nDivY=1; }
561     if (nMulX!=nDivX || nMulY!=nDivY) {
562         Fraction aX(nMulX,nDivX);
563         Fraction aY(nMulY,nDivY);
564         Resize(aOld.TopLeft(),aX,aY);
565     }
566     if (rRect.Left()!=aOld.Left() || rRect.Top()!=aOld.Top()) {
567         Move(Size(rRect.Left()-aOld.Left(),rRect.Top()-aOld.Top()));
568     }
569 
570     SetChanged();
571     BroadcastObjectChange();
572     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
573 }
574 
575 
SetLogicRect(const Rectangle & rRect)576 void SdrObjGroup::SetLogicRect(const Rectangle& rRect)
577 {
578     SetSnapRect(rRect);
579 }
580 
581 
Move(const Size & rSiz)582 void SdrObjGroup::Move(const Size& rSiz)
583 {
584     if (rSiz.Width()!=0 || rSiz.Height()!=0) {
585         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
586         MovePoint(aRefPoint,rSiz);
587         if (pSub->GetObjCount()!=0) {
588             // #32383# Erst die Verbinder verschieben, dann den Rest
589             SdrObjList* pOL=pSub;
590             sal_uIntPtr nObjAnz=pOL->GetObjCount();
591             sal_uIntPtr i;
592             for (i=0; i<nObjAnz; i++) {
593                 SdrObject* pObj=pOL->GetObj(i);
594                 if (pObj->IsEdgeObj()) pObj->Move(rSiz);
595             }
596             for (i=0; i<nObjAnz; i++) {
597                 SdrObject* pObj=pOL->GetObj(i);
598                 if (!pObj->IsEdgeObj()) pObj->Move(rSiz);
599             }
600         } else {
601             // #110094#-14 SendRepaintBroadcast();
602             MoveRect(aOutRect,rSiz);
603             SetRectsDirty();
604         }
605 
606         SetChanged();
607         BroadcastObjectChange();
608         SendUserCall(SDRUSERCALL_MOVEONLY,aBoundRect0);
609     }
610 }
611 
612 
Resize(const Point & rRef,const Fraction & xFact,const Fraction & yFact)613 void SdrObjGroup::Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
614 {
615     if (xFact.GetNumerator()!=xFact.GetDenominator() || yFact.GetNumerator()!=yFact.GetDenominator()) {
616         FASTBOOL bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0);
617         FASTBOOL bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0);
618         if (bXMirr || bYMirr) {
619             Point aRef1(GetSnapRect().Center());
620             if (bXMirr) {
621                 Point aRef2(aRef1);
622                 aRef2.Y()++;
623                 NbcMirrorGluePoints(aRef1,aRef2);
624             }
625             if (bYMirr) {
626                 Point aRef2(aRef1);
627                 aRef2.X()++;
628                 NbcMirrorGluePoints(aRef1,aRef2);
629             }
630         }
631         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
632         ResizePoint(aRefPoint,rRef,xFact,yFact);
633         if (pSub->GetObjCount()!=0) {
634             // #32383# Erst die Verbinder verschieben, dann den Rest
635             SdrObjList* pOL=pSub;
636             sal_uIntPtr nObjAnz=pOL->GetObjCount();
637             sal_uIntPtr i;
638             for (i=0; i<nObjAnz; i++) {
639                 SdrObject* pObj=pOL->GetObj(i);
640                 if (pObj->IsEdgeObj()) pObj->Resize(rRef,xFact,yFact);
641             }
642             for (i=0; i<nObjAnz; i++) {
643                 SdrObject* pObj=pOL->GetObj(i);
644                 if (!pObj->IsEdgeObj()) pObj->Resize(rRef,xFact,yFact);
645             }
646         } else {
647             // #110094#-14 SendRepaintBroadcast();
648             ResizeRect(aOutRect,rRef,xFact,yFact);
649             SetRectsDirty();
650         }
651 
652         SetChanged();
653         BroadcastObjectChange();
654         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
655     }
656 }
657 
658 
Rotate(const Point & rRef,long nWink,double sn,double cs)659 void SdrObjGroup::Rotate(const Point& rRef, long nWink, double sn, double cs)
660 {
661     if (nWink!=0) {
662         SetGlueReallyAbsolute(sal_True);
663         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
664         RotatePoint(aRefPoint,rRef,sn,cs);
665         // #32383# Erst die Verbinder verschieben, dann den Rest
666         SdrObjList* pOL=pSub;
667         sal_uIntPtr nObjAnz=pOL->GetObjCount();
668         sal_uIntPtr i;
669         for (i=0; i<nObjAnz; i++) {
670             SdrObject* pObj=pOL->GetObj(i);
671             if (pObj->IsEdgeObj()) pObj->Rotate(rRef,nWink,sn,cs);
672         }
673         for (i=0; i<nObjAnz; i++) {
674             SdrObject* pObj=pOL->GetObj(i);
675             if (!pObj->IsEdgeObj()) pObj->Rotate(rRef,nWink,sn,cs);
676         }
677         NbcRotateGluePoints(rRef,nWink,sn,cs);
678         SetGlueReallyAbsolute(sal_False);
679         SetChanged();
680         BroadcastObjectChange();
681         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
682     }
683 }
684 
685 
Mirror(const Point & rRef1,const Point & rRef2)686 void SdrObjGroup::Mirror(const Point& rRef1, const Point& rRef2)
687 {
688     SetGlueReallyAbsolute(sal_True);
689     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
690     MirrorPoint(aRefPoint,rRef1,rRef2); // fehlende Implementation in SvdEtc !!!
691     // #32383# Erst die Verbinder verschieben, dann den Rest
692     SdrObjList* pOL=pSub;
693     sal_uIntPtr nObjAnz=pOL->GetObjCount();
694     sal_uIntPtr i;
695     for (i=0; i<nObjAnz; i++) {
696         SdrObject* pObj=pOL->GetObj(i);
697         if (pObj->IsEdgeObj()) pObj->Mirror(rRef1,rRef2);
698     }
699     for (i=0; i<nObjAnz; i++) {
700         SdrObject* pObj=pOL->GetObj(i);
701         if (!pObj->IsEdgeObj()) pObj->Mirror(rRef1,rRef2);
702     }
703     NbcMirrorGluePoints(rRef1,rRef2);
704     SetGlueReallyAbsolute(sal_False);
705     SetChanged();
706     BroadcastObjectChange();
707     SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
708 }
709 
710 
Shear(const Point & rRef,long nWink,double tn,FASTBOOL bVShear)711 void SdrObjGroup::Shear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
712 {
713     if (nWink!=0) {
714         SetGlueReallyAbsolute(sal_True);
715         Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
716         ShearPoint(aRefPoint,rRef,tn);
717         // #32383# Erst die Verbinder verschieben, dann den Rest
718         SdrObjList* pOL=pSub;
719         sal_uIntPtr nObjAnz=pOL->GetObjCount();
720         sal_uIntPtr i;
721         for (i=0; i<nObjAnz; i++) {
722             SdrObject* pObj=pOL->GetObj(i);
723             if (pObj->IsEdgeObj()) pObj->Shear(rRef,nWink,tn,bVShear);
724         }
725         for (i=0; i<nObjAnz; i++) {
726             SdrObject* pObj=pOL->GetObj(i);
727             if (!pObj->IsEdgeObj()) pObj->Shear(rRef,nWink,tn,bVShear);
728         }
729         NbcShearGluePoints(rRef,nWink,tn,bVShear);
730         SetGlueReallyAbsolute(sal_False);
731         SetChanged();
732         BroadcastObjectChange();
733         SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
734     }
735 }
736 
737 
SetAnchorPos(const Point & rPnt)738 void SdrObjGroup::SetAnchorPos(const Point& rPnt)
739 {
740     Rectangle aBoundRect0; if (pUserCall!=NULL) aBoundRect0=GetLastBoundRect();
741     FASTBOOL bChg=aAnchor!=rPnt;
742     aAnchor=rPnt;
743     Size aSiz(rPnt.X()-aAnchor.X(),rPnt.Y()-aAnchor.Y());
744     MovePoint(aRefPoint,aSiz);
745     // #32383# Erst die Verbinder verschieben, dann den Rest
746     SdrObjList* pOL=pSub;
747     sal_uIntPtr nObjAnz=pOL->GetObjCount();
748     sal_uIntPtr i;
749     for (i=0; i<nObjAnz; i++) {
750         SdrObject* pObj=pOL->GetObj(i);
751         if (pObj->IsEdgeObj()) pObj->SetAnchorPos(rPnt);
752     }
753     for (i=0; i<nObjAnz; i++) {
754         SdrObject* pObj=pOL->GetObj(i);
755         if (!pObj->IsEdgeObj()) pObj->SetAnchorPos(rPnt);
756     }
757     if (bChg) {
758         SetChanged();
759         BroadcastObjectChange();
760         SendUserCall(SDRUSERCALL_MOVEONLY,aBoundRect0);
761     }
762 }
763 
764 
765 
NbcSetRelativePos(const Point & rPnt)766 void SdrObjGroup::NbcSetRelativePos(const Point& rPnt)
767 {
768     Point aRelPos0(GetSnapRect().TopLeft()-aAnchor);
769     Size aSiz(rPnt.X()-aRelPos0.X(),rPnt.Y()-aRelPos0.Y());
770     NbcMove(aSiz); // Der ruft auch das SetRectsDirty()
771 }
772 
SetRelativePos(const Point & rPnt)773 void SdrObjGroup::SetRelativePos(const Point& rPnt)
774 {
775     Point aRelPos0(GetSnapRect().TopLeft()-aAnchor);
776     Size aSiz(rPnt.X()-aRelPos0.X(),rPnt.Y()-aRelPos0.Y());
777     if (aSiz.Width()!=0 || aSiz.Height()!=0) Move(aSiz); // Der ruft auch das SetRectsDirty() und Broadcast, ...
778 }
779 
NbcReformatText()780 void SdrObjGroup::NbcReformatText()
781 {
782     pSub->NbcReformatAllTextObjects();
783 }
784 
ReformatText()785 void SdrObjGroup::ReformatText()
786 {
787     pSub->ReformatAllTextObjects();
788 }
789 
DoConvertToPolyObj(sal_Bool bBezier,bool bAddText) const790 SdrObject* SdrObjGroup::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const
791 {
792     SdrObject* pGroup = new SdrObjGroup;
793     pGroup->SetModel(GetModel());
794 
795     for(sal_uInt32 a=0;a<pSub->GetObjCount();a++)
796     {
797         SdrObject* pIterObj = pSub->GetObj(a);
798         SdrObject* pResult = pIterObj->DoConvertToPolyObj(bBezier, bAddText);
799 
800         // pResult can be NULL e.g. for empty objects
801         if( pResult )
802             pGroup->GetSubList()->NbcInsertObject(pResult);
803     }
804 
805     return pGroup;
806 }
807 
808 // eof
809