On Wed, Jun 8, 2011 at 12:38 AM, Kohei Yoshida <kyoshida@novell.com> 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 <kyoshida@novell.com>
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
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.