From b0535f3944975c1f6cdadc149d70502843331f86 Mon Sep 17 00:00:00 2001 From: David Tardon Date: Mon, 11 Jul 2016 11:59:41 +0200 Subject: [PATCH] rhbz#1351292 correctly set edit mode ... when switching between different shells, e.g., from Outline to Slide master. Change-Id: I22ef6f6cac73c52fb1bedd97e653b4b57c5a7a24 --- sd/source/ui/framework/tools/FrameworkHelper.cxx | 57 +++++++++++++++++------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/sd/source/ui/framework/tools/FrameworkHelper.cxx b/sd/source/ui/framework/tools/FrameworkHelper.cxx index 6b08f37..15740f0 100644 --- a/sd/source/ui/framework/tools/FrameworkHelper.cxx +++ b/sd/source/ui/framework/tools/FrameworkHelper.cxx @@ -518,6 +518,41 @@ OUString FrameworkHelper::GetViewURL (ViewShell::ShellType eType) } } +namespace +{ + +void updateEditMode(const Reference &xView, FrameworkHelper* const pHelper, const EditMode eEMode, bool updateFrameView) +{ + // Ensure we have the expected edit mode + // The check is only for DrawViewShell as OutlineViewShell + // and SlideSorterViewShell have no master mode + const ::std::shared_ptr pCenterViewShell (pHelper->GetViewShell(xView)); + DrawViewShell* pDrawViewShell + = dynamic_cast(pCenterViewShell.get()); + if (pDrawViewShell != nullptr) + { + pCenterViewShell->Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START)); + + pDrawViewShell->ChangeEditMode(eEMode, pDrawViewShell->IsLayerModeActive()); + if (updateFrameView) + pDrawViewShell->WriteFrameViewData(); + + pCenterViewShell->Broadcast ( + ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END)); + } +} + +void asyncUpdateEditMode(FrameworkHelper* const pHelper, const EditMode eEMode) +{ + Reference xPaneId ( + FrameworkHelper::CreateResourceId(framework::FrameworkHelper::msCenterPaneURL)); + Reference xView (pHelper->GetView(xPaneId)); + updateEditMode(xView, pHelper, eEMode, true); +} + +} + void FrameworkHelper::HandleModeChangeSlot ( sal_uLong nSlotId, SfxRequest& rRequest) @@ -552,7 +587,6 @@ void FrameworkHelper::HandleModeChangeSlot ( Reference xPaneId ( CreateResourceId(framework::FrameworkHelper::msCenterPaneURL)); Reference xView (GetView(xPaneId)); - ::std::shared_ptr pCenterViewShell (GetViewShell(xView)); // Compute requested view OUString sRequestedView; @@ -595,26 +629,15 @@ void FrameworkHelper::HandleModeChangeSlot ( if (!(xView.is() && xView->getResourceId()->getResourceURL().equals(sRequestedView))) { + const auto xId = CreateResourceId(sRequestedView, msCenterPaneURL); mxConfigurationController->requestResourceActivation( - CreateResourceId(sRequestedView, msCenterPaneURL), + xId, ResourceActivationMode_REPLACE); + RunOnResourceActivation(xId, std::bind(&asyncUpdateEditMode, this, eEMode)); } - - // Ensure we have the expected edit mode - // The check is only for DrawViewShell as OutlineViewShell - // and SlideSorterViewShell have no master mode - DrawViewShell* pDrawViewShell - = dynamic_cast(pCenterViewShell.get()); - if (pDrawViewShell != nullptr) + else { - pCenterViewShell->Broadcast ( - ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START)); - - pDrawViewShell->ChangeEditMode ( - eEMode, pDrawViewShell->IsLayerModeActive()); - - pCenterViewShell->Broadcast ( - ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END)); + updateEditMode(xView, this, eEMode, false); } } catch (RuntimeException&) -- 2.7.4