summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2018-01-17 22:22:55 +0100
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2018-02-09 01:46:12 +0100
commit6e4f31b720b1334118ea7da271d9829a739d8e30 (patch)
treee54fbe040bef41030e67a2b28deadd3e37a20282
parent73497ede98634192469d1638f307eb1b5248a127 (diff)
CheckLinkFormulaNeedingCheck() for .xls and .xlsx formula cells
This is a combination of 3 commits. Move implementation to CheckLinkFormulaNeedingCheck() for further reuse (cherry picked from commit 55e484c7bcd3ef218e08d3fd93f97bf98fd8cb7f) CheckLinkFormulaNeedingCheck() for .xlsx cell formulas (cherry picked from commit f96dbc3dd9c33202f75e29ef49d962386595995d) CheckLinkFormulaNeedingCheck() for .xls cell formulas (cherry picked from commit 6bc48275558c3f76c4da25eb8af3c48583ac5599) a6dd195f7eb4d43483e87eeca59f651e7bf2dcb8 2587fbc4fec39b6f2c8e733331815a2953dee308 Change-Id: I541d2b6e12a88371c064b901b00e71206ee0c18e Reviewed-on: https://gerrit.libreoffice.org/48143 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit 2bef4debcf7650f3b3922134dff0332d4a95da3f)
-rw-r--r--sc/inc/document.hxx2
-rw-r--r--sc/source/core/data/documen8.cxx10
-rw-r--r--sc/source/core/data/formulacell.cxx3
-rw-r--r--sc/source/filter/excel/excform.cxx1
-rw-r--r--sc/source/filter/excel/excform8.cxx1
-rw-r--r--sc/source/filter/excel/impop.cxx1
-rw-r--r--sc/source/filter/oox/formulabuffer.cxx4
7 files changed, 20 insertions, 2 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 7bd0b181011d..d25ca0b913a8 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1930,6 +1930,8 @@ public:
bool HasLinkFormulaNeedingCheck() const { return bLinkFormulaNeedingCheck; }
void SetLinkFormulaNeedingCheck(bool bSet) { bLinkFormulaNeedingCheck = bSet; }
+ /** Check token array and set link check if ocDde/ocWebservice is contained. */
+ SC_DLLPUBLIC void CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode );
void SetRangeOverflowType(sal_uInt32 nType) { nRangeOverflowType = nType; }
bool HasRangeOverflow() const { return nRangeOverflowType != 0; }
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index 572d594b3697..dff84d25aff5 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -88,6 +88,7 @@
#include "stringutil.hxx"
#include <documentlinkmgr.hxx>
#include <scopetools.hxx>
+#include <tokenarray.hxx>
#include <memory>
@@ -1153,6 +1154,15 @@ void ScDocument::UpdateRefAreaLinks( UpdateRefMode eUpdateRefMode,
}
}
+void ScDocument::CheckLinkFormulaNeedingCheck( const ScTokenArray& rCode )
+{
+ if (HasLinkFormulaNeedingCheck())
+ return;
+
+ if (rCode.HasOpCodeRPN(ocDde) || rCode.HasOpCodeRPN(ocWebservice))
+ SetLinkFormulaNeedingCheck(true);
+}
+
// TimerDelays etc.
void ScDocument::KeyInput( const KeyEvent& )
{
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 57ecfa94d358..8eb4f9f23400 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1381,8 +1381,7 @@ void ScFormulaCell::CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rPr
// After loading, it must be known if ocDde/ocWebservice is in any formula
// (for external links warning, CompileXML is called at the end of loading XML file)
- if (!pDocument->HasLinkFormulaNeedingCheck() && (pCode->HasOpCodeRPN(ocDde) || pCode->HasOpCodeRPN(ocWebservice)))
- pDocument->SetLinkFormulaNeedingCheck(true);
+ pDocument->CheckLinkFormulaNeedingCheck(*pCode);
//volatile cells must be added here for import
if( pCode->IsRecalcModeAlways() || pCode->IsRecalcModeForced() ||
diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx
index 67e7657f3428..889225c364bc 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -156,6 +156,7 @@ void ImportExcel::Formula(
{
pCell = new ScFormulaCell(&rDoc.getDoc(), aScPos, *pResult);
pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
+ rDoc.getDoc().CheckLinkFormulaNeedingCheck( *pCell->GetCode());
rDoc.getDoc().EnsureTable(aScPos.Tab());
rDoc.setFormulaCell(aScPos, pCell);
SetLastFormula(aScPos.Col(), aScPos.Row(), fCurVal, nXF, pCell);
diff --git a/sc/source/filter/excel/excform8.cxx b/sc/source/filter/excel/excform8.cxx
index ef3d09ae1c8b..ff3387bf916b 100644
--- a/sc/source/filter/excel/excform8.cxx
+++ b/sc/source/filter/excel/excform8.cxx
@@ -730,6 +730,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn,
<< nMerk0 << ocClose;
aPool >> aStack;
pExtName->CreateDdeData( GetDoc(), aApplic, aTopic );
+ GetDoc().SetLinkFormulaNeedingCheck(true);
}
}
break;
diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx
index 01b5b736951e..a76a81db3ff8 100644
--- a/sc/source/filter/excel/impop.cxx
+++ b/sc/source/filter/excel/impop.cxx
@@ -866,6 +866,7 @@ void ImportExcel::Shrfmla()
ScFormulaCell* pCell = new ScFormulaCell(pD, aPos, *pErgebnis);
pCell->GetCode()->WrapReference(aPos, EXC_MAXCOL8, EXC_MAXROW8);
+ rDoc.getDoc().CheckLinkFormulaNeedingCheck( *pCell->GetCode());
rDoc.getDoc().EnsureTable(aPos.Tab());
rDoc.setFormulaCell(aPos, pCell);
pCell->SetNeedNumberFormat(false);
diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx
index 003d0b96769b..bfa229292775 100644
--- a/sc/source/filter/oox/formulabuffer.cxx
+++ b/sc/source/filter/oox/formulabuffer.cxx
@@ -223,6 +223,10 @@ void applyCellFormulas(
continue;
aCompiler.CompileTokenArray(); // Generate RPN tokens.
+
+ // Check if ocDde/ocWebservice is in any formula for external links warning.
+ rDoc.getDoc().CheckLinkFormulaNeedingCheck(*pCode);
+
ScFormulaCell* pCell = new ScFormulaCell(&rDoc.getDoc(), aPos, pCode);
rDoc.setFormulaCell(aPos, pCell);
rCache.store(aPos, pCell);