On Wed, Jun 8, 2011 at 12:38 AM, Kohei Yoshida <[email protected]> wrote: > I'd like to cherry-pick this to the -3-4 branch > > http://cgit.freedesktop.org/libreoffice/calc/commit/?id=8c02d7e41b5406471ede62099fceac5c8ce17fe4
Apparently cherry-picking this from master to the -3-4 branch fails. I've re-issued a new patch against the -3-4 branch and attached herein. Kohei
From 4d805f802846a81b5acff1ad5ca30963bb789837 Mon Sep 17 00:00:00 2001 From: Kohei Yoshida <[email protected]> Date: Wed, 8 Jun 2011 18:18:45 -0400 Subject: [PATCH] fdo#37947: Correctly import sheet-local named ranges. The key is to temporarily store all sheet-local named range data, and insert them en masse after importing the sheet contents fully. --- sc/source/filter/xml/xmlimprt.cxx | 82 +++++++++++++++++++++++++++++++++++++ sc/source/filter/xml/xmlimprt.hxx | 8 ++++ sc/source/filter/xml/xmlnexpi.cxx | 37 +--------------- sc/source/filter/xml/xmlnexpi.hxx | 7 ++- sc/source/filter/xml/xmltabi.cxx | 16 ++----- 5 files changed, 101 insertions(+), 49 deletions(-) diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index e047ef6..83f599f 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -95,6 +95,8 @@ #include <com/sun/star/io/XSeekable.hpp> #include <com/sun/star/beans/XPropertySet.hpp> +#include <memory> + #define SC_LOCALE "Locale" #define SC_STANDARDFORMAT "StandardFormat" #define SC_CURRENCYSYMBOL "CurrencySymbol" @@ -2036,6 +2038,25 @@ sal_Bool ScXMLImport::GetValidation(const rtl::OUString& sName, ScMyImportValida return false; } +void ScXMLImport::AddNamedExpression(SCTAB nTab, ScMyNamedExpression* pNamedExp) +{ + ::std::auto_ptr<ScMyNamedExpression> p(pNamedExp); + SheetNamedExpMap::iterator itr = maSheetNamedExpressions.find(nTab); + if (itr == maSheetNamedExpressions.end()) + { + // No chain exists for this sheet. Create one. + ::std::auto_ptr<ScMyNamedExpressions> pNew(new ScMyNamedExpressions); + ::std::pair<SheetNamedExpMap::iterator, bool> r = maSheetNamedExpressions.insert(nTab, pNew); + if (!r.second) + // insertion failed. + return; + + itr = r.first; + } + ScMyNamedExpressions& r = *itr->second; + r.push_back(p); +} + ScXMLChangeTrackingImportHelper* ScXMLImport::GetChangeTrackingImportHelper() { if (!pChangeTrackingImportHelper) @@ -2850,6 +2871,66 @@ void ScXMLImport::SetNamedRanges() } } +namespace { + +class SheetRangeNameInserter : public ::std::unary_function<ScMyNamedExpression, void> +{ + ScDocument* mpDoc; + ScRangeName& mrRangeName; +public: + SheetRangeNameInserter(ScDocument* pDoc, ScRangeName& rRangeName) : + mpDoc(pDoc), mrRangeName(rRangeName) {} + + void operator() (const ScMyNamedExpression& r) const + { + using namespace formula; + + if (r.sRangeType.getLength() > 0) + // For now, we only accept normal named expressions. + return; + + if (mpDoc && !mrRangeName.findByName(r.sName)) + { + // Insert a new name. + ScAddress aPos; + sal_Int32 nOffset = 0; + bool bSuccess = ScRangeStringConverter::GetAddressFromString( + aPos, r.sBaseCellAddress, mpDoc, FormulaGrammar::CONV_OOO, nOffset); + + if (bSuccess) + { + ::rtl::OUString aContent = r.sContent; + if (!r.bIsExpression) + ScXMLConverter::ParseFormula(aContent, false); + + ScRangeData* pData = new ScRangeData( + mpDoc, r.sName, r.sContent, aPos, RT_NAME, r.eGrammar); + mrRangeName.insert(pData); + } + } + } +}; + +} + +void ScXMLImport::SetSheetNamedRanges() +{ + if (!pDoc) + return; + + SheetNamedExpMap::const_iterator itr = maSheetNamedExpressions.begin(), itrEnd = maSheetNamedExpressions.end(); + for (; itr != itrEnd; ++itr) + { + SCTAB nTab = itr->first; + ScRangeName* pRangeNames = pDoc->GetRangeName(nTab); + if (!pRangeNames) + continue; + + const ScMyNamedExpressions& rNames = *itr->second; + ::std::for_each(rNames.begin(), rNames.end(), SheetRangeNameInserter(pDoc, *pRangeNames)); + } +} + void SAL_CALL ScXMLImport::endDocument(void) throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ) { @@ -2891,6 +2972,7 @@ throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeE } SetLabelRanges(); SetNamedRanges(); + SetSheetNamedRanges(); } GetProgressBarHelper()->End(); // make room for subsequent SfxProgressBars if (pDoc) diff --git a/sc/source/filter/xml/xmlimprt.hxx b/sc/source/filter/xml/xmlimprt.hxx index 28862bb..a1b737e 100644 --- a/sc/source/filter/xml/xmlimprt.hxx +++ b/sc/source/filter/xml/xmlimprt.hxx @@ -55,6 +55,7 @@ #include <vector> #include <boost/unordered_map.hpp> #include <boost/ptr_container/ptr_list.hpp> +#include <boost/ptr_container/ptr_map.hpp> class ScRangeList; class ScMyStyleNumberFormats; @@ -674,6 +675,8 @@ class ScMyStylesImportHelper; class ScXMLImport: public SvXMLImport { typedef ::boost::unordered_map< ::rtl::OUString, sal_Int16, ::rtl::OUStringHash > CellTypeMap; + typedef ::boost::ptr_map<SCTAB, ScMyNamedExpressions> SheetNamedExpMap; + CellTypeMap aCellTypeMap; ScDocument* pDoc; @@ -763,6 +766,8 @@ class ScXMLImport: public SvXMLImport ScMyTables aTables; ScMyNamedExpressions* pMyNamedExpressions; + SheetNamedExpMap maSheetNamedExpressions; + ScMyLabelRanges* pMyLabelRanges; ScMyImportValidations* pValidations; ScMyImpDetectiveOpArray* pDetectiveOpArray; @@ -918,6 +923,8 @@ public: ScMyNamedExpressions* GetNamedExpressions() { return pMyNamedExpressions; } + void AddNamedExpression(SCTAB nTab, ScMyNamedExpression* pNamedExp); + void AddLabelRange(const ScMyLabelRange* pMyLabelRange) { if (!pMyLabelRanges) pMyLabelRanges = new ScMyLabelRanges(); @@ -1006,6 +1013,7 @@ public: sal_Int32 GetRangeType(const rtl::OUString sRangeType) const; void SetNamedRanges(); + void SetSheetNamedRanges(); void SetLabelRanges(); void AddDefaultNote( const com::sun::star::table::CellAddress& aCell ); diff --git a/sc/source/filter/xml/xmlnexpi.cxx b/sc/source/filter/xml/xmlnexpi.cxx index ce33d78..fcb02bd 100644 --- a/sc/source/filter/xml/xmlnexpi.cxx +++ b/sc/source/filter/xml/xmlnexpi.cxx @@ -36,16 +36,11 @@ #include "xmlimprt.hxx" #include "xmlcelli.hxx" #include "docuno.hxx" -#include "global.hxx" #include "document.hxx" -#include "XMLConverter.hxx" -#include "rangeutl.hxx" #include <xmloff/xmltkmap.hxx> #include <xmloff/nmspmap.hxx> -#include <boost/scoped_ptr.hpp> - using namespace com::sun::star; //------------------------------------------------------------------ @@ -58,38 +53,12 @@ void ScXMLNamedExpressionsContext::GlobalInserter::insert(ScMyNamedExpression* p mrImport.AddNamedExpression(pExp); } -ScXMLNamedExpressionsContext::SheetLocalInserter::SheetLocalInserter( - ScDocument* pDoc, ScRangeName& rRangeName) : mpDoc(pDoc), mrRangeName(rRangeName) {} +ScXMLNamedExpressionsContext::SheetLocalInserter::SheetLocalInserter(ScXMLImport& rImport, SCTAB nTab) : + mrImport(rImport), mnTab(nTab) {} void ScXMLNamedExpressionsContext::SheetLocalInserter::insert(ScMyNamedExpression* pExp) { - using namespace formula; - - ::boost::scoped_ptr<ScMyNamedExpression> p(pExp); - - if (p->sRangeType.getLength() > 0) - // For now, we only accept normal named expressions. - return; - - if (mpDoc && !mrRangeName.findByName(p->sName)) - { - // Insert a new name. - ScAddress aPos; - sal_Int32 nOffset = 0; - bool bSuccess = ScRangeStringConverter::GetAddressFromString( - aPos, p->sBaseCellAddress, mpDoc, FormulaGrammar::CONV_OOO, nOffset); - - if (bSuccess) - { - ::rtl::OUString aContent = p->sContent; - if (!p->bIsExpression) - ScXMLConverter::ParseFormula(aContent, false); - - ScRangeData* pData = new ScRangeData( - mpDoc, p->sName, p->sContent, aPos, RT_NAME, p->eGrammar); - mrRangeName.insert(pData); - } - } + mrImport.AddNamedExpression(mnTab, pExp); } ScXMLNamedExpressionsContext::ScXMLNamedExpressionsContext( diff --git a/sc/source/filter/xml/xmlnexpi.hxx b/sc/source/filter/xml/xmlnexpi.hxx index d66881a..71355c2 100644 --- a/sc/source/filter/xml/xmlnexpi.hxx +++ b/sc/source/filter/xml/xmlnexpi.hxx @@ -30,6 +30,7 @@ #include <xmloff/xmlictxt.hxx> #include <xmloff/xmlimp.hxx> +#include "address.hxx" #include <boost/shared_ptr.hpp> @@ -72,11 +73,11 @@ public: class SheetLocalInserter : public Inserter { public: - SheetLocalInserter(ScDocument* pDoc, ScRangeName& rRangeName); + SheetLocalInserter(ScXMLImport& rImport, SCTAB nTab); virtual void insert(ScMyNamedExpression* pExp); private: - ScDocument* mpDoc; - ScRangeName& mrRangeName; + ScXMLImport& mrImport; + SCTAB mnTab; }; ScXMLNamedExpressionsContext( diff --git a/sc/source/filter/xml/xmltabi.cxx b/sc/source/filter/xml/xmltabi.cxx index 8c2f084..ada5f9c 100644 --- a/sc/source/filter/xml/xmltabi.cxx +++ b/sc/source/filter/xml/xmltabi.cxx @@ -282,18 +282,10 @@ SvXMLImportContext *ScXMLTableContext::CreateChildContext( sal_uInt16 nPrefix, { case XML_TOK_TABLE_NAMED_EXPRESSIONS: { - ScDocument* pDoc = GetScImport().GetDocument(); - if (pDoc) - { - sal_Int32 nTab = GetScImport().GetTables().GetCurrentSheet(); - ScRangeName* pRN = pDoc->GetRangeName(static_cast<SCTAB>(nTab)); - if (pRN) - { - pContext = new ScXMLNamedExpressionsContext( - GetScImport(), nPrefix, rLName, xAttrList, - new ScXMLNamedExpressionsContext::SheetLocalInserter(pDoc, *pRN)); - } - } + SCTAB nTab = GetScImport().GetTables().GetCurrentSheet(); + pContext = new ScXMLNamedExpressionsContext( + GetScImport(), nPrefix, rLName, xAttrList, + new ScXMLNamedExpressionsContext::SheetLocalInserter(GetScImport(), nTab)); } break; case XML_TOK_TABLE_COL_GROUP: -- 1.7.4.2
_______________________________________________ LibreOffice mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice
