934034a
From c29af1572ad15ac5199a09e5812fb8354c165329 Mon Sep 17 00:00:00 2001
934034a
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
934034a
Date: Wed, 22 Aug 2012 14:20:32 +0100
934034a
Subject: [PATCH] Resolves: rhbz#842292 crash in calling callback whose
934034a
 instance was deleted
934034a
934034a
Change-Id: I4cc04d59f48b42cc105703daa9983dd7c9f7af62
934034a
---
934034a
 .../controller/SlsDragAndDropContext.cxx           |  6 +++--
934034a
 .../slidesorter/controller/SlsScrollBarManager.cxx |  8 ++++---
934034a
 .../controller/SlsSelectionFunction.cxx            | 26 ++++++++++++++++++----
934034a
 .../inc/controller/SlsScrollBarManager.hxx         |  2 ++
934034a
 4 files changed, 33 insertions(+), 9 deletions(-)
934034a
934034a
diff --git a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
934034a
index b8234b5..c1bf497 100644
934034a
--- a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
934034a
+++ b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
934034a
@@ -100,11 +100,13 @@ void DragAndDropContext::UpdatePosition (
934034a
     ::boost::shared_ptr<InsertionIndicatorHandler> pInsertionIndicatorHandler (
934034a
         mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler());
934034a
 
934034a
-    if ( ! (bAllowAutoScroll
934034a
+    bool bDoAutoScroll = bAllowAutoScroll
934034a
             && mpTargetSlideSorter->GetController().GetScrollBarManager().AutoScroll(
934034a
                 rMousePosition,
934034a
                 ::boost::bind(
934034a
-                    &DragAndDropContext::UpdatePosition, this, rMousePosition, eMode, false))))
934034a
+                    &DragAndDropContext::UpdatePosition, this, rMousePosition, eMode, false));
934034a
+
934034a
+    if (!bDoAutoScroll)
934034a
     {
934034a
         pInsertionIndicatorHandler->UpdatePosition(aMouseModelPosition, eMode);
934034a
 
934034a
diff --git a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
934034a
index a45f640..4a2d808 100644
934034a
--- a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
934034a
+++ b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
221f595
@@ -617,13 +617,15 @@
934034a
         }
934034a
     }
934034a
 
934034a
-    maAutoScrollFunctor = ::boost::function<void(void)>();
934034a
+    clearAutoScrollFunctor();
934034a
     mbIsAutoScrollActive = false;
934034a
     return false;
934034a
 }
934034a
 
934034a
-
934034a
-
934034a
+void ScrollBarManager::clearAutoScrollFunctor()
934034a
+{
934034a
+    maAutoScrollFunctor = ::boost::function<void(void)>();
934034a
+}
934034a
 
8f1d79a
 IMPL_LINK_NOARG(ScrollBarManager, AutoScrollTimeoutHandler)
934034a
 {
934034a
diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
934034a
index 6217c07..16c23ad 100644
934034a
--- a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
934034a
+++ b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
934034a
@@ -273,6 +273,7 @@ private:
934034a
     SelectionMode meSelectionMode;
934034a
     Point maSecondCorner;
934034a
     Pointer maSavedPointer;
934034a
+    bool mbAutoScrollInstalled;
934034a
     sal_Int32 mnAnchorIndex;
934034a
     sal_Int32 mnSecondIndex;
934034a
     view::ButtonBar::Lock maButtonBarLock;
934034a
@@ -1503,6 +1504,7 @@ MultiSelectionModeHandler::MultiSelectionModeHandler (
934034a
       meSelectionMode(SM_Normal),
934034a
       maSecondCorner(rMouseModelPosition),
934034a
       maSavedPointer(mrSlideSorter.GetContentWindow()->GetPointer()),
934034a
+      mbAutoScrollInstalled(false),
934034a
       mnAnchorIndex(-1),
934034a
       mnSecondIndex(-1),
934034a
       maButtonBarLock(rSlideSorter)
934034a
@@ -1523,6 +1525,12 @@ void MultiSelectionModeHandler::Initialize(const sal_uInt32 nEventCode)
934034a
 
934034a
 MultiSelectionModeHandler::~MultiSelectionModeHandler (void)
934034a
 {
934034a
+    if (mbAutoScrollInstalled)
934034a
+    {
934034a
+        //a call to this handler's MultiSelectionModeHandler::UpdatePosition
934034a
+        //may be still waiting to be called back
934034a
+        mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor();
934034a
+    }
934034a
     mrSlideSorter.GetContentWindow()->SetPointer(maSavedPointer);
934034a
 }
934034a
 
934034a
@@ -1564,6 +1572,14 @@ void MultiSelectionModeHandler::ProcessEvent (
934034a
 bool MultiSelectionModeHandler::ProcessButtonUpEvent (
934034a
     SelectionFunction::EventDescriptor& rDescriptor)
934034a
 {
934034a
+    if (mbAutoScrollInstalled)
934034a
+    {
934034a
+        //a call to this handler's MultiSelectionModeHandler::UpdatePosition
934034a
+        //may be still waiting to be called back
934034a
+        mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor();
934034a
+        mbAutoScrollInstalled = false;
934034a
+    }
934034a
+
934034a
     if (Match(rDescriptor.mnEventCode, BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK))
934034a
     {
934034a
         mrSelectionFunction.SwitchToNormalMode();
934034a
@@ -1620,16 +1636,18 @@ void MultiSelectionModeHandler::UpdatePosition (
934034a
     SharedSdWindow pWindow (mrSlideSorter.GetContentWindow());
934034a
     const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition));
934034a
 
934034a
-    if ( ! (bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll(
934034a
+    bool bDoAutoScroll = bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll(
934034a
         rMousePosition,
934034a
         ::boost::bind(
934034a
             &MultiSelectionModeHandler::UpdatePosition,
934034a
             this,
934034a
             rMousePosition,
934034a
-            false))))
934034a
-    {
934034a
+            false));
934034a
+
934034a
+    if (!bDoAutoScroll)
934034a
         UpdateModelPosition(aMouseModelPosition);
934034a
-    }
934034a
+
934034a
+    mbAutoScrollInstalled |= bDoAutoScroll;
934034a
 }
934034a
 
934034a
 
934034a
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
934034a
index 18807c1..41f3bde 100644
934034a
--- a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
934034a
+++ b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
934034a
@@ -172,6 +172,8 @@ public:
934034a
 
934034a
     void StopAutoScroll (void);
934034a
 
934034a
+    void clearAutoScrollFunctor();
934034a
+
934034a
     enum Orientation { Orientation_Horizontal, Orientation_Vertical };
934034a
     enum Unit { Unit_Pixel, Unit_Slide };
934034a
     /** Scroll the slide sorter by setting the thumbs of the scroll bars and
934034a
-- 
934034a
1.7.11.2
934034a