summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/formula/errorcodes.hxx4
-rw-r--r--sc/inc/globstr.hrc1
-rw-r--r--sc/source/core/data/global.cxx3
-rw-r--r--sc/source/core/tool/interpr7.cxx35
4 files changed, 32 insertions, 11 deletions
diff --git a/include/formula/errorcodes.hxx b/include/formula/errorcodes.hxx
index d4324a998db0..7afce495b6de 100644
--- a/include/formula/errorcodes.hxx
+++ b/include/formula/errorcodes.hxx
@@ -83,6 +83,9 @@ enum class FormulaError : sal_uInt16
MatrixSize = 538,
// Bad inline array content, non-value/non-string.
BadArrayContent = 539,
+// Interpreter: signal result not available because updating links is not
+// allowed (yet) and tell to try hybrid string as result.
+ LinkFormulaNeedingCheck = 540,
// Interpreter: NA() not available condition, not a real error
NotAvailable = 0x7fff
@@ -171,6 +174,7 @@ inline bool isPublishedFormulaError( FormulaError nErr )
return false;
case FormulaError::MatrixSize:
+ case FormulaError::LinkFormulaNeedingCheck:
return true;
case FormulaError::NotAvailable:
diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc
index 326c9f01c455..09caaf80423c 100644
--- a/sc/inc/globstr.hrc
+++ b/sc/inc/globstr.hrc
@@ -510,6 +510,7 @@
#define STR_TEXT NC_("STR_TEXT", "Text")
#define STR_QUERY_PIVOTTABLE_DELTAB NC_("STR_QUERY_PIVOTTABLE_DELTAB", "The selected sheet(s) contain source data of related pivot tables that will be lost. Are you sure you want to delete the selected sheet(s)?")
#define STR_ERR_NAME_INVALID_CELL_REF NC_("STR_ERR_NAME_INVALID_CELL_REF", "Invalid name. Reference to a cell, or a range of cells not allowed.")
+#define STR_ERR_LONG_LINK_FORMULA_NEEDING_CHECK NC_("STR_ERR_LONG_LINK_FORMULA_NEEDING_CHECK", "External content disabled.")
#endif
diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx
index 825278134b43..cf0bd92371da 100644
--- a/sc/source/core/data/global.cxx
+++ b/sc/source/core/data/global.cxx
@@ -423,6 +423,9 @@ OUString ScGlobal::GetLongErrorString(FormulaError nErr)
case FormulaError::BadArrayContent:
pErrNumber = STR_ERR_LONG_BAD_ARRAY_CONTENT;
break;
+ case FormulaError::LinkFormulaNeedingCheck:
+ pErrNumber = STR_ERR_LONG_LINK_FORMULA_NEEDING_CHECK;
+ break;
case FormulaError::NoValue:
pErrNumber = STR_LONG_ERR_NO_VALUE;
break;
diff --git a/sc/source/core/tool/interpr7.cxx b/sc/source/core/tool/interpr7.cxx
index 108d5f4445ea..e2dd62717fb9 100644
--- a/sc/source/core/tool/interpr7.cxx
+++ b/sc/source/core/tool/interpr7.cxx
@@ -320,7 +320,6 @@ void ScInterpreter::ScWebservice()
ScWebServiceLink* pLink = lcl_GetWebServiceLink(mpLinkManager, aURI);
bool bWasError = (pMyFormulaCell && pMyFormulaCell->GetRawError() != FormulaError::NONE);
- bool bLinkFormulaNeedingCheck = false;
if (!pLink)
{
@@ -336,8 +335,7 @@ void ScInterpreter::ScWebservice()
//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
- bLinkFormulaNeedingCheck = pDok->HasLinkFormulaNeedingCheck();
- if (!bLinkFormulaNeedingCheck)
+ if (!pDok->HasLinkFormulaNeedingCheck())
{
pLink->Update();
}
@@ -361,7 +359,7 @@ void ScInterpreter::ScWebservice()
// check the value
if (pLink->HasResult())
PushString(pLink->GetResult());
- else
+ else if (pDok->HasLinkFormulaNeedingCheck())
{
// If this formula cell is recalculated just after load and the
// expression is exactly WEBSERVICE("literal_URI") (i.e. no other
@@ -371,18 +369,33 @@ void ScInterpreter::ScWebservice()
// external links has been disabled."
// This will work only once, as the new formula cell result won't
// be a hybrid anymore.
- if (bLinkFormulaNeedingCheck && pMyFormulaCell && pMyFormulaCell->GetCode()->GetCodeLen() == 2 &&
- pMyFormulaCell->HasHybridStringResult())
+ /* TODO: the FormulaError::LinkFormulaNeedingCheck could be used as
+ * a signal for the formula cell to keep the hybrid string as
+ * result of the overall formula *iff* no higher prioritized
+ * ScRecalcMode than ONLOAD_LENIENT is present in the entire
+ * document (i.e. the formula result could not be influenced by an
+ * ONLOAD_MUST or ALWAYS recalc, necessary as we don't track
+ * interim results of subexpressions that could be compared), which
+ * also means to track setting ScRecalcMode somehow.. note this is
+ * just a vague idea so far and might or might not work. */
+ if (pMyFormulaCell && pMyFormulaCell->HasHybridStringResult())
{
- formula::FormulaToken const * const * pRPN = pMyFormulaCell->GetCode()->GetCode();
- if (pRPN[0]->GetType() == formula::svString && pRPN[1]->GetOpCode() == ocWebservice)
- PushString( pMyFormulaCell->GetResultString());
+ if (pMyFormulaCell->GetCode()->GetCodeLen() == 2)
+ {
+ formula::FormulaToken const * const * pRPN = pMyFormulaCell->GetCode()->GetCode();
+ if (pRPN[0]->GetType() == formula::svString && pRPN[1]->GetOpCode() == ocWebservice)
+ PushString( pMyFormulaCell->GetResultString());
+ else
+ PushError(FormulaError::LinkFormulaNeedingCheck);
+ }
else
- PushError(FormulaError::NoValue);
+ PushError(FormulaError::LinkFormulaNeedingCheck);
}
else
- PushError(FormulaError::NoValue);
+ PushError(FormulaError::LinkFormulaNeedingCheck);
}
+ else
+ PushError(FormulaError::NoValue);
pDok->EnableIdle(bOldEnabled);
mpLinkManager->CloseCachedComps();