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