[ooo-build-commit] .: patches/dev300

Kohei Yoshida kohei at kemper.freedesktop.org
Mon Oct 4 11:20:42 PDT 2010


 patches/dev300/apply                                     |    7 
 patches/dev300/calc-perf-ods-import-cellstyles.diff      |  756 ---------------
 patches/dev300/calc-perf-xls-import-cellstyles-fix.diff  |   21 
 patches/dev300/calc-perf-xls-import-cellstyles-fix2.diff |  443 --------
 patches/dev300/calc-perf-xls-import-cellstyles.diff      |  356 -------
 5 files changed, 1583 deletions(-)

New commits:
commit 04740b5083a2caf88bc26edb17b9e46b9119ccf7
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Mon Oct 4 14:16:16 2010 -0400

    Removed patches related to ods and xls file loading performances.
    
    The following patches have been removed as they are now in git:
    
    * patches/dev300/calc-perf-ods-import-cellstyles.diff
    * patches/dev300/calc-perf-xls-import-cellstyles.diff
    * patches/dev300/calc-perf-xls-import-cellstyles-fix.diff
    * patches/dev300/calc-perf-xls-import-cellstyles-fix2.diff

diff --git a/patches/dev300/apply b/patches/dev300/apply
index 130a0e3..b4cd1d1 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -2655,13 +2655,6 @@ always-save-option-svx.diff,       n#556125, i#5226, kohei
 # don't throw unnecessary exceptions in sfx2
 speed-sfx2-dont-throw-too-much.diff, i#107512, jholesov
 
-[ CalcRowLimit ]
-# Speed up row height data import from ods documents.
-calc-perf-ods-import-cellstyles.diff, n#582693, kohei
-calc-perf-xls-import-cellstyles.diff, n#582693, kohei
-calc-perf-xls-import-cellstyles-fix.diff, n#594266, kohei
-calc-perf-xls-import-cellstyles-fix2.diff, n#594235, kohei
-
 [ CalcFixes ]
 # Check for separator options' potential conflict with custom locale setting.
 calc-formula-variable-sep-config-check-sfx2.diff, n#556142, i#106959, kohei
diff --git a/patches/dev300/calc-perf-ods-import-cellstyles.diff b/patches/dev300/calc-perf-ods-import-cellstyles.diff
deleted file mode 100644
index 602fbf5..0000000
--- a/patches/dev300/calc-perf-ods-import-cellstyles.diff
+++ /dev/null
@@ -1,756 +0,0 @@
----
- sc/inc/simplerangelist.hxx                     |   82 ++++++++
- sc/source/core/tool/makefile.mk                |    2 +
- sc/source/core/tool/simplerangelist.cxx        |  243 ++++++++++++++++++++++++
- sc/source/filter/xml/XMLStylesImportHelper.cxx |  218 +++++++++++++---------
- sc/source/filter/xml/XMLStylesImportHelper.hxx |   28 ++-
- 5 files changed, 473 insertions(+), 100 deletions(-)
- create mode 100644 sc/inc/simplerangelist.hxx
- create mode 100644 sc/source/core/tool/simplerangelist.cxx
-
-diff --git sc/inc/simplerangelist.hxx sc/inc/simplerangelist.hxx
-new file mode 100644
-index 0000000..4a0c257
---- /dev/null
-+++ sc/inc/simplerangelist.hxx
-@@ -0,0 +1,82 @@
-+/*************************************************************************
-+ *
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * Copyright 2008 by Sun Microsystems, Inc.
-+ *
-+ * OpenOffice.org - a multi-platform office productivity suite
-+ *
-+ * $RCSfile: rangelst.hxx,v $
-+ * $Revision: 1.9.32.3 $
-+ *
-+ * This file is part of OpenOffice.org.
-+ *
-+ * OpenOffice.org is free software: you can redistribute it and/or modify
-+ * it under the terms of the GNU Lesser General Public License version 3
-+ * only, as published by the Free Software Foundation.
-+ *
-+ * OpenOffice.org is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU Lesser General Public License version 3 for more details
-+ * (a copy is included in the LICENSE file that accompanied this code).
-+ *
-+ * You should have received a copy of the GNU Lesser General Public License
-+ * version 3 along with OpenOffice.org.  If not, see
-+ * <http://www.openoffice.org/license.html>
-+ * for a copy of the LGPLv3 License.
-+ *
-+ ************************************************************************/
-+
-+#ifndef __SC_SIMPLERANGELIST_HXX__
-+#define __SC_SIMPLERANGELIST_HXX__
-+
-+#include <boost/shared_ptr.hpp>
-+
-+#include "address.hxx"
-+
-+#include <map>
-+#include <list>
-+
-+class ScAddress;
-+class ScRange;
-+class ScRangeList;
-+
-+/**
-+ * This container is optimized for use in the ods import filter, to store
-+ * ranges for cell styles.  We may change the name of this class once we
-+ * have a better name for what it does.  Using this is way more efficient
-+ * than ScRangeList.
-+ */
-+class ScSimpleRangeList
-+{
-+public:
-+    struct Range
-+    {
-+        SCCOL mnCol1;
-+        SCROW mnRow1;
-+        SCCOL mnCol2;
-+        SCROW mnRow2;
-+        explicit Range(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
-+
-+        bool contains(const Range& r) const;
-+    };
-+    typedef ::boost::shared_ptr< ::std::list<Range> > RangeListRef;
-+    typedef ::std::map<SCTAB, RangeListRef> TabType;
-+
-+    ScSimpleRangeList();
-+
-+    void addRange(const ScRange& rRange);
-+    void insertCol(SCCOL nCol, SCTAB nTab);
-+    void insertRow(SCROW nRow, SCTAB nTab);
-+    void getRangeList(::std::list<ScRange>& rList) const;
-+    void clear();
-+
-+private:
-+    RangeListRef findTab(SCTAB nTab);
-+
-+private:
-+    TabType maTabs;
-+};
-+
-+#endif
-diff --git sc/source/core/tool/makefile.mk sc/source/core/tool/makefile.mk
-index 9c4cac2..9819cf2 100644
---- sc/source/core/tool/makefile.mk
-+++ sc/source/core/tool/makefile.mk
-@@ -104,6 +104,7 @@ SLOFILES =  \
-         $(SLO)$/reftokenhelper.obj \
-         $(SLO)$/refupdat.obj \
-         $(SLO)$/scmatrix.obj \
-+        $(SLO)$/simplerangelist.obj \
-         $(SLO)$/stringutil.obj \
-         $(SLO)$/subtotal.obj \
-         $(SLO)$/token.obj \
-@@ -133,6 +134,7 @@ EXCEPTIONSFILES= \
-         $(SLO)$/prnsave.obj \
-         $(SLO)$/queryparam.obj \
-         $(SLO)$/reftokenhelper.obj \
-+        $(SLO)$/simplerangelist.obj \
-         $(SLO)$/stringutil.obj \
-         $(SLO)$/token.obj
- 
-diff --git sc/source/core/tool/simplerangelist.cxx sc/source/core/tool/simplerangelist.cxx
-new file mode 100644
-index 0000000..ca86775
---- /dev/null
-+++ sc/source/core/tool/simplerangelist.cxx
-@@ -0,0 +1,243 @@
-+/*************************************************************************
-+ *
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * Copyright 2008 by Sun Microsystems, Inc.
-+ *
-+ * OpenOffice.org - a multi-platform office productivity suite
-+ *
-+ * $RCSfile: rangelst.hxx,v $
-+ * $Revision: 1.9.32.3 $
-+ *
-+ * This file is part of OpenOffice.org.
-+ *
-+ * OpenOffice.org is free software: you can redistribute it and/or modify
-+ * it under the terms of the GNU Lesser General Public License version 3
-+ * only, as published by the Free Software Foundation.
-+ *
-+ * OpenOffice.org is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU Lesser General Public License version 3 for more details
-+ * (a copy is included in the LICENSE file that accompanied this code).
-+ *
-+ * You should have received a copy of the GNU Lesser General Public License
-+ * version 3 along with OpenOffice.org.  If not, see
-+ * <http://www.openoffice.org/license.html>
-+ * for a copy of the LGPLv3 License.
-+ *
-+ ************************************************************************/
-+
-+// MARKER(update_precomp.py): autogen include statement, do not remove
-+#include "precompiled_sc.hxx"
-+
-+
-+//------------------------------------------------------------------------
-+
-+#include "simplerangelist.hxx"
-+#include "rangelst.hxx"
-+
-+using ::std::list;
-+using ::std::pair;
-+using ::std::max;
-+
-+// ============================================================================
-+
-+ScSimpleRangeList::Range::Range(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) :
-+    mnCol1(nCol1), mnRow1(nRow1), mnCol2(nCol2), mnRow2(nRow2) {}
-+
-+bool ScSimpleRangeList::Range::contains(const Range& r) const
-+{
-+    return mnCol1 <= r.mnCol1 && mnRow1 <= r.mnRow1 && r.mnCol2 <= mnCol2 && r.mnRow2 <= mnRow2;
-+}
-+
-+// ----------------------------------------------------------------------------
-+
-+ScSimpleRangeList::ScSimpleRangeList()
-+{
-+}
-+
-+namespace {
-+
-+bool maybeJoin(ScSimpleRangeList::Range& rOld, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
-+{
-+    if (rOld.mnRow1 == nRow1 && rOld.mnRow2 == nRow2)
-+    {
-+        // Check their column spans to see if they overlap.
-+        if (rOld.mnCol1 == nCol1)
-+        {
-+            // Their share the start column position.
-+            rOld.mnCol2 = max(rOld.mnCol2, nCol2);
-+            return true;
-+        }
-+        else if (rOld.mnCol1 < nCol1)
-+        {
-+            // Old range sits on the left.
-+            if (nCol1 - rOld.mnCol2 <= 1)
-+            {
-+                rOld.mnCol2 = max(rOld.mnCol2, nCol2);
-+                return true;
-+            }
-+        }
-+        else if (nCol1 < rOld.mnCol1)
-+        {
-+            // New range sits on the left.
-+            if (nCol1 - rOld.mnCol2 <= 1)
-+            {
-+                rOld.mnCol1 = nCol1;
-+                rOld.mnCol2 = max(rOld.mnCol2, nCol2);
-+                return true;
-+            }
-+        }
-+    }
-+
-+    if (rOld.mnCol1 == nCol1 && rOld.mnCol2 == nCol2)
-+    {
-+        if (rOld.mnRow1 == nRow1)
-+        {
-+            // Their share the start row position.
-+            rOld.mnRow2 = max(rOld.mnRow2, nRow2);
-+            return true;
-+        }
-+        else if (rOld.mnRow1 < nRow1)
-+        {
-+            // Old range sits above.
-+            if (nRow1 - rOld.mnRow2 <= 1)
-+            {
-+                rOld.mnRow2 = max(rOld.mnRow2, nRow2);
-+                return true;
-+            }
-+        }
-+        else if (nRow1 < rOld.mnRow1)
-+        {
-+            // New range sits above.
-+            if (nRow1 - rOld.mnRow2 <= 1)
-+            {
-+                rOld.mnRow1 = nRow1;
-+                rOld.mnRow2 = max(rOld.mnRow2, nRow2);
-+                return true;
-+            }
-+        }
-+    }
-+
-+    return false;
-+}
-+
-+}
-+
-+void ScSimpleRangeList::addRange(const ScRange& rRange)
-+{
-+    SCCOL nCol1 = rRange.aStart.Col();
-+    SCROW nRow1 = rRange.aStart.Row();
-+    SCTAB nTab1 = rRange.aStart.Tab();
-+    SCCOL nCol2 = rRange.aEnd.Col();
-+    SCROW nRow2 = rRange.aEnd.Row();
-+    SCTAB nTab2 = rRange.aEnd.Tab();
-+
-+    for (SCTAB nTab = nTab1; nTab <= nTab2; ++nTab)
-+    {
-+        RangeListRef pRef = findTab(nTab);
-+        if (!pRef)
-+            // This should never happen!
-+            return;
-+
-+        if (pRef->empty() || !maybeJoin(pRef->back(), nCol1, nRow1, nCol2, nRow2))
-+            // Not joinable.  Append it to the list.
-+            pRef->push_back(Range(nCol1, nRow1, nCol2, nRow2));
-+    }
-+}
-+
-+void ScSimpleRangeList::insertCol(SCCOL nCol, SCTAB nTab)
-+{
-+    RangeListRef pRef = findTab(nTab);
-+    if (!pRef)
-+        // This should never happen!
-+        return;
-+
-+    list<Range>::iterator itr = pRef->begin(), itrEnd = pRef->end();
-+    for (; itr != itrEnd; ++itr)
-+    {
-+        Range& r = *itr;
-+        if (r.mnCol2 < nCol)
-+            // insertion point to the right of the range.
-+            continue;
-+
-+        if (nCol <= r.mnCol1)
-+        {
-+            // insertion point to the left of the range.
-+            ++r.mnCol1;
-+            ++r.mnCol2;
-+        }
-+        else if (nCol <= r.mnCol2)
-+        {
-+            // insertion point cuts through the range.
-+            ++r.mnCol2;
-+        }
-+    }
-+}
-+
-+void ScSimpleRangeList::insertRow(SCROW nRow, SCTAB nTab)
-+{
-+    RangeListRef pRef = findTab(nTab);
-+    if (!pRef)
-+        // This should never happen!
-+        return;
-+
-+    list<Range>::iterator itr = pRef->begin(), itrEnd = pRef->end();
-+    for (; itr != itrEnd; ++itr)
-+    {
-+        Range& r = *itr;
-+        if (r.mnRow2 < nRow)
-+            // insertion point is below the range.
-+            continue;
-+
-+        if (nRow <= r.mnRow1)
-+        {
-+            // insertion point is above the range.
-+            ++r.mnRow1;
-+            ++r.mnRow2;
-+        }
-+        else if (nRow <= r.mnRow2)
-+        {
-+            // insertion point cuts through the range.
-+            ++r.mnRow2;
-+        }
-+    }
-+}
-+
-+void ScSimpleRangeList::getRangeList(list<ScRange>& rList) const
-+{
-+    list<ScRange> aList;
-+    for (TabType::const_iterator itrTab = maTabs.begin(), itrTabEnd = maTabs.end(); itrTab != itrTabEnd; ++itrTab)
-+    {
-+        SCTAB nTab = itrTab->first;
-+        const RangeListRef& pRanges = itrTab->second;
-+        list<Range>::const_iterator itr = pRanges->begin(), itrEnd = pRanges->end();
-+        for (; itr != itrEnd; ++itr)
-+        {
-+            const Range& r = *itr;
-+            aList.push_back(ScRange(r.mnCol1, r.mnRow1, nTab, r.mnCol2, r.mnRow2, nTab));
-+        }
-+    }
-+    rList.swap(aList);
-+}
-+
-+void ScSimpleRangeList::clear()
-+{
-+    maTabs.clear();
-+}
-+
-+ScSimpleRangeList::RangeListRef ScSimpleRangeList::findTab(SCTAB nTab)
-+{
-+    TabType::iterator itr = maTabs.find(nTab);
-+    if (itr == maTabs.end())
-+    {
-+        RangeListRef p(new list<Range>);
-+        pair<TabType::iterator, bool> r = maTabs.insert(TabType::value_type(nTab, p));
-+        if (!r.second)
-+            return RangeListRef();
-+        itr = r.first;
-+    }
-+
-+    return itr->second;
-+}
-diff --git sc/source/filter/xml/XMLStylesImportHelper.cxx sc/source/filter/xml/XMLStylesImportHelper.cxx
-index 976d204..c54997b 100644
---- sc/source/filter/xml/XMLStylesImportHelper.cxx
-+++ sc/source/filter/xml/XMLStylesImportHelper.cxx
-@@ -37,6 +37,7 @@
- #include <com/sun/star/util/NumberFormat.hpp>
- 
- using namespace com::sun::star;
-+using ::std::list;
- 
- void ScMyStyleNumberFormats::AddStyleNumberFormat(const rtl::OUString& rStyleName, const sal_Int32 nNumberFormat)
- {
-@@ -53,37 +54,14 @@ sal_Int32 ScMyStyleNumberFormats::GetStyleNumberFormat(const rtl::OUString& rSty
-         return aItr->nNumberFormat;
- }
- 
--ScMyStyleRanges::ScMyStyleRanges()
--    :
--    pTextList(NULL),
--    pNumberList(NULL),
--    pTimeList(NULL),
--    pDateTimeList(NULL),
--    pPercentList(NULL),
--    pLogicalList(NULL),
--    pUndefinedList(NULL),
-+ScMyStyleRanges::ScMyStyleRanges() :
-     pCurrencyList(NULL)
- {
- }
- 
- ScMyStyleRanges::~ScMyStyleRanges()
- {
--    if (pTextList)
--        delete pTextList;
--    if (pNumberList)
--        delete pNumberList;
--    if (pTimeList)
--        delete pTimeList;
--    if (pDateTimeList)
--        delete pDateTimeList;
--    if (pPercentList)
--        delete pPercentList;
--    if (pLogicalList)
--        delete pLogicalList;
--    if (pUndefinedList)
--        delete pUndefinedList;
--    if (pCurrencyList)
--        delete pCurrencyList;
-+    delete pCurrencyList;
- }
- 
- void ScMyStyleRanges::AddRange(const ScRange& rRange, ScRangeList* pList,
-@@ -135,58 +113,58 @@ void ScMyStyleRanges::AddCurrencyRange(const ScRange& rRange, ScRangeListRef xLi
- }
- 
- void ScMyStyleRanges::AddRange(const ScRange& rRange,
--    const rtl::OUString* pStyleName, const sal_Int16 nType,
--    ScXMLImport& rImport, const sal_uInt32 nMaxRanges)
-+    const rtl::OUString* /*pStyleName*/, const sal_Int16 nType,
-+    ScXMLImport& /*rImport*/, const sal_uInt32 /*nMaxRanges*/)
- {
-     switch (nType)
-     {
-         case util::NumberFormat::NUMBER:
-         {
--            if (!pNumberList)
--                pNumberList = new ScRangeList();
--            AddRange(rRange, pNumberList, pStyleName, nType, rImport, nMaxRanges);
-+            if (!mpNumberList)
-+                mpNumberList.reset(new ScSimpleRangeList);
-+            mpNumberList->addRange(rRange);
-         }
-         break;
-         case util::NumberFormat::TEXT:
-         {
--            if (!pTextList)
--                pTextList = new ScRangeList();
--            AddRange(rRange, pTextList, pStyleName, nType, rImport, nMaxRanges);
-+            if (!mpTextList)
-+                mpTextList.reset(new ScSimpleRangeList);
-+            mpTextList->addRange(rRange);
-         }
-         break;
-         case util::NumberFormat::TIME:
-         {
--            if (!pTimeList)
--                pTimeList = new ScRangeList();
--            AddRange(rRange, pTimeList, pStyleName, nType, rImport, nMaxRanges);
-+            if (!mpTimeList)
-+                mpTimeList.reset(new ScSimpleRangeList);
-+            mpTimeList->addRange(rRange);
-         }
-         break;
-         case util::NumberFormat::DATETIME:
-         {
--            if (!pDateTimeList)
--                pDateTimeList = new ScRangeList();
--            AddRange(rRange, pDateTimeList, pStyleName, nType, rImport, nMaxRanges);
-+            if (!mpDateTimeList)
-+                mpDateTimeList.reset(new ScSimpleRangeList);
-+            mpDateTimeList->addRange(rRange);
-         }
-         break;
-         case util::NumberFormat::PERCENT:
-         {
--            if (!pPercentList)
--                pPercentList = new ScRangeList();
--            AddRange(rRange, pPercentList, pStyleName, nType, rImport, nMaxRanges);
-+            if (!mpPercentList)
-+                mpPercentList.reset(new ScSimpleRangeList);
-+            mpPercentList->addRange(rRange);
-         }
-         break;
-         case util::NumberFormat::LOGICAL:
-         {
--            if (!pLogicalList)
--                pLogicalList = new ScRangeList();
--            AddRange(rRange, pLogicalList, pStyleName, nType, rImport, nMaxRanges);
-+            if (!mpLogicalList)
-+                mpLogicalList.reset(new ScSimpleRangeList);
-+            mpLogicalList->addRange(rRange);
-         }
-         break;
-         case util::NumberFormat::UNDEFINED:
-         {
--            if (!pUndefinedList)
--                pUndefinedList = new ScRangeList();
--            AddRange(rRange, pUndefinedList, pStyleName, nType, rImport, nMaxRanges);
-+            if (!mpUndefinedList)
-+                mpUndefinedList.reset(new ScSimpleRangeList);
-+            mpUndefinedList->addRange(rRange);
-         }
-         break;
-         default:
-@@ -213,53 +191,78 @@ void ScMyStyleRanges::AddCurrencyRange(const ScRange& rRange,
-         if (aPair.second)
-         {
-             aItr = aPair.first;
--            AddCurrencyRange(rRange, aItr->xRanges, pStyleName, pCurrency, rImport, nMaxRanges);
-+            aItr->mpRanges->addRange(rRange);
-         }
-     }
-     else
--        aItr->xRanges->Join(rRange);
-+        aItr->mpRanges->addRange(rRange);
- }
- 
--void ScMyStyleRanges::InsertColRow(const ScRange& rRange, const SCsCOL nDx, const SCsROW nDy,
--        const SCsTAB nDz, ScDocument* pDoc)
-+void ScMyStyleRanges::InsertRow(const sal_Int32 nRow, const sal_Int32 nTab, ScDocument* pDoc)
- {
--    UpdateRefMode aRefMode(URM_INSDEL);
--    if (pNumberList)
--        pNumberList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
--    if (pTextList)
--        pTextList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
--    if (pTimeList)
--        pTimeList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
--    if (pDateTimeList)
--        pDateTimeList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
--    if (pPercentList)
--        pPercentList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
--    if (pLogicalList)
--        pLogicalList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
--    if (pUndefinedList)
--        pUndefinedList->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
-+    if (mpTextList)
-+        mpTextList->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-+    if (mpNumberList)
-+        mpNumberList->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-+    if (mpTimeList)
-+        mpTimeList->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-+    if (mpDateTimeList)
-+        mpDateTimeList->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-+    if (mpPercentList)
-+        mpPercentList->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-+    if (mpLogicalList)
-+        mpLogicalList->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-+    if (mpUndefinedList)
-+        mpUndefinedList->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-+
-     if (pCurrencyList)
-     {
-         ScMyCurrencyStylesSet::iterator aItr(pCurrencyList->begin());
-         ScMyCurrencyStylesSet::iterator aEndItr(pCurrencyList->end());
-         while (aItr != aEndItr)
-         {
--            aItr->xRanges->UpdateReference(aRefMode, pDoc, rRange, nDx, nDy, nDz);
-+            aItr->mpRanges->insertRow(static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab));
-             ++aItr;
-         }
-     }
- }
- 
--void ScMyStyleRanges::InsertRow(const sal_Int32 nRow, const sal_Int32 nTab, ScDocument* pDoc)
-+void ScMyStyleRanges::InsertCol(const sal_Int32 nCol, const sal_Int32 nTab, ScDocument* pDoc)
- {
--    InsertColRow(ScRange(0, static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab),
--        MAXCOL, MAXROW, static_cast<SCTAB>(nTab)), 0, 1, 0, pDoc);
-+    if (mpTextList)
-+        mpTextList->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+    if (mpNumberList)
-+        mpNumberList->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+    if (mpTimeList)
-+        mpTimeList->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+    if (mpDateTimeList)
-+        mpDateTimeList->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+    if (mpPercentList)
-+        mpPercentList->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+    if (mpLogicalList)
-+        mpLogicalList->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+    if (mpUndefinedList)
-+        mpUndefinedList->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+
-+    if (pCurrencyList)
-+    {
-+        ScMyCurrencyStylesSet::iterator aItr(pCurrencyList->begin());
-+        ScMyCurrencyStylesSet::iterator aEndItr(pCurrencyList->end());
-+        while (aItr != aEndItr)
-+        {
-+            aItr->mpRanges->insertCol(static_cast<SCCOL>(nCol), static_cast<SCTAB>(nTab));
-+            ++aItr;
-+        }
-+    }
- }
- 
--void ScMyStyleRanges::InsertCol(const sal_Int32 nCol, const sal_Int32 nTab, ScDocument* pDoc)
-+void ScMyStyleRanges::SetStylesToRanges(const list<ScRange>& rRanges,
-+    const rtl::OUString* pStyleName, const sal_Int16 nCellType,
-+    const rtl::OUString* pCurrency, ScXMLImport& rImport)
- {
--    InsertColRow(ScRange(static_cast<SCCOL>(nCol), 0, static_cast<SCTAB>(nTab),
--        MAXCOL, MAXROW, static_cast<SCTAB>(nTab)), 1, 0, 0, pDoc);
-+    list<ScRange>::const_iterator itr = rRanges.begin(), itrEnd = rRanges.end();
-+    for (; itr != itrEnd; ++itr)
-+        rImport.SetStyleToRange(*itr, pStyleName, nCellType, pCurrency);
- }
- 
- void ScMyStyleRanges::SetStylesToRanges(ScRangeList* pList,
-@@ -282,27 +285,64 @@ void ScMyStyleRanges::SetStylesToRanges(ScRangeListRef xList,
- 
- void ScMyStyleRanges::SetStylesToRanges(const rtl::OUString* pStyleName, ScXMLImport& rImport)
- {
--    if (pNumberList)
--        SetStylesToRanges(pNumberList, pStyleName, util::NumberFormat::NUMBER, NULL, rImport);
--    if (pTextList)
--        SetStylesToRanges(pTextList, pStyleName, util::NumberFormat::TEXT, NULL, rImport);
--    if (pTimeList)
--        SetStylesToRanges(pTimeList, pStyleName, util::NumberFormat::TIME, NULL, rImport);
--    if (pDateTimeList)
--        SetStylesToRanges(pDateTimeList, pStyleName, util::NumberFormat::DATETIME, NULL, rImport);
--    if (pPercentList)
--        SetStylesToRanges(pPercentList, pStyleName, util::NumberFormat::PERCENT, NULL, rImport);
--    if (pLogicalList)
--        SetStylesToRanges(pLogicalList, pStyleName, util::NumberFormat::LOGICAL, NULL, rImport);
--    if (pUndefinedList)
--        SetStylesToRanges(pUndefinedList, pStyleName, util::NumberFormat::UNDEFINED, NULL, rImport);
-+    if (mpNumberList)
-+    {
-+        list<ScRange> aList;
-+        mpNumberList->getRangeList(aList);
-+        SetStylesToRanges(aList, pStyleName, util::NumberFormat::NUMBER, NULL, rImport);
-+        mpNumberList->clear();
-+    }
-+    if (mpTextList)
-+    {
-+        list<ScRange> aList;
-+        mpTextList->getRangeList(aList);
-+        SetStylesToRanges(aList, pStyleName, util::NumberFormat::TEXT, NULL, rImport);
-+        mpTextList->clear();
-+    }
-+    if (mpTimeList)
-+    {
-+        list<ScRange> aList;
-+        mpTimeList->getRangeList(aList);
-+        SetStylesToRanges(aList, pStyleName, util::NumberFormat::TIME, NULL, rImport);
-+        mpTimeList->clear();
-+    }
-+    if (mpDateTimeList)
-+    {
-+        list<ScRange> aList;
-+        mpDateTimeList->getRangeList(aList);
-+        SetStylesToRanges(aList, pStyleName, util::NumberFormat::DATETIME, NULL, rImport);
-+        mpDateTimeList->clear();
-+    }
-+    if (mpPercentList)
-+    {
-+        list<ScRange> aList;
-+        mpPercentList->getRangeList(aList);
-+        SetStylesToRanges(aList, pStyleName, util::NumberFormat::PERCENT, NULL, rImport);
-+        mpPercentList->clear();
-+    }
-+    if (mpLogicalList)
-+    {
-+        list<ScRange> aList;
-+        mpLogicalList->getRangeList(aList);
-+        SetStylesToRanges(aList, pStyleName, util::NumberFormat::LOGICAL, NULL, rImport);
-+        mpLogicalList->clear();
-+    }
-+    if (mpUndefinedList)
-+    {
-+        list<ScRange> aList;
-+        mpUndefinedList->getRangeList(aList);
-+        SetStylesToRanges(aList, pStyleName, util::NumberFormat::UNDEFINED, NULL, rImport);
-+        mpUndefinedList->clear();
-+    }
-     if (pCurrencyList)
-     {
-         ScMyCurrencyStylesSet::iterator aItr(pCurrencyList->begin());
-         ScMyCurrencyStylesSet::iterator aEndItr(pCurrencyList->end());
-         while (aItr != aEndItr)
-         {
--            SetStylesToRanges(aItr->xRanges, pStyleName, util::NumberFormat::CURRENCY, &aItr->sCurrency, rImport);
-+            list<ScRange> aList;
-+            aItr->mpRanges->getRangeList(aList);
-+            SetStylesToRanges(aList, pStyleName, util::NumberFormat::CURRENCY, &aItr->sCurrency, rImport);
-             ++aItr;
-         }
-     }
-diff --git sc/source/filter/xml/XMLStylesImportHelper.hxx sc/source/filter/xml/XMLStylesImportHelper.hxx
-index a0c2026..6e321f6 100644
---- sc/source/filter/xml/XMLStylesImportHelper.hxx
-+++ sc/source/filter/xml/XMLStylesImportHelper.hxx
-@@ -29,12 +29,15 @@
- #define SC_XMLSTYLESIMPORTHELPER_HXX
- 
- #include "rangelst.hxx"
-+#include "simplerangelist.hxx"
- #include <rtl/ustring.hxx>
- #include <com/sun/star/table/CellRangeAddress.hpp>
- #include <com/sun/star/table/CellAddress.hpp>
- 
- #include <set>
- #include <vector>
-+#include <list>
-+#include <boost/shared_ptr.hpp>
- 
- class ScXMLImport;
- 
-@@ -72,9 +75,11 @@ public:
- struct ScMyCurrencyStyle
- {
-     rtl::OUString		sCurrency;
--    ScRangeListRef		xRanges;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpRanges;
- 
--    ScMyCurrencyStyle() : xRanges(new ScRangeList()) {}
-+    ScMyCurrencyStyle() :
-+        mpRanges(new ScSimpleRangeList)
-+    {}
-     ~ScMyCurrencyStyle() {}
- };
- 
-@@ -90,13 +95,13 @@ typedef std::set<ScMyCurrencyStyle, LessCurrencyStyle>	ScMyCurrencyStylesSet;
- 
- class ScMyStyleRanges : public SvRefBase
- {
--    ScRangeList*			pTextList;
--    ScRangeList*			pNumberList;
--    ScRangeList*			pTimeList;
--    ScRangeList*			pDateTimeList;
--    ScRangeList*			pPercentList;
--    ScRangeList*			pLogicalList;
--    ScRangeList*			pUndefinedList;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpTextList;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpNumberList;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpTimeList;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpDateTimeList;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpPercentList;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpLogicalList;
-+    ::boost::shared_ptr<ScSimpleRangeList> mpUndefinedList;
-     ScMyCurrencyStylesSet*	pCurrencyList;
- 
-     void AddRange(const ScRange& rRange, ScRangeList* pList,
-@@ -105,8 +110,9 @@ class ScMyStyleRanges : public SvRefBase
-     void AddCurrencyRange(const ScRange& rRange, ScRangeListRef xList,
-         const rtl::OUString* pStyleName, const rtl::OUString* pCurrency,
-         ScXMLImport& rImport, const sal_uInt32 nMaxRanges);
--    void InsertColRow(const ScRange& rRange, const SCsCOL nDx, const SCsROW nDy,
--        const SCsTAB nDz, ScDocument* pDoc);
-+    void SetStylesToRanges(const ::std::list<ScRange>& rList,
-+        const rtl::OUString* pStyleName, const sal_Int16 nCellType,
-+        const rtl::OUString* pCurrency, ScXMLImport& rImport);
-     void SetStylesToRanges(ScRangeList* pList,
-         const rtl::OUString* pStyleName, const sal_Int16 nCellType,
-         const rtl::OUString* pCurrency, ScXMLImport& rImport);
--- 
-1.7.0.1
-
diff --git a/patches/dev300/calc-perf-xls-import-cellstyles-fix.diff b/patches/dev300/calc-perf-xls-import-cellstyles-fix.diff
deleted file mode 100644
index ffd2124..0000000
--- a/patches/dev300/calc-perf-xls-import-cellstyles-fix.diff
+++ /dev/null
@@ -1,21 +0,0 @@
----
- sc/source/filter/excel/excimp8.cxx |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git sc/source/filter/excel/excimp8.cxx sc/source/filter/excel/excimp8.cxx
-index d4facf9..7f05201 100644
---- sc/source/filter/excel/excimp8.cxx
-+++ sc/source/filter/excel/excimp8.cxx
-@@ -287,8 +287,8 @@ void ImportExcel8::ReadBasic( void )
- 
- void ImportExcel8::EndSheet( void )
- {
--    GetCondFormatManager().Apply();
-     ImportExcel::EndSheet();
-+    GetCondFormatManager().Apply();
- }
- 
- 
--- 
-1.7.0.1
-
diff --git a/patches/dev300/calc-perf-xls-import-cellstyles-fix2.diff b/patches/dev300/calc-perf-xls-import-cellstyles-fix2.diff
deleted file mode 100644
index f1cb3de..0000000
--- a/patches/dev300/calc-perf-xls-import-cellstyles-fix2.diff
+++ /dev/null
@@ -1,443 +0,0 @@
----
- sc/source/filter/excel/excimp8.cxx   |    1 +
- sc/source/filter/excel/read.cxx      |    5 +-
- sc/source/filter/excel/xicontent.cxx |  245 ++++++++++++++++++---------------
- sc/source/filter/excel/xiroot.cxx    |    7 +
- sc/source/filter/inc/xicontent.hxx   |   25 +++-
- sc/source/filter/inc/xiroot.hxx      |    5 +
- 6 files changed, 171 insertions(+), 117 deletions(-)
-
-diff --git sc/source/filter/excel/excimp8.cxx sc/source/filter/excel/excimp8.cxx
-index 7f05201..196788e 100644
---- sc/source/filter/excel/excimp8.cxx
-+++ sc/source/filter/excel/excimp8.cxx
-@@ -289,6 +289,7 @@ void ImportExcel8::EndSheet( void )
- {
-     ImportExcel::EndSheet();
-     GetCondFormatManager().Apply();
-+    GetValidationManager().Apply();
- }
- 
- 
-diff --git sc/source/filter/excel/read.cxx sc/source/filter/excel/read.cxx
-index 1c38ead..7023794 100644
---- sc/source/filter/excel/read.cxx
-+++ sc/source/filter/excel/read.cxx
-@@ -803,6 +803,7 @@ FltError ImportExcel8::Read( void )
-     XclImpObjectManager&    rObjMgr         = GetObjectManager();
-     // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets)
-     XclImpCondFormatManager& rCondFmtMgr    = GetCondFormatManager();
-+    XclImpValidationManager& rValidMgr      = GetValidationManager();
-     XclImpPivotTableManager& rPTableMgr     = GetPivotTableManager();
-     XclImpWebQueryBuffer&   rWQBfr          = GetWebQueryBuffer();
- 
-@@ -1175,8 +1176,8 @@ FltError ImportExcel8::Read( void )
-                     case EXC_ID_CONDFMT:        rCondFmtMgr.ReadCondfmt( maStrm );      break;
-                     case EXC_ID_CF:             rCondFmtMgr.ReadCF( maStrm );           break;
- 
--                    case EXC_ID_DVAL:           XclImpValidation::ReadDval( maStrm );   break;
--                    case EXC_ID_DV:             XclImpValidation::ReadDV( maStrm );     break;
-+                    case EXC_ID_DVAL:           rValidMgr.ReadDval( maStrm );           break;
-+                    case EXC_ID_DV:             rValidMgr.ReadDV( maStrm );             break;
- 
-                     case EXC_ID_QSI:            rWQBfr.ReadQsi( maStrm );               break;
-                     case EXC_ID_WQSTRING:       rWQBfr.ReadWqstring( maStrm );          break;
-diff --git sc/source/filter/excel/xicontent.cxx sc/source/filter/excel/xicontent.cxx
-index 1b3efb2..9652b17 100644
---- sc/source/filter/excel/xicontent.cxx
-+++ sc/source/filter/excel/xicontent.cxx
-@@ -699,7 +699,15 @@ void XclImpCondFormatManager::Apply()
- 
- // Data Validation ============================================================
- 
--void XclImpValidation::ReadDval( XclImpStream& rStrm )
-+XclImpValidationManager::DVItem::DVItem( const ScRangeList& rRanges, const ScValidationData& rValidData ) :
-+    maRanges(rRanges), maValidData(rValidData) {}
-+
-+XclImpValidationManager::XclImpValidationManager( const XclImpRoot& rRoot ) :
-+    XclImpRoot( rRoot )
-+{
-+}
-+
-+void XclImpValidationManager::ReadDval( XclImpStream& rStrm )
- {
-     const XclImpRoot& rRoot = rStrm.GetRoot();
-     DBG_ASSERT_BIFF( rRoot.GetBiff() == EXC_BIFF8 );
-@@ -714,7 +722,7 @@ void XclImpValidation::ReadDval( XclImpStream& rStrm )
-     }
- }
- 
--void XclImpValidation::ReadDV( XclImpStream& rStrm )
-+void XclImpValidationManager::ReadDV( XclImpStream& rStrm )
- {
-     const XclImpRoot& rRoot = rStrm.GetRoot();
-     DBG_ASSERT_BIFF( rRoot.GetBiff() == EXC_BIFF8 );
-@@ -738,130 +746,145 @@ void XclImpValidation::ReadDV( XclImpStream& rStrm )
-     rStrm.SetNulSubstChar();    // back to default
- 
-     // formula(s)
--    if( rStrm.GetRecLeft() > 8 )
-+    if ( rStrm.GetRecLeft() <= 8 )
-+        // Not enough bytes left in the record.  Bail out.
-+        return;
-+
-+    sal_uInt16 nLen;
-+
-+    // first formula
-+    // string list is single tStr token with NUL separators -> replace them with LF
-+    rStrm.SetNulSubstChar( '\n' );
-+    ::std::auto_ptr< ScTokenArray > xTokArr1;
-+    rStrm >> nLen;
-+    rStrm.Ignore( 2 );
-+    if( nLen > 0 )
-     {
--        sal_uInt16 nLen;
-+        const ScTokenArray* pTokArr = 0;
-+        rFmlaConv.Reset();
-+        rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_RangeName );
-+        // formula converter owns pTokArr -> create a copy of the token array
-+        if( pTokArr )
-+            xTokArr1.reset( pTokArr->Clone() );
-+    }
-+    rStrm.SetNulSubstChar();    // back to default
- 
--        // first formula
--        // string list is single tStr token with NUL separators -> replace them with LF
--        rStrm.SetNulSubstChar( '\n' );
--        ::std::auto_ptr< ScTokenArray > xTokArr1;
--        rStrm >> nLen;
--        rStrm.Ignore( 2 );
--        if( nLen > 0 )
--        {
--            const ScTokenArray* pTokArr = 0;
--            rFmlaConv.Reset();
--            rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_RangeName );
--            // formula converter owns pTokArr -> create a copy of the token array
--            if( pTokArr )
--                xTokArr1.reset( pTokArr->Clone() );
--        }
--        rStrm.SetNulSubstChar();    // back to default
-+    // second formula
-+    ::std::auto_ptr< ScTokenArray > xTokArr2;
-+    rStrm >> nLen;
-+    rStrm.Ignore( 2 );
-+    if( nLen > 0 )
-+    {
-+        const ScTokenArray* pTokArr = 0;
-+        rFmlaConv.Reset();
-+        rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_RangeName );
-+        // formula converter owns pTokArr -> create a copy of the token array
-+        if( pTokArr )
-+            xTokArr2.reset( pTokArr->Clone() );
-+    }
- 
--        // second formula
--        ::std::auto_ptr< ScTokenArray > xTokArr2;
--        rStrm >> nLen;
--        rStrm.Ignore( 2 );
--        if( nLen > 0 )
--        {
--            const ScTokenArray* pTokArr = 0;
--            rFmlaConv.Reset();
--            rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_RangeName );
--            // formula converter owns pTokArr -> create a copy of the token array
--            if( pTokArr )
--                xTokArr2.reset( pTokArr->Clone() );
--        }
-+    // read all cell ranges
-+    XclRangeList aXclRanges;
-+    rStrm >> aXclRanges;
- 
--        // read all cell ranges
--        XclRangeList aXclRanges;
--        rStrm >> aXclRanges;
-+    // convert to Calc range list
-+    ScRangeList aScRanges;
-+    rRoot.GetAddressConverter().ConvertRangeList( aScRanges, aXclRanges, nScTab, true );
- 
--        // convert to Calc range list
--        ScRangeList aScRanges;
--        rRoot.GetAddressConverter().ConvertRangeList( aScRanges, aXclRanges, nScTab, true );
-+    // only continue if there are valid ranges
-+    if ( !aScRanges.Count() )
-+        return;
- 
--        // only continue if there are valid ranges
--        if( aScRanges.Count() )
--        {
--            bool bIsValid = true;   // valid settings in flags field
-+    bool bIsValid = true;   // valid settings in flags field
- 
--            ScValidationMode eValMode = SC_VALID_ANY;
--            switch( nFlags & EXC_DV_MODE_MASK )
--            {
--                case EXC_DV_MODE_ANY:       eValMode = SC_VALID_ANY;        break;
--                case EXC_DV_MODE_WHOLE:     eValMode = SC_VALID_WHOLE;      break;
--                case EXC_DV_MODE_DECIMAL:   eValMode = SC_VALID_DECIMAL;    break;
--                case EXC_DV_MODE_LIST:      eValMode = SC_VALID_LIST;       break;
--                case EXC_DV_MODE_DATE:      eValMode = SC_VALID_DATE;       break;
--                case EXC_DV_MODE_TIME:      eValMode = SC_VALID_TIME;       break;
--                case EXC_DV_MODE_TEXTLEN:   eValMode = SC_VALID_TEXTLEN;    break;
--                case EXC_DV_MODE_CUSTOM:    eValMode = SC_VALID_CUSTOM;     break;
--                default:                    bIsValid = false;
--            }
--            rRoot.GetTracer().TraceDVType(eValMode == SC_VALID_CUSTOM);
-+    ScValidationMode eValMode = SC_VALID_ANY;
-+    switch( nFlags & EXC_DV_MODE_MASK )
-+    {
-+        case EXC_DV_MODE_ANY:       eValMode = SC_VALID_ANY;        break;
-+        case EXC_DV_MODE_WHOLE:     eValMode = SC_VALID_WHOLE;      break;
-+        case EXC_DV_MODE_DECIMAL:   eValMode = SC_VALID_DECIMAL;    break;
-+        case EXC_DV_MODE_LIST:      eValMode = SC_VALID_LIST;       break;
-+        case EXC_DV_MODE_DATE:      eValMode = SC_VALID_DATE;       break;
-+        case EXC_DV_MODE_TIME:      eValMode = SC_VALID_TIME;       break;
-+        case EXC_DV_MODE_TEXTLEN:   eValMode = SC_VALID_TEXTLEN;    break;
-+        case EXC_DV_MODE_CUSTOM:    eValMode = SC_VALID_CUSTOM;     break;
-+        default:                    bIsValid = false;
-+    }
-+    rRoot.GetTracer().TraceDVType(eValMode == SC_VALID_CUSTOM);
- 
--            ScConditionMode eCondMode = SC_COND_BETWEEN;
--            switch( nFlags & EXC_DV_COND_MASK )
--            {
--                case EXC_DV_COND_BETWEEN:   eCondMode = SC_COND_BETWEEN;    break;
--                case EXC_DV_COND_NOTBETWEEN:eCondMode = SC_COND_NOTBETWEEN; break;
--                case EXC_DV_COND_EQUAL:     eCondMode = SC_COND_EQUAL;      break;
--                case EXC_DV_COND_NOTEQUAL:  eCondMode = SC_COND_NOTEQUAL;   break;
--                case EXC_DV_COND_GREATER:   eCondMode = SC_COND_GREATER;    break;
--                case EXC_DV_COND_LESS:      eCondMode = SC_COND_LESS;       break;
--                case EXC_DV_COND_EQGREATER: eCondMode = SC_COND_EQGREATER;  break;
--                case EXC_DV_COND_EQLESS:    eCondMode = SC_COND_EQLESS;     break;
--                default:                    bIsValid = false;
--            }
-+    ScConditionMode eCondMode = SC_COND_BETWEEN;
-+    switch( nFlags & EXC_DV_COND_MASK )
-+    {
-+        case EXC_DV_COND_BETWEEN:   eCondMode = SC_COND_BETWEEN;    break;
-+        case EXC_DV_COND_NOTBETWEEN:eCondMode = SC_COND_NOTBETWEEN; break;
-+        case EXC_DV_COND_EQUAL:     eCondMode = SC_COND_EQUAL;      break;
-+        case EXC_DV_COND_NOTEQUAL:  eCondMode = SC_COND_NOTEQUAL;   break;
-+        case EXC_DV_COND_GREATER:   eCondMode = SC_COND_GREATER;    break;
-+        case EXC_DV_COND_LESS:      eCondMode = SC_COND_LESS;       break;
-+        case EXC_DV_COND_EQGREATER: eCondMode = SC_COND_EQGREATER;  break;
-+        case EXC_DV_COND_EQLESS:    eCondMode = SC_COND_EQLESS;     break;
-+        default:                    bIsValid = false;
-+    }
- 
--            if( bIsValid )
--            {
--                // first range for base address for relative references
--                const ScRange& rScRange = *aScRanges.GetObject( 0 );    // aScRanges is not empty
-+    if ( !bIsValid )
-+        // No valid validation found.  Bail out.
-+        return;
- 
--                // process string list of a list validity (convert to list of string tokens)
--                if( xTokArr1.get() && (eValMode == SC_VALID_LIST) && ::get_flag( nFlags, EXC_DV_STRINGLIST ) )
--                    XclTokenArrayHelper::ConvertStringToList( *xTokArr1, '\n', true );
- 
--                ScValidationData aValidData( eValMode, eCondMode, xTokArr1.get(), xTokArr2.get(), &rDoc, rScRange.aStart );
-+    // first range for base address for relative references
-+    const ScRange& rScRange = *aScRanges.GetObject( 0 );    // aScRanges is not empty
- 
--                aValidData.SetIgnoreBlank( ::get_flag( nFlags, EXC_DV_IGNOREBLANK ) );
--                aValidData.SetListType( ::get_flagvalue( nFlags, EXC_DV_SUPPRESSDROPDOWN, ValidListType::INVISIBLE, ValidListType::UNSORTED ) );
-+    // process string list of a list validity (convert to list of string tokens)
-+    if( xTokArr1.get() && (eValMode == SC_VALID_LIST) && ::get_flag( nFlags, EXC_DV_STRINGLIST ) )
-+        XclTokenArrayHelper::ConvertStringToList( *xTokArr1, '\n', true );
- 
--                // *** prompt box ***
--                if( aPromptTitle.Len() || aPromptMessage.Len() )
--                {
--                    // set any text stored in the record
--                    aValidData.SetInput( aPromptTitle, aPromptMessage );
--                    if( !::get_flag( nFlags, EXC_DV_SHOWPROMPT ) )
--                        aValidData.ResetInput();
--                }
-+    maDVItems.push_back(
-+        new DVItem(aScRanges, ScValidationData(eValMode, eCondMode, xTokArr1.get(), xTokArr2.get(), &rDoc, rScRange.aStart)));
-+    DVItem& rItem = maDVItems.back();
- 
--                // *** error box ***
--                ScValidErrorStyle eErrStyle = SC_VALERR_STOP;
--                switch( nFlags & EXC_DV_ERROR_MASK )
--                {
--                    case EXC_DV_ERROR_WARNING:  eErrStyle = SC_VALERR_WARNING;  break;
--                    case EXC_DV_ERROR_INFO:     eErrStyle = SC_VALERR_INFO;     break;
--                }
--                // set texts and error style
--                aValidData.SetError( aErrorTitle, aErrorMessage, eErrStyle );
--                if( !::get_flag( nFlags, EXC_DV_SHOWERROR ) )
--                    aValidData.ResetError();
--
--                // set the handle ID
--                ULONG nHandle = rDoc.AddValidationEntry( aValidData );
--                ScPatternAttr aPattern( rDoc.GetPool() );
--                aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nHandle ) );
--
--                // apply all ranges
--                for( const ScRange* pScRange = aScRanges.First(); pScRange; pScRange = aScRanges.Next() )
--                    rDoc.ApplyPatternAreaTab( pScRange->aStart.Col(), pScRange->aStart.Row(),
--                        pScRange->aEnd.Col(), pScRange->aEnd.Row(), nScTab, aPattern );
--            }
--        }
-+    rItem.maValidData.SetIgnoreBlank( ::get_flag( nFlags, EXC_DV_IGNOREBLANK ) );
-+    rItem.maValidData.SetListType( ::get_flagvalue( nFlags, EXC_DV_SUPPRESSDROPDOWN, ValidListType::INVISIBLE, ValidListType::UNSORTED ) );
-+
-+    // *** prompt box ***
-+    if( aPromptTitle.Len() || aPromptMessage.Len() )
-+    {
-+        // set any text stored in the record
-+        rItem.maValidData.SetInput( aPromptTitle, aPromptMessage );
-+        if( !::get_flag( nFlags, EXC_DV_SHOWPROMPT ) )
-+            rItem.maValidData.ResetInput();
-+    }
-+
-+    // *** error box ***
-+    ScValidErrorStyle eErrStyle = SC_VALERR_STOP;
-+    switch( nFlags & EXC_DV_ERROR_MASK )
-+    {
-+        case EXC_DV_ERROR_WARNING:  eErrStyle = SC_VALERR_WARNING;  break;
-+        case EXC_DV_ERROR_INFO:     eErrStyle = SC_VALERR_INFO;     break;
-+    }
-+    // set texts and error style
-+    rItem.maValidData.SetError( aErrorTitle, aErrorMessage, eErrStyle );
-+    if( !::get_flag( nFlags, EXC_DV_SHOWERROR ) )
-+        rItem.maValidData.ResetError();
-+}
-+
-+void XclImpValidationManager::Apply()
-+{
-+    ScDocument& rDoc = GetRoot().GetDoc();
-+    DVItemList::iterator itr = maDVItems.begin(), itrEnd = maDVItems.end();
-+    for (; itr != itrEnd; ++itr)
-+    {
-+        DVItem& rItem = *itr;
-+        // set the handle ID
-+        ULONG nHandle = rDoc.AddValidationEntry( rItem.maValidData );
-+        ScPatternAttr aPattern( rDoc.GetPool() );
-+        aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nHandle ) );
-+
-+        // apply all ranges
-+        for( const ScRange* pScRange = rItem.maRanges.First(); pScRange; pScRange = rItem.maRanges.Next() )
-+            rDoc.ApplyPatternAreaTab( pScRange->aStart.Col(), pScRange->aStart.Row(),
-+                pScRange->aEnd.Col(), pScRange->aEnd.Row(), pScRange->aStart.Tab(), aPattern );
-     }
-+    maDVItems.clear();
- }
- 
- // Web queries ================================================================
-diff --git sc/source/filter/excel/xiroot.cxx sc/source/filter/excel/xiroot.cxx
-index 286ed16..e50865d 100644
---- sc/source/filter/excel/xiroot.cxx
-+++ sc/source/filter/excel/xiroot.cxx
-@@ -79,6 +79,7 @@ XclImpRoot::XclImpRoot( XclImpRootData& rImpRootData ) :
-         mrImpData.mxLinkMgr.reset( new XclImpLinkManager( GetRoot() ) );
-         mrImpData.mxSst.reset( new XclImpSst( GetRoot() ) );
-         mrImpData.mxCondFmtMgr.reset( new XclImpCondFormatManager( GetRoot() ) );
-+        mrImpData.mxValidMgr.reset( new XclImpValidationManager( GetRoot() ) );
-         // TODO still in old RootData (deleted by RootData)
-         GetOldRoot().pAutoFilterBuffer = new XclImpAutoFilterBuffer;
-         mrImpData.mxWebQueryBfr.reset( new XclImpWebQueryBuffer( GetRoot() ) );
-@@ -218,6 +219,12 @@ XclImpCondFormatManager& XclImpRoot::GetCondFormatManager() const
-     return *mrImpData.mxCondFmtMgr;
- }
- 
-+XclImpValidationManager& XclImpRoot::GetValidationManager() const
-+{
-+    DBG_ASSERT( mrImpData.mxValidMgr.is(), "XclImpRoot::GetValidationManager - invalid call, wrong BIFF" );
-+    return *mrImpData.mxValidMgr;
-+}
-+
- XclImpAutoFilterBuffer& XclImpRoot::GetFilterManager() const
- {
-     // TODO still in old RootData
-diff --git sc/source/filter/inc/xicontent.hxx sc/source/filter/inc/xicontent.hxx
-index d8b1ec9..976dbdb 100644
---- sc/source/filter/inc/xicontent.hxx
-+++ sc/source/filter/inc/xicontent.hxx
-@@ -33,8 +33,10 @@
- #include "xlcontent.hxx"
- #include "xistring.hxx"
- #include "xiroot.hxx"
-+#include "validat.hxx"
- 
- #include <map>
-+#include <boost/ptr_container/ptr_vector.hpp>
- 
- /* ============================================================================
- Classes to import the big Excel document contents (related to several cells or
-@@ -162,14 +164,29 @@ private:
- 
- // Data Validation ============================================================
- 
--/** Provides importing validation data and inserting it into a document. */
--class XclImpValidation : ScfNoInstance
-+/** Imports validation data. */
-+class XclImpValidationManager : protected XclImpRoot
- {
- public:
-+    explicit            XclImpValidationManager( const XclImpRoot& rRoot );
-+
-     /** Reads a DVAL record and sets marks the dropdown arrow control to be ignored. */
--    static void         ReadDval( XclImpStream& rStrm );
-+    void                ReadDval( XclImpStream& rStrm );
-     /** Reads a DV record and inserts validation data into the document. */
--    static void         ReadDV( XclImpStream& rStrm );
-+    void                ReadDV( XclImpStream& rStrm );
-+
-+    void                Apply();
-+private:
-+    struct DVItem
-+    {
-+        ScRangeList         maRanges;
-+        ScValidationData    maValidData;
-+
-+        explicit DVItem ( const ScRangeList& rRanges, const ScValidationData& rValidData );
-+    };
-+    typedef ::boost::ptr_vector<DVItem> DVItemList;
-+
-+    DVItemList maDVItems;
- };
- 
- // Web queries ================================================================
-diff --git sc/source/filter/inc/xiroot.hxx sc/source/filter/inc/xiroot.hxx
-index 6ed1d73..04dc112 100644
---- sc/source/filter/inc/xiroot.hxx
-+++ sc/source/filter/inc/xiroot.hxx
-@@ -53,6 +53,7 @@ class XclImpLinkManager;
- class XclImpObjectManager;
- class XclImpSheetDrawing;
- class XclImpCondFormatManager;
-+class XclImpValidationManager;
- class XclImpAutoFilterBuffer;
- class XclImpWebQueryBuffer;
- class XclImpPivotTableManager;
-@@ -82,6 +83,7 @@ struct XclImpRootData : public XclRootData
-     typedef ScfRef< XclImpLinkManager >         XclImpLinkMgrRef;
-     typedef ScfRef< XclImpObjectManager >       XclImpObjectMgrRef;
-     typedef ScfRef< XclImpCondFormatManager >   XclImpCondFmtMgrRef;
-+    typedef ScfRef< XclImpValidationManager >   XclImpValidationMgrRef;
-     typedef ScfRef< XclImpWebQueryBuffer >      XclImpWebQueryBfrRef;
-     typedef ScfRef< XclImpPivotTableManager >   XclImpPTableMgrRef;
-     typedef ScfRef< XclImpPageSettings >        XclImpPageSettRef;
-@@ -106,6 +108,7 @@ struct XclImpRootData : public XclRootData
- 
-     XclImpObjectMgrRef  mxObjMgr;           /// All drawing objects.
-     XclImpCondFmtMgrRef mxCondFmtMgr;       /// Conditional formattings.
-+    XclImpValidationMgrRef mxValidMgr;      /// Data validation
-     XclImpWebQueryBfrRef mxWebQueryBfr;     /// All web queries.
-     XclImpPTableMgrRef  mxPTableMgr;        /// All pivot tables and pivot caches.
- 
-@@ -181,6 +184,8 @@ public:
-     XclImpSheetDrawing& GetCurrSheetDrawing() const;
-     /** Returns the conditional formattings manager. */
-     XclImpCondFormatManager& GetCondFormatManager() const;
-+
-+    XclImpValidationManager& GetValidationManager() const;
-     /** Returns the filter manager. */
-     XclImpAutoFilterBuffer& GetFilterManager() const;
-     /** Returns the web query buffer. */
--- 
-1.7.0.1
-
diff --git a/patches/dev300/calc-perf-xls-import-cellstyles.diff b/patches/dev300/calc-perf-xls-import-cellstyles.diff
deleted file mode 100644
index 9a39546..0000000
--- a/patches/dev300/calc-perf-xls-import-cellstyles.diff
+++ /dev/null
@@ -1,356 +0,0 @@
- sc/inc/attarray.hxx                |    1 +
- sc/inc/column.hxx                  |    2 +
- sc/inc/document.hxx                |    4 +
- sc/inc/table.hxx                   |    2 +
- sc/source/core/data/attarray.cxx   |   15 +++++
- sc/source/core/data/column.cxx     |    4 +
- sc/source/core/data/document.cxx   |    8 +++
- sc/source/core/data/table2.cxx     |    8 +++
- sc/source/filter/excel/xistyle.cxx |  107 +++++++++++++++++++++++++++---------
- sc/source/filter/inc/xistyle.hxx   |   20 +-----
- 10 files changed, 129 insertions(+), 42 deletions(-)
-
-diff --git sc/inc/attarray.hxx sc/inc/attarray.hxx
-index f3a3361..510b6c5 100644
---- sc/inc/attarray.hxx
-+++ sc/inc/attarray.hxx
-@@ -133,6 +133,7 @@ public:
-     void	ApplyStyleArea( SCROW nStartRow, SCROW nEndRow, ScStyleSheet* pStyle );
-     void	ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, SfxItemPoolCache* pCache,
-                             ScEditDataArray* pDataArray = NULL );
-+    bool    SetAttrEntries(ScAttrEntry* pNewData, SCSIZE nSize);
-     void	ApplyLineStyleArea( SCROW nStartRow, SCROW nEndRow,
-                                 const SvxBorderLine* pLine, BOOL bColorOnly );
- 
-diff --git sc/inc/column.hxx sc/inc/column.hxx
-index 4e6dbf0..bc4ea23 100644
---- sc/inc/column.hxx
-+++ sc/inc/column.hxx
-@@ -51,6 +51,7 @@ class SvxBoxItem;
- 
- class ScAttrIterator;
- class ScAttrArray;
-+struct ScAttrEntry;
- class ScBaseCell;
- class ScDocument;
- class ScEditDataArray;
-@@ -324,6 +325,7 @@ public:
-     void		ApplyPattern( SCROW nRow, const ScPatternAttr& rPatAttr );
-     void		ApplyPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPatternAttr& rPatAttr,
-                                   ScEditDataArray* pDataArray = NULL );
-+    bool        SetAttrEntries(ScAttrEntry* pData, SCSIZE nSize);
-     void		SetPattern( SCROW nRow, const ScPatternAttr& rPatAttr, BOOL bPutToPool = FALSE );
-     void		SetPatternArea( SCROW nStartRow, SCROW nEndRow,
-                                 const ScPatternAttr& rPatAttr, BOOL bPutToPool = FALSE );
-diff --git sc/inc/document.hxx sc/inc/document.hxx
-index 4866f4b..bd8fb12 100644
---- sc/inc/document.hxx
-+++ sc/inc/document.hxx
-@@ -83,6 +83,7 @@ class Window;
- class XColorTable;
- class List;
- 
-+struct ScAttrEntry;
- class ScAutoFormatData;
- class ScBaseCell;
- class ScStringCell;
-@@ -1219,6 +1220,9 @@ public:
-     SC_DLLPUBLIC void			ApplyPatternAreaTab( SCCOL nStartCol, SCROW nStartRow,
-                                             SCCOL nEndCol, SCROW nEndRow, SCTAB nTab,
-                                             const ScPatternAttr& rAttr );
-+
-+    SC_DLLPUBLIC bool SetAttrEntries(SCCOL nCol, SCTAB nTab, ScAttrEntry* pData, SCSIZE nSize);
-+
-     SC_DLLPUBLIC void			ApplyPatternIfNumberformatIncompatible(
-                             const ScRange& rRange, const ScMarkData& rMark,
-                             const ScPatternAttr& rPattern, short nNewType );
-diff --git sc/inc/table.hxx sc/inc/table.hxx
-index 709000e..9a5725e 100644
---- sc/inc/table.hxx
-+++ sc/inc/table.hxx
-@@ -536,6 +536,8 @@ public:
-     void		ApplyPattern( SCCOL nCol, SCROW nRow, const ScPatternAttr& rAttr );
-     void		ApplyPatternArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
-                                   const ScPatternAttr& rAttr, ScEditDataArray* pDataArray = NULL );
-+    bool        SetAttrEntries(SCCOL nCol, ScAttrEntry* pData, SCSIZE nSize);
-+
-     void		SetPattern( const ScAddress& rPos, const ScPatternAttr& rAttr, BOOL bPutToPool = FALSE )
-                     {
-                         if (ValidColRow(rPos.Col(),rPos.Row()))
-diff --git sc/source/core/data/attarray.cxx sc/source/core/data/attarray.cxx
-index d5001ad..d0b457f 100644
---- sc/source/core/data/attarray.cxx
-+++ sc/source/core/data/attarray.cxx
-@@ -836,6 +836,21 @@ void ScAttrArray::ApplyCacheArea( SCROW nStartRow, SCROW nEndRow, SfxItemPoolCac
- #endif
- }
- 
-+bool ScAttrArray::SetAttrEntries(ScAttrEntry* pNewData, SCSIZE nSize)
-+{
-+    if (pData)
-+    {
-+        ScDocumentPool* pDocPool = pDocument->GetPool();
-+        for (SCSIZE i=0; i<nCount; i++)
-+            pDocPool->Remove(*pData[i].pPattern);
-+
-+        delete[] pData;
-+    }
-+
-+    pData = pNewData;
-+    nCount = nLimit = nSize;
-+    return true;
-+}
- 
- void lcl_MergeDeep( SfxItemSet& rMergeSet, const SfxItemSet& rSource )
- {
-diff --git sc/source/core/data/column.cxx sc/source/core/data/column.cxx
-index b35d019..99ceb84 100644
---- sc/source/core/data/column.cxx
-+++ sc/source/core/data/column.cxx
-@@ -482,6 +482,10 @@ void ScColumn::ApplyPatternArea( SCROW nStartRow, SCROW nEndRow, const ScPattern
-     pAttrArray->ApplyCacheArea( nStartRow, nEndRow, &aCache, pDataArray );
- }
- 
-+bool ScColumn::SetAttrEntries(ScAttrEntry* pData, SCSIZE nSize)
-+{
-+    return pAttrArray->SetAttrEntries(pData, nSize);
-+}
- 
- void ScColumn::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
-         const ScPatternAttr& rPattern, short nNewType )
-diff --git sc/source/core/data/document.cxx sc/source/core/data/document.cxx
-index 1d6048f..44bbc66 100644
---- sc/source/core/data/document.cxx
-+++ sc/source/core/data/document.cxx
-@@ -3886,6 +3886,14 @@ void ScDocument::ApplyPatternAreaTab( SCCOL nStartCol, SCROW nStartRow,
-             pTab[nTab]->ApplyPatternArea( nStartCol, nStartRow, nEndCol, nEndRow, rAttr );
- }
- 
-+bool ScDocument::SetAttrEntries(SCCOL nCol, SCTAB nTab, ScAttrEntry* pData, SCSIZE nSize)
-+{
-+    if (!ValidTab(nTab) || !pTab[nTab])
-+        return false;
-+
-+    return pTab[nTab]->SetAttrEntries(nCol, pData, nSize);
-+}
-+
- void ScDocument::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
-         const ScMarkData& rMark, const ScPatternAttr& rPattern, short nNewType )
- {
-diff --git sc/source/core/data/table2.cxx sc/source/core/data/table2.cxx
-index e0a34fa..c003a14 100644
---- sc/source/core/data/table2.cxx
-+++ sc/source/core/data/table2.cxx
-@@ -1802,6 +1802,14 @@ void ScTable::ApplyPatternArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol,
-     }
- }
- 
-+bool ScTable::SetAttrEntries(SCCOL nCol, ScAttrEntry* pData, SCSIZE nSize)
-+{
-+    if (!ValidCol(nCol))
-+        return false;
-+
-+    return aCol[nCol].SetAttrEntries(pData, nSize);
-+}
-+
- void ScTable::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
-         const ScPatternAttr& rPattern, short nNewType )
- {
-diff --git sc/source/filter/excel/xistyle.cxx sc/source/filter/excel/xistyle.cxx
-index fdd537a..6e6ee3e 100644
---- sc/source/filter/excel/xistyle.cxx
-+++ sc/source/filter/excel/xistyle.cxx
-@@ -58,12 +58,18 @@
- #include "stlsheet.hxx"
- #include "cell.hxx"
- #include "globstr.hrc"
-+#include "attarray.hxx"
- #include "xltracer.hxx"
- #include "xistream.hxx"
- #include "xicontent.hxx"
- 
- #include "root.hxx"
- #include "colrowst.hxx"
-+#include "svl/poolcach.hxx"
-+
-+#include <list>
-+
-+using ::std::list;
- 
- #include <cppuhelper/implbase1.hxx>
- #include <com/sun/star/container/XIndexAccess.hpp>
-@@ -1242,26 +1248,60 @@ const ScPatternAttr& XclImpXF::CreatePattern( bool bSkipPoolDefs )
-     return *mpPattern;
- }
- 
--void XclImpXF::ApplyPattern(
--        SCCOL nScCol1, SCROW nScRow1, SCCOL nScCol2, SCROW nScRow2,
--        SCTAB nScTab, ULONG nForceScNumFmt )
-+void XclImpXF::ApplyPatternToAttrList(
-+    list<ScAttrEntry>& rAttrs, SCROW nRow1, SCROW nRow2, sal_uInt32 nForceScNumFmt)
- {
-     // force creation of cell style and hard formatting, do it here to have mpStyleSheet
--    const ScPatternAttr& rPattern = CreatePattern();
-+    const ScPatternAttr& rOrigPat = CreatePattern();
-+    ScPatternAttr aNewPat = rOrigPat;
-+    const ScPatternAttr* pPat = NULL;
- 
-     // insert into document
-     ScDocument& rDoc = GetDoc();
--    if( IsCellXF() && mpStyleSheet )
--        rDoc.ApplyStyleAreaTab( nScCol1, nScRow1, nScCol2, nScRow2, nScTab, *mpStyleSheet );
--    if( HasUsedFlags() )
--        rDoc.ApplyPatternAreaTab( nScCol1, nScRow1, nScCol2, nScRow2, nScTab, rPattern );
- 
--    // #108770# apply special number format
--    if( nForceScNumFmt != NUMBERFORMAT_ENTRY_NOT_FOUND )
-+    if (IsCellXF() && mpStyleSheet)
-+    {
-+        // Style sheet exists.  Create a copy of the original pattern.
-+        aNewPat.SetStyleSheet(mpStyleSheet);
-+        pPat = &aNewPat;
-+    }
-+
-+    if (HasUsedFlags())
-+    {
-+        if (!pPat)
-+            pPat = &aNewPat;
-+
-+        SfxItemPoolCache aCache(rDoc.GetPool(), &rOrigPat.GetItemSet());
-+        pPat = static_cast<const ScPatternAttr*>(&aCache.ApplyTo(*pPat, true));
-+    }
-+
-+    if (nForceScNumFmt != NUMBERFORMAT_ENTRY_NOT_FOUND)
-     {
--        ScPatternAttr aPattern( GetDoc().GetPool() );
--        GetNumFmtBuffer().FillScFmtToItemSet( aPattern.GetItemSet(), nForceScNumFmt );
--        rDoc.ApplyPatternAreaTab( nScCol1, nScRow1, nScCol2, nScRow2, nScTab, aPattern );
-+        if (!pPat)
-+            pPat = &aNewPat;
-+
-+        ScPatternAttr aNumPat(GetDoc().GetPool());
-+        GetNumFmtBuffer().FillScFmtToItemSet(aNumPat.GetItemSet(), nForceScNumFmt);
-+        SfxItemPoolCache aCache(rDoc.GetPool(), &aNumPat.GetItemSet());
-+        pPat = static_cast<const ScPatternAttr*>(&aCache.ApplyTo(*pPat, true));
-+    }
-+
-+
-+    if (pPat)
-+    {
-+        if (!rAttrs.empty() && rAttrs.back().nRow + 1 < nRow1)
-+        {
-+            // Fill this gap with the default pattern.
-+            ScAttrEntry aEntry;
-+            aEntry.nRow = nRow1 - 1;
-+            aEntry.pPattern = rDoc.GetDefPattern();
-+            rAttrs.push_back(aEntry);
-+        }
-+
-+        ScAttrEntry aEntry;
-+        aEntry.nRow = nRow2;
-+        aEntry.pPattern = static_cast<const ScPatternAttr*>(&rDoc.GetPool()->Put(*pPat));
-+        rAttrs.push_back(aEntry);
-     }
- }
- 
-@@ -1507,18 +1547,6 @@ ScStyleSheet* XclImpXFBuffer::CreateStyleSheet( sal_uInt16 nXFIndex )
-     return (aIt == maStylesByXf.end()) ? 0 : aIt->second->CreateStyleSheet();
- }
- 
--void XclImpXFBuffer::ApplyPattern(
--        SCCOL nScCol1, SCROW nScRow1, SCCOL nScCol2, SCROW nScRow2,
--        SCTAB nScTab, const XclImpXFIndex& rXFIndex )
--{
--    if( XclImpXF* pXF = GetXF( rXFIndex.GetXFIndex() ) )
--    {
--        // #108770# set 'Standard' number format for all Boolean cells
--        ULONG nForceScNumFmt = rXFIndex.IsBoolCell() ? GetNumFmtBuffer().GetStdScNumFmt() : NUMBERFORMAT_ENTRY_NOT_FOUND;
--        pXF->ApplyPattern( nScCol1, nScRow1, nScCol2, nScRow2, nScTab, nForceScNumFmt );
--    }
--}
--
- // Buffer for XF indexes in cells =============================================
- 
- IMPL_FIXEDMEMPOOL_NEWDEL( XclImpXFRange, 100, 500 )
-@@ -1842,8 +1870,35 @@ void XclImpXFRangeBuffer::Finalize()
-         {
-             XclImpXFRangeColumn& rColumn = **aVIt;
-             SCCOL nScCol = static_cast< SCCOL >( aVIt - aVBeg );
-+            list<ScAttrEntry> aAttrs;
-             for( XclImpXFRange* pStyle = rColumn.First(); pStyle; pStyle = rColumn.Next() )
--                rXFBuffer.ApplyPattern( nScCol, pStyle->mnScRow1, nScCol, pStyle->mnScRow2, nScTab, pStyle->maXFIndex );
-+            {
-+                const XclImpXFIndex& rXFIndex = pStyle->maXFIndex;
-+                XclImpXF* pXF = rXFBuffer.GetXF( rXFIndex.GetXFIndex() );
-+                if (!pXF)
-+                    continue;
-+
-+                sal_uInt32 nForceScNumFmt = rXFIndex.IsBoolCell() ?
-+                    GetNumFmtBuffer().GetStdScNumFmt() : NUMBERFORMAT_ENTRY_NOT_FOUND;
-+
-+                pXF->ApplyPatternToAttrList(aAttrs, pStyle->mnScRow1, pStyle->mnScRow2, nForceScNumFmt);
-+            }
-+
-+            if (aAttrs.empty() || aAttrs.back().nRow != MAXROW)
-+            {
-+                ScAttrEntry aEntry;
-+                aEntry.nRow = MAXROW;
-+                aEntry.pPattern = rDoc.GetDefPattern();
-+                aAttrs.push_back(aEntry);
-+            }
-+
-+            size_t nAttrSize = aAttrs.size();
-+            ScAttrEntry* pData = new ScAttrEntry[nAttrSize];
-+            list<ScAttrEntry>::const_iterator itr = aAttrs.begin(), itrEnd = aAttrs.end();
-+            for (size_t i = 0; itr != itrEnd; ++itr, ++i)
-+                pData[i] = *itr;
-+
-+            rDoc.SetAttrEntries(nScCol, nScTab, pData, static_cast<SCSIZE>(nAttrSize));
-         }
-     }
- 
-diff --git sc/source/filter/inc/xistyle.hxx sc/source/filter/inc/xistyle.hxx
-index ba3448f..7e5857d 100644
---- sc/source/filter/inc/xistyle.hxx
-+++ sc/source/filter/inc/xistyle.hxx
-@@ -37,6 +37,7 @@
- #include "xiroot.hxx"
- 
- class ScDocumentPool;
-+class ScAttrEntry;
- 
- /* ============================================================================
- - Buffers for style records (PALETTE, FONT, FORMAT, XF)
-@@ -408,14 +409,9 @@ public:
-         @return  A read-only reference to the item set stored internally. */
-     const ScPatternAttr& CreatePattern( bool bSkipPoolDefs = false );
- 
--    /** Inserts all formatting attributes to the specified area in the Calc document.
--        @param nForcedNumFmt  If not set to NUMBERFORMAT_ENTRY_NOT_FOUND, it will overwrite
--        the number format of the XF. */
--    void                ApplyPattern(
--                            SCCOL nScCol1, SCROW nScRow1,
--                            SCCOL nScCol2, SCROW nScRow2,
--                            SCTAB nScTab,
--                            ULONG nForceScNumFmt = NUMBERFORMAT_ENTRY_NOT_FOUND );
-+    void                ApplyPatternToAttrList(
-+                            ::std::list<ScAttrEntry>& rAttrs, SCROW nRow1, SCROW nRow2,
-+                            sal_uInt32 nForceScNumFmt = NUMBERFORMAT_ENTRY_NOT_FOUND);
- 
- private:
-     void                ReadXF2( XclImpStream& rStrm );
-@@ -511,14 +507,6 @@ public:
-         @return  The pointer to the cell style sheet, or 0, if there is no style sheet. */
-     ScStyleSheet*       CreateStyleSheet( sal_uInt16 nXFIndex );
- 
--    /** Inserts formatting attributes from an XF to the specified area in the Calc document.
--        @param nForcedNumFmt  If not set to NUMBERFORMAT_ENTRY_NOT_FOUND, it will overwrite
--        the number format of the XF. */
--    void                ApplyPattern(
--                            SCCOL nScCol1, SCROW nScRow1,
--                            SCCOL nScCol2, SCROW nScRow2,
--                            SCTAB nScTab, const XclImpXFIndex& rXFIndex );
--
- private:
-     typedef ScfDelList< XclImpStyle >               XclImpStyleList;
-     typedef ::std::map< sal_uInt16, XclImpStyle* >  XclImpStyleMap;


More information about the ooo-build-commit mailing list