LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdorect.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 211 315 67.0 %
Date: 2014-11-03 Functions: 38 50 76.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10