include/svx/svdhdl.hxx | 3 include/svx/svdoashp.hxx | 2 include/svx/svdobj.hxx | 1 include/svx/svdocapt.hxx | 2 include/svx/svdocirc.hxx | 2 include/svx/svdoedge.hxx | 2 include/svx/svdograf.hxx | 2 include/svx/svdomeas.hxx | 2 include/svx/svdopath.hxx | 3 include/svx/svdorect.hxx | 2 include/svx/svdotable.hxx | 1 include/svx/svdotext.hxx | 2 include/svx/svdovirt.hxx | 1 sd/qa/unit/tiledrendering/tiledrendering.cxx | 6 - svx/source/svdraw/svdhdl.cxx | 14 +- svx/source/svdraw/svdoashp.cxx | 41 +++----- svx/source/svdraw/svdobj.cxx | 38 ++----- svx/source/svdraw/svdocapt.cxx | 31 +----- svx/source/svdraw/svdocirc.cxx | 128 ++++++++++++------------- svx/source/svdraw/svdoedge.cxx | 93 ++++++++++-------- svx/source/svdraw/svdograf.cxx | 7 - svx/source/svdraw/svdomeas.cxx | 31 +++--- svx/source/svdraw/svdopath.cxx | 22 ---- svx/source/svdraw/svdorect.cxx | 103 +++++++++----------- svx/source/svdraw/svdotxdr.cxx | 37 +++---- svx/source/svdraw/svdovirt.cxx | 51 +-------- svx/source/table/svdotable.cxx | 23 ---- sw/inc/dcontact.hxx | 2 sw/qa/extras/tiledrendering/tiledrendering.cxx | 6 - sw/source/core/draw/dcontact.cxx | 16 +-- 30 files changed, 292 insertions(+), 382 deletions(-)
New commits: commit ffe84f49270e0a8818365ca7d1fd5242abff5562 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Thu Sep 20 09:48:50 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Sep 21 10:52:46 2018 +0200 remove SdrObject::GetHdl in favour of AddToHdlList the code already says that using GetHdl is inefficient, and client code should be using AddToHdlList, so just drop the bad one Change-Id: I88c43154c8cc0988127b9292e4cda28917f54eb9 Reviewed-on: https://gerrit.libreoffice.org/60792 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/svx/svdhdl.hxx b/include/svx/svdhdl.hxx index 0e954c16dce0..5416ec71c68d 100644 --- a/include/svx/svdhdl.hxx +++ b/include/svx/svdhdl.hxx @@ -461,6 +461,9 @@ public: SdrHdl* RemoveHdl(size_t nNum); void RemoveAllByKind(SdrHdlKind eKind); + // move the ownership of all the SdrHdl to rOther + void MoveTo(SdrHdlList& rOther); + // Last inserted handles are likely hit (if the handles are above each other) SdrHdl* IsHdlListHit(const Point& rPnt) const; SdrHdl* GetHdl(SdrHdlKind eKind1) const; diff --git a/include/svx/svdoashp.hxx b/include/svx/svdoashp.hxx index ed90a91d79d0..e7f915992eae 100644 --- a/include/svx/svdoashp.hxx +++ b/include/svx/svdoashp.hxx @@ -240,7 +240,7 @@ public: virtual SdrGluePointList* ForceGluePointList() override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl( sal_uInt32 nHdlNum ) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // #i33136# static bool doConstructOrthogonal(const OUString& rName); diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx index d01031c40112..5c5fb75ca26a 100644 --- a/include/svx/svdobj.hxx +++ b/include/svx/svdobj.hxx @@ -521,7 +521,6 @@ public: /// An object that returns true from HasSpacialDrag() must provide these /// methods (incl. FillHdlList()). virtual sal_uInt32 GetHdlCount() const; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const; virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const; virtual SdrHdl* GetPlusHdl(const SdrHdl& rHdl, sal_uInt32 nPlNum) const; virtual void AddToHdlList(SdrHdlList& rHdlList) const; diff --git a/include/svx/svdocapt.hxx b/include/svx/svdocapt.hxx index 124e83c206b2..68bc32a51fae 100644 --- a/include/svx/svdocapt.hxx +++ b/include/svx/svdocapt.hxx @@ -106,7 +106,7 @@ public: virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // special drag methods virtual bool hasSpecialDrag() const override; diff --git a/include/svx/svdocirc.hxx b/include/svx/svdocirc.hxx index 8ce5681094b4..b681ad5acc44 100644 --- a/include/svx/svdocirc.hxx +++ b/include/svx/svdocirc.hxx @@ -109,7 +109,7 @@ public: virtual Point GetSnapPoint(sal_uInt32 i) const override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // special drag methods virtual bool hasSpecialDrag() const override; diff --git a/include/svx/svdoedge.hxx b/include/svx/svdoedge.hxx index 61b53414fa6d..0a68d6f84646 100644 --- a/include/svx/svdoedge.hxx +++ b/include/svx/svdoedge.hxx @@ -227,7 +227,7 @@ public: virtual basegfx::B2DPolyPolygon TakeXorPoly() const override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // special drag methods virtual bool hasSpecialDrag() const override; diff --git a/include/svx/svdograf.hxx b/include/svx/svdograf.hxx index 42cc1a37f83a..8cc7395a2283 100644 --- a/include/svx/svdograf.hxx +++ b/include/svx/svdograf.hxx @@ -179,7 +179,7 @@ public: SdrGrafObj& operator=(const SdrGrafObj& rObj); virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override; virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override; diff --git a/include/svx/svdomeas.hxx b/include/svx/svdomeas.hxx index 409dbbf92d9c..374cdff602fd 100644 --- a/include/svx/svdomeas.hxx +++ b/include/svx/svdomeas.hxx @@ -95,7 +95,7 @@ public: virtual basegfx::B2DPolyPolygon TakeXorPoly() const override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // special drag methods virtual bool hasSpecialDrag() const override; diff --git a/include/svx/svdopath.hxx b/include/svx/svdopath.hxx index 0f58f1f7354c..66c3b0410e5b 100644 --- a/include/svx/svdopath.hxx +++ b/include/svx/svdopath.hxx @@ -86,10 +86,9 @@ public: virtual void RecalcSnapRect() override; virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const override; virtual SdrHdl* GetPlusHdl(const SdrHdl& rHdl, sal_uInt32 nPlNum) const override; - virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // special drag methods virtual bool hasSpecialDrag() const override; diff --git a/include/svx/svdorect.hxx b/include/svx/svdorect.hxx index 15d5c3672f9b..00f1b481b733 100644 --- a/include/svx/svdorect.hxx +++ b/include/svx/svdorect.hxx @@ -99,7 +99,7 @@ public: virtual basegfx::B2DPolyPolygon TakeXorPoly() const override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // Special drag methods virtual bool hasSpecialDrag() const override; diff --git a/include/svx/svdotable.hxx b/include/svx/svdotable.hxx index 6f52fde2a7dc..72d5f25f627e 100644 --- a/include/svx/svdotable.hxx +++ b/include/svx/svdotable.hxx @@ -211,7 +211,6 @@ public: virtual void AdjustToMaxRect( const tools::Rectangle& rMaxRect, bool bShrinkOnly = false ) override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // Special drag methods diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx index deb8e74477cf..9bca148fd443 100644 --- a/include/svx/svdotext.hxx +++ b/include/svx/svdotext.hxx @@ -459,7 +459,7 @@ public: virtual Point GetSnapPoint(sal_uInt32 i) const override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; // special drag methods virtual bool hasSpecialDrag() const override; diff --git a/include/svx/svdovirt.hxx b/include/svx/svdovirt.hxx index 45c04ccff893..5d562a73e2c9 100644 --- a/include/svx/svdovirt.hxx +++ b/include/svx/svdovirt.hxx @@ -77,7 +77,6 @@ public: virtual basegfx::B2DPolyPolygon TakeXorPoly() const override; virtual sal_uInt32 GetHdlCount() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const override; virtual SdrHdl* GetPlusHdl(const SdrHdl& rHdl, sal_uInt32 nPlNum) const override; virtual void AddToHdlList(SdrHdlList& rHdlList) const override; diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index d629152c2217..f46b8ca0b63a 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -486,10 +486,12 @@ void SdTiledRenderingTest::testSetGraphicSelection() sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); SdPage* pPage = pViewShell->GetActualPage(); SdrObject* pObject = pPage->GetObj(0); + SdrHdlList handleList(nullptr); + pObject->AddToHdlList(handleList); // Make sure the rectangle has 8 handles: at each corner and at the center of each edge. - CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(8), pObject->GetHdlCount()); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(8), handleList.GetHdlCount()); // Take the bottom center one. - SdrHdl* pHdl = pObject->GetHdl(6); + SdrHdl* pHdl = handleList.GetHdl(6); CPPUNIT_ASSERT_EQUAL(int(SdrHdlKind::Lower), static_cast<int>(pHdl->GetKind())); ::tools::Rectangle aShapeBefore = pObject->GetSnapRect(); // Resize. diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx index 510b58d23b9c..31f232de4703 100644 --- a/svx/source/svdraw/svdhdl.cxx +++ b/svx/source/svdraw/svdhdl.cxx @@ -2251,11 +2251,9 @@ size_t SdrHdlList::GetHdlNum(const SdrHdl* pHdl) const void SdrHdlList::AddHdl(SdrHdl* pHdl) { - if (pHdl!=nullptr) - { - aList.push_back(pHdl); - pHdl->SetHdlList(this); - } + assert(pHdl); + aList.push_back(pHdl); + pHdl->SetHdlList(this); } SdrHdl* SdrHdlList::IsHdlListHit(const Point& rPnt) const @@ -2285,6 +2283,12 @@ SdrHdl* SdrHdlList::GetHdl(SdrHdlKind eKind1) const return pRet; } +void SdrHdlList::MoveTo(SdrHdlList& rOther) +{ + rOther.aList.insert(rOther.aList.end(), aList.begin(), aList.end()); + aList.clear(); +} + SdrCropHdl::SdrCropHdl( const Point& rPnt, SdrHdlKind eNewKind, diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx index 476d4de45a5c..c94432421aa0 100644 --- a/svx/source/svdraw/svdoashp.cxx +++ b/svx/source/svdraw/svdoashp.cxx @@ -1801,43 +1801,34 @@ SdrGluePointList* SdrObjCustomShape::ForceGluePointList() sal_uInt32 SdrObjCustomShape::GetHdlCount() const { const sal_uInt32 nBasicHdlCount(SdrTextObj::GetHdlCount()); - std::vector< SdrCustomShapeInteraction > aInteractionHandles( GetInteractionHandles() ); - return ( aInteractionHandles.size() + nBasicHdlCount ); + return ( GetInteractionHandles().size() + nBasicHdlCount ); } -SdrHdl* SdrObjCustomShape::GetHdl( sal_uInt32 nHdlNum ) const +void SdrObjCustomShape::AddToHdlList(SdrHdlList& rHdlList) const { - SdrHdl* pH = nullptr; - const sal_uInt32 nBasicHdlCount(SdrTextObj::GetHdlCount()); + SdrTextObj::AddToHdlList(rHdlList); - if ( nHdlNum < nBasicHdlCount ) - pH = SdrTextObj::GetHdl( nHdlNum ); - else + int nCustomShapeHdlNum = 0; + for (SdrCustomShapeInteraction const & rInteraction : GetInteractionHandles()) { - std::vector< SdrCustomShapeInteraction > aInteractionHandles( GetInteractionHandles() ); - const sal_uInt32 nCustomShapeHdlNum(nHdlNum - nBasicHdlCount); - - if ( nCustomShapeHdlNum < aInteractionHandles.size() ) + if ( rInteraction.xInteraction.is() ) { - if ( aInteractionHandles[ nCustomShapeHdlNum ].xInteraction.is() ) + try + { + css::awt::Point aPosition( rInteraction.xInteraction->getPosition() ); + SdrHdl* pH = new SdrHdl( Point( aPosition.X, aPosition.Y ), SdrHdlKind::CustomShape1 ); + pH->SetPointNum( nCustomShapeHdlNum ); + pH->SetObj( const_cast<SdrObjCustomShape*>(this) ); + rHdlList.AddHdl(pH); + } + catch ( const uno::RuntimeException& ) { - try - { - css::awt::Point aPosition( aInteractionHandles[ nCustomShapeHdlNum ].xInteraction->getPosition() ); - pH = new SdrHdl( Point( aPosition.X, aPosition.Y ), SdrHdlKind::CustomShape1 ); - pH->SetPointNum( nCustomShapeHdlNum ); - pH->SetObj( const_cast<SdrObjCustomShape*>(this) ); - } - catch ( const uno::RuntimeException& ) - { - } } } + ++nCustomShapeHdlNum; } - return pH; } - bool SdrObjCustomShape::hasSpecialDrag() const { return true; diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 5a705b998c77..9e37ca84c16c 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -1174,21 +1174,24 @@ sal_uInt32 SdrObject::GetHdlCount() const return 8L; } -SdrHdl* SdrObject::GetHdl(sal_uInt32 nHdlNum) const +void SdrObject::AddToHdlList(SdrHdlList& rHdlList) const { - SdrHdl* pH=nullptr; const tools::Rectangle& rR=GetSnapRect(); - switch (nHdlNum) { - case 0: pH=new SdrHdl(rR.TopLeft(), SdrHdlKind::UpperLeft); break; - case 1: pH=new SdrHdl(rR.TopCenter(), SdrHdlKind::Upper); break; - case 2: pH=new SdrHdl(rR.TopRight(), SdrHdlKind::UpperRight); break; - case 3: pH=new SdrHdl(rR.LeftCenter(), SdrHdlKind::Left ); break; - case 4: pH=new SdrHdl(rR.RightCenter(), SdrHdlKind::Right); break; - case 5: pH=new SdrHdl(rR.BottomLeft(), SdrHdlKind::LowerLeft); break; - case 6: pH=new SdrHdl(rR.BottomCenter(),SdrHdlKind::Lower); break; - case 7: pH=new SdrHdl(rR.BottomRight(), SdrHdlKind::LowerRight); break; + for (sal_uInt32 nHdlNum=0; nHdlNum<8; ++nHdlNum) + { + SdrHdl* pH=nullptr; + switch (nHdlNum) { + case 0: pH=new SdrHdl(rR.TopLeft(), SdrHdlKind::UpperLeft); break; + case 1: pH=new SdrHdl(rR.TopCenter(), SdrHdlKind::Upper); break; + case 2: pH=new SdrHdl(rR.TopRight(), SdrHdlKind::UpperRight); break; + case 3: pH=new SdrHdl(rR.LeftCenter(), SdrHdlKind::Left ); break; + case 4: pH=new SdrHdl(rR.RightCenter(), SdrHdlKind::Right); break; + case 5: pH=new SdrHdl(rR.BottomLeft(), SdrHdlKind::LowerLeft); break; + case 6: pH=new SdrHdl(rR.BottomCenter(),SdrHdlKind::Lower); break; + case 7: pH=new SdrHdl(rR.BottomRight(), SdrHdlKind::LowerRight); break; + } + rHdlList.AddHdl(pH); } - return pH; } sal_uInt32 SdrObject::GetPlusHdlCount(const SdrHdl& /*rHdl*/) const @@ -1201,17 +1204,6 @@ SdrHdl* SdrObject::GetPlusHdl(const SdrHdl& /*rHdl*/, sal_uInt32 /*nPlNum*/) con return nullptr; } -void SdrObject::AddToHdlList(SdrHdlList& rHdlList) const -{ - sal_uInt32 nCount=GetHdlCount(); - for (sal_uInt32 i=0; i<nCount; i++) { - SdrHdl* pHdl=GetHdl(i); - if (pHdl!=nullptr) { - rHdlList.AddHdl(pHdl); - } - } -} - void SdrObject::addCropHandles(SdrHdlList& /*rTarget*/) const { // Default implementation, does nothing. Overloaded in diff --git a/svx/source/svdraw/svdocapt.cxx b/svx/source/svdraw/svdocapt.cxx index 7acb0bd4015c..4be0d6687a78 100644 --- a/svx/source/svdraw/svdocapt.cxx +++ b/svx/source/svdraw/svdocapt.cxx @@ -294,34 +294,21 @@ sal_uInt32 SdrCaptionObj::GetHdlCount() const return nCount1 + 1; } -SdrHdl* SdrCaptionObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrCaptionObj::AddToHdlList(SdrHdlList& rHdlList) const { - const sal_uInt32 nRectHdlCnt(SdrRectObj::GetHdlCount()); + SdrRectObj::AddToHdlList(rHdlList); + const sal_uInt32 nRectHdlCnt(rHdlList.GetHdlCount()); - if(nHdlNum < nRectHdlCnt) + sal_uInt32 nCnt = aTailPoly.GetSize(); + for(sal_uInt32 i = 0; i<nCnt; ++i) { - return SdrRectObj::GetHdl(nHdlNum); - } - else - { - sal_uInt32 nPntNum(nHdlNum); - nPntNum -= nRectHdlCnt; - - if(nPntNum < aTailPoly.GetSize()) - { - SdrHdl* pHdl = new SdrHdl(aTailPoly.GetPoint(static_cast<sal_uInt16>(nPntNum)), SdrHdlKind::Poly); - pHdl->SetPolyNum(1); - pHdl->SetPointNum(nPntNum); - return pHdl; - } - else - { - return nullptr; - } + SdrHdl* pHdl = new SdrHdl(aTailPoly.GetPoint(i), SdrHdlKind::Poly); + pHdl->SetPolyNum(1); + pHdl->SetPointNum(nRectHdlCnt + i); + rHdlList.AddHdl(pHdl); } } - bool SdrCaptionObj::hasSpecialDrag() const { return true; diff --git a/svx/source/svdraw/svdocirc.cxx b/svx/source/svdraw/svdocirc.cxx index 5f80317af1f1..10272e0fec67 100644 --- a/svx/source/svdraw/svdocirc.cxx +++ b/svx/source/svdraw/svdocirc.cxx @@ -406,83 +406,81 @@ sal_uInt32 SdrCircObj::GetHdlCount() const } } -SdrHdl* SdrCircObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrCircObj::AddToHdlList(SdrHdlList& rHdlList) const { + sal_uInt32 nHdlCnt = 8; if (meCircleKind==OBJ_CIRC) - { - nHdlNum += 2; - } - - SdrHdl* pH = nullptr; - Point aPnt; - SdrHdlKind eLocalKind(SdrHdlKind::Move); - sal_uInt32 nPNum(0); + nHdlCnt += 2; - switch (nHdlNum) + for (sal_uInt32 nHdlNum=0; nHdlNum<nHdlCnt; ++nHdlNum) { - case 0: - aPnt = GetAnglePnt(maRect,nStartAngle); - eLocalKind = SdrHdlKind::Circle; - nPNum = 1; - break; - case 1: - aPnt = GetAnglePnt(maRect,nEndAngle); - eLocalKind = SdrHdlKind::Circle; - nPNum = 2; - break; - case 2: - aPnt = maRect.TopLeft(); - eLocalKind = SdrHdlKind::UpperLeft; - break; - case 3: - aPnt = maRect.TopCenter(); - eLocalKind = SdrHdlKind::Upper; - break; - case 4: - aPnt = maRect.TopRight(); - eLocalKind = SdrHdlKind::UpperRight; - break; - case 5: - aPnt = maRect.LeftCenter(); - eLocalKind = SdrHdlKind::Left; - break; - case 6: - aPnt = maRect.RightCenter(); - eLocalKind = SdrHdlKind::Right; - break; - case 7: - aPnt = maRect.BottomLeft(); - eLocalKind = SdrHdlKind::LowerLeft; - break; - case 8: - aPnt = maRect.BottomCenter(); - eLocalKind = SdrHdlKind::Lower; - break; - case 9: - aPnt = maRect.BottomRight(); - eLocalKind = SdrHdlKind::LowerRight; - break; - } + SdrHdl* pH = nullptr; + Point aPnt; + SdrHdlKind eLocalKind(SdrHdlKind::Move); + sal_uInt32 nPNum(0); - if (aGeo.nShearAngle) - { - ShearPoint(aPnt,maRect.TopLeft(),aGeo.nTan); - } + switch (nHdlNum) + { + case 0: + aPnt = GetAnglePnt(maRect,nStartAngle); + eLocalKind = SdrHdlKind::Circle; + nPNum = 1; + break; + case 1: + aPnt = GetAnglePnt(maRect,nEndAngle); + eLocalKind = SdrHdlKind::Circle; + nPNum = 2; + break; + case 2: + aPnt = maRect.TopLeft(); + eLocalKind = SdrHdlKind::UpperLeft; + break; + case 3: + aPnt = maRect.TopCenter(); + eLocalKind = SdrHdlKind::Upper; + break; + case 4: + aPnt = maRect.TopRight(); + eLocalKind = SdrHdlKind::UpperRight; + break; + case 5: + aPnt = maRect.LeftCenter(); + eLocalKind = SdrHdlKind::Left; + break; + case 6: + aPnt = maRect.RightCenter(); + eLocalKind = SdrHdlKind::Right; + break; + case 7: + aPnt = maRect.BottomLeft(); + eLocalKind = SdrHdlKind::LowerLeft; + break; + case 8: + aPnt = maRect.BottomCenter(); + eLocalKind = SdrHdlKind::Lower; + break; + case 9: + aPnt = maRect.BottomRight(); + eLocalKind = SdrHdlKind::LowerRight; + break; + } - if (aGeo.nRotationAngle) - { - RotatePoint(aPnt,maRect.TopLeft(),aGeo.nSin,aGeo.nCos); - } + if (aGeo.nShearAngle) + { + ShearPoint(aPnt,maRect.TopLeft(),aGeo.nTan); + } + + if (aGeo.nRotationAngle) + { + RotatePoint(aPnt,maRect.TopLeft(),aGeo.nSin,aGeo.nCos); + } - if (eLocalKind != SdrHdlKind::Move) - { pH = new SdrHdl(aPnt,eLocalKind); pH->SetPointNum(nPNum); pH->SetObj(const_cast<SdrCircObj*>(this)); pH->SetRotationAngle(aGeo.nRotationAngle); + rHdlList.AddHdl(pH); } - - return pH; } diff --git a/svx/source/svdraw/svdoedge.cxx b/svx/source/svdraw/svdoedge.cxx index 605ed189ae55..8c9ef410a446 100644 --- a/svx/source/svdraw/svdoedge.cxx +++ b/svx/source/svdraw/svdoedge.cxx @@ -1747,13 +1747,12 @@ sal_uInt32 SdrEdgeObj::GetHdlCount() const if(nPointCount) { nHdlCnt = 2; - if ((eKind==SdrEdgeKind::OrthoLines || eKind==SdrEdgeKind::Bezier) && nPointCount >= 4) { - sal_uInt32 nO1(aEdgeInfo.nObj1Lines > 0 ? aEdgeInfo.nObj1Lines - 1 : 0); - sal_uInt32 nO2(aEdgeInfo.nObj2Lines > 0 ? aEdgeInfo.nObj2Lines - 1 : 0); - sal_uInt32 nM(aEdgeInfo.nMiddleLine != 0xFFFF ? 1 : 0); - nHdlCnt += nO1 + nO2 + nM; + sal_uInt32 nO1(aEdgeInfo.nObj1Lines > 0 ? aEdgeInfo.nObj1Lines - 1 : 0); + sal_uInt32 nO2(aEdgeInfo.nObj2Lines > 0 ? aEdgeInfo.nObj2Lines - 1 : 0); + sal_uInt32 nM(aEdgeInfo.nMiddleLine != 0xFFFF ? 1 : 0); + nHdlCnt += nO1 + nO2 + nM; } else if (eKind==SdrEdgeKind::ThreeLines && nPointCount == 4) { @@ -1768,41 +1767,50 @@ sal_uInt32 SdrEdgeObj::GetHdlCount() const return nHdlCnt; } -SdrHdl* SdrEdgeObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrEdgeObj::AddToHdlList(SdrHdlList& rHdlList) const { - SdrHdl* pHdl=nullptr; sal_uInt32 nPointCount(pEdgeTrack->GetPointCount()); - if (nPointCount!=0) { - if (nHdlNum==0) { - pHdl=new ImpEdgeHdl((*pEdgeTrack)[0],SdrHdlKind::Poly); - if (aCon1.pObj!=nullptr && aCon1.bBestVertex) pHdl->Set1PixMore(); - } else if (nHdlNum==1) { - pHdl=new ImpEdgeHdl((*pEdgeTrack)[sal_uInt16(nPointCount-1)],SdrHdlKind::Poly); - if (aCon2.pObj!=nullptr && aCon2.bBestVertex) pHdl->Set1PixMore(); - } else { - SdrEdgeKind eKind=GetObjectItem(SDRATTR_EDGEKIND).GetValue(); - if (eKind==SdrEdgeKind::OrthoLines || eKind==SdrEdgeKind::Bezier) { - sal_uInt32 nO1(aEdgeInfo.nObj1Lines > 0 ? aEdgeInfo.nObj1Lines - 1 : 0); - sal_uInt32 nO2(aEdgeInfo.nObj2Lines > 0 ? aEdgeInfo.nObj2Lines - 1 : 0); - sal_uInt32 nM(aEdgeInfo.nMiddleLine != 0xFFFF ? 1 : 0); - sal_uInt32 nNum(nHdlNum - 2); + if (nPointCount==0) + return; + + { + SdrHdl* pHdl=new ImpEdgeHdl((*pEdgeTrack)[0],SdrHdlKind::Poly); + if (aCon1.pObj!=nullptr && aCon1.bBestVertex) pHdl->Set1PixMore(); + pHdl->SetPointNum(0); + rHdlList.AddHdl(pHdl); + } + { + SdrHdl* pHdl=new ImpEdgeHdl((*pEdgeTrack)[sal_uInt16(nPointCount-1)],SdrHdlKind::Poly); + if (aCon2.pObj!=nullptr && aCon2.bBestVertex) pHdl->Set1PixMore(); + pHdl->SetPointNum(1); + rHdlList.AddHdl(pHdl); + } + { + SdrEdgeKind eKind=GetObjectItem(SDRATTR_EDGEKIND).GetValue(); + if ((eKind==SdrEdgeKind::OrthoLines || eKind==SdrEdgeKind::Bezier) && nPointCount >= 4) + { + sal_uInt32 nO1(aEdgeInfo.nObj1Lines > 0 ? aEdgeInfo.nObj1Lines - 1 : 0); + sal_uInt32 nO2(aEdgeInfo.nObj2Lines > 0 ? aEdgeInfo.nObj2Lines - 1 : 0); + sal_uInt32 nM(aEdgeInfo.nMiddleLine != 0xFFFF ? 1 : 0); + for(sal_uInt32 nNum = 0; nNum < (nO1 + nO2 + nM); ++nNum) + { sal_Int32 nPt(0); - pHdl=new ImpEdgeHdl(Point(),SdrHdlKind::Poly); + ImpEdgeHdl* pHdl=new ImpEdgeHdl(Point(),SdrHdlKind::Poly); if (nNum<nO1) { nPt=nNum+1; - if (nNum==0) static_cast<ImpEdgeHdl*>(pHdl)->SetLineCode(SdrEdgeLineCode::Obj1Line2); - if (nNum==1) static_cast<ImpEdgeHdl*>(pHdl)->SetLineCode(SdrEdgeLineCode::Obj1Line3); + if (nNum==0) pHdl->SetLineCode(SdrEdgeLineCode::Obj1Line2); + if (nNum==1) pHdl->SetLineCode(SdrEdgeLineCode::Obj1Line3); } else { nNum=nNum-nO1; if (nNum<nO2) { nPt=nPointCount-3-nNum; - if (nNum==0) static_cast<ImpEdgeHdl*>(pHdl)->SetLineCode(SdrEdgeLineCode::Obj2Line2); - if (nNum==1) static_cast<ImpEdgeHdl*>(pHdl)->SetLineCode(SdrEdgeLineCode::Obj2Line3); + if (nNum==0) pHdl->SetLineCode(SdrEdgeLineCode::Obj2Line2); + if (nNum==1) pHdl->SetLineCode(SdrEdgeLineCode::Obj2Line3); } else { nNum=nNum-nO2; if (nNum<nM) { nPt=aEdgeInfo.nMiddleLine; - static_cast<ImpEdgeHdl*>(pHdl)->SetLineCode(SdrEdgeLineCode::MiddleLine); + pHdl->SetLineCode(SdrEdgeLineCode::MiddleLine); } } } @@ -1812,27 +1820,36 @@ SdrHdl* SdrEdgeObj::GetHdl(sal_uInt32 nHdlNum) const aPos.setX( aPos.X() / 2 ); aPos.setY( aPos.Y() / 2 ); pHdl->SetPos(aPos); + pHdl->SetPointNum(nNum + 2); + rHdlList.AddHdl(pHdl); } else { delete pHdl; pHdl=nullptr; } - } else if (eKind==SdrEdgeKind::ThreeLines) { - sal_uInt32 nNum(nHdlNum); - if (GetConnectedNode(true)==nullptr) nNum++; - Point aPos((*pEdgeTrack)[static_cast<sal_uInt16>(nNum)-1]); - pHdl=new ImpEdgeHdl(aPos,SdrHdlKind::Poly); - if (nNum==2) static_cast<ImpEdgeHdl*>(pHdl)->SetLineCode(SdrEdgeLineCode::Obj1Line2); - if (nNum==3) static_cast<ImpEdgeHdl*>(pHdl)->SetLineCode(SdrEdgeLineCode::Obj2Line2); } } - if (pHdl!=nullptr) { - pHdl->SetPointNum(nHdlNum); + else if (eKind==SdrEdgeKind::ThreeLines && nPointCount == 4) + { + if(GetConnectedNode(true)) + { + Point aPos((*pEdgeTrack)[1]); + ImpEdgeHdl* pHdl=new ImpEdgeHdl(aPos,SdrHdlKind::Poly); + pHdl->SetLineCode(SdrEdgeLineCode::Obj1Line2); + pHdl->SetPointNum(2); + rHdlList.AddHdl(pHdl); + } + if(GetConnectedNode(false)) + { + Point aPos((*pEdgeTrack)[2]); + ImpEdgeHdl* pHdl=new ImpEdgeHdl(aPos,SdrHdlKind::Poly); + pHdl->SetLineCode(SdrEdgeLineCode::Obj2Line2); + pHdl->SetPointNum(3); + rHdlList.AddHdl(pHdl); + } } } - return pHdl; } - bool SdrEdgeObj::hasSpecialDrag() const { return true; diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx index 2a6463d49d55..27b1e4d5eeb4 100644 --- a/svx/source/svdraw/svdograf.cxx +++ b/svx/source/svdraw/svdograf.cxx @@ -751,9 +751,12 @@ sal_uInt32 SdrGrafObj::GetHdlCount() const return 8L; } -SdrHdl* SdrGrafObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrGrafObj::AddToHdlList(SdrHdlList& rHdlList) const { - return SdrRectObj::GetHdl( nHdlNum + 1 ); + SdrHdlList tempList(nullptr); + SdrRectObj::AddToHdlList( tempList ); + tempList.RemoveHdl(0); + tempList.MoveTo(rHdlList); } void SdrGrafObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) diff --git a/svx/source/svdraw/svdomeas.cxx b/svx/source/svdraw/svdomeas.cxx index c7add749df64..70b4a9f00169 100644 --- a/svx/source/svdraw/svdomeas.cxx +++ b/svx/source/svdraw/svdomeas.cxx @@ -751,27 +751,30 @@ sal_uInt32 SdrMeasureObj::GetHdlCount() const return 6L; } -SdrHdl* SdrMeasureObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrMeasureObj::AddToHdlList(SdrHdlList& rHdlList) const { ImpMeasureRec aRec; ImpMeasurePoly aMPol; ImpTakeAttr(aRec); aRec.nHelplineDist=0; ImpCalcGeometrics(aRec,aMPol); - Point aPt; - switch (nHdlNum) { - case 0: aPt=aMPol.aHelpline1.aP1; break; - case 1: aPt=aMPol.aHelpline2.aP1; break; - case 2: aPt=aPt1; break; - case 3: aPt=aPt2; break; - case 4: aPt=aMPol.aHelpline1.aP2; break; - case 5: aPt=aMPol.aHelpline2.aP2; break; - } // switch - SdrHdl* pHdl=new ImpMeasureHdl(aPt,SdrHdlKind::User); - pHdl->SetObjHdlNum(nHdlNum); - pHdl->SetRotationAngle(aMPol.nLineAngle); - return pHdl; + for (sal_uInt32 nHdlNum=0; nHdlNum<6; ++nHdlNum) + { + Point aPt; + switch (nHdlNum) { + case 0: aPt=aMPol.aHelpline1.aP1; break; + case 1: aPt=aMPol.aHelpline2.aP1; break; + case 2: aPt=aPt1; break; + case 3: aPt=aPt2; break; + case 4: aPt=aMPol.aHelpline1.aP2; break; + case 5: aPt=aMPol.aHelpline2.aP2; break; + } // switch + SdrHdl* pHdl=new ImpMeasureHdl(aPt,SdrHdlKind::User); + pHdl->SetObjHdlNum(nHdlNum); + pHdl->SetRotationAngle(aMPol.nLineAngle); + rHdlList.AddHdl(pHdl); + } } diff --git a/svx/source/svdraw/svdopath.cxx b/svx/source/svdraw/svdopath.cxx index 3dd12b6341af..55a66abd85e5 100644 --- a/svx/source/svdraw/svdopath.cxx +++ b/svx/source/svdraw/svdopath.cxx @@ -1984,28 +1984,6 @@ sal_uInt32 SdrPathObj::GetHdlCount() const return nRetval; } -SdrHdl* SdrPathObj::GetHdl(sal_uInt32 nHdlNum) const -{ - // #i73248# - // Warn the user that this is ineffective and show alternatives. Should not be used at all. - OSL_FAIL("SdrPathObj::GetHdl(): ineffective, use AddToHdlList instead (!)"); - - // to have an alternative, get single handle using the ineffective way - SdrHdl* pRetval = nullptr; - SdrHdlList aLocalList(nullptr); - AddToHdlList(aLocalList); - const sal_uInt32 nHdlCount(aLocalList.GetHdlCount()); - - if(nHdlCount && nHdlNum < nHdlCount) - { - // remove and remember. The other created handles will be deleted again with the - // destruction of the local list - pRetval = aLocalList.RemoveHdl(nHdlNum); - } - - return pRetval; -} - void SdrPathObj::AddToHdlList(SdrHdlList& rHdlList) const { // keep old stuff to be able to keep old SdrHdl stuff, too diff --git a/svx/source/svdraw/svdorect.cxx b/svx/source/svdraw/svdorect.cxx index c961d04dc080..fe727ae9b52b 100644 --- a/svx/source/svdraw/svdorect.cxx +++ b/svx/source/svdraw/svdorect.cxx @@ -310,71 +310,68 @@ sal_uInt32 SdrRectObj::GetHdlCount() const return IsTextFrame() ? 10 : 9; } -SdrHdl* SdrRectObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrRectObj::AddToHdlList(SdrHdlList& rHdlList) const { - SdrHdl* pH = nullptr; - Point aPnt; - SdrHdlKind eKind = SdrHdlKind::Move; - - if(!IsTextFrame()) + sal_Int32 nCount = IsTextFrame() ? 10 : 9; + for(sal_Int32 nHdlNum = 0; nHdlNum < nCount; ++nHdlNum) { - nHdlNum++; - } + SdrHdl* pH = nullptr; + Point aPnt; + SdrHdlKind eKind = SdrHdlKind::Move; - switch(nHdlNum) - { - case 0: - { - OSL_ENSURE(!IsTextEditActive(), "Do not use a ImpTextframeHdl for highlighting text in active text edit, this will collide with EditEngine paints (!)"); - // hack for calc grid sync to ensure the hatched area - // for a textbox is displayed at correct position - pH = new ImpTextframeHdl(maRect + GetGridOffset() ); - pH->SetObj(const_cast<SdrRectObj*>(this)); - pH->SetRotationAngle(aGeo.nRotationAngle); - break; - } - case 1: + switch(nHdlNum) { - long a = GetEckenradius(); - long b = std::max(maRect.GetWidth(),maRect.GetHeight())/2; // rounded up, because GetWidth() adds 1 - if (a>b) a=b; - if (a<0) a=0; - aPnt=maRect.TopLeft(); - aPnt.AdjustX(a ); - eKind = SdrHdlKind::Circle; - break; + case 0: + { + OSL_ENSURE(!IsTextEditActive(), "Do not use a ImpTextframeHdl for highlighting text in active text edit, this will collide with EditEngine paints (!)"); + // hack for calc grid sync to ensure the hatched area + // for a textbox is displayed at correct position + pH = new ImpTextframeHdl(maRect + GetGridOffset() ); + pH->SetObj(const_cast<SdrRectObj*>(this)); + pH->SetRotationAngle(aGeo.nRotationAngle); + break; + } + case 1: + { + long a = GetEckenradius(); + long b = std::max(maRect.GetWidth(),maRect.GetHeight())/2; // rounded up, because GetWidth() adds 1 + if (a>b) a=b; + if (a<0) a=0; + aPnt=maRect.TopLeft(); + aPnt.AdjustX(a ); + eKind = SdrHdlKind::Circle; + break; + } + case 2: aPnt=maRect.TopLeft(); eKind = SdrHdlKind::UpperLeft; break; + case 3: aPnt=maRect.TopCenter(); eKind = SdrHdlKind::Upper; break; + case 4: aPnt=maRect.TopRight(); eKind = SdrHdlKind::UpperRight; break; + case 5: aPnt=maRect.LeftCenter(); eKind = SdrHdlKind::Left ; break; + case 6: aPnt=maRect.RightCenter(); eKind = SdrHdlKind::Right; break; + case 7: aPnt=maRect.BottomLeft(); eKind = SdrHdlKind::LowerLeft; break; + case 8: aPnt=maRect.BottomCenter(); eKind = SdrHdlKind::Lower; break; + case 9: aPnt=maRect.BottomRight(); eKind = SdrHdlKind::LowerRight; break; } - case 2: aPnt=maRect.TopLeft(); eKind = SdrHdlKind::UpperLeft; break; - case 3: aPnt=maRect.TopCenter(); eKind = SdrHdlKind::Upper; break; - case 4: aPnt=maRect.TopRight(); eKind = SdrHdlKind::UpperRight; break; - case 5: aPnt=maRect.LeftCenter(); eKind = SdrHdlKind::Left ; break; - case 6: aPnt=maRect.RightCenter(); eKind = SdrHdlKind::Right; break; - case 7: aPnt=maRect.BottomLeft(); eKind = SdrHdlKind::LowerLeft; break; - case 8: aPnt=maRect.BottomCenter(); eKind = SdrHdlKind::Lower; break; - case 9: aPnt=maRect.BottomRight(); eKind = SdrHdlKind::LowerRight; break; - } - if(!pH) - { - if(aGeo.nShearAngle) + if(!pH) { - ShearPoint(aPnt,maRect.TopLeft(),aGeo.nTan); - } + if(aGeo.nShearAngle) + { + ShearPoint(aPnt,maRect.TopLeft(),aGeo.nTan); + } - if(aGeo.nRotationAngle) - { - RotatePoint(aPnt,maRect.TopLeft(),aGeo.nSin,aGeo.nCos); - } + if(aGeo.nRotationAngle) + { + RotatePoint(aPnt,maRect.TopLeft(),aGeo.nSin,aGeo.nCos); + } - pH = new SdrHdl(aPnt,eKind); - pH->SetObj(const_cast<SdrRectObj*>(this)); - pH->SetRotationAngle(aGeo.nRotationAngle); + pH = new SdrHdl(aPnt,eKind); + pH->SetObj(const_cast<SdrRectObj*>(this)); + pH->SetRotationAngle(aGeo.nRotationAngle); + } + rHdlList.AddHdl(pH); } - - return pH; } - bool SdrRectObj::hasSpecialDrag() const { return true; diff --git a/svx/source/svdraw/svdotxdr.cxx b/svx/source/svdraw/svdotxdr.cxx index 635d002b42e9..5ce1e60583d2 100644 --- a/svx/source/svdraw/svdotxdr.cxx +++ b/svx/source/svdraw/svdotxdr.cxx @@ -36,29 +36,30 @@ sal_uInt32 SdrTextObj::GetHdlCount() const return 8L; } -SdrHdl* SdrTextObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrTextObj::AddToHdlList(SdrHdlList& rHdlList) const { - SdrHdl* pH=nullptr; - Point aPnt; - SdrHdlKind eKind=SdrHdlKind::Move; - switch (nHdlNum) { - case 0: aPnt=maRect.TopLeft(); eKind=SdrHdlKind::UpperLeft; break; - case 1: aPnt=maRect.TopCenter(); eKind=SdrHdlKind::Upper; break; - case 2: aPnt=maRect.TopRight(); eKind=SdrHdlKind::UpperRight; break; - case 3: aPnt=maRect.LeftCenter(); eKind=SdrHdlKind::Left ; break; - case 4: aPnt=maRect.RightCenter(); eKind=SdrHdlKind::Right; break; - case 5: aPnt=maRect.BottomLeft(); eKind=SdrHdlKind::LowerLeft; break; - case 6: aPnt=maRect.BottomCenter(); eKind=SdrHdlKind::Lower; break; - case 7: aPnt=maRect.BottomRight(); eKind=SdrHdlKind::LowerRight; break; - } - if (aGeo.nShearAngle!=0) ShearPoint(aPnt,maRect.TopLeft(),aGeo.nTan); - if (aGeo.nRotationAngle!=0) RotatePoint(aPnt,maRect.TopLeft(),aGeo.nSin,aGeo.nCos); - if (eKind!=SdrHdlKind::Move) { + for(sal_uInt32 nHdlNum=0; nHdlNum<8; ++nHdlNum) + { + SdrHdl* pH=nullptr; + Point aPnt; + SdrHdlKind eKind = SdrHdlKind::UpperLeft; + switch (nHdlNum) { + case 0: aPnt=maRect.TopLeft(); eKind=SdrHdlKind::UpperLeft; break; + case 1: aPnt=maRect.TopCenter(); eKind=SdrHdlKind::Upper; break; + case 2: aPnt=maRect.TopRight(); eKind=SdrHdlKind::UpperRight; break; + case 3: aPnt=maRect.LeftCenter(); eKind=SdrHdlKind::Left ; break; + case 4: aPnt=maRect.RightCenter(); eKind=SdrHdlKind::Right; break; + case 5: aPnt=maRect.BottomLeft(); eKind=SdrHdlKind::LowerLeft; break; + case 6: aPnt=maRect.BottomCenter(); eKind=SdrHdlKind::Lower; break; + case 7: aPnt=maRect.BottomRight(); eKind=SdrHdlKind::LowerRight; break; + } + if (aGeo.nShearAngle!=0) ShearPoint(aPnt,maRect.TopLeft(),aGeo.nTan); + if (aGeo.nRotationAngle!=0) RotatePoint(aPnt,maRect.TopLeft(),aGeo.nSin,aGeo.nCos); pH=new SdrHdl(aPnt,eKind); pH->SetObj(const_cast<SdrTextObj*>(this)); pH->SetRotationAngle(aGeo.nRotationAngle); + rHdlList.AddHdl(pH); } - return pH; } diff --git a/svx/source/svdraw/svdovirt.cxx b/svx/source/svdraw/svdovirt.cxx index 698ac2051adc..b625ae9fcf3d 100644 --- a/svx/source/svdraw/svdovirt.cxx +++ b/svx/source/svdraw/svdovirt.cxx @@ -199,19 +199,17 @@ sal_uInt32 SdrVirtObj::GetHdlCount() const return rRefObj.GetHdlCount(); } -SdrHdl* SdrVirtObj::GetHdl(sal_uInt32 nHdlNum) const +void SdrVirtObj::AddToHdlList(SdrHdlList& rHdlList) const { - SdrHdl* pHdl=rRefObj.GetHdl(nHdlNum); - - // #i73248# - // GetHdl() at SdrObject is not guaranteed to return an object - if(pHdl) + SdrHdlList tempList(nullptr); + rRefObj.AddToHdlList(tempList); + for (size_t i=0; i<tempList.GetHdlCount(); ++i) { + SdrHdl* pHdl = tempList.GetHdl(i); Point aP(pHdl->GetPos()+aAnchor); pHdl->SetPos(aP); } - - return pHdl; + tempList.MoveTo(rHdlList); } sal_uInt32 SdrVirtObj::GetPlusHdlCount(const SdrHdl& rHdl) const @@ -226,43 +224,6 @@ SdrHdl* SdrVirtObj::GetPlusHdl(const SdrHdl& rHdl, sal_uInt32 nPlNum) const return pHdl; } -void SdrVirtObj::AddToHdlList(SdrHdlList& rHdlList) const -{ - // #i73248# - // SdrObject::AddToHdlList(rHdlList) is not a good thing to call - // since at SdrPathObj, only AddToHdlList may be used and the call - // will instead use the standard implementation which uses GetHdlCount() - // and GetHdl instead. This is not wrong, but may be much less effective - // and may not be prepared to GetHdl returning NULL - - // get handles using AddToHdlList from ref object - SdrHdlList aLocalList(nullptr); - rRefObj.AddToHdlList(aLocalList); - const size_t nHdlCount(aLocalList.GetHdlCount()); - - if(nHdlCount) - { - // translate handles and add them to dest list. They are temporarily part of - // two lists then - const Point aOffset(GetOffset()); - - for(size_t a = 0; a < nHdlCount; ++a) - { - SdrHdl* pCandidate = aLocalList.GetHdl(a); - pCandidate->SetPos(pCandidate->GetPos() + aOffset); - rHdlList.AddHdl(pCandidate); - } - - // remove them from source list, else they will be deleted when - // source list is deleted - while(aLocalList.GetHdlCount()) - { - aLocalList.RemoveHdl(aLocalList.GetHdlCount() - 1); - } - } -} - - bool SdrVirtObj::hasSpecialDrag() const { return rRefObj.hasSpecialDrag(); diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx index 53eaffa65d7e..b09160a0b36c 100644 --- a/svx/source/table/svdotable.cxx +++ b/svx/source/table/svdotable.cxx @@ -2187,29 +2187,6 @@ void SdrTableObj::AddToHdlList(SdrHdlList& rHdlList) const rHdlList.GetHdl(nHdl)->SetObj(const_cast<SdrTableObj*>(this)); } -SdrHdl* SdrTableObj::GetHdl(sal_uInt32 nHdlNum) const -{ - // #i73248# - // Warn the user that this is ineffective and show alternatives. Should not be used at all. - OSL_FAIL("SdrTableObj::GetHdl(): ineffective, use AddToHdlList instead (!)"); - - // to have an alternative, get single handle using the ineffective way - SdrHdl* pRetval = nullptr; - SdrHdlList aLocalList(nullptr); - AddToHdlList(aLocalList); - const size_t nHdlCount(aLocalList.GetHdlCount()); - - if(nHdlCount && static_cast<size_t>(nHdlNum) < nHdlCount) - { - // remove and remember. The other created handles will be deleted again with the - // destruction of the local list - pRetval = aLocalList.RemoveHdl(nHdlNum); - } - - return pRetval; -} - - // Dragging bool SdrTableObj::hasSpecialDrag() const diff --git a/sw/inc/dcontact.hxx b/sw/inc/dcontact.hxx index ea0261cde391..4d3a48fd14d0 100644 --- a/sw/inc/dcontact.hxx +++ b/sw/inc/dcontact.hxx @@ -263,7 +263,7 @@ class SwDrawVirtObj : public SdrVirtObj virtual void RecalcBoundRect() override; virtual ::basegfx::B2DPolyPolygon TakeXorPoly() const override; virtual ::basegfx::B2DPolyPolygon TakeContour() const override; - virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const override; + virtual void AddToHdlList(SdrHdlList& rHdlList) const override; virtual void NbcMove(const Size& rSiz) override; virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override; virtual void NbcRotate(const Point& rRef, long nAngle, double sn, double cs) override; diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 286b6ddd721c..df8958a9eaab 100644 --- a/sw/qa/extras/tiledrendering/tiledrendering.cxx +++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx @@ -412,10 +412,12 @@ void SwTiledRenderingTest::testSetGraphicSelection() SdrPage* pPage = pWrtShell->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); SdrObject* pObject = pPage->GetObj(0); pWrtShell->SelectObj(Point(), 0, pObject); + SdrHdlList handleList(nullptr); + pObject->AddToHdlList(handleList); // Make sure the rectangle has 8 handles: at each corner and at the center of each edge. - CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(8), pObject->GetHdlCount()); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(8), handleList.GetHdlCount()); // Take the bottom center one. - SdrHdl* pHdl = pObject->GetHdl(6); + SdrHdl* pHdl = handleList.GetHdl(6); CPPUNIT_ASSERT_EQUAL(int(SdrHdlKind::Lower), static_cast<int>(pHdl->GetKind())); tools::Rectangle aShapeBefore = pObject->GetSnapRect(); // Resize. diff --git a/sw/source/core/draw/dcontact.cxx b/sw/source/core/draw/dcontact.cxx index c3bb4ae61025..2f5da1bb4e36 100644 --- a/sw/source/core/draw/dcontact.cxx +++ b/sw/source/core/draw/dcontact.cxx @@ -2339,21 +2339,19 @@ basegfx::B2DPolyPolygon SwDrawVirtObj::TakeContour() const return aRetval; } -SdrHdl* SwDrawVirtObj::GetHdl(sal_uInt32 nHdlNum) const +void SwDrawVirtObj::AddToHdlList(SdrHdlList& rHdlList) const { - SdrHdl* pHdl = rRefObj.GetHdl(nHdlNum); + SdrHdlList tmpList(nullptr); + rRefObj.AddToHdlList(tmpList); - if(pHdl) + size_t cnt = tmpList.GetHdlCount(); + for(size_t i=0; i < cnt; ++i) { + SdrHdl* pHdl = tmpList.GetHdl(i); Point aP(pHdl->GetPos() + GetOffset()); pHdl->SetPos(aP); } - else - { - OSL_ENSURE(false, "Got no SdrHdl(!)"); - } - - return pHdl; + tmpList.MoveTo(rHdlList); } void SwDrawVirtObj::NbcMove(const Size& rSiz) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits