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 09:49:32 +0100
commit5691a58e04318c3a5b74da1928be48adf75f032c (patch)
treed21a63b6efdbf970392299e0804037e9d5d733a3
parent9fec2cfc1b02479ae407ae33eb3b4b6f471a8d41 (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>
-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 b5d6f3217544..77ff3883889a 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1795,6 +1795,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 );
static bool CheckMacroWarn();
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index 2bdfa30e3160..f6a43a1d587e 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 <boost/scoped_ptr.hpp>
@@ -1158,6 +1159,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 96316392ffc3..49d3133f42fe 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1353,8 +1353,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 08399552c2a3..14be167de85e 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -157,6 +157,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 ebe3b6445e57..c7e56afd1149 100644
--- a/sc/source/filter/excel/excform8.cxx
+++ b/sc/source/filter/excel/excform8.cxx
@@ -729,6 +729,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 904209d2bb1b..69e536e64ed3 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 189017d65196..2d20e9d73a53 100644
--- a/sc/source/filter/oox/formulabuffer.cxx
+++ b/sc/source/filter/oox/formulabuffer.cxx
@@ -229,6 +229,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);