move the KeepSlideSorterInSyncWithPageChanges to a level lower
so that is a SlideSorter is present it is kept in sync on
undo/redo. regardless of whether focus is in the SlideSorter
or in the main shell.
Change-Id: I11b3333b4447a6020862092e89e9a89de1768f87
diff --git a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
index 05fd566..1f54ce0 100644
--- a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
+++ b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
@@ -334,23 +334,6 @@ void SlotManager::FuPermanent (SfxRequest& rRequest)
// Invalidate( SID_OBJECT_SELECT );
}
class KeepSlideSorterInSyncWithPageChanges
{
view::SlideSorterView::DrawLock m_aDrawLock;
SlideSorterController::ModelChangeLock m_aModelLock;
PageSelector::UpdateLock m_aUpdateLock;
SelectionObserver::Context m_aContext;
public:
KeepSlideSorterInSyncWithPageChanges(SlideSorter& rSlideSorter)
: m_aDrawLock(rSlideSorter)
, m_aModelLock(rSlideSorter.GetController())
, m_aUpdateLock(rSlideSorter)
, m_aContext(rSlideSorter)
{
}
};
void SlotManager::FuSupport (SfxRequest& rRequest)
{
switch (rRequest.GetSlot())
@@ -423,7 +406,6 @@ void SlotManager::FuSupport (SfxRequest& rRequest)
= dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell());
if (pViewShell != nullptr)
{
KeepSlideSorterInSyncWithPageChanges aWatcher(mrSlideSorter);
pViewShell->ImpSidUndo (false, rRequest);
}
break;
@@ -435,7 +417,6 @@ void SlotManager::FuSupport (SfxRequest& rRequest)
= dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell());
if (pViewShell != nullptr)
{
KeepSlideSorterInSyncWithPageChanges aWatcher(mrSlideSorter);
pViewShell->ImpSidRedo (false, rRequest);
}
break;
diff --git a/sd/source/ui/view/viewshel.cxx b/sd/source/ui/view/viewshel.cxx
index fa9d189..c46b9ef 100644
--- a/sd/source/ui/view/viewshel.cxx
+++ b/sd/source/ui/view/viewshel.cxx
@@ -58,6 +58,8 @@
#include "TextObjectBar.hxx"
#include "GraphicObjectBar.hxx"
#include "MediaObjectBar.hxx"
#include "SlideSorter.hxx"
#include "SlideSorterViewShell.hxx"
#include "ViewShellManager.hxx"
#include "FormShellManager.hxx"
#include <svx/dialogs.hrc>
@@ -70,6 +72,10 @@
#include <svl/slstitm.hxx>
#include <sfx2/request.hxx>
#include "SpellDialogChildWindow.hxx"
#include "controller/SlideSorterController.hxx"
#include "controller/SlsPageSelector.hxx"
#include "controller/SlsSelectionObserver.hxx"
#include "view/SlideSorterView.hxx"
#include <basegfx/tools/zoomtools.hxx>
@@ -1226,8 +1232,33 @@ void ViewShell::ImpGetRedoStrings(SfxItemSet &rSet) const
}
}
class KeepSlideSorterInSyncWithPageChanges
{
sd::slidesorter::view::SlideSorterView::DrawLock m_aDrawLock;
sd::slidesorter::controller::SlideSorterController::ModelChangeLock m_aModelLock;
sd::slidesorter::controller::PageSelector::UpdateLock m_aUpdateLock;
sd::slidesorter::controller::SelectionObserver::Context m_aContext;
public:
KeepSlideSorterInSyncWithPageChanges(sd::slidesorter::SlideSorter& rSlideSorter)
: m_aDrawLock(rSlideSorter)
, m_aModelLock(rSlideSorter.GetController())
, m_aUpdateLock(rSlideSorter)
, m_aContext(rSlideSorter)
{
}
};
void ViewShell::ImpSidUndo(bool, SfxRequest& rReq)
{
//The xWatcher keeps the SlideSorter selection in sync
//with the page insertions/deletions that Undo may introduce
std::unique_ptr<KeepSlideSorterInSyncWithPageChanges> xWatcher;
slidesorter::SlideSorterViewShell* pSlideSorterViewShell
= slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
if (pSlideSorterViewShell)
xWatcher.reset(new KeepSlideSorterInSyncWithPageChanges(pSlideSorterViewShell->GetSlideSorter()));
::svl::IUndoManager* pUndoManager = ImpGetUndoManager();
sal_uInt16 nNumber(1);
const SfxItemSet* pReqArgs = rReq.GetArgs();
@@ -1271,6 +1302,14 @@ void ViewShell::ImpSidUndo(bool, SfxRequest& rReq)
void ViewShell::ImpSidRedo(bool, SfxRequest& rReq)
{
//The xWatcher keeps the SlideSorter selection in sync
//with the page insertions/deletions that Undo may introduce
std::unique_ptr<KeepSlideSorterInSyncWithPageChanges> xWatcher;
slidesorter::SlideSorterViewShell* pSlideSorterViewShell
= slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
if (pSlideSorterViewShell)
xWatcher.reset(new KeepSlideSorterInSyncWithPageChanges(pSlideSorterViewShell->GetSlideSorter()));
::svl::IUndoManager* pUndoManager = ImpGetUndoManager();
sal_uInt16 nNumber(1);
const SfxItemSet* pReqArgs = rReq.GetArgs();