[PATCH] fix for fdo#35357 SetNamedRanges speedup

Laurent Godard oooconv at free.fr
Fri Jul 15 08:55:55 PDT 2011


use of SheetRangeNameInserter
SheetRangeNameInserter now handles rangeType
changing SetSheetNamedRanges accordingly
rename SheetRangeNameInserter to RangeNameInserter
---
 sc/source/filter/xml/xmlimprt.cxx |  139 ++++++++-----------------------------
 1 files changed, 30 insertions(+), 109 deletions(-)

diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx
index 83f599f..28d870c 100644
--- a/sc/source/filter/xml/xmlimprt.cxx
+++ b/sc/source/filter/xml/xmlimprt.cxx
@@ -2770,124 +2770,31 @@ private:
 
 }
 
-void ScXMLImport::SetNamedRanges()
-{
-    ScMyNamedExpressions* pNamedExpressions = GetNamedExpressions();
-    if (!pNamedExpressions)
-        return;
-
-    Reference <beans::XPropertySet> xPropertySet (GetModel(), UNO_QUERY);
-    if (!xPropertySet.is())
-        return;
-
-    Reference <sheet::XNamedRanges> xNamedRanges(
-        xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_NAMEDRANGES))), UNO_QUERY);
-
-    if (!xNamedRanges.is())
-        return;
-
-    Reference<beans::XPropertySet> xPropSet(xNamedRanges, UNO_QUERY);
-    if (!xPropSet.is())
-        return;
-
-    // Turn off broadcasting while adding imported range names.
-    NamedRangesSwitch aSwitch(xPropSet);
-
-    ScMyNamedExpressions::iterator aItr(pNamedExpressions->begin());
-    ScMyNamedExpressions::const_iterator aEndItr(pNamedExpressions->end());
-    table::CellAddress aCellAddress;
-    OUString sTempContent(RTL_CONSTASCII_USTRINGPARAM("0"));
-
-    for (; aItr != aEndItr; ++aItr)
-    {
-        sal_Int32 nOffset = 0;
-        bool bSuccess = ScRangeStringConverter::GetAddressFromString(
-            aCellAddress, aItr->sBaseCellAddress, GetDocument(), FormulaGrammar::CONV_OOO, nOffset);
-
-        if (!bSuccess)
-            // Conversion of base cell address failed.  Skip this.
-            continue;
-
-        try
-        {
-            xNamedRanges->addNewByName(
-                aItr->sName, sTempContent, aCellAddress, GetRangeType(aItr->sRangeType));
-        }
-        catch( uno::RuntimeException& )
-        {
-            OSL_FAIL("here are some Named Ranges with the same name");
-            uno::Reference < container::XIndexAccess > xIndex(xNamedRanges, uno::UNO_QUERY);
-            if (xIndex.is())
-            {
-                sal_Int32 nMax = xIndex->getCount();
-                bool bInserted = false;
-                sal_Int32 nCount = 1;
-                OUStringBuffer sName(aItr->sName);
-                sName.append(sal_Unicode('_'));
-                while (!bInserted && nCount <= nMax)
-                {
-                    OUStringBuffer sTemp(sName);
-                    sTemp.append(OUString::valueOf(nCount));
-                    try
-                    {
-                        xNamedRanges->addNewByName(
-                            sTemp.makeStringAndClear(), sTempContent, aCellAddress,
-                            GetRangeType(aItr->sRangeType));
-                        bInserted = true;
-                    }
-                    catch( uno::RuntimeException& )
-                    {
-                        ++nCount;
-                    }
-                }
-                UnlockSolarMutex();
-            }
-        }
-    }
-
-    aItr = pNamedExpressions->begin();
-    while (aItr != aEndItr)
-    {
-        sal_Int32 nOffset(0);
-        if (ScRangeStringConverter::GetAddressFromString(
-            aCellAddress, aItr->sBaseCellAddress, GetDocument(), FormulaGrammar::CONV_OOO, nOffset ))
-        {
-            uno::Reference <sheet::XNamedRange> xNamedRange(xNamedRanges->getByName(aItr->sName), uno::UNO_QUERY);
-            if (xNamedRange.is())
-            {
-                ScXMLImport::MutexGuard aGuard(*this);
-                ScNamedRangeObj* pNamedRangeObj = ScNamedRangeObj::getImplementation( xNamedRange);
-                if (pNamedRangeObj)
-                {
-                    sTempContent = aItr->sContent;
-                    // Get rid of leading sheet dots in simple ranges.
-                    if (!aItr->bIsExpression)
-                        ScXMLConverter::ParseFormula( sTempContent, false);
-                    pNamedRangeObj->SetContentWithGrammar( sTempContent, aItr->eGrammar);
-                }
-            }
-        }
-        aItr = pNamedExpressions->erase(aItr);
-    }
-}
-
 namespace {
 
-class SheetRangeNameInserter : public ::std::unary_function<ScMyNamedExpression, void>
+class RangeNameInserter : public ::std::unary_function<ScMyNamedExpression, void>
 {
     ScDocument* mpDoc;
     ScRangeName& mrRangeName;
+    ScXMLImport& mrXmlImport;
+
 public:
-    SheetRangeNameInserter(ScDocument* pDoc, ScRangeName& rRangeName) :
-        mpDoc(pDoc), mrRangeName(rRangeName) {}
+    RangeNameInserter(ScDocument* pDoc, ScRangeName& rRangeName, ScXMLImport& rXmlImport) :
+        mpDoc(pDoc), mrRangeName(rRangeName), mrXmlImport(rXmlImport) {}
 
     void operator() (const ScMyNamedExpression& r) const
     {
         using namespace formula;
 
-        if (r.sRangeType.getLength() > 0)
-            // For now, we only accept normal named expressions.
-            return;
+        const ::rtl::OUString& aType = r.sRangeType;
+        sal_uInt32 nUnoType = mrXmlImport.GetRangeType(aType);
+
+        sal_uInt16 nNewType = RT_NAME;
+        if ( nUnoType & sheet::NamedRangeFlag::FILTER_CRITERIA )    nNewType |= RT_CRITERIA;
+        if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA )         nNewType |= RT_PRINTAREA;
+        if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER )      nNewType |= RT_COLHEADER;
+        if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER )         nNewType |= RT_ROWHEADER;
+
 
         if (mpDoc && !mrRangeName.findByName(r.sName))
         {
@@ -2904,7 +2811,7 @@ public:
                     ScXMLConverter::ParseFormula(aContent, false);
 
                 ScRangeData* pData = new ScRangeData(
-                    mpDoc, r.sName, r.sContent, aPos, RT_NAME, r.eGrammar);
+                    mpDoc, r.sName, r.sContent, aPos, nNewType, r.eGrammar);
                 mrRangeName.insert(pData);
             }
         }
@@ -2913,6 +2820,20 @@ public:
 
 }
 
+void ScXMLImport::SetNamedRanges()
+{
+    ScMyNamedExpressions* pNamedExpressions = GetNamedExpressions();
+    if (!pNamedExpressions)
+        return;
+
+    if (!pDoc)
+        return;
+
+    // Insert the namedRanges
+    ScRangeName* pRangeNames = pDoc->GetRangeName();
+    ::std::for_each(pNamedExpressions->begin(), pNamedExpressions->end(), RangeNameInserter(pDoc, *pRangeNames, *this));
+}
+
 void ScXMLImport::SetSheetNamedRanges()
 {
     if (!pDoc)
@@ -2927,7 +2848,7 @@ void ScXMLImport::SetSheetNamedRanges()
             continue;
 
         const ScMyNamedExpressions& rNames = *itr->second;
-        ::std::for_each(rNames.begin(), rNames.end(), SheetRangeNameInserter(pDoc, *pRangeNames));
+        ::std::for_each(rNames.begin(), rNames.end(), RangeNameInserter(pDoc, *pRangeNames, *this));
     }
 }
 
-- 
1.7.1


--------------070109070205040904020105--


More information about the LibreOffice mailing list