Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <svx/svdorect.hxx>
21 : #include <math.h>
22 : #include <stdlib.h>
23 : #include <svx/xpool.hxx>
24 : #include <svx/xpoly.hxx>
25 : #include <svx/svdattr.hxx>
26 : #include <svx/svdpool.hxx>
27 : #include <svx/svdtrans.hxx>
28 : #include <svx/svdetc.hxx>
29 : #include <svx/svddrag.hxx>
30 : #include <svx/svdmodel.hxx>
31 : #include <svx/svdpage.hxx>
32 : #include <svx/svdocapt.hxx>
33 : #include <svx/svdpagv.hxx>
34 : #include <svx/svdview.hxx>
35 : #include <svx/svdundo.hxx>
36 : #include <svx/svdopath.hxx>
37 : #include "svx/svdglob.hxx"
38 : #include "svx/svdstr.hrc"
39 : #include <svx/xflclit.hxx>
40 : #include <svx/xlnclit.hxx>
41 : #include <svx/xlnwtit.hxx>
42 : #include <svx/sdr/properties/rectangleproperties.hxx>
43 : #include <svx/sdr/contact/viewcontactofsdrrectobj.hxx>
44 : #include <basegfx/polygon/b2dpolygon.hxx>
45 : #include <basegfx/polygon/b2dpolygontools.hxx>
46 :
47 :
48 : // BaseProperties section
49 :
50 0 : sdr::properties::BaseProperties* SdrRectObj::CreateObjectSpecificProperties()
51 : {
52 0 : return new sdr::properties::RectangleProperties(*this);
53 : }
54 :
55 :
56 : // DrawContact section
57 :
58 0 : sdr::contact::ViewContact* SdrRectObj::CreateObjectSpecificViewContact()
59 : {
60 0 : return new sdr::contact::ViewContactOfSdrRectObj(*this);
61 : }
62 :
63 :
64 :
65 0 : TYPEINIT1(SdrRectObj,SdrTextObj);
66 :
67 0 : SdrRectObj::SdrRectObj()
68 0 : : mpXPoly(0L)
69 : {
70 0 : bClosedObj=true;
71 0 : }
72 :
73 0 : SdrRectObj::SdrRectObj(const Rectangle& rRect)
74 : : SdrTextObj(rRect),
75 0 : mpXPoly(NULL)
76 : {
77 0 : bClosedObj=true;
78 0 : }
79 :
80 0 : SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind)
81 : : SdrTextObj(eNewTextKind),
82 0 : mpXPoly(NULL)
83 : {
84 : DBG_ASSERT(eTextKind==OBJ_TEXT || eTextKind==OBJ_TEXTEXT ||
85 : eTextKind==OBJ_OUTLINETEXT || eTextKind==OBJ_TITLETEXT,
86 : "SdrRectObj::SdrRectObj(SdrObjKind) can only be applied to text frames.");
87 0 : bClosedObj=true;
88 0 : }
89 :
90 0 : SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind, const Rectangle& rRect)
91 : : SdrTextObj(eNewTextKind,rRect),
92 0 : mpXPoly(NULL)
93 : {
94 : DBG_ASSERT(eTextKind==OBJ_TEXT || eTextKind==OBJ_TEXTEXT ||
95 : eTextKind==OBJ_OUTLINETEXT || eTextKind==OBJ_TITLETEXT,
96 : "SdrRectObj::SdrRectObj(SdrObjKind,...) can only be applied to text frames.");
97 0 : bClosedObj=true;
98 0 : }
99 :
100 0 : SdrRectObj::~SdrRectObj()
101 : {
102 0 : delete mpXPoly;
103 0 : }
104 :
105 0 : SdrRectObj& SdrRectObj::operator=(const SdrRectObj& rCopy)
106 : {
107 0 : if ( this == &rCopy )
108 0 : return *this;
109 :
110 0 : SdrTextObj::operator=( rCopy );
111 :
112 0 : delete mpXPoly;
113 :
114 0 : if ( rCopy.mpXPoly )
115 0 : mpXPoly = new XPolygon( *rCopy.mpXPoly );
116 : else
117 0 : mpXPoly = NULL;
118 :
119 0 : return *this;
120 : }
121 :
122 0 : void SdrRectObj::SetXPolyDirty()
123 : {
124 0 : delete mpXPoly;
125 0 : mpXPoly = 0L;
126 0 : }
127 :
128 0 : XPolygon SdrRectObj::ImpCalcXPoly(const Rectangle& rRect1, long nRad1) const
129 : {
130 0 : XPolygon aXPoly(rRect1,nRad1,nRad1);
131 0 : const sal_uInt16 nPointAnz(aXPoly.GetPointCount());
132 0 : XPolygon aNeuPoly(nPointAnz+1);
133 0 : sal_uInt16 nShift=nPointAnz-2;
134 0 : if (nRad1!=0) nShift=nPointAnz-5;
135 0 : sal_uInt16 j=nShift;
136 0 : for (sal_uInt16 i=1; i<nPointAnz; i++) {
137 0 : aNeuPoly[i]=aXPoly[j];
138 0 : aNeuPoly.SetFlags(i,aXPoly.GetFlags(j));
139 0 : j++;
140 0 : if (j>=nPointAnz) j=1;
141 : }
142 0 : aNeuPoly[0]=rRect1.BottomCenter();
143 0 : aNeuPoly[nPointAnz]=aNeuPoly[0];
144 0 : aXPoly=aNeuPoly;
145 :
146 : // these angles always relate to the top left corner of aRect
147 0 : if (aGeo.nShearWink!=0) ShearXPoly(aXPoly,aRect.TopLeft(),aGeo.nTan);
148 0 : if (aGeo.nDrehWink!=0) RotateXPoly(aXPoly,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
149 0 : return aXPoly;
150 : }
151 :
152 0 : void SdrRectObj::RecalcXPoly()
153 : {
154 0 : delete mpXPoly;
155 0 : mpXPoly = new XPolygon(ImpCalcXPoly(aRect,GetEckenradius()));
156 0 : }
157 :
158 0 : const XPolygon& SdrRectObj::GetXPoly() const
159 : {
160 0 : if(!mpXPoly)
161 : {
162 0 : ((SdrRectObj*)this)->RecalcXPoly();
163 : }
164 :
165 0 : return *mpXPoly;
166 : }
167 :
168 0 : void SdrRectObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
169 : {
170 0 : bool bNoTextFrame=!IsTextFrame();
171 0 : rInfo.bResizeFreeAllowed=bNoTextFrame || aGeo.nDrehWink%9000==0;
172 0 : rInfo.bResizePropAllowed=true;
173 0 : rInfo.bRotateFreeAllowed=true;
174 0 : rInfo.bRotate90Allowed =true;
175 0 : rInfo.bMirrorFreeAllowed=bNoTextFrame;
176 0 : rInfo.bMirror45Allowed =bNoTextFrame;
177 0 : rInfo.bMirror90Allowed =bNoTextFrame;
178 :
179 : // allow transparency
180 0 : rInfo.bTransparenceAllowed = true;
181 :
182 : // gradient depends on fillstyle
183 0 : XFillStyle eFillStyle = ((XFillStyleItem&)(GetObjectItem(XATTR_FILLSTYLE))).GetValue();
184 0 : rInfo.bGradientAllowed = (eFillStyle == XFILL_GRADIENT);
185 :
186 0 : rInfo.bShearAllowed =bNoTextFrame;
187 0 : rInfo.bEdgeRadiusAllowed=true;
188 :
189 0 : bool bCanConv=!HasText() || ImpCanConvTextToCurve();
190 0 : if (bCanConv && !bNoTextFrame && !HasText()) {
191 0 : bCanConv=HasFill() || HasLine();
192 : }
193 0 : rInfo.bCanConvToPath =bCanConv;
194 0 : rInfo.bCanConvToPoly =bCanConv;
195 0 : rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary());
196 0 : }
197 :
198 0 : sal_uInt16 SdrRectObj::GetObjIdentifier() const
199 : {
200 0 : if (IsTextFrame()) return sal_uInt16(eTextKind);
201 0 : else return sal_uInt16(OBJ_RECT);
202 : }
203 :
204 0 : void SdrRectObj::TakeUnrotatedSnapRect(Rectangle& rRect) const
205 : {
206 0 : rRect=aRect;
207 0 : if (aGeo.nShearWink!=0) {
208 0 : long nDst=Round((aRect.Bottom()-aRect.Top())*aGeo.nTan);
209 0 : if (aGeo.nShearWink>0) {
210 0 : Point aRef(rRect.TopLeft());
211 0 : rRect.Left()-=nDst;
212 0 : Point aTmpPt(rRect.TopLeft());
213 0 : RotatePoint(aTmpPt,aRef,aGeo.nSin,aGeo.nCos);
214 0 : aTmpPt-=rRect.TopLeft();
215 0 : rRect.Move(aTmpPt.X(),aTmpPt.Y());
216 : } else {
217 0 : rRect.Right()-=nDst;
218 : }
219 : }
220 0 : }
221 :
222 0 : OUString SdrRectObj::TakeObjNameSingul() const
223 : {
224 0 : if (IsTextFrame())
225 : {
226 0 : return SdrTextObj::TakeObjNameSingul();
227 : }
228 :
229 0 : OUStringBuffer sName;
230 :
231 0 : sal_uInt16 nResId=STR_ObjNameSingulRECT;
232 0 : if (aGeo.nShearWink!=0) {
233 0 : nResId+=4; // parallelogram or, maybe, rhombus
234 : } else {
235 0 : if (aRect.GetWidth()==aRect.GetHeight()) nResId+=2; // square
236 : }
237 0 : if (GetEckenradius()!=0) nResId+=8; // rounded down
238 0 : sName.append(ImpGetResStr(nResId));
239 :
240 0 : OUString aName(GetName());
241 0 : if (!aName.isEmpty())
242 : {
243 0 : sName.append(' ');
244 0 : sName.append('\'');
245 0 : sName.append(aName);
246 0 : sName.append('\'');
247 : }
248 :
249 0 : return sName.makeStringAndClear();
250 : }
251 :
252 0 : OUString SdrRectObj::TakeObjNamePlural() const
253 : {
254 0 : if (IsTextFrame())
255 : {
256 0 : return SdrTextObj::TakeObjNamePlural();
257 : }
258 :
259 0 : sal_uInt16 nResId=STR_ObjNamePluralRECT;
260 :
261 0 : if (aGeo.nShearWink!=0)
262 : {
263 0 : nResId+=4; // parallelogram or rhombus
264 : }
265 : else
266 : {
267 0 : if (aRect.GetWidth()==aRect.GetHeight())
268 0 : nResId+=2; // square
269 : }
270 :
271 0 : if (GetEckenradius()!=0)
272 0 : nResId+=8; // rounded down
273 :
274 0 : return ImpGetResStr(nResId);
275 : }
276 :
277 0 : SdrRectObj* SdrRectObj::Clone() const
278 : {
279 0 : return CloneHelper< SdrRectObj >();
280 : }
281 :
282 0 : basegfx::B2DPolyPolygon SdrRectObj::TakeXorPoly() const
283 : {
284 0 : XPolyPolygon aXPP;
285 0 : aXPP.Insert(ImpCalcXPoly(aRect,GetEckenradius()));
286 0 : return aXPP.getB2DPolyPolygon();
287 : }
288 :
289 0 : void SdrRectObj::RecalcSnapRect()
290 : {
291 0 : long nEckRad=GetEckenradius();
292 0 : if ((aGeo.nDrehWink!=0 || aGeo.nShearWink!=0) && nEckRad!=0) {
293 0 : maSnapRect=GetXPoly().GetBoundRect();
294 : } else {
295 0 : SdrTextObj::RecalcSnapRect();
296 : }
297 0 : }
298 :
299 0 : void SdrRectObj::NbcSetSnapRect(const Rectangle& rRect)
300 : {
301 0 : SdrTextObj::NbcSetSnapRect(rRect);
302 0 : SetXPolyDirty();
303 0 : }
304 :
305 0 : void SdrRectObj::NbcSetLogicRect(const Rectangle& rRect)
306 : {
307 0 : SdrTextObj::NbcSetLogicRect(rRect);
308 0 : SetXPolyDirty();
309 0 : }
310 :
311 0 : sal_uInt32 SdrRectObj::GetHdlCount() const
312 : {
313 0 : return IsTextFrame() ? 10 : 9;
314 : }
315 :
316 0 : SdrHdl* SdrRectObj::GetHdl(sal_uInt32 nHdlNum) const
317 : {
318 0 : SdrHdl* pH = NULL;
319 0 : Point aPnt;
320 0 : SdrHdlKind eKind = HDL_MOVE;
321 :
322 0 : if(!IsTextFrame())
323 : {
324 0 : nHdlNum++;
325 : }
326 :
327 0 : switch(nHdlNum)
328 : {
329 : case 0:
330 : {
331 : OSL_ENSURE(!IsTextEditActive(), "Do not use a ImpTextframeHdl for hilighting text in active text edit, this will collide with EditEngine paints (!)");
332 : // hack for calc grid sync to ensure the hatched area
333 : // for a textbox is displayed at correct position
334 0 : pH = new ImpTextframeHdl(aRect + GetGridOffset() );
335 0 : pH->SetObj((SdrObject*)this);
336 0 : pH->SetDrehWink(aGeo.nDrehWink);
337 0 : break;
338 : }
339 : case 1:
340 : {
341 0 : long a = GetEckenradius();
342 0 : long b = std::max(aRect.GetWidth(),aRect.GetHeight())/2; // rounded up, because GetWidth() adds 1
343 0 : if (a>b) a=b;
344 0 : if (a<0) a=0;
345 0 : aPnt=aRect.TopLeft();
346 0 : aPnt.X()+=a;
347 0 : eKind = HDL_CIRC;
348 0 : break;
349 : }
350 0 : case 2: aPnt=aRect.TopLeft(); eKind = HDL_UPLFT; break;
351 0 : case 3: aPnt=aRect.TopCenter(); eKind = HDL_UPPER; break;
352 0 : case 4: aPnt=aRect.TopRight(); eKind = HDL_UPRGT; break;
353 0 : case 5: aPnt=aRect.LeftCenter(); eKind = HDL_LEFT ; break;
354 0 : case 6: aPnt=aRect.RightCenter(); eKind = HDL_RIGHT; break;
355 0 : case 7: aPnt=aRect.BottomLeft(); eKind = HDL_LWLFT; break;
356 0 : case 8: aPnt=aRect.BottomCenter(); eKind = HDL_LOWER; break;
357 0 : case 9: aPnt=aRect.BottomRight(); eKind = HDL_LWRGT; break;
358 : }
359 :
360 0 : if(!pH)
361 : {
362 0 : if(aGeo.nShearWink)
363 : {
364 0 : ShearPoint(aPnt,aRect.TopLeft(),aGeo.nTan);
365 : }
366 :
367 0 : if(aGeo.nDrehWink)
368 : {
369 0 : RotatePoint(aPnt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
370 : }
371 :
372 0 : pH = new SdrHdl(aPnt,eKind);
373 0 : pH->SetObj((SdrObject*)this);
374 0 : pH->SetDrehWink(aGeo.nDrehWink);
375 : }
376 :
377 0 : return pH;
378 : }
379 :
380 :
381 :
382 0 : bool SdrRectObj::hasSpecialDrag() const
383 : {
384 0 : return true;
385 : }
386 :
387 0 : bool SdrRectObj::beginSpecialDrag(SdrDragStat& rDrag) const
388 : {
389 0 : const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
390 :
391 0 : if(bRad)
392 : {
393 0 : rDrag.SetEndDragChangesAttributes(true);
394 :
395 0 : return true;
396 : }
397 :
398 0 : return SdrTextObj::beginSpecialDrag(rDrag);
399 : }
400 :
401 0 : bool SdrRectObj::applySpecialDrag(SdrDragStat& rDrag)
402 : {
403 0 : const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
404 :
405 0 : if (bRad)
406 : {
407 0 : Point aPt(rDrag.GetNow());
408 :
409 0 : if(aGeo.nDrehWink)
410 0 : RotatePoint(aPt,aRect.TopLeft(),-aGeo.nSin,aGeo.nCos);
411 :
412 0 : sal_Int32 nRad(aPt.X() - aRect.Left());
413 :
414 0 : if (nRad < 0)
415 0 : nRad = 0;
416 :
417 0 : if(nRad != GetEckenradius())
418 : {
419 0 : NbcSetEckenradius(nRad);
420 : }
421 :
422 0 : return true;
423 : }
424 : else
425 : {
426 0 : return SdrTextObj::applySpecialDrag(rDrag);
427 : }
428 : }
429 :
430 0 : OUString SdrRectObj::getSpecialDragComment(const SdrDragStat& rDrag) const
431 : {
432 0 : const bool bCreateComment(rDrag.GetView() && this == rDrag.GetView()->GetCreateObj());
433 :
434 0 : if(bCreateComment)
435 : {
436 0 : return OUString();
437 : }
438 : else
439 : {
440 0 : const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
441 :
442 0 : if(bRad)
443 : {
444 0 : Point aPt(rDrag.GetNow());
445 :
446 : // -sin for reversal
447 0 : if(aGeo.nDrehWink)
448 0 : RotatePoint(aPt, aRect.TopLeft(), -aGeo.nSin, aGeo.nCos);
449 :
450 0 : sal_Int32 nRad(aPt.X() - aRect.Left());
451 :
452 0 : if(nRad < 0)
453 0 : nRad = 0;
454 :
455 0 : OUString aStr;
456 0 : ImpTakeDescriptionStr(STR_DragRectEckRad, aStr);
457 0 : OUStringBuffer aBuf(aStr);
458 0 : aBuf.appendAscii(" (");
459 0 : aBuf.append(GetMetrStr(nRad));
460 0 : aBuf.append(')');
461 :
462 0 : return aBuf.makeStringAndClear();
463 : }
464 : else
465 : {
466 0 : return SdrTextObj::getSpecialDragComment(rDrag);
467 : }
468 : }
469 : }
470 :
471 :
472 :
473 0 : basegfx::B2DPolyPolygon SdrRectObj::TakeCreatePoly(const SdrDragStat& rDrag) const
474 : {
475 0 : Rectangle aRect1;
476 0 : rDrag.TakeCreateRect(aRect1);
477 0 : aRect1.Justify();
478 :
479 0 : basegfx::B2DPolyPolygon aRetval;
480 0 : aRetval.append(ImpCalcXPoly(aRect1,GetEckenradius()).getB2DPolygon());
481 0 : return aRetval;
482 : }
483 :
484 0 : Pointer SdrRectObj::GetCreatePointer() const
485 : {
486 0 : if (IsTextFrame()) return Pointer(POINTER_DRAW_TEXT);
487 0 : return Pointer(POINTER_DRAW_RECT);
488 : }
489 :
490 0 : void SdrRectObj::NbcMove(const Size& rSiz)
491 : {
492 0 : SdrTextObj::NbcMove(rSiz);
493 0 : SetXPolyDirty();
494 0 : }
495 :
496 0 : void SdrRectObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
497 : {
498 0 : SdrTextObj::NbcResize(rRef,xFact,yFact);
499 0 : SetXPolyDirty();
500 0 : }
501 :
502 0 : void SdrRectObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
503 : {
504 0 : SdrTextObj::NbcRotate(rRef,nWink,sn,cs);
505 0 : SetXPolyDirty();
506 0 : }
507 :
508 0 : void SdrRectObj::NbcShear(const Point& rRef, long nWink, double tn, bool bVShear)
509 : {
510 0 : SdrTextObj::NbcShear(rRef,nWink,tn,bVShear);
511 0 : SetXPolyDirty();
512 0 : }
513 :
514 0 : void SdrRectObj::NbcMirror(const Point& rRef1, const Point& rRef2)
515 : {
516 0 : SdrTextObj::NbcMirror(rRef1,rRef2);
517 0 : SetXPolyDirty();
518 0 : }
519 :
520 0 : bool SdrRectObj::DoMacro(const SdrObjMacroHitRec& rRec)
521 : {
522 0 : return SdrTextObj::DoMacro(rRec);
523 : }
524 :
525 0 : OUString SdrRectObj::GetMacroPopupComment(const SdrObjMacroHitRec& rRec) const
526 : {
527 0 : return SdrTextObj::GetMacroPopupComment(rRec);
528 : }
529 :
530 0 : SdrGluePoint SdrRectObj::GetVertexGluePoint(sal_uInt16 nPosNum) const
531 : {
532 0 : sal_Int32 nWdt = ImpGetLineWdt(); // #i25616#
533 :
534 : // #i25616#
535 0 : if(!LineIsOutsideGeometry())
536 : {
537 0 : nWdt++;
538 0 : nWdt /= 2;
539 : }
540 :
541 0 : Point aPt;
542 0 : switch (nPosNum) {
543 0 : case 0: aPt=aRect.TopCenter(); aPt.Y()-=nWdt; break;
544 0 : case 1: aPt=aRect.RightCenter(); aPt.X()+=nWdt; break;
545 0 : case 2: aPt=aRect.BottomCenter(); aPt.Y()+=nWdt; break;
546 0 : case 3: aPt=aRect.LeftCenter(); aPt.X()-=nWdt; break;
547 : }
548 0 : if (aGeo.nShearWink!=0) ShearPoint(aPt,aRect.TopLeft(),aGeo.nTan);
549 0 : if (aGeo.nDrehWink!=0) RotatePoint(aPt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
550 0 : aPt-=GetSnapRect().Center();
551 0 : SdrGluePoint aGP(aPt);
552 0 : aGP.SetPercent(false);
553 0 : return aGP;
554 : }
555 :
556 0 : SdrGluePoint SdrRectObj::GetCornerGluePoint(sal_uInt16 nPosNum) const
557 : {
558 0 : sal_Int32 nWdt = ImpGetLineWdt(); // #i25616#
559 :
560 : // #i25616#
561 0 : if(!LineIsOutsideGeometry())
562 : {
563 0 : nWdt++;
564 0 : nWdt /= 2;
565 : }
566 :
567 0 : Point aPt;
568 0 : switch (nPosNum) {
569 0 : case 0: aPt=aRect.TopLeft(); aPt.X()-=nWdt; aPt.Y()-=nWdt; break;
570 0 : case 1: aPt=aRect.TopRight(); aPt.X()+=nWdt; aPt.Y()-=nWdt; break;
571 0 : case 2: aPt=aRect.BottomRight(); aPt.X()+=nWdt; aPt.Y()+=nWdt; break;
572 0 : case 3: aPt=aRect.BottomLeft(); aPt.X()-=nWdt; aPt.Y()+=nWdt; break;
573 : }
574 0 : if (aGeo.nShearWink!=0) ShearPoint(aPt,aRect.TopLeft(),aGeo.nTan);
575 0 : if (aGeo.nDrehWink!=0) RotatePoint(aPt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
576 0 : aPt-=GetSnapRect().Center();
577 0 : SdrGluePoint aGP(aPt);
578 0 : aGP.SetPercent(false);
579 0 : return aGP;
580 : }
581 :
582 0 : SdrObject* SdrRectObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const
583 : {
584 0 : XPolygon aXP(ImpCalcXPoly(aRect,GetEckenradius()));
585 : { // TODO: this is only for the moment, until we have the new TakeContour()
586 0 : aXP.Remove(0,1);
587 0 : aXP[aXP.GetPointCount()-1]=aXP[0];
588 : }
589 :
590 0 : basegfx::B2DPolyPolygon aPolyPolygon(aXP.getB2DPolygon());
591 0 : aPolyPolygon.removeDoublePoints();
592 0 : SdrObject* pRet = 0L;
593 :
594 : // small correction: Do not create something when no fill and no line. To
595 : // be sure to not damage something with non-text frames, do this only
596 : // when used with bAddText==false from other converters
597 0 : if((bAddText && !IsTextFrame()) || HasFill() || HasLine())
598 : {
599 0 : pRet = ImpConvertMakeObj(aPolyPolygon, true, bBezier);
600 : }
601 :
602 0 : if(bAddText)
603 : {
604 0 : pRet = ImpConvertAddText(pRet, bBezier);
605 : }
606 :
607 0 : return pRet;
608 : }
609 :
610 0 : void SdrRectObj::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
611 : {
612 0 : SdrTextObj::Notify(rBC,rHint);
613 0 : SetXPolyDirty(); // because of the corner radius
614 0 : }
615 :
616 0 : void SdrRectObj::RestGeoData(const SdrObjGeoData& rGeo)
617 : {
618 0 : SdrTextObj::RestGeoData(rGeo);
619 0 : SetXPolyDirty();
620 0 : }
621 :
622 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|