diff options
-rw-r--r-- | sc/source/ui/view/drawvie3.cxx | 7 | ||||
-rw-r--r-- | svx/inc/svx/svdhdl.hxx | 1 | ||||
-rw-r--r-- | svx/source/svdraw/svdhdl.cxx | 20 |
3 files changed, 28 insertions, 0 deletions
diff --git a/sc/source/ui/view/drawvie3.cxx b/sc/source/ui/view/drawvie3.cxx index 964fb14527bd..ed701a2d62ab 100644 --- a/sc/source/ui/view/drawvie3.cxx +++ b/sc/source/ui/view/drawvie3.cxx @@ -87,6 +87,10 @@ void ScDrawView::SetPageAnchored() if ( pViewData ) pViewData->GetDocShell()->SetDrawModified(); + + // Remove the anchor object. + aHdl.RemoveAllByKind(HDL_ANCHOR); + aHdl.RemoveAllByKind(HDL_ANCHOR_TR); } } @@ -108,6 +112,9 @@ void ScDrawView::SetCellAnchored() if ( pViewData ) pViewData->GetDocShell()->SetDrawModified(); + + // Set the anchor object. + AddCustomHdl(); } } diff --git a/svx/inc/svx/svdhdl.hxx b/svx/inc/svx/svdhdl.hxx index 895644d47784..f94a00e57acb 100644 --- a/svx/inc/svx/svdhdl.hxx +++ b/svx/inc/svx/svdhdl.hxx @@ -502,6 +502,7 @@ public: // also auf dem Heap stehen, da Clear() ein delete macht. void AddHdl(SdrHdl* pHdl, sal_Bool bAtBegin=sal_False); SdrHdl* RemoveHdl(sal_uIntPtr nNum); + void RemoveAllByKind(SdrHdlKind eKind); // Zuletzt eingefuegte Handles werden am ehesten getroffen // (wenn Handles uebereinander liegen). diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx index 3d2e7868a0b0..5d58e1f85e81 100644 --- a/svx/source/svdraw/svdhdl.cxx +++ b/svx/source/svdraw/svdhdl.cxx @@ -2081,6 +2081,26 @@ SdrHdl* SdrHdlList::RemoveHdl(sal_uIntPtr nNum) return pRetval; } +void SdrHdlList::RemoveAllByKind(SdrHdlKind eKind) +{ + SdrHdl* p = static_cast<SdrHdl*>(aList.Last()); + while (p) + { + if (p->GetKind() == eKind) + { + // If removing an item doesn't invalidate the current position, + // then perhaps it's safe to keep calling Prev here. But then I'm + // too lazy to find out & this Container needs to be replaced by + // STL anyways... :-P + aList.Remove(p); + delete p; + p = static_cast<SdrHdl*>(aList.Last()); // start from the back again. + } + else + p = static_cast<SdrHdl*>(aList.Prev()); + } +} + void SdrHdlList::Clear() { for (sal_uIntPtr i=0; i<GetHdlCount(); i++) |