diff options
author | Eike Rathke <erack@redhat.com> | 2021-08-01 21:40:15 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-08-03 12:40:30 +0200 |
commit | 1663fd0f85a523bfbd46e836436e979344f009d3 (patch) | |
tree | 933094a209ebba3d6c61a9729dc8c2e4825aee3a | |
parent | 05e869e3f5d459a6e0e3c22f1af8989d0e7fcf6f (diff) |
Consolidate link update handling
Have it at one central place and identical for all document
loading paths.
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119835
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
(cherry picked from commit 55abc3eb93fb8314b413453e384261cb00fde087)
Conflicts:
sc/source/ui/docshell/docsh4.cxx
Change-Id: Ib00153a9f5831e223d0129df0538353a7e20961e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119852
Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | sc/source/filter/oox/excelfilter.cxx | 8 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlimprt.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/docshell/arealink.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh.cxx | 25 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh4.cxx | 90 | ||||
-rw-r--r-- | sc/source/ui/inc/docsh.hxx | 1 |
6 files changed, 71 insertions, 59 deletions
diff --git a/sc/source/filter/oox/excelfilter.cxx b/sc/source/filter/oox/excelfilter.cxx index b5d01215baf8..e5815200e063 100644 --- a/sc/source/filter/oox/excelfilter.cxx +++ b/sc/source/filter/oox/excelfilter.cxx @@ -109,14 +109,18 @@ bool ExcelFilter::importDocument() if (xBookGlob) { rtl::Reference<FragmentHandler> xWorkbookFragment( new WorkbookFragment(*xBookGlob, aWorkbookPath)); + + const WorkbookFragment* pWF = static_cast<const WorkbookFragment*>(xWorkbookFragment.get()); + const ScDocument& rDoc = pWF->getScDocument(); + if (ScDocShell* pDocSh = static_cast<ScDocShell*>(rDoc.GetDocumentShell())) + pDocSh->SetInitialLinkUpdate( pDocSh->GetMedium()); + bool bRet = importFragment( xWorkbookFragment); if (bRet) { - const WorkbookFragment* pWF = static_cast<const WorkbookFragment*>(xWorkbookFragment.get()); const AddressConverter& rAC = pWF->getAddressConverter(); if (rAC.isTabOverflow() || rAC.isColOverflow() || rAC.isRowOverflow()) { - const ScDocument& rDoc = pWF->getScDocument(); if (rDoc.IsUserInteractionEnabled()) { // Show data loss warning. diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index 968ebb0cdbfe..99d33d2416db 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -1138,6 +1138,9 @@ void SAL_CALL ScXMLImport::setTargetDocument( const css::uno::Reference< css::la if (!pDoc) throw lang::IllegalArgumentException(); + if (ScDocShell* pDocSh = static_cast<ScDocShell*>(pDoc->GetDocumentShell())) + pDocSh->SetInitialLinkUpdate( pDocSh->GetMedium()); + mpDocImport.reset(new ScDocumentImport(*pDoc)); mpComp.reset(new ScCompiler(*pDoc, ScAddress(), formula::FormulaGrammar::GRAM_ODFF)); diff --git a/sc/source/ui/docshell/arealink.cxx b/sc/source/ui/docshell/arealink.cxx index 2b66e13e2327..e44e364c461a 100644 --- a/sc/source/ui/docshell/arealink.cxx +++ b/sc/source/ui/docshell/arealink.cxx @@ -226,6 +226,9 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const OUString& rNewFilter, if (rNewFile.isEmpty() || rNewFilter.isEmpty()) return false; + if (!m_pDocSh->GetEmbeddedObjectContainer().getUserAllowsLinkUpdate()) + return false; + OUString aNewUrl( ScGlobal::GetAbsDocName( rNewFile, m_pDocSh ) ); bool bNewUrlName = (aNewUrl != aFileName); diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 29435d90a2f4..8e2c3c45218f 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -586,21 +586,7 @@ bool ScDocShell::Load( SfxMedium& rMedium ) bool bRet = SfxObjectShell::Load(rMedium); if (bRet) { - if (GetMedium()) - { - const SfxUInt16Item* pUpdateDocItem = SfxItemSet::GetItem<SfxUInt16Item>(rMedium.GetItemSet(), SID_UPDATEDOCMODE, false); - m_nCanUpdate = pUpdateDocItem ? pUpdateDocItem->GetValue() : css::document::UpdateDocMode::NO_UPDATE; - } - - // GetLinkUpdateModeState() evaluates m_nCanUpdate so that must have - // been set first. Do not override an already forbidden LinkUpdate (the - // default is allow). - comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer(); - if (rEmbeddedObjectContainer.getUserAllowsLinkUpdate()) - { - // For anything else than LM_ALWAYS we need user confirmation. - rEmbeddedObjectContainer.setUserAllowsLinkUpdate( GetLinkUpdateModeState() == LM_ALWAYS); - } + SetInitialLinkUpdate(&rMedium); { // prepare a valid document for XML filter @@ -1090,11 +1076,7 @@ bool ScDocShell::LoadFrom( SfxMedium& rMedium ) bool bRet = false; - if (GetMedium()) - { - const SfxUInt16Item* pUpdateDocItem = SfxItemSet::GetItem<SfxUInt16Item>(rMedium.GetItemSet(), SID_UPDATEDOCMODE, false); - m_nCanUpdate = pUpdateDocItem ? pUpdateDocItem->GetValue() : css::document::UpdateDocMode::NO_UPDATE; - } + SetInitialLinkUpdate(&rMedium); // until loading/saving only the styles in XML is implemented, // load the whole file @@ -1161,8 +1143,7 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium ) // So make sure that we transfer the whole file with CreateFileStream rMedium.GetPhysicalName(); //! Call CreateFileStream directly, if available - const SfxUInt16Item* pUpdateDocItem = SfxItemSet::GetItem<SfxUInt16Item>(rMedium.GetItemSet(), SID_UPDATEDOCMODE, false); - m_nCanUpdate = pUpdateDocItem ? pUpdateDocItem->GetValue() : css::document::UpdateDocMode::NO_UPDATE; + SetInitialLinkUpdate(&rMedium); std::shared_ptr<const SfxFilter> pFilter = rMedium.GetFilter(); if (pFilter) diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx index f3eca38a7da9..85ee0a42ff2d 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -110,6 +110,61 @@ using namespace ::com::sun::star; #include <svx/xdef.hxx> +void ScDocShell::SetInitialLinkUpdate( SfxMedium* pMed ) +{ + if (pMed) + { + const SfxUInt16Item* pUpdateDocItem = SfxItemSet::GetItem<SfxUInt16Item>( pMed->GetItemSet(), + SID_UPDATEDOCMODE, false); + m_nCanUpdate = pUpdateDocItem ? pUpdateDocItem->GetValue() : css::document::UpdateDocMode::NO_UPDATE; + } + + // GetLinkUpdateModeState() evaluates m_nCanUpdate so that must have + // been set first. Do not override an already forbidden LinkUpdate (the + // default is allow). + comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer(); + if (rEmbeddedObjectContainer.getUserAllowsLinkUpdate()) + { + // For anything else than LM_ALWAYS we need user confirmation. + rEmbeddedObjectContainer.setUserAllowsLinkUpdate( GetLinkUpdateModeState() == LM_ALWAYS); + } +} + +ScLkUpdMode ScDocShell::GetLinkUpdateModeState() const +{ + ScLkUpdMode nSet; + if (m_nCanUpdate == css::document::UpdateDocMode::NO_UPDATE) + nSet = LM_NEVER; + else if (m_nCanUpdate == css::document::UpdateDocMode::FULL_UPDATE) + nSet = LM_ALWAYS; + else + { + nSet = GetDocument().GetLinkMode(); + if (nSet == LM_UNKNOWN) + { + ScAppOptions aAppOptions = SC_MOD()->GetAppOptions(); + nSet = aAppOptions.GetLinkMode(); + } + } + + if (nSet == LM_ALWAYS + && !(SvtSecurityOptions().isTrustedLocationUriForUpdatingLinks( + GetMedium() == nullptr ? OUString() : GetMedium()->GetName()) + || (IsDocShared() + && SvtSecurityOptions().isTrustedLocationUriForUpdatingLinks( + GetSharedFileURL())))) + { + nSet = LM_ON_DEMAND; + } + if (m_nCanUpdate == css::document::UpdateDocMode::QUIET_UPDATE + && nSet == LM_ON_DEMAND) + { + nSet = LM_NEVER; + } + + return nSet; +} + void ScDocShell::AllowLinkUpdate() { m_aDocument.SetLinkFormulaNeedingCheck(false); @@ -150,41 +205,6 @@ IMPL_LINK_NOARG( ScDocShell, ReloadAllLinksHdl, weld::Button&, void ) SAL_WARN_IF(!pViewFrame, "sc", "expected there to be a ViewFrame"); } -ScLkUpdMode ScDocShell::GetLinkUpdateModeState() const -{ - const ScDocument& rDoc = GetDocument(); - - ScLkUpdMode nSet = rDoc.GetLinkMode(); - - if (nSet == LM_UNKNOWN) - { - ScAppOptions aAppOptions = SC_MOD()->GetAppOptions(); - nSet = aAppOptions.GetLinkMode(); - } - - if (m_nCanUpdate == css::document::UpdateDocMode::NO_UPDATE) - nSet = LM_NEVER; - else if (m_nCanUpdate == css::document::UpdateDocMode::FULL_UPDATE) - nSet = LM_ALWAYS; - - if (nSet == LM_ALWAYS - && !(SvtSecurityOptions().isTrustedLocationUriForUpdatingLinks( - GetMedium() == nullptr ? OUString() : GetMedium()->GetName()) - || (IsDocShared() - && SvtSecurityOptions().isTrustedLocationUriForUpdatingLinks( - GetSharedFileURL())))) - { - nSet = LM_ON_DEMAND; - } - if (m_nCanUpdate == css::document::UpdateDocMode::QUIET_UPDATE - && nSet == LM_ON_DEMAND) - { - nSet = LM_NEVER; - } - - return nSet; -} - void ScDocShell::Execute( SfxRequest& rReq ) { const SfxItemSet* pReqArgs = rReq.GetArgs(); diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx index eb6203362110..57f172ef2b5e 100644 --- a/sc/source/ui/inc/docsh.hxx +++ b/sc/source/ui/inc/docsh.hxx @@ -294,6 +294,7 @@ public: virtual void ReconnectDdeLink(SfxObjectShell& rServer) override; void UpdateLinks() override; + void SetInitialLinkUpdate( SfxMedium* pMedium ); void AllowLinkUpdate(); void ReloadAllLinks(); void ReloadTabLinks(); |