26 #include <rtl/ustrbuf.hxx>
29 #include <svx/strings.hrc>
61 if (nWdt==0) aRetval.setX(0 );
62 if (nHgt==0) aRetval.setY(0 );
67 if (std::abs(nHgt)>32767 || std::abs(aRetval.Y())>32767) {
68 aRetval.setY(
BigMulDiv(aRetval.Y(),nHgt,nWdt) );
70 aRetval.setY(aRetval.Y()*nHgt/nWdt );
76 if (std::abs(nWdt)>32767 || std::abs(aRetval.X())>32767) {
77 aRetval.setX(
BigMulDiv(aRetval.X(),nWdt,nHgt) );
79 aRetval.setX(aRetval.X()*nWdt/nHgt );
93 return std::make_unique<sdr::properties::CircleProperties>(*this);
101 return std::make_unique<sdr::contact::ViewContactOfSdrCircObj>(*this);
157 Degree100 nAngleDif=nNewEndAngle-nNewStartAngle;
160 if (nAngleDif==36000_deg100)
nEndAngle+=nAngleDif;
206 bNeed = eLine != drawing::LineStyle_NONE && eLine != drawing::LineStyle_SOLID;
209 if(!bNeed && eLine != drawing::LineStyle_NONE)
232 bNeed = eFill != drawing::FillStyle_NONE && eFill != drawing::FillStyle_SOLID;
258 aCenter.getX(), aCenter.getY()));
265 const double fStart((((36000 - nEnd.
get()) % 36000) / 18000.0) *
F_PI);
266 const double fEnd((((36000 - nStart.
get()) % 36000) / 18000.0) *
F_PI);
279 if(bCloseUsingCenter)
284 aSector.
append(aCircPolygon);
285 aCircPolygon = aSector;
299 -aTopLeft.getX(), -aTopLeft.getY()));
322 const char* pID=STR_ObjNameSingulCIRC;
344 if (!aName.isEmpty())
351 return sName.makeStringAndClear();
356 const char* pID=STR_ObjNamePluralCIRC;
489 std::unique_ptr<SdrHdl> pH(
new SdrHdl(aPnt,eLocalKind));
490 pH->SetPointNum(nPNum);
491 pH->SetObj(const_cast<SdrCircObj*>(
this));
493 rHdlList.
AddHdl(std::move(pH));
556 nAngle+=nSA/2_deg100;
596 const ImpCircUser* pU =
static_cast<const ImpCircUser*
>(rDrag.
GetUser());
614 return aBuf.makeStringAndClear();
629 return aBuf.makeStringAndClear();
639 void ImpCircUser::SetCreateParams(
SdrDragStat const & rStat)
644 nWdt=aR.Right()-aR.Left();
645 nHgt=aR.Bottom()-aR.Top();
650 if (nWdt==0) aP.setX(0 );
651 if (nHgt==0) aP.setY(0 );
653 if (nHgt!=0) aP.setY(aP.Y()*nWdt/nHgt );
655 if (nWdt!=0) aP.setX(aP.X()*nHgt/nWdt );
661 nStart+=nSA/2_deg100;
693 ImpCircUser* pU=
static_cast<ImpCircUser*
>(rStat.
GetUser());
696 rStat.
SetUser(std::unique_ptr<ImpCircUser>(pU));
698 pU->SetCreateParams(rStat);
715 ImpCircUser* pU=
static_cast<ImpCircUser*
>(rStat.
GetUser());
738 ImpCircUser* pU=
static_cast<ImpCircUser*
>(rStat.
GetUser());
781 const ImpCircUser* pU =
static_cast<const ImpCircUser*
>(rDrag.
GetUser());
815 return PointerStyle::Cross;
836 if (bXMirr || bYMirr) {
845 if (! (bXMirr && bYMirr)) {
847 nS0=18000_deg100-nE0;
848 nE0=18000_deg100-nTmp;
851 if (bXMirr!=bYMirr) {
856 nS0=18000_deg100-nE0;
857 nE0=18000_deg100-nTmp;
871 if (nAngleDif==36000_deg100)
nEndAngle+=nAngleDif;
899 if (nWdt==0) aTmpPt1.setX(0 );
900 if (nHgt==0) aTmpPt1.setY(0 );
905 if (nWdt==0) aTmpPt2.setX(0 );
906 if (nHgt==0) aTmpPt2.setY(0 );
940 if (nAngleDif==36000_deg100)
nEndAngle+=nAngleDif;
948 return std::make_unique<SdrCircObjGeoData>();
973 if (rP.Y()<rR.
Top ()) rR.
SetTop(rP.Y() );
989 Union(rRect,aPntStart);
990 Union(rRect,aPntEnd);
991 if ((a<=18000_deg100 && e>=18000_deg100) || (a>e && (a<=18000_deg100 || e>=18000_deg100))) {
994 if ((a<=27000_deg100 && e>=27000_deg100) || (a>e && (a<=27000_deg100 || e>=27000_deg100))) {
1000 if ((a<=9000_deg100 && e>=9000_deg100) || (a>e && (a<=9000_deg100 || e>=9000_deg100))) {
1012 rRect.
Move(aDst.X(),aDst.Y());
1025 rRect.
Move(aTmpPt.X(),aTmpPt.Y());
1096 if(bKindChg || bAngleChg)
B2DPolygon const & createPolygonFromUnitCircle(sal_uInt32 nStartQuadrant=0)
static SVX_DLLPRIVATE void ImpSetCreateParams(SdrDragStat &rStat)
B2DPoint getCenter() const
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
virtual void RestoreGeoData(const SdrObjGeoData &rGeo) override
void append(const basegfx::B2DPoint &rPoint, sal_uInt32 nCount)
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
Detects when a stylesheet is changed.
constexpr TypedWhichId< XLineEndItem > XATTR_LINEEND(XATTR_LINE_FIRST+5)
tools::Rectangle GetBoundRect() const
constexpr TypedWhichId< XLineStartItem > XATTR_LINESTART(XATTR_LINE_FIRST+4)
virtual void SetObjectItemDirect(const SfxPoolItem &rItem)=0
void ShearPoint(Point &rPnt, const Point &rRef, double tn, bool bVShear=false)
virtual OUString TakeObjNameSingul() const override
const Point & GetStart() const
static Point GetAnglePnt(const tools::Rectangle &rR, Degree100 nAngle)
rectangle (round corners optional)
static OUString GetAngleString(Degree100 nAngle)
virtual void RestoreGeoData(const SdrObjGeoData &rGeo) override
bool ImpCanConvTextToCurve() const
constexpr TypedWhichId< XFillStyleItem > XATTR_FILLSTYLE(XATTR_FILL_FIRST)
virtual basegfx::B2DPolyPolygon TakeXorPoly() const override
The Xor-Polygon is required by the View to drag the object.
constexpr TypedWhichId< XLineWidthItem > XATTR_LINEWIDTH(XATTR_LINE_FIRST+2)
double mfSinRotationAngle
sal_uInt32 GetPointNum() const
virtual void SetBoundRectDirty()
virtual void RecalcSnapRect() override
Snap is not done on the BoundRect but if possible on logic coordinates (i.e.
static void Union(tools::Rectangle &rR, const Point &rP)
SdrObjectUniquePtr ImpConvertAddText(SdrObjectUniquePtr pObj, bool bBezier) const
constexpr TypedWhichId< XLineStyleItem > XATTR_LINESTYLE(XATTR_LINE_FIRST)
const Point & GetPoint(sal_Int32 nNum) const
tools::Rectangle m_aOutRect
virtual bool applySpecialDrag(SdrDragStat &rDrag) override
virtual SdrObjectUniquePtr DoConvertToPolyObj(bool bBezier, bool bAddText) const override
virtual sdr::properties::BaseProperties & GetProperties() const
virtual void TakeUnrotatedSnapRect(tools::Rectangle &rRect) const override
virtual const tools::Rectangle & GetSnapRect() const override
All geometrical data of an arbitrary object for use in undo/redo.
virtual bool HasText() const override
constexpr TypedWhichId< SdrCircKindItem > SDRATTR_CIRCKIND(SDRATTR_CIRC_FIRST+0)
SdrCircKind ToSdrCircKind(SdrObjKind eKind)
virtual void NbcMirror(const Point &rRef1, const Point &rRef2) override
Rectangle objects (rectangle, circle, ...)
const SdrHdl * GetHdl() const
virtual void BrkCreate(SdrDragStat &rStat) override
virtual bool hasSpecialDrag() const override
The standard transformations (Move,Resize,Rotate,Mirror,Shear) are taken over by the View (TakeXorPol...
constexpr TypedWhichId< SdrAngleItem > SDRATTR_CIRCENDANGLE(SDRATTR_CIRC_FIRST+2)
virtual void NbcShear(const Point &rRef, Degree100 nAngle, double tn, bool bVShear) override
OUString SvxResId(const char *pId)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
virtual void SaveGeoData(SdrObjGeoData &rGeo) const override
virtual void TakeObjInfo(SdrObjTransformInfoRec &rInfo) const override
virtual bool MovCreate(SdrDragStat &rStat) override
virtual Point GetSnapPoint(sal_uInt32 i) const override
virtual std::unique_ptr< SdrObjGeoData > NewGeoData() const override
A derived class must override these 3 methods if it has own geometric data that must be saved for Und...
const SfxItemSet & GetObjectItemSet() const
virtual bool BckCreate(SdrDragStat &rStat) override
void SetOrtho4Possible(bool bOn=true)
void TakeCreateRect(tools::Rectangle &rRect) const
B2DHomMatrix createScaleTranslateB2DHomMatrix(double fScaleX, double fScaleY, double fTranslateX, double fTranslateY)
Degree100 NormAngle36000(Degree100 deg100)
Normalize angle to -180.00..179.99.
tools::Long BigMulDiv(tools::Long nVal, tools::Long nMul, tools::Long nDiv)
virtual void NbcShear(const Point &rRef, Degree100 nAngle, double tn, bool bVShear) override
tools::Rectangle maSnapRect
virtual sal_uInt32 GetSnapPointCount() const override
snap to special points of an Object (polygon points, center of circle)
virtual void AddToHdlList(SdrHdlList &rHdlList) const override
SVX_DLLPRIVATE void ImpSetCircInfoToAttr()
void SetNoSnap(bool bOn=true)
UNDERLYING_TYPE get() const
virtual bool applySpecialDrag(SdrDragStat &rDrag) override
virtual OUString getSpecialDragComment(const SdrDragStat &rDrag) const override
const XPolygon & GetXPoly() const
constexpr TypedWhichId< XLineStartWidthItem > XATTR_LINESTARTWIDTH(XATTR_LINE_FIRST+6)
virtual SdrObjKind GetObjIdentifier() const override
SdrObject * GetCreateObj() const
tools::Long FRound(double fVal)
SdrPathObjUniquePtr ImpConvertMakeObj(const basegfx::B2DPolyPolygon &rPolyPolygon, bool bClosed, bool bBezier) const
Degree100 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.
constexpr TypedWhichId< XLineEndWidthItem > XATTR_LINEENDWIDTH(XATTR_LINE_FIRST+7)
virtual std::unique_ptr< sdr::properties::BaseProperties > CreateObjectSpecificProperties() override
sal_Int32 GetPointCount() const
void MirrorPoint(Point &rPnt, const Point &rRef1, const Point &rRef2)
SdrView * GetView() const
bool IsAngleSnapEnabled() const
virtual void SaveGeoData(SdrObjGeoData &rGeo) const override
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
virtual bool beginSpecialDrag(SdrDragStat &rDrag) const override
Degree100 GetSnapAngle() const
virtual bool BegCreate(SdrDragStat &rStat) override
Every object must be able to create itself interactively.
virtual ~SdrCircObj() override
SdrAngleItem makeSdrCircStartAngleItem(Degree100 nAngle)
void transform(const basegfx::B2DHomMatrix &rMatrix)
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
void setClosed(bool bNew)
void RotatePoint(Point &rPnt, const Point &rRef, double sn, double cs)
void SetActionRect(const tools::Rectangle &rR)
virtual OUString getSpecialDragComment(const SdrDragStat &rDrag) const override
virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat &rDrag) const override
Polygon dragged by the user when creating the object.
sal_Int32 GetDenominator() const
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
virtual SVX_DLLPRIVATE void RecalcXPoly() override
Subclasses should override RecalcXPoly() by creating an XPolygon instance with new and assigning it t...
virtual OUString TakeObjNamePlural() const override
virtual void NbcMirror(const Point &rRef1, const Point &rRef2) override
OUString ImpGetDescriptionStr(const char *pStrCacheID) const
virtual sal_uInt32 GetHdlCount() const override
Via GetHdlCount the number of Handles can be retrieved.
B2DPolygon createPolygonFromEllipseSegment(const B2DPoint &rCenter, double fRadiusX, double fRadiusY, double fStart, double fEnd)
void SetUser(std::unique_ptr< SdrDragStatUserData > pU)
double mfCosRotationAngle
std::unique_ptr< XPolygon > mpXPoly
B2DPoint getMinimum() const
virtual PointerStyle GetCreatePointer() const override
get the cursor/pointer that signals creating this object
sal_Int32 GetNumerator() const
virtual bool EndCreate(SdrDragStat &rStat, SdrCreateCmd eCmd) override
std::unique_ptr< SdrObject, SdrObjectFreeOp > SdrObjectUniquePtr
SdrCircObj(SdrModel &rSdrModel, SdrCircKind eNewKind)
const Point & GetNow() const
virtual bool beginSpecialDrag(SdrDragStat &rDrag) const
SVX_DLLPRIVATE void ImpSetAttrToCircInfo()
virtual void SetRectsDirty(bool bNotMyself=false, bool bRecursive=true)
virtual void NbcMove(const Size &aSiz) override
The methods Move, Resize, Rotate, Mirror, Shear, SetSnapRect and SetLogicRect call the corresponding ...
bool LineGeometryUsageIsNecessary() const
SVX_DLLPRIVATE basegfx::B2DPolygon ImpCalcXPolyCirc(const SdrCircKind eKind, const tools::Rectangle &rRect1, Degree100 nStart, Degree100 nEnd) const
SVX_DLLPRIVATE bool PaintNeedsXPolyCirc() const
SdrDragStatUserData * GetUser() const
B2DHomMatrix createShearXRotateTranslateB2DHomMatrix(double fShearX, double fRadiant, double fTranslateX, double fTranslateY)
virtual void NbcSetSnapRect(const tools::Rectangle &rRect) override
B2DHomMatrix createTranslateB2DHomMatrix(double fTranslateX, double fTranslateY)
SdrAngleItem makeSdrCircEndAngleItem(Degree100 nAngle)
virtual void SetChanged()
static void ImpJustifyRect(tools::Rectangle &rRect)
void AddHdl(std::unique_ptr< SdrHdl > pHdl)
constexpr TypedWhichId< SdrAngleItem > SDRATTR_CIRCSTARTANGLE(SDRATTR_CIRC_FIRST+1)
virtual bool IsFontwork() const
virtual SdrCircObj * CloneSdrObject(SdrModel &rTargetModel) const override
SdrHdlKind GetKind() const
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
Detects when a stylesheet is changed.
virtual std::unique_ptr< sdr::contact::ViewContact > CreateObjectSpecificViewContact() override