diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-07-26 16:14:46 +1000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-07-26 17:42:09 +0200 |
commit | e2a5932da7a3df9f6440f8326520061caa2342c1 (patch) | |
tree | 40aa2ae9c36a5931705ac1e003381e1dbfab23d6 /sw | |
parent | 4c702afe205a778b73b50cd95bc4f28b98baca44 (diff) |
tdf#41063: don't jump to cursor when saving
Reuse the fix from commits e12184393f0591b5c5d9218062cc0a4bced6d4e6
and 36c84fa3fbd03e5f651ba9d81e321566c8fcdbd0.
Change-Id: I5b7cdc321c6e30e994732d2c0295e494a172a2e2
Reviewed-on: https://gerrit.libreoffice.org/58034
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/docsh.hxx | 12 | ||||
-rw-r--r-- | sw/source/core/doc/DocumentStatisticsManager.cxx | 31 | ||||
-rw-r--r-- | sw/source/uibase/app/docsh.cxx | 28 |
3 files changed, 41 insertions, 30 deletions
diff --git a/sw/inc/docsh.hxx b/sw/inc/docsh.hxx index 9a88de3abeb6..f2c17c1747c1 100644 --- a/sw/inc/docsh.hxx +++ b/sw/inc/docsh.hxx @@ -51,6 +51,7 @@ class IDocumentDeviceAccess; class IDocumentChartDataProviderAccess; class SwDocShell; class SwDrawModel; +class SwViewShell; namespace svt { class EmbeddedObjectRef; @@ -318,6 +319,17 @@ public: void RegisterAutomationDocumentEventsCaller(css::uno::Reference< ooo::vba::XSinkCaller > const& xCaller); void CallAutomationDocumentEventSinks(const OUString& Method, css::uno::Sequence< css::uno::Any >& Arguments); void RegisterAutomationDocumentObject(css::uno::Reference< ooo::vba::word::XDocument > const& xDocument); + + class LockAllViewsGuard + { + std::vector<SwViewShell*> m_aViewWasUnLocked; + + public: + explicit LockAllViewsGuard(SwViewShell* pViewShell); + ~LockAllViewsGuard(); + }; + // Lock all unlocked views, and returns a guard object which unlocks those views when destructed + std::unique_ptr<LockAllViewsGuard> LockAllViews(); }; /** Find the right DocShell and create a new one: diff --git a/sw/source/core/doc/DocumentStatisticsManager.cxx b/sw/source/core/doc/DocumentStatisticsManager.cxx index 0b8003283fb0..394aee67856a 100644 --- a/sw/source/core/doc/DocumentStatisticsManager.cxx +++ b/sw/source/core/doc/DocumentStatisticsManager.cxx @@ -39,35 +39,6 @@ using namespace ::com::sun::star; -namespace -{ - class LockAllViews - { - std::vector<SwViewShell*> m_aViewWasUnLocked; - SwViewShell* m_pViewShell; - public: - explicit LockAllViews(SwViewShell *pViewShell) - : m_pViewShell(pViewShell) - { - if (!m_pViewShell) - return; - for (SwViewShell& rShell : m_pViewShell->GetRingContainer()) - { - if (!rShell.IsViewLocked()) - { - m_aViewWasUnLocked.push_back(&rShell); - rShell.LockView(true); - } - } - } - ~LockAllViews() - { - for(SwViewShell* pShell : m_aViewWasUnLocked) - pShell->LockView(false); - } - }; -} - namespace sw { @@ -218,7 +189,7 @@ bool DocumentStatisticsManager::IncrementalDocStatCalculate(long nChars, bool bF const ModifyBlocker_Impl b(pObjShell); // rhbz#1081176: don't jump to cursor pos because of (temporary) // activation of modified flag triggering move to input position - LockAllViews aViewGuard(pObjShell->GetEditShell()); + auto aViewGuard(pObjShell->LockAllViews()); xDocProps->setDocumentStatistics(aStat); if (!bDocWasModified) { diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx index 2a40bc1d12da..ee1fa8228b4d 100644 --- a/sw/source/uibase/app/docsh.cxx +++ b/sw/source/uibase/app/docsh.cxx @@ -130,6 +130,7 @@ #include <sal/log.hxx> #include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include <o3tl/make_unique.hxx> using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -382,10 +383,37 @@ bool SwDocShell::Save() return !nErr.IsError(); } +SwDocShell::LockAllViewsGuard::LockAllViewsGuard(SwViewShell* pViewShell) +{ + if (!pViewShell) + return; + for (SwViewShell& rShell : pViewShell->GetRingContainer()) + { + if (!rShell.IsViewLocked()) + { + m_aViewWasUnLocked.push_back(&rShell); + rShell.LockView(true); + } + } +} + +SwDocShell::LockAllViewsGuard::~LockAllViewsGuard() +{ + for (SwViewShell* pShell : m_aViewWasUnLocked) + pShell->LockView(false); +} + +std::unique_ptr<SwDocShell::LockAllViewsGuard> SwDocShell::LockAllViews() +{ + return o3tl::make_unique<LockAllViewsGuard>(GetEditShell()); +} + // Save using the Defaultformat bool SwDocShell::SaveAs( SfxMedium& rMedium ) { SwWait aWait( *this, true ); + // tdf#41063: prevent jumping to cursor at any temporary modification + auto aViewGuard(LockAllViews()); //#i3370# remove quick help to prevent saving of autocorrection suggestions if (m_pView) m_pView->GetEditWin().StopQuickHelp(); |