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