summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2018-07-26 16:14:46 +1000
committerCaolán McNamara <caolanm@redhat.com>2018-07-26 17:42:09 +0200
commite2a5932da7a3df9f6440f8326520061caa2342c1 (patch)
tree40aa2ae9c36a5931705ac1e003381e1dbfab23d6
parent4c702afe205a778b73b50cd95bc4f28b98baca44 (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>
-rw-r--r--sw/inc/docsh.hxx12
-rw-r--r--sw/source/core/doc/DocumentStatisticsManager.cxx31
-rw-r--r--sw/source/uibase/app/docsh.cxx28
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();