diff options
author | Caolán McNamara <caolanm@redhat.com> | 2012-08-22 14:20:32 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2012-08-22 14:20:52 +0100 |
commit | c29af1572ad15ac5199a09e5812fb8354c165329 (patch) | |
tree | fd086851a2f6157973daa1238d7a1406b6bc9569 /sd | |
parent | 6fb127a62e8f6f55b41eb75e5f7c20339886e021 (diff) |
Resolves: rhbz#842292 crash in calling callback whose instance was deleted
Change-Id: I4cc04d59f48b42cc105703daa9983dd7c9f7af62
Diffstat (limited to 'sd')
4 files changed, 33 insertions, 9 deletions
diff --git a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx index b8234b53af2a..c1bf497ee080 100644 --- a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx +++ b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx @@ -100,11 +100,13 @@ void DragAndDropContext::UpdatePosition ( ::boost::shared_ptr<InsertionIndicatorHandler> pInsertionIndicatorHandler ( mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()); - if ( ! (bAllowAutoScroll + bool bDoAutoScroll = bAllowAutoScroll && mpTargetSlideSorter->GetController().GetScrollBarManager().AutoScroll( rMousePosition, ::boost::bind( - &DragAndDropContext::UpdatePosition, this, rMousePosition, eMode, false)))) + &DragAndDropContext::UpdatePosition, this, rMousePosition, eMode, false)); + + if (!bDoAutoScroll) { pInsertionIndicatorHandler->UpdatePosition(aMouseModelPosition, eMode); diff --git a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx index a45f640ac1ca..4a2d808dddf5 100644 --- a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx +++ b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx @@ -617,13 +617,15 @@ bool ScrollBarManager::RepeatAutoScroll (void) } } - maAutoScrollFunctor = ::boost::function<void(void)>(); + clearAutoScrollFunctor(); mbIsAutoScrollActive = false; return false; } - - +void ScrollBarManager::clearAutoScrollFunctor() +{ + maAutoScrollFunctor = ::boost::function<void(void)>(); +} IMPL_LINK_NOARG(ScrollBarManager, AutoScrollTimeoutHandler) { diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx index 6217c07fde2f..16c23ad21a38 100644 --- a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx +++ b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx @@ -273,6 +273,7 @@ private: SelectionMode meSelectionMode; Point maSecondCorner; Pointer maSavedPointer; + bool mbAutoScrollInstalled; sal_Int32 mnAnchorIndex; sal_Int32 mnSecondIndex; view::ButtonBar::Lock maButtonBarLock; @@ -1503,6 +1504,7 @@ MultiSelectionModeHandler::MultiSelectionModeHandler ( meSelectionMode(SM_Normal), maSecondCorner(rMouseModelPosition), maSavedPointer(mrSlideSorter.GetContentWindow()->GetPointer()), + mbAutoScrollInstalled(false), mnAnchorIndex(-1), mnSecondIndex(-1), maButtonBarLock(rSlideSorter) @@ -1523,6 +1525,12 @@ void MultiSelectionModeHandler::Initialize(const sal_uInt32 nEventCode) MultiSelectionModeHandler::~MultiSelectionModeHandler (void) { + if (mbAutoScrollInstalled) + { + //a call to this handler's MultiSelectionModeHandler::UpdatePosition + //may be still waiting to be called back + mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor(); + } mrSlideSorter.GetContentWindow()->SetPointer(maSavedPointer); } @@ -1564,6 +1572,14 @@ void MultiSelectionModeHandler::ProcessEvent ( bool MultiSelectionModeHandler::ProcessButtonUpEvent ( SelectionFunction::EventDescriptor& rDescriptor) { + if (mbAutoScrollInstalled) + { + //a call to this handler's MultiSelectionModeHandler::UpdatePosition + //may be still waiting to be called back + mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor(); + mbAutoScrollInstalled = false; + } + if (Match(rDescriptor.mnEventCode, BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK)) { mrSelectionFunction.SwitchToNormalMode(); @@ -1620,16 +1636,18 @@ void MultiSelectionModeHandler::UpdatePosition ( SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition)); - if ( ! (bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll( + bool bDoAutoScroll = bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll( rMousePosition, ::boost::bind( &MultiSelectionModeHandler::UpdatePosition, this, rMousePosition, - false)))) - { + false)); + + if (!bDoAutoScroll) UpdateModelPosition(aMouseModelPosition); - } + + mbAutoScrollInstalled |= bDoAutoScroll; } diff --git a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx index 18807c128ab0..41f3bdeb0df3 100644 --- a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx +++ b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx @@ -172,6 +172,8 @@ public: void StopAutoScroll (void); + void clearAutoScrollFunctor(); + enum Orientation { Orientation_Horizontal, Orientation_Vertical }; enum Unit { Unit_Pixel, Unit_Slide }; /** Scroll the slide sorter by setting the thumbs of the scroll bars and |