LCOV - code coverage report
Current view: top level - libreoffice/svx/source/svdraw - svdorect.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 75 314 23.9 %
Date: 2012-12-27 Functions: 25 48 52.1 %
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> // 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: */

Generated by: LCOV version 1.10