|
|
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 |
|