diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2015-10-24 09:45:58 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-10-25 16:30:00 +0000 |
commit | d4743045a0b320449d07a957463a76bb8b13f939 (patch) | |
tree | 4501ab47ec45b2a47e29fd5dcead4b69d5b53590 | |
parent | 5ce68783148aa77d77086aac220fabdfa211429d (diff) |
the cells need to be imported before we handle charts, tdf#81396
Change-Id: Ic0dc47b71e76aa4825a867fc171406d126ae0518
Reviewed-on: https://gerrit.libreoffice.org/19568
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r-- | sc/source/filter/inc/workbookfragment.hxx | 2 | ||||
-rw-r--r-- | sc/source/filter/oox/workbookfragment.cxx | 79 | ||||
-rw-r--r-- | sc/source/filter/oox/workbookhelper.cxx | 51 |
3 files changed, 75 insertions, 57 deletions
diff --git a/sc/source/filter/inc/workbookfragment.hxx b/sc/source/filter/inc/workbookfragment.hxx index 4a28034c4b9f..4e22b7b9f3d4 100644 --- a/sc/source/filter/inc/workbookfragment.hxx +++ b/sc/source/filter/inc/workbookfragment.hxx @@ -55,6 +55,8 @@ private: void importExternalLinkFragment( ExternalLink& rExtLink ); void importPivotCacheDefFragment( const OUString& rRelId, sal_Int32 nCacheId ); + void recalcFormulaCells(); + private: DefinedNameRef mxCurrName; }; diff --git a/sc/source/filter/oox/workbookfragment.cxx b/sc/source/filter/oox/workbookfragment.cxx index 08ca758dd428..abd63b07d8d3 100644 --- a/sc/source/filter/oox/workbookfragment.cxx +++ b/sc/source/filter/oox/workbookfragment.cxx @@ -52,9 +52,11 @@ #include "document.hxx" #include "docsh.hxx" #include "calcconfig.hxx" +#include "globstr.hrc" #include <vcl/svapp.hxx> #include <vcl/timer.hxx> +#include <vcl/msgbox.hxx> #include <oox/core/fastparser.hxx> #include <salhelper/thread.hxx> @@ -68,6 +70,9 @@ #include <oox/ole/vbaproject.hxx> +#include <comphelper/processfactory.hxx> +#include <officecfg/Office/Calc.hxx> + namespace oox { namespace xls { @@ -482,6 +487,19 @@ void WorkbookFragment::finalizeImport() // load all worksheets importSheetFragments(*this, aSheetFragments); + sal_Int16 nActiveSheet = getViewSettings().getActiveCalcSheet(); + getWorksheets().finalizeImport( nActiveSheet ); + + // final conversions, e.g. calculation settings and view settings + finalizeWorkbookImport(); + // + //stop preventing establishment of listeners as is done in + //ScDocShell::AfterXMLLoading() for ods + getScDocument().SetInsertingFromOtherDoc(false); + getDocImport().finalize(); + + recalcFormulaCells(); + for( std::vector<WorksheetHelper*>::iterator aIt = maHelpers.begin(), aEnd = maHelpers.end(); aIt != aEnd; ++aIt ) { (*aIt)->finalizeDrawingImport(); @@ -494,12 +512,6 @@ void WorkbookFragment::finalizeImport() aIt->first.reset(); } - sal_Int16 nActiveSheet = getViewSettings().getActiveCalcSheet(); - getWorksheets().finalizeImport( nActiveSheet ); - - // final conversions, e.g. calculation settings and view settings - finalizeWorkbookImport(); - OUString aRevHeadersPath = getFragmentPathFromFirstType(CREATE_OFFICEDOC_RELATION_TYPE("revisionHeaders")); if (!aRevHeadersPath.isEmpty()) { @@ -509,6 +521,61 @@ void WorkbookFragment::finalizeImport() } } +namespace { + +ScDocShell& getDocShell(ScDocument& rDoc) +{ + return static_cast<ScDocShell&>(*rDoc.GetDocumentShell()); +} + +} + +void WorkbookFragment::recalcFormulaCells() +{ + // Recalculate formula cells. + ScDocument& rDoc = getScDocument(); + ScDocShell& rDocSh = getDocShell(rDoc); + Reference< XComponentContext > xContext = comphelper::getProcessComponentContext(); + ScRecalcOptions nRecalcMode = + static_cast<ScRecalcOptions>(officecfg::Office::Calc::Formula::Load::OOXMLRecalcMode::get(xContext)); + bool bHardRecalc = false; + if (nRecalcMode == RECALC_ASK) + { + if (rDoc.IsUserInteractionEnabled()) + { + // Ask the user if full re-calculation is desired. + ScopedVclPtrInstance<QueryBox> aBox( + ScDocShell::GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES), + ScGlobal::GetRscString(STR_QUERY_FORMULA_RECALC_ONLOAD_XLS)); + aBox->SetCheckBoxText(ScGlobal::GetRscString(STR_ALWAYS_PERFORM_SELECTED)); + + sal_Int32 nRet = aBox->Execute(); + bHardRecalc = nRet == RET_YES; + + if (aBox->GetCheckBoxState()) + { + // Always perform selected action in the future. + std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create()); + 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(); + } + } + } + else if (nRecalcMode == RECALC_ALWAYS) + bHardRecalc = true; + + if (bHardRecalc) + rDocSh.DoHardRecalc(false); + else + rDoc.CalcFormulaTree(false, true, false); +} + // private -------------------------------------------------------------------- void WorkbookFragment::importExternalReference( const AttributeList& rAttribs ) diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index a4cb2f63ab90..ce4f54b20492 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -660,60 +660,9 @@ void WorkbookGlobals::finalize() if (pModel) pModel->SetOpenInDesignMode(false); - //stop preventing establishment of listeners as is done in - //ScDocShell::AfterXMLLoading() for ods - mpDoc->SetInsertingFromOtherDoc(false); - getDocImport().finalize(); - - recalcFormulaCells(); } } -void WorkbookGlobals::recalcFormulaCells() -{ - // Recalculate formula cells. - ScDocument& rDoc = getScDocument(); - ScDocShell& rDocSh = getDocShell(); - Reference< XComponentContext > xContext = comphelper::getProcessComponentContext(); - ScRecalcOptions nRecalcMode = - static_cast<ScRecalcOptions>(officecfg::Office::Calc::Formula::Load::OOXMLRecalcMode::get(xContext)); - bool bHardRecalc = false; - if (nRecalcMode == RECALC_ASK) - { - if (rDoc.IsUserInteractionEnabled()) - { - // Ask the user if full re-calculation is desired. - ScopedVclPtrInstance<QueryBox> aBox( - ScDocShell::GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES), - ScGlobal::GetRscString(STR_QUERY_FORMULA_RECALC_ONLOAD_XLS)); - aBox->SetCheckBoxText(ScGlobal::GetRscString(STR_ALWAYS_PERFORM_SELECTED)); - - sal_Int32 nRet = aBox->Execute(); - bHardRecalc = nRet == RET_YES; - - if (aBox->GetCheckBoxState()) - { - // Always perform selected action in the future. - std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create()); - 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(); - } - } - } - else if (nRecalcMode == RECALC_ALWAYS) - bHardRecalc = true; - - if (bHardRecalc) - rDocSh.DoHardRecalc(false); - else - rDoc.CalcFormulaTree(false, true, false); -} WorkbookHelper::~WorkbookHelper() { |