21 #include <svx/strings.hrc>
82 bool bTextRota90(
false);
83 bool bShowUnit(
false);
94 switch(eMeasureFieldKind)
96 case SdrMeasureFieldKind::Value:
100 if(eMeasureUnit == FieldUnit::NONE)
101 eMeasureUnit = eModUIUnit;
106 if(eMeasureUnit != eModUIUnit)
114 aFact *= aMeasureScale;
137 if(aStr.indexOf(cDec) != -1 || (cDecAlt && aStr.indexOf(cDecAlt) != -1))
139 sal_Int32 nLen2(aStr.getLength() - 1);
141 while(aStr[nLen2] ==
'0')
143 aStr = aStr.copy(0, nLen2);
147 if(aStr[nLen2] == cDec || (cDecAlt && aStr[nLen2] == cDecAlt))
149 aStr = aStr.copy(0, nLen2);
159 case SdrMeasureFieldKind::Unit:
165 if(eMeasureUnit == FieldUnit::NONE)
166 eMeasureUnit = eModUIUnit;
173 case SdrMeasureFieldKind::Rotate90Blanks:
191 return std::make_unique<sdr::properties::MeasureProperties>(*this);
199 return std::make_unique<sdr::contact::ViewContactOfSdrMeasureObj>(*this);
333 const double fOldWidth(std::max(aPolygonRange.getWidth(), 1.0));
334 const double fScale(static_cast<double>(nNewWidth) / fOldWidth);
349 Point aDelt(aP2); aDelt-=aP1;
355 long nArrow1Len=0;
bool bArrow1Center=
false;
356 long nArrow2Len=0;
bool bArrow2Center=
false;
363 bool bPfeileAussen =
false;
371 nArrow1Wdt = -nLineWdt * nArrow1Wdt / 100;
375 nArrow2Wdt = -nLineWdt * nArrow2Wdt / 100;
386 nArrowNeed=nArrow1Len+nArrow2Len+(nArrow1Wdt+nArrow2Wdt)/2;
387 if (rPol.
nLineLen<nArrowNeed) bPfeileAussen =
true;
388 nShortLen=(nArrow1Len+nArrow1Wdt + nArrow2Len+nArrow2Wdt) /2;
392 if (rPol.
eUsedTextVPos == css::drawing::MeasureTextVertPos_AUTO)
395 if (rPol.
eUsedTextVPos == css::drawing::MeasureTextVertPos_CENTERED)
404 if (rPol.
eUsedTextHPos==css::drawing::MeasureTextHorzPos_AUTO) {
405 bool bOutside =
false;
407 if (nNeedSiz>rPol.
nLineLen) bOutside =
true;
409 if (nNeedSiz+nArrowNeed>rPol.
nLineLen) bPfeileAussen =
true;
411 long nSmallNeed=nArrow1Len+nArrow2Len+(nArrow1Wdt+nArrow2Wdt)/2/4;
412 if (nNeedSiz+nSmallNeed>rPol.
nLineLen) bPfeileAussen =
true;
414 rPol.
eUsedTextHPos=bOutside ? css::drawing::MeasureTextHorzPos_LEFTOUTSIDE : css::drawing::MeasureTextHorzPos_INSIDE;
416 if (rPol.
eUsedTextHPos != css::drawing::MeasureTextHorzPos_INSIDE) bPfeileAussen =
true;
425 double nLineSin=sin(a);
426 double nLineCos=cos(a);
436 if (nTmpAngle>=18000) {
447 double nHlpSin=nLineCos;
448 double nHlpCos=-nLineSin;
458 long dx=
FRound(nLineDist*nHlpCos);
459 long dy=-
FRound(nLineDist*nHlpSin);
464 long dxh2=
FRound((nLineDist+nOverhang)*nHlpCos);
465 long dyh2=-
FRound((nLineDist+nOverhang)*nHlpSin);
476 Point aMainlinePt1(aP1.
X()+dx,aP1.
Y()+dy);
477 Point aMainlinePt2(aP2.
X()+dx,aP2.
Y()+dy);
478 if (!bPfeileAussen) {
486 long nHalfLen=(rPol.
nLineLen-nNeedSiz-nArrow1Wdt/4-nArrow2Wdt/4) /2;
496 long nLen1=nShortLen;
497 long nLen2=nShortLen;
500 if (rPol.
eUsedTextHPos==css::drawing::MeasureTextHorzPos_LEFTOUTSIDE) nLen1=nArrow1Len+nTextWdt;
501 if (rPol.
eUsedTextHPos==css::drawing::MeasureTextHorzPos_RIGHTOUTSIDE) nLen2=nArrow2Len+nTextWdt;
520 aRetval.
append(aPartPolyA);
527 aRetval.
append(aPartPolyA);
535 aRetval.
append(aPartPolyA);
541 aRetval.
append(aPartPolyA);
546 aRetval.
append(aPartPolyA);
553 o3tl::optional<Color>& rpTxtColor, o3tl::optional<Color>& rpFldColor, OUString& rRet)
const
557 if (pMeasureField!=
nullptr) {
559 if (rpFldColor && !bEdit)
575 if(pOutlinerParaObject==
nullptr)
593 rOutliner.
SetText(*pOutlinerParaObject);
643 case css::drawing::MeasureTextHorzPos_LEFTOUTSIDE: aTextPos.
setX(aPt1b.
X()-aTextSize2.
Width()-nArr1Len-nLWdt );
break;
644 case css::drawing::MeasureTextHorzPos_RIGHTOUTSIDE: aTextPos.
setX(aPt1b.
X()+nLen+nArr2Len+nLWdt );
break;
645 default: aTextPos.
setX(aPt1b.
X() ); aTextSize2.
setWidth(nLen );
648 case css::drawing::MeasureTextVertPos_CENTERED:
649 aTextPos.
setY(aPt1b.
Y()-aTextSize2.
Height()/2 );
break;
650 case css::drawing::MeasureTextVertPos_WEST: {
651 if (!bUpsideDown) aTextPos.
setY(aPt1b.
Y()+nLWdt );
652 else aTextPos.
setY(aPt1b.
Y()-aTextSize2.
Height()-nLWdt );
655 if (!bUpsideDown) aTextPos.
setY(aPt1b.
Y()-aTextSize2.
Height()-nLWdt );
656 else aTextPos.
setY(aPt1b.
Y()+nLWdt );
665 case css::drawing::MeasureTextHorzPos_LEFTOUTSIDE: aTextPos.
setX(aPt1b.
X()-aTextSize2.
Height()-nArr1Len );
break;
666 case css::drawing::MeasureTextHorzPos_RIGHTOUTSIDE: aTextPos.
setX(aPt1b.
X()+nLen+nArr2Len );
break;
670 case css::drawing::MeasureTextVertPos_CENTERED:
671 aTextPos.
setY(aPt1b.
Y()+aTextSize2.
Width()/2 );
break;
672 case css::drawing::MeasureTextVertPos_WEST: {
673 if (!bBelowRefEdge) aTextPos.
setY(aPt1b.
Y()+aTextSize2.
Width()+nLWdt );
674 else aTextPos.
setY(aPt1b.
Y()-nLWdt );
677 if (!bBelowRefEdge) aTextPos.
setY(aPt1b.
Y()-nLWdt );
678 else aTextPos.
setY(aPt1b.
Y()+aTextSize2.
Width()+nLWdt );
688 const_cast<SdrMeasureObj*>(
this)->aGeo.RecalcSinCos();
698 const_cast<SdrMeasureObj*>(
this)->aGeo.RecalcSinCos();
704 return CloneHelper< SdrMeasureObj >(rTargetModel);
725 if (!aName.isEmpty())
733 return sName.makeStringAndClear();
738 return SvxResId(STR_ObjNamePluralMEASURE);
763 for (sal_uInt32 nHdlNum=0; nHdlNum<6; ++nHdlNum)
769 case 2: aPt=
aPt1;
break;
770 case 3: aPt=
aPt2;
break;
775 pHdl->SetObjHdlNum(nHdlNum);
777 rHdlList.
AddHdl(std::move(pHdl));
795 if(nHdlNum != 2 && nHdlNum != 3)
911 bool bAnf=nHdlNum==2;
916 long ndx0=aMov.
X()-aFix.
X();
917 long ndy0=aMov.
Y()-aFix.
Y();
920 if (!bHLin || !bVLin) {
921 long ndx=aPt.X()-aFix.
X();
922 long ndy=aPt.Y()-aFix.
Y();
923 double nXFact=0;
if (!bVLin) nXFact=
static_cast<double>(ndx)/static_cast<double>(ndx0);
924 double nYFact=0;
if (!bHLin) nYFact=
static_cast<double>(ndy)/static_cast<double>(ndy0);
925 bool bHor=bHLin || (!bVLin && (nXFact>nYFact) ==bBigOrtho);
926 bool bVer=bVLin || (!bHLin && (nXFact<=nYFact)==bBigOrtho);
927 if (bHor) ndy=long(ndy0*nXFact);
928 if (bVer) ndx=long(ndx0*nYFact);
1005 return PointerStyle::Cross;
1087 if (i==0)
return aPt1;
1154 sal_uInt16 nLoopStart(0);
1160 aPolyPoly.
append(aTmpPolyPolygon[0].getB2DPolygon());
1169 pGroup->GetSubList()->NbcInsertObject(pPath);
1182 aPolyPoly.
append(aTmpPolyPolygon[0].getB2DPolygon());
1191 pGroup->GetSubList()->NbcInsertObject(pPath);
1197 aPolyPoly.
append(aTmpPolyPolygon[1].getB2DPolygon());
1206 pGroup->GetSubList()->NbcInsertObject(pPath);
1219 aPolyPoly.
append(aTmpPolyPolygon[0].getB2DPolygon());
1228 pGroup->GetSubList()->NbcInsertObject(pPath);
1234 aPolyPoly.
append(aTmpPolyPolygon[1].getB2DPolygon());
1243 pGroup->GetSubList()->NbcInsertObject(pPath);
1249 for(;nLoopStart<
nCount;nLoopStart++)
1252 aPolyPoly.
append(aTmpPolyPolygon[nLoopStart].getB2DPolygon());
1261 pGroup->GetSubList()->NbcInsertObject(pPath);
1346 if (!bBelowRefEdge) {
1360 else eRet=EEAnchorMode::VCenterLeft;
1364 else eRet=EEAnchorMode::VCenterRight;
1368 else eRet=EEAnchorMode::VCenterHCenter;
1415 aPosA += aAnchorOffset;
1416 aPosB += aAnchorOffset;
1424 if(aNewPt1 !=
aPt1 || aNewPt2 !=
aPt2)
#define XATTR_LINESTARTCENTER
virtual void SaveGeoData(SdrObjGeoData &rGeo) const override
virtual PointerStyle GetCreatePointer() const override
get the cursor/pointer that signals creating this object
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
void append(const basegfx::B2DPoint &rPoint, sal_uInt32 nCount)
virtual const Size & GetTextSize() const override
virtual ~SdrMeasureObjGeoData() override
virtual OUString getSpecialDragComment(const SdrDragStat &rDrag) const override
css::drawing::MeasureTextHorzPos eWantTextHPos
void ShearPoint(Point &rPnt, const Point &rRef, double tn, bool bVShear=false)
SdrObjUserCall * pUserCall
virtual sal_uInt16 GetObjIdentifier() const override
long AdjustX(long nHorzMove)
#define XATTR_LINEENDWIDTH
void ResizePoint(Point &rPnt, const Point &rRef, const Fraction &xFract, const Fraction &yFract)
virtual void NbcSetOutlinerParaObject(std::unique_ptr< OutlinerParaObject > pTextObject) override
const Point & GetStart() const
virtual void TakeTextEditArea(Size *pPaperMin, Size *pPaperMax, tools::Rectangle *pViewInit, tools::Rectangle *pViewMin) const
virtual const Size & GetTextSize() const
#define SDRATTR_MEASURETEXTVPOS
void SetStyleSheet(SfxStyleSheet *pNewStyleSheet, bool bDontRemoveHardAttr)
virtual void NbcMirror(const Point &rRef1, const Point &rRef2) override
virtual void SetBoundRectDirty()
css::drawing::MeasureTextVertPos eUsedTextVPos
virtual void TakeObjInfo(SdrObjTransformInfoRec &rInfo) const override
void ImpCalcGeometrics(const ImpMeasureRec &rRec, ImpMeasurePoly &rPol) const
SdrObjectUniquePtr ImpConvertAddText(SdrObjectUniquePtr pObj, bool bBezier) const
#define SDRATTR_MEASUREHELPLINE2LEN
virtual bool hasSpecialDrag() const override
The standard transformations (Move,Resize,Rotate,Mirror,Shear) are taken over by the View (TakeXorPol...
virtual bool BegTextEdit(SdrOutliner &rOutl) override
All geometrical data of an arbitrary object for use in undo/redo.
long AdjustHeight(long n)
long NormAngle36000(long a)
Normalize angle to -180.00..179.99.
SdrMeasureObj & operator=(const SdrMeasureObj &rObj)
object that represents a SdrPage
#define SDRATTR_MEASUREHELPLINEDIST
void SetOrtho8Possible(bool bOn=true)
virtual void NbcMirror(const Point &rRef1, const Point &rRef2) override
B2DRange getB2DRange() const
long GetLen(const Point &rPnt)
Determine sector within the cartesian coordinate system.
SdrMeasureFieldKind GetMeasureFieldKind() const
const SdrHdl * GetHdl() const
virtual void NbcShear(const Point &rRef, long nAngle, double tn, bool bVShear) override
#define SDRATTR_MEASURETEXTROTA90
const LocaleDataWrapper & GetLocaleData() const
OUString SvxResId(const char *pId)
#define SDRATTR_MEASUREHELPLINE1LEN
virtual void SaveGeoData(SdrObjGeoData &rGeo) const override
#define SDRATTR_MEASUREBELOWREFEDGE
virtual OutlinerParaObject * GetOutlinerParaObject() const override
SdrMetricItem makeSdrMeasureLineDistItem(long nVal)
const SfxItemSet & GetObjectItemSet() const
SfxStyleSheet * GetStyleSheet() const
void SetMergedItemSet(const SfxItemSet &rSet, bool bClearAllItems=false)
B2DHomMatrix createScaleTranslateB2DHomMatrix(double fScaleX, double fScaleY, double fTranslateX, double fTranslateY)
void ImpTakeAttr(ImpMeasureRec &rRec) const
virtual EEAnchorMode GetOutlinerViewAnchorMode() const override
void SetObjectItem(const SfxPoolItem &rItem)
tools::Rectangle maSnapRect
B2IRange fround(const B2DRange &rRange)
virtual void TakeUnrotatedSnapRect(tools::Rectangle &rRect) const override
void SetParaAttribs(sal_Int32 nPara, const SfxItemSet &)
#define SDRATTR_MEASURETEXTAUTOANGLE
FieldUnit GetUIUnit() const
#define XATTR_LINEENDCENTER
virtual bool CalcFieldValue(const SvxFieldItem &rField, sal_Int32 nPara, sal_uInt16 nPos, bool bEdit, o3tl::optional< Color > &rpTxtColor, o3tl::optional< Color > &rpFldColor, OUString &rRet) const override
virtual sal_uInt32 GetPointCount() const override
#define SDRATTR_MEASURESHOWUNIT
SdrTextHorzAdjust GetTextHorizontalAdjust() const
const OUString & getNumDecimalSep() const
const EditTextObject & GetTextObject() const
SdrTextVertAdjust GetTextVerticalAdjust() const
bool mbSupportTextIndentingOnLineWidthChange
long GetTextLeftDistance() const
Left inner spacing to borders.
void SetText(const OutlinerParaObject &)
long AdjustY(long nVertMove)
long GetTextRightDistance() const
Right inner spacing to borders.
static OUString GetUnitString(FieldUnit eUnit)
virtual long GetRotateAngle() const override
virtual bool BegTextEdit(SdrOutliner &rOutl)
#define SDRATTR_MEASUREDECIMALPLACES
virtual bool EndCreate(SdrDragStat &rStat, SdrCreateCmd eCmd) override
virtual SdrMeasureObj * CloneSdrObject(SdrModel &rTargetModel) const override
virtual sal_uInt32 GetSnapPointCount() const override
snap to special points of an Object (polygon points, center of circle)
void QuickInsertField(const SvxFieldItem &rFld, const ESelection &rSel)
void BroadcastObjectChange() const
virtual void NbcRotate(const Point &rRef, long nAngle, double sn, double cs) override
sal_Int32 GetPointCount() const
void MirrorPoint(Point &rPnt, const Point &rRef1, const Point &rRef2)
const Fraction & X() const
virtual Point GetPoint(sal_uInt32 i) const override
SdrTextObj & operator=(const SdrTextObj &rObj)
void ActionChanged() const
SdrView * GetView() const
static basegfx::B2DPolyPolygon ImpCalcXPoly(const ImpMeasurePoly &rPol)
SdrMeasureObj(SdrModel &rSdrModel)
SdrModel & getSdrModelFromSdrObject() const
#define SDRATTR_MEASURETEXTAUTOANGLEVIEW
virtual void TakeTextAnchorRect(::tools::Rectangle &rAnchorRect) const
virtual void AddToHdlList(SdrHdlList &rHdlList) const override
virtual bool applySpecialDrag(SdrDragStat &rDrag) override
virtual void NbcMove(const Size &rSiz) override
The methods Move, Resize, Rotate, Mirror, Shear, SetSnapRect and SetLogicRect call the corresponding ...
virtual OUString TakeObjNameSingul() const override
bool IsCreate1stPointAsCenter() const
void SetEndDragChangesAttributes(bool bOn)
virtual bool BegCreate(SdrDragStat &rStat) override
Every object must be able to create itself interactively.
css::drawing::MeasureTextHorzPos eUsedTextHPos
virtual bool BckCreate(SdrDragStat &rStat) override
#define SDRATTR_MEASUREUNIT
long GetTextUpperDistance() const
Top inner spacing to borders.
virtual ~SdrMeasureObj() override
void QuickInsertText(const OUString &rText, const ESelection &rSel)
long BigMulDiv(long nVal, long nMul, long nDiv)
OUString GetMetricString(long nVal, bool bNoUnitChars=false, sal_Int32 nNumDigits=-1) const
const OUString & getNumDecimalSepAlt() const
#define SDRATTR_MEASURESCALE
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
sal_Int32 GetParagraphCount() const
SdrMetricItem makeSdrMeasureHelpline1LenItem(long nVal)
virtual void NbcSetOutlinerParaObject(std::unique_ptr< OutlinerParaObject > pTextObject) override
virtual const tools::Rectangle & GetLastBoundRect() const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
void RotatePoint(Point &rPnt, const Point &rRef, double sn, double cs)
std::unique_ptr< OutlinerParaObject > CreateParaObject(sal_Int32 nStartPara=0, sal_Int32 nParaCount=EE_PARA_ALL) const
virtual void RecalcSnapRect() override
Snap is not done on the BoundRect but if possible on logic coordinates (i.e.
FrPair GetMapFactor(MapUnit eS, MapUnit eD)
sal_uInt32 GetObjHdlNum() const
virtual std::unique_ptr< sdr::contact::ViewContact > CreateObjectSpecificViewContact() override
virtual void RestGeoData(const SdrObjGeoData &rGeo) override
virtual void TakeTextRect(SdrOutliner &rOutliner, tools::Rectangle &rTextRect, bool bNoEditText, tools::Rectangle *pAnchorRect, bool bLineWidth=true) const
virtual void RestGeoData(const SdrObjGeoData &rGeo) override
sal_Int32 GetDenominator() const
virtual void TakeTextEditArea(Size *pPaperMin, Size *pPaperMax, tools::Rectangle *pViewInit, tools::Rectangle *pViewMin) const override
void ImpEvalDrag(ImpMeasureRec &rRec, const SdrDragStat &rDrag) const
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
OUString TakeRepresentation(SdrMeasureFieldKind eMeasureFieldKind) const
virtual bool beginSpecialDrag(SdrDragStat &rDrag) const override
virtual OutlinerParaObject * GetOutlinerParaObject() const override
#define SDRATTR_MEASUREHELPLINEOVERHANG
const SfxItemSet & GetMergedItemSet() const
css::drawing::MeasureTextVertPos eWantTextVPos
#define SDRATTR_MEASURETEXTUPSIDEDOWN
virtual void NbcMove(const Size &rSiz) override
The methods Move, Resize, Rotate, Mirror, Shear, SetSnapRect and SetLogicRect call the corresponding ...
#define SDRATTR_MEASURETEXTHPOS
virtual Point GetSnapPoint(sal_uInt32 i) const override
sal_Int32 GetNumerator() const
std::unique_ptr< SdrObject, SdrObjectFreeOp > SdrObjectUniquePtr
virtual basegfx::B2DPolyPolygon TakeXorPoly() const override
The Xor-Polygon is required by the View to drag the object.
const Point & GetNow() const
long GetAngle(const Point &rPnt)
The Y axis points down! The function negates the Y axis, when calculating the angle, such that GetAngle(Point(0,-1))=90 deg.
void SetUpdateMode(bool bUpdate)
const Point & GetAnchorPos() const
void SetStyleSheet(sal_Int32 nPara, SfxStyleSheet *pStyle)
virtual void SetRectsDirty(bool bNotMyself=false, bool bRecursive=true)
virtual bool CalcFieldValue(const SvxFieldItem &rField, sal_Int32 nPara, sal_uInt16 nPos, bool bEdit, o3tl::optional< Color > &rpTxtColor, o3tl::optional< Color > &rpFldColor, OUString &rRet) const
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
#define SDRATTR_MEASURELINEDIST
friend class SdrMeasureField
virtual void TakeTextAnchorRect(tools::Rectangle &rAnchorRect) const override
virtual SdrObjectUniquePtr DoConvertToPolyObj(bool bBezier, bool bAddText) const override
void Move(long nHorzMove, long nVertMove)
virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat &rDrag) const override
Polygon dragged by the user when creating the object.
#define XATTR_LINESTARTWIDTH
virtual void NbcSetPoint(const Point &rPnt, sal_uInt32 i) override
bool LineGeometryUsageIsNecessary() const
virtual bool IsPolyObj() const override
virtual void TakeTextRect(SdrOutliner &rOutliner, tools::Rectangle &rTextRect, bool bNoEditText, tools::Rectangle *pAnchorRect, bool bLineWidth=true) const override
virtual void NbcRotate(const Point &rRef, long nAngle, double sn, double cs) override
virtual void SetChanged()
virtual OUString TakeObjNamePlural() const override
virtual void TRSetBaseGeometry(const basegfx::B2DHomMatrix &rMatrix, const basegfx::B2DPolyPolygon &rPolyPolygon) override
virtual void NbcShear(const Point &rRef, long nAngle, double tn, bool bVShear) override
virtual std::unique_ptr< sdr::properties::BaseProperties > CreateObjectSpecificProperties() override
virtual void BrkCreate(SdrDragStat &rStat) override
void setWidth(long nWidth)
SdrOutliner & ImpGetDrawOutliner() const
virtual bool MovCreate(SdrDragStat &rStat) override
void SendUserCall(SdrUserCallType eUserCall, const tools::Rectangle &rBoundRect) const
long GetTextLowerDistance() const
Bottom inner spacing to borders.
virtual sal_uInt32 GetHdlCount() const override
Via GetHdlCount the number of Handles can be retrieved.
tools::Rectangle GetBoundRect() const
virtual SdrObjGeoData * NewGeoData() const override
A derived class must override these 3 methods if it has own geometric data that must be saved for Und...
void AddHdl(std::unique_ptr< SdrHdl > pHdl)
virtual bool TRGetBaseGeometry(basegfx::B2DHomMatrix &rMatrix, basegfx::B2DPolyPolygon &rPolyPolygon) const override
const SvxFieldData * GetField() const
static long impGetLineStartEndDistance(const basegfx::B2DPolyPolygon &rPolyPolygon, long nNewWidth, bool bCenter)
SdrMetricItem makeSdrMeasureHelpline2LenItem(long nVal)
void setHeight(long nHeight)