[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