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> // for Import of SdrFileVersion 2
33 : #include <svx/svdpagv.hxx> // for
34 : #include <svx/svdview.hxx> // the
35 : #include <svx/svdundo.hxx> // macro example
36 : #include <svx/svdopath.hxx>
37 : #include "svx/svdglob.hxx" // Stringcache
38 : #include "svx/svdstr.hrc" // the object's name
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 1810 : sdr::properties::BaseProperties* SdrRectObj::CreateObjectSpecificProperties()
51 : {
52 1810 : return new sdr::properties::RectangleProperties(*this);
53 : }
54 :
55 : //////////////////////////////////////////////////////////////////////////////
56 : // DrawContact section
57 :
58 1803 : sdr::contact::ViewContact* SdrRectObj::CreateObjectSpecificViewContact()
59 : {
60 1803 : return new sdr::contact::ViewContactOfSdrRectObj(*this);
61 : }
62 :
63 : //////////////////////////////////////////////////////////////////////////////
64 :
65 149416 : TYPEINIT1(SdrRectObj,SdrTextObj);
66 :
67 541 : SdrRectObj::SdrRectObj()
68 541 : : mpXPoly(0L)
69 : {
70 541 : bClosedObj=sal_True;
71 541 : }
72 :
73 59 : SdrRectObj::SdrRectObj(const Rectangle& rRect)
74 : : SdrTextObj(rRect),
75 59 : mpXPoly(NULL)
76 : {
77 59 : bClosedObj=sal_True;
78 59 : }
79 :
80 1280 : SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind)
81 : : SdrTextObj(eNewTextKind),
82 1280 : 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 1280 : bClosedObj=sal_True;
88 1280 : }
89 :
90 51 : SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind, const Rectangle& rRect)
91 : : SdrTextObj(eNewTextKind,rRect),
92 51 : 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 51 : bClosedObj=sal_True;
98 51 : }
99 :
100 5500 : SdrRectObj::~SdrRectObj()
101 : {
102 1882 : delete mpXPoly;
103 3618 : }
104 :
105 4 : SdrRectObj& SdrRectObj::operator=(const SdrRectObj& rCopy)
106 : {
107 4 : if ( this == &rCopy )
108 0 : return *this;
109 :
110 4 : SdrTextObj::operator=( rCopy );
111 :
112 4 : delete mpXPoly;
113 :
114 4 : if ( rCopy.mpXPoly )
115 0 : mpXPoly = new XPolygon( *rCopy.mpXPoly );
116 : else
117 4 : mpXPoly = NULL;
118 :
119 4 : return *this;
120 : }
121 :
122 26198 : void SdrRectObj::SetXPolyDirty()
123 : {
124 26198 : delete mpXPoly;
125 26198 : mpXPoly = 0L;
126 26198 : }
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=sal_True;
173 0 : rInfo.bRotateFreeAllowed=sal_True;
174 0 : rInfo.bRotate90Allowed =sal_True;
175 0 : rInfo.bMirrorFreeAllowed=bNoTextFrame;
176 0 : rInfo.bMirror45Allowed =bNoTextFrame;
177 0 : rInfo.bMirror90Allowed =bNoTextFrame;
178 :
179 : // allow transparency
180 0 : rInfo.bTransparenceAllowed = sal_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=sal_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 20665 : sal_uInt16 SdrRectObj::GetObjIdentifier() const
199 : {
200 20665 : if (IsTextFrame()) return sal_uInt16(eTextKind);
201 5949 : 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 32 : void SdrRectObj::TakeObjNameSingul(XubString& rName) const
223 : {
224 32 : if (IsTextFrame())
225 : {
226 32 : SdrTextObj::TakeObjNameSingul(rName);
227 : }
228 : else
229 : {
230 0 : sal_uInt16 nResId=STR_ObjNameSingulRECT;
231 0 : if (aGeo.nShearWink!=0) {
232 0 : nResId+=4; // parallelogram or, maybe, rhombus
233 : } else {
234 0 : if (aRect.GetWidth()==aRect.GetHeight()) nResId+=2; // square
235 : }
236 0 : if (GetEckenradius()!=0) nResId+=8; // rounded down
237 0 : rName=ImpGetResStr(nResId);
238 :
239 0 : String aName( GetName() );
240 0 : if(aName.Len())
241 : {
242 0 : rName += sal_Unicode(' ');
243 0 : rName += sal_Unicode('\'');
244 0 : rName += aName;
245 0 : rName += sal_Unicode('\'');
246 0 : }
247 : }
248 32 : }
249 :
250 0 : void SdrRectObj::TakeObjNamePlural(XubString& rName) const
251 : {
252 0 : if (IsTextFrame()) SdrTextObj::TakeObjNamePlural(rName);
253 : else {
254 0 : sal_uInt16 nResId=STR_ObjNamePluralRECT;
255 0 : if (aGeo.nShearWink!=0) {
256 0 : nResId+=4; // parallelogram or rhombus
257 : } else {
258 0 : if (aRect.GetWidth()==aRect.GetHeight()) nResId+=2; // square
259 : }
260 0 : if (GetEckenradius()!=0) nResId+=8; // rounded down
261 0 : rName=ImpGetResStr(nResId);
262 : }
263 0 : }
264 :
265 2 : SdrRectObj* SdrRectObj::Clone() const
266 : {
267 2 : return CloneHelper< SdrRectObj >();
268 : }
269 :
270 0 : basegfx::B2DPolyPolygon SdrRectObj::TakeXorPoly() const
271 : {
272 0 : XPolyPolygon aXPP;
273 0 : aXPP.Insert(ImpCalcXPoly(aRect,GetEckenradius()));
274 0 : return aXPP.getB2DPolyPolygon();
275 : }
276 :
277 1917 : void SdrRectObj::RecalcSnapRect()
278 : {
279 1917 : long nEckRad=GetEckenradius();
280 1917 : if ((aGeo.nDrehWink!=0 || aGeo.nShearWink!=0) && nEckRad!=0) {
281 0 : maSnapRect=GetXPoly().GetBoundRect();
282 : } else {
283 1917 : SdrTextObj::RecalcSnapRect();
284 : }
285 1917 : }
286 :
287 2838 : void SdrRectObj::NbcSetSnapRect(const Rectangle& rRect)
288 : {
289 2838 : SdrTextObj::NbcSetSnapRect(rRect);
290 2838 : SetXPolyDirty();
291 2838 : }
292 :
293 2668 : void SdrRectObj::NbcSetLogicRect(const Rectangle& rRect)
294 : {
295 2668 : SdrTextObj::NbcSetLogicRect(rRect);
296 2668 : SetXPolyDirty();
297 2668 : }
298 :
299 0 : sal_uInt32 SdrRectObj::GetHdlCount() const
300 : {
301 0 : return IsTextFrame() ? 10 : 9;
302 : }
303 :
304 0 : SdrHdl* SdrRectObj::GetHdl(sal_uInt32 nHdlNum) const
305 : {
306 0 : SdrHdl* pH = NULL;
307 0 : Point aPnt;
308 0 : SdrHdlKind eKind = HDL_MOVE;
309 :
310 0 : if(!IsTextFrame())
311 : {
312 0 : nHdlNum++;
313 : }
314 :
315 0 : switch(nHdlNum)
316 : {
317 : case 0:
318 : {
319 : // hack for calc grid sync to ensure the hatched area
320 : // for a textbox is displayed at correct position
321 0 : pH = new ImpTextframeHdl(aRect + GetGridOffset() );
322 0 : pH->SetObj((SdrObject*)this);
323 0 : pH->SetDrehWink(aGeo.nDrehWink);
324 0 : break;
325 : }
326 : case 1:
327 : {
328 0 : long a = GetEckenradius();
329 0 : long b = Max(aRect.GetWidth(),aRect.GetHeight())/2; // rounded up, because GetWidth() adds 1
330 0 : if (a>b) a=b;
331 0 : if (a<0) a=0;
332 0 : aPnt=aRect.TopLeft();
333 0 : aPnt.X()+=a;
334 0 : eKind = HDL_CIRC;
335 0 : break;
336 : }
337 0 : case 2: aPnt=aRect.TopLeft(); eKind = HDL_UPLFT; break;
338 0 : case 3: aPnt=aRect.TopCenter(); eKind = HDL_UPPER; break;
339 0 : case 4: aPnt=aRect.TopRight(); eKind = HDL_UPRGT; break;
340 0 : case 5: aPnt=aRect.LeftCenter(); eKind = HDL_LEFT ; break;
341 0 : case 6: aPnt=aRect.RightCenter(); eKind = HDL_RIGHT; break;
342 0 : case 7: aPnt=aRect.BottomLeft(); eKind = HDL_LWLFT; break;
343 0 : case 8: aPnt=aRect.BottomCenter(); eKind = HDL_LOWER; break;
344 0 : case 9: aPnt=aRect.BottomRight(); eKind = HDL_LWRGT; break;
345 : }
346 :
347 0 : if(!pH)
348 : {
349 0 : if(aGeo.nShearWink)
350 : {
351 0 : ShearPoint(aPnt,aRect.TopLeft(),aGeo.nTan);
352 : }
353 :
354 0 : if(aGeo.nDrehWink)
355 : {
356 0 : RotatePoint(aPnt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
357 : }
358 :
359 0 : pH = new SdrHdl(aPnt,eKind);
360 0 : pH->SetObj((SdrObject*)this);
361 0 : pH->SetDrehWink(aGeo.nDrehWink);
362 : }
363 :
364 0 : return pH;
365 : }
366 :
367 : ////////////////////////////////////////////////////////////////////////////////////////////////////
368 :
369 7 : bool SdrRectObj::hasSpecialDrag() const
370 : {
371 7 : return true;
372 : }
373 :
374 0 : bool SdrRectObj::beginSpecialDrag(SdrDragStat& rDrag) const
375 : {
376 0 : const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
377 :
378 0 : if(bRad)
379 : {
380 0 : rDrag.SetEndDragChangesAttributes(true);
381 :
382 0 : return true;
383 : }
384 :
385 0 : return SdrTextObj::beginSpecialDrag(rDrag);
386 : }
387 :
388 0 : bool SdrRectObj::applySpecialDrag(SdrDragStat& rDrag)
389 : {
390 0 : const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
391 :
392 0 : if (bRad)
393 : {
394 0 : Rectangle aBoundRect0;
395 0 : Point aPt(rDrag.GetNow());
396 :
397 0 : if(aGeo.nDrehWink)
398 0 : RotatePoint(aPt,aRect.TopLeft(),-aGeo.nSin,aGeo.nCos);
399 :
400 0 : sal_Int32 nRad(aPt.X() - aRect.Left());
401 :
402 0 : if (nRad < 0)
403 0 : nRad = 0;
404 :
405 0 : if(nRad != GetEckenradius())
406 : {
407 0 : NbcSetEckenradius(nRad);
408 : }
409 :
410 0 : return true;
411 : }
412 : else
413 : {
414 0 : return SdrTextObj::applySpecialDrag(rDrag);
415 : }
416 : }
417 :
418 0 : String SdrRectObj::getSpecialDragComment(const SdrDragStat& rDrag) const
419 : {
420 0 : const bool bCreateComment(rDrag.GetView() && this == rDrag.GetView()->GetCreateObj());
421 :
422 0 : if(bCreateComment)
423 : {
424 0 : return String();
425 : }
426 : else
427 : {
428 0 : const bool bRad(rDrag.GetHdl() && HDL_CIRC == rDrag.GetHdl()->GetKind());
429 :
430 0 : if(bRad)
431 : {
432 0 : Point aPt(rDrag.GetNow());
433 :
434 : // -sin for reversal
435 0 : if(aGeo.nDrehWink)
436 0 : RotatePoint(aPt, aRect.TopLeft(), -aGeo.nSin, aGeo.nCos);
437 :
438 0 : sal_Int32 nRad(aPt.X() - aRect.Left());
439 :
440 0 : if(nRad < 0)
441 0 : nRad = 0;
442 :
443 0 : rtl::OUString aStr;
444 0 : ImpTakeDescriptionStr(STR_DragRectEckRad, aStr);
445 0 : rtl::OUStringBuffer aBuf(aStr);
446 0 : aBuf.appendAscii(" (");
447 0 : aBuf.append(GetMetrStr(nRad));
448 0 : aBuf.append(sal_Unicode(')'));
449 :
450 0 : return aBuf.makeStringAndClear();
451 : }
452 : else
453 : {
454 0 : return SdrTextObj::getSpecialDragComment(rDrag);
455 : }
456 : }
457 : }
458 :
459 : ////////////////////////////////////////////////////////////////////////////////////////////////////
460 :
461 0 : basegfx::B2DPolyPolygon SdrRectObj::TakeCreatePoly(const SdrDragStat& rDrag) const
462 : {
463 0 : Rectangle aRect1;
464 0 : rDrag.TakeCreateRect(aRect1);
465 0 : aRect1.Justify();
466 :
467 0 : basegfx::B2DPolyPolygon aRetval;
468 0 : aRetval.append(ImpCalcXPoly(aRect1,GetEckenradius()).getB2DPolygon());
469 0 : return aRetval;
470 : }
471 :
472 0 : Pointer SdrRectObj::GetCreatePointer() const
473 : {
474 0 : if (IsTextFrame()) return Pointer(POINTER_DRAW_TEXT);
475 0 : return Pointer(POINTER_DRAW_RECT);
476 : }
477 :
478 2403 : void SdrRectObj::NbcMove(const Size& rSiz)
479 : {
480 2403 : SdrTextObj::NbcMove(rSiz);
481 2403 : SetXPolyDirty();
482 2403 : }
483 :
484 1 : void SdrRectObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
485 : {
486 1 : SdrTextObj::NbcResize(rRef,xFact,yFact);
487 1 : SetXPolyDirty();
488 1 : }
489 :
490 5 : void SdrRectObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
491 : {
492 5 : SdrTextObj::NbcRotate(rRef,nWink,sn,cs);
493 5 : SetXPolyDirty();
494 5 : }
495 :
496 0 : void SdrRectObj::NbcShear(const Point& rRef, long nWink, double tn, bool bVShear)
497 : {
498 0 : SdrTextObj::NbcShear(rRef,nWink,tn,bVShear);
499 0 : SetXPolyDirty();
500 0 : }
501 :
502 0 : void SdrRectObj::NbcMirror(const Point& rRef1, const Point& rRef2)
503 : {
504 0 : SdrTextObj::NbcMirror(rRef1,rRef2);
505 0 : SetXPolyDirty();
506 0 : }
507 :
508 0 : bool SdrRectObj::DoMacro(const SdrObjMacroHitRec& rRec)
509 : {
510 0 : return SdrTextObj::DoMacro(rRec);
511 : }
512 :
513 0 : rtl::OUString SdrRectObj::GetMacroPopupComment(const SdrObjMacroHitRec& rRec) const
514 : {
515 0 : return SdrTextObj::GetMacroPopupComment(rRec);
516 : }
517 :
518 0 : SdrGluePoint SdrRectObj::GetVertexGluePoint(sal_uInt16 nPosNum) const
519 : {
520 0 : sal_Int32 nWdt = ImpGetLineWdt(); // #i25616#
521 :
522 : // #i25616#
523 0 : if(!LineIsOutsideGeometry())
524 : {
525 0 : nWdt++;
526 0 : nWdt /= 2;
527 : }
528 :
529 0 : Point aPt;
530 0 : switch (nPosNum) {
531 0 : case 0: aPt=aRect.TopCenter(); aPt.Y()-=nWdt; break;
532 0 : case 1: aPt=aRect.RightCenter(); aPt.X()+=nWdt; break;
533 0 : case 2: aPt=aRect.BottomCenter(); aPt.Y()+=nWdt; break;
534 0 : case 3: aPt=aRect.LeftCenter(); aPt.X()-=nWdt; break;
535 : }
536 0 : if (aGeo.nShearWink!=0) ShearPoint(aPt,aRect.TopLeft(),aGeo.nTan);
537 0 : if (aGeo.nDrehWink!=0) RotatePoint(aPt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
538 0 : aPt-=GetSnapRect().Center();
539 0 : SdrGluePoint aGP(aPt);
540 0 : aGP.SetPercent(sal_False);
541 0 : return aGP;
542 : }
543 :
544 0 : SdrGluePoint SdrRectObj::GetCornerGluePoint(sal_uInt16 nPosNum) const
545 : {
546 0 : sal_Int32 nWdt = ImpGetLineWdt(); // #i25616#
547 :
548 : // #i25616#
549 0 : if(!LineIsOutsideGeometry())
550 : {
551 0 : nWdt++;
552 0 : nWdt /= 2;
553 : }
554 :
555 0 : Point aPt;
556 0 : switch (nPosNum) {
557 0 : case 0: aPt=aRect.TopLeft(); aPt.X()-=nWdt; aPt.Y()-=nWdt; break;
558 0 : case 1: aPt=aRect.TopRight(); aPt.X()+=nWdt; aPt.Y()-=nWdt; break;
559 0 : case 2: aPt=aRect.BottomRight(); aPt.X()+=nWdt; aPt.Y()+=nWdt; break;
560 0 : case 3: aPt=aRect.BottomLeft(); aPt.X()-=nWdt; aPt.Y()+=nWdt; break;
561 : }
562 0 : if (aGeo.nShearWink!=0) ShearPoint(aPt,aRect.TopLeft(),aGeo.nTan);
563 0 : if (aGeo.nDrehWink!=0) RotatePoint(aPt,aRect.TopLeft(),aGeo.nSin,aGeo.nCos);
564 0 : aPt-=GetSnapRect().Center();
565 0 : SdrGluePoint aGP(aPt);
566 0 : aGP.SetPercent(sal_False);
567 0 : return aGP;
568 : }
569 :
570 0 : SdrObject* SdrRectObj::DoConvertToPolyObj(sal_Bool bBezier, bool bAddText) const
571 : {
572 0 : XPolygon aXP(ImpCalcXPoly(aRect,GetEckenradius()));
573 : { // TODO: this is only for the moment, until we have the new TakeContour()
574 0 : aXP.Remove(0,1);
575 0 : aXP[aXP.GetPointCount()-1]=aXP[0];
576 : }
577 :
578 0 : basegfx::B2DPolyPolygon aPolyPolygon(aXP.getB2DPolygon());
579 0 : aPolyPolygon.removeDoublePoints();
580 0 : SdrObject* pRet = 0L;
581 :
582 : // small correction: Do not create something when no fill and no line. To
583 : // be sure to not damage something with non-text frames, do this only
584 : // when used with bAddText==false from other converters
585 0 : if((bAddText && !IsTextFrame()) || HasFill() || HasLine())
586 : {
587 0 : pRet = ImpConvertMakeObj(aPolyPolygon, sal_True, bBezier);
588 : }
589 :
590 0 : if(bAddText)
591 : {
592 0 : pRet = ImpConvertAddText(pRet, bBezier);
593 : }
594 :
595 0 : return pRet;
596 : }
597 :
598 5652 : void SdrRectObj::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
599 : {
600 5652 : SdrTextObj::Notify(rBC,rHint);
601 5652 : SetXPolyDirty(); // because of the corner radius
602 5652 : }
603 :
604 0 : void SdrRectObj::RestGeoData(const SdrObjGeoData& rGeo)
605 : {
606 0 : SdrTextObj::RestGeoData(rGeo);
607 0 : SetXPolyDirty();
608 0 : }
609 :
610 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|