sc/inc/document.hxx | 5 +++++ sc/qa/unit/ucalc.cxx | 1 + sc/source/core/data/documen2.cxx | 1 + sc/source/core/data/formulacell.cxx | 5 +++++ sc/source/core/tool/interpr2.cxx | 8 +++++++- sc/source/ui/docshell/docsh4.cxx | 2 ++ sc/source/ui/view/tabvwsh4.cxx | 2 +- 7 files changed, 22 insertions(+), 2 deletions(-)
New commits: commit dabcc069de794f38a04625cbc1cb5f70dcd3dff9 Author: Caolán McNamara <caol...@redhat.com> Date: Thu Jan 11 16:59:50 2018 +0000 Better handle ScDde formulas with missing dde-link entries typically each ScDde formula has a matching table:dde-link which results in a ScDdeLink getting inserted during the load. If that dde-link is missing then no ScDdeLink exists and ScDde() will create a new one without cached content. So detect that ScDde is used in the freshing loaded ods and defer fetching new content until the right time. Change-Id: I016b53288076d83dd49e92e245346a5f7f560522 Reviewed-on: https://gerrit.libreoffice.org/47768 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 3d13fd4d649f..28d815a748aa 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -500,6 +500,8 @@ private: // for detective update, is set for each change of a formula bool bDetectiveDirty; + bool bLinkFormulaNeedingCheck; // valid only after loading, for ocDde + CharCompressType nAsianCompression; sal_uInt8 nAsianKerning; @@ -1988,6 +1990,9 @@ public: bool IsDetectiveDirty() const { return bDetectiveDirty; } void SetDetectiveDirty(bool bSet) { bDetectiveDirty = bSet; } + bool HasLinkFormulaNeedingCheck() const { return bLinkFormulaNeedingCheck; } + void SetLinkFormulaNeedingCheck(bool bSet) { bLinkFormulaNeedingCheck = bSet; } + void SetRangeOverflowType(ErrCode nType) { nRangeOverflowType = nType; } bool HasRangeOverflow() const { return nRangeOverflowType != ERRCODE_NONE; } SC_DLLPUBLIC const ErrCode& GetRangeOverflowType() const { return nRangeOverflowType; } diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index 36572e564cb5..175564916e20 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -6548,6 +6548,7 @@ void Test::testEmptyCalcDocDefaults() CPPUNIT_ASSERT_EQUAL( false, m_pDoc->IdleCalcTextWidth() ); CPPUNIT_ASSERT_EQUAL( true, m_pDoc->IsIdleEnabled() ); CPPUNIT_ASSERT_EQUAL( false, m_pDoc->IsDetectiveDirty() ); + CPPUNIT_ASSERT_EQUAL( false, m_pDoc->HasLinkFormulaNeedingCheck() ); CPPUNIT_ASSERT_EQUAL( false, m_pDoc->IsChartListenerCollectionNeedsUpdate() ); CPPUNIT_ASSERT_EQUAL( false, m_pDoc->HasRangeOverflow() ); diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index bd0f72e76658..4e8e83614d5d 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -203,6 +203,7 @@ ScDocument::ScDocument( ScDocumentMode eMode, SfxObjectShell* pDocShell ) : bInDtorClear( false ), bExpandRefs( false ), bDetectiveDirty( false ), + bLinkFormulaNeedingCheck( false ), nAsianCompression(CharCompressType::Invalid), nAsianKerning(SC_ASIANKERNING_INVALID), bPastingDrawFromOtherDoc( false ), diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index efab5fa09cf3..813f74f29655 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -1358,6 +1358,11 @@ void ScFormulaCell::CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rPr bChanged = true; } + // After loading, it must be known if ocDde is in any formula + // (for external links warning, CompileXML is called at the end of loading XML file) + if (!pDocument->HasLinkFormulaNeedingCheck() && pCode->HasOpCodeRPN(ocDde)) + pDocument->SetLinkFormulaNeedingCheck(true); + //volatile cells must be added here for import if( pCode->IsRecalcModeAlways() || pCode->IsRecalcModeForced() || pCode->IsRecalcModeOnLoad() || pCode->IsRecalcModeOnLoadOnce() ) diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx index 5464d9b6c778..ab07afe355e0 100644 --- a/sc/source/core/tool/interpr2.cxx +++ b/sc/source/core/tool/interpr2.cxx @@ -2780,8 +2780,14 @@ void ScInterpreter::ScDde() pBindings->Invalidate( SID_LINKS ); // Link-Manager enabled } + //if the document was just loaded, but the ScDdeLink entry was missing, then + //don't update this link until the links are updated in response to the users + //decision + if (!pDok->HasLinkFormulaNeedingCheck()) + { //TODO: evaluate asynchron ??? - pLink->TryUpdate(); // TryUpdate doesn't call Update multiple times + pLink->TryUpdate(); // TryUpdate doesn't call Update multiple times + } if (pMyFormulaCell) { diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx index 7071e42ab0e4..d555c99aaea3 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -476,6 +476,8 @@ void ScDocShell::Execute( SfxRequest& rReq ) rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false); rReq.Ignore(); } + + rDoc.SetLinkFormulaNeedingCheck(false); } break; diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx index d1f40a7bd313..969dfb7efd8b 100644 --- a/sc/source/ui/view/tabvwsh4.cxx +++ b/sc/source/ui/view/tabvwsh4.cxx @@ -1567,7 +1567,7 @@ void ScTabViewShell::Construct( TriState nForceDesignMode ) if (!bLink) { const sc::DocumentLinkManager& rMgr = rDoc.GetDocLinkManager(); - if (rMgr.hasDdeOrOleLinks() || rDoc.HasAreaLinks()) + if (rMgr.hasDdeOrOleLinks() || rDoc.HasAreaLinks() || rDoc.HasLinkFormulaNeedingCheck()) bLink = true; } if (bLink) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits