summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2014-08-21 23:14:52 +0200
committerEike Rathke <erack@redhat.com>2014-08-22 01:12:18 +0200
commitc0aba5007b6e468336b41138f099914c32f4b0cf (patch)
tree79e6f7269b07ada5ae1ee1d5579178aa7dd30506
parent07b18860ae03ecb66b5605201f34c2aef3a55ad6 (diff)
fdo#82183 do not reset globals while loading a document
Destroying the function list while an instance of the Formula Wizard is still open is a bad idea. Workaround not doing this when loading a document due to a DDE function or external reference being entered in the wizard. Change-Id: I6fa00fb4f442bf7c9410679e446ff460289e4b16
-rw-r--r--formula/source/ui/dlg/formula.cxx2
-rw-r--r--sc/source/filter/oox/workbookhelper.cxx2
-rw-r--r--sc/source/ui/app/scmod.cxx6
-rw-r--r--sc/source/ui/docshell/docsh.cxx2
-rw-r--r--sc/source/ui/docshell/docsh3.cxx2
-rw-r--r--sc/source/ui/docshell/docsh6.cxx54
-rw-r--r--sc/source/ui/inc/docsh.hxx2
7 files changed, 46 insertions, 24 deletions
diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx
index 33775657cfcd..5a2710ce3208 100644
--- a/formula/source/ui/dlg/formula.cxx
+++ b/formula/source/ui/dlg/formula.cxx
@@ -1831,7 +1831,7 @@ void FormulaDlg::StoreFormEditData(FormEditData* pData)
const IFunctionDescription* FormulaDlg::getCurrentFunctionDescription() const
{
- OSL_VERIFY(!m_pImpl->pFuncDesc || m_pImpl->pFuncDesc->getSuppressedArgumentCount() == m_pImpl->nArgs);
+ //OSL_VERIFY(!m_pImpl->pFuncDesc || m_pImpl->pFuncDesc->getSuppressedArgumentCount() == m_pImpl->nArgs);
return m_pImpl->pFuncDesc;
}
diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx
index 048f754120c1..bfe360e9ec59 100644
--- a/sc/source/filter/oox/workbookhelper.cxx
+++ b/sc/source/filter/oox/workbookhelper.cxx
@@ -675,6 +675,8 @@ void WorkbookGlobals::recalcFormulaCells()
officecfg::Office::Calc::Formula::Load::OOXMLRecalcMode::set(sal_Int32(0), batch);
ScFormulaOptions aOpt = SC_MOD()->GetFormulaOptions();
aOpt.SetOOXMLRecalcOptions(bHardRecalc ? RECALC_ALWAYS : RECALC_NEVER);
+ /** XXX is this really supposed to set the ScModule options?
+ Not the ScDocShell options? */
SC_MOD()->SetFormulaOptions(aOpt);
batch->commit();
diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx
index 84eddf0210f0..040e16edb001 100644
--- a/sc/source/ui/app/scmod.cxx
+++ b/sc/source/ui/app/scmod.cxx
@@ -1034,13 +1034,15 @@ void ScModule::ModifyOptions( const SfxItemSet& rOptSet )
if (pFormulaCfg && pFormulaCfg->GetCalcConfig() != rOpt.GetCalcConfig())
bCalcAll = true;
- SetFormulaOptions( rOpt );
-
if ( pDocSh )
{
pDocSh->SetFormulaOptions( rOpt );
pDocSh->SetDocumentModified();
}
+
+ // ScDocShell::SetFormulaOptions() may check for changed settings, so
+ // set the new options here after that has been called.
+ SetFormulaOptions( rOpt );
}
// ViewOptions
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 92cc36ca2b14..bc1d284b1e32 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -484,6 +484,8 @@ bool ScDocShell::LoadXML( SfxMedium* pLoadMedium, const ::com::sun::star::uno::R
officecfg::Office::Calc::Formula::Load::ODFRecalcMode::set(sal_Int32(0), batch);
ScFormulaOptions aOpt = SC_MOD()->GetFormulaOptions();
aOpt.SetODFRecalcOptions(bHardRecalc ? RECALC_ALWAYS : RECALC_NEVER);
+ /** XXX is this really supposed to set the ScModule options?
+ Not the ScDocShell options? */
SC_MOD()->SetFormulaOptions(aOpt);
batch->commit();
diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx
index 8544435181f5..8424ef566172 100644
--- a/sc/source/ui/docshell/docsh3.cxx
+++ b/sc/source/ui/docshell/docsh3.cxx
@@ -417,7 +417,7 @@ void ScDocShell::InitOptions(bool bForLoading) // called from InitNew and L
aDocument.SetDocOptions( aDocOpt );
aDocument.SetViewOptions( aViewOpt );
- SetFormulaOptions( aFormulaOpt );
+ SetFormulaOptions( aFormulaOpt, bForLoading );
// Druck-Optionen werden jetzt direkt vor dem Drucken gesetzt
diff --git a/sc/source/ui/docshell/docsh6.cxx b/sc/source/ui/docshell/docsh6.cxx
index c6b3dc600c20..78228eb0cc11 100644
--- a/sc/source/ui/docshell/docsh6.cxx
+++ b/sc/source/ui/docshell/docsh6.cxx
@@ -445,32 +445,48 @@ bool ScDocShell::ReloadTabLinks()
return true; //! Fehler erkennen
}
-void ScDocShell::SetFormulaOptions(const ScFormulaOptions& rOpt )
+void ScDocShell::SetFormulaOptions( const ScFormulaOptions& rOpt, bool bForLoading )
{
aDocument.SetGrammar( rOpt.GetFormulaSyntax() );
- // This needs to be called first since it may re-initialize the entire
- // opcode map.
- if (rOpt.GetUseEnglishFuncName())
+ // This is nasty because it resets module globals from within a docshell!
+ // For actual damage caused see fdo#82183 where an unconditional
+ // ScGlobal::ResetFunctionList() (without checking GetUseEnglishFuncName())
+ // lead to a crash becasuse the function list was still used by the Formula
+ // Wizard when loading the second document.
+ // Do the stupid stuff only when we're not called while loading a document.
+
+ /** TODO: bForLoading is a workaround, rather get rid of setting any
+ globals from per document instances like ScDocShell. */
+
+ if (!bForLoading)
{
- // switch native symbols to English.
- ScCompiler aComp(NULL, ScAddress());
- ScCompiler::OpCodeMapPtr xMap = aComp.GetOpCodeMap(::com::sun::star::sheet::FormulaLanguage::ENGLISH);
- ScCompiler::SetNativeSymbols(xMap);
- }
- else
- // re-initialize native symbols with localized function names.
- ScCompiler::ResetNativeSymbols();
+ if (rOpt.GetUseEnglishFuncName() != SC_MOD()->GetFormulaOptions().GetUseEnglishFuncName())
+ {
+ // This needs to be called first since it may re-initialize the entire
+ // opcode map.
+ if (rOpt.GetUseEnglishFuncName())
+ {
+ // switch native symbols to English.
+ ScCompiler aComp(NULL, ScAddress());
+ ScCompiler::OpCodeMapPtr xMap = aComp.GetOpCodeMap(::com::sun::star::sheet::FormulaLanguage::ENGLISH);
+ ScCompiler::SetNativeSymbols(xMap);
+ }
+ else
+ // re-initialize native symbols with localized function names.
+ ScCompiler::ResetNativeSymbols();
- // Force re-population of function names for the function wizard, function tip etc.
- ScGlobal::ResetFunctionList();
+ // Force re-population of function names for the function wizard, function tip etc.
+ ScGlobal::ResetFunctionList();
+ }
- // Update the separators.
- ScCompiler::UpdateSeparatorsNative(
- rOpt.GetFormulaSepArg(), rOpt.GetFormulaSepArrayCol(), rOpt.GetFormulaSepArrayRow());
+ // Update the separators.
+ ScCompiler::UpdateSeparatorsNative(
+ rOpt.GetFormulaSepArg(), rOpt.GetFormulaSepArrayCol(), rOpt.GetFormulaSepArrayRow());
- // Global interpreter settings.
- ScInterpreter::SetGlobalConfig(rOpt.GetCalcConfig());
+ // Global interpreter settings.
+ ScInterpreter::SetGlobalConfig(rOpt.GetCalcConfig());
+ }
// Per document interpreter settings.
SetCalcConfig( rOpt.GetCalcConfig());
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index 46bd07ebc8f4..b432f94199b3 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -323,7 +323,7 @@ public:
void UpdateLinks() SAL_OVERRIDE;
bool ReloadTabLinks();
- void SetFormulaOptions(const ScFormulaOptions& rOpt );
+ void SetFormulaOptions( const ScFormulaOptions& rOpt, bool bForLoading = false );
void SetCalcConfig( const ScCalcConfig& rConfig );
virtual void CheckConfigOptions() SAL_OVERRIDE;