diff options
-rw-r--r-- | sc/source/filter/xml/cachedattraccess.cxx | 70 | ||||
-rw-r--r-- | sc/source/filter/xml/cachedattraccess.hxx | 63 | ||||
-rw-r--r-- | sc/source/filter/xml/makefile.mk | 1 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlexprt.cxx | 42 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlexprt.hxx | 26 |
5 files changed, 139 insertions, 63 deletions
diff --git a/sc/source/filter/xml/cachedattraccess.cxx b/sc/source/filter/xml/cachedattraccess.cxx new file mode 100644 index 000000000000..b5ef932a4410 --- /dev/null +++ b/sc/source/filter/xml/cachedattraccess.cxx @@ -0,0 +1,70 @@ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * [ Kohei Yoshida <kyoshida@novell.com> ] + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +#include "cachedattraccess.hxx" +#include "document.hxx" + +ScXMLCachedRowAttrAccess::Cache::Cache() : + mnTab(-1), mnRow1(-1), mnRow2(-1), mbValue(false) {} + +bool ScXMLCachedRowAttrAccess::Cache::hasCache(sal_Int32 nTab, sal_Int32 nRow) const +{ + return mnTab == nTab && mnRow1 <= nRow && nRow <= mnRow2; +} + +ScXMLCachedRowAttrAccess::ScXMLCachedRowAttrAccess(ScDocument* pDoc) : + mpDoc(pDoc) {} + +bool ScXMLCachedRowAttrAccess::rowHidden(sal_Int32 nTab, sal_Int32 nRow) +{ + if (!maHidden.hasCache(nTab, nRow)) + { + SCROW nRow1, nRow2; + maHidden.mbValue = mpDoc->RowHidden( + static_cast<SCTAB>(nTab), static_cast<SCROW>(nRow), &nRow1, &nRow2); + maHidden.mnRow1 = static_cast<sal_Int32>(nRow1); + maHidden.mnRow2 = static_cast<sal_Int32>(nRow2); + } + return maHidden.mbValue; +} + +bool ScXMLCachedRowAttrAccess::rowFiltered(sal_Int32 nTab, sal_Int32 nRow) +{ + if (!maFiltered.hasCache(nTab, nRow)) + { + SCROW nRow1, nRow2; + maFiltered.mbValue = mpDoc->RowFiltered( + static_cast<SCTAB>(nTab), static_cast<SCROW>(nRow), &nRow1, &nRow2); + maFiltered.mnRow1 = static_cast<sal_Int32>(nRow1); + maFiltered.mnRow2 = static_cast<sal_Int32>(nRow2); + } + return maFiltered.mbValue; +} + diff --git a/sc/source/filter/xml/cachedattraccess.hxx b/sc/source/filter/xml/cachedattraccess.hxx new file mode 100644 index 000000000000..5ef6e4118089 --- /dev/null +++ b/sc/source/filter/xml/cachedattraccess.hxx @@ -0,0 +1,63 @@ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * [ Kohei Yoshida <kyoshida@novell.com> ] + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#ifndef __SC_FILTER_XML_CACHEDATTRACCESS_HXX__ +#define __SC_FILTER_XML_CACHEDATTRACCESS_HXX__ + +#include "sal/types.h" + +class ScDocument; + +/** + * Wrapper for accessing hidden and filtered row attributes. It caches last + * accessed values for a current range, to avoid fetching values for every + * single row. + */ +class ScXMLCachedRowAttrAccess +{ + struct Cache + { + sal_Int32 mnTab; + sal_Int32 mnRow1; + sal_Int32 mnRow2; + bool mbValue; + Cache(); + bool hasCache(sal_Int32 nTab, sal_Int32 nRow) const; + }; + +public: + ScXMLCachedRowAttrAccess(ScDocument* pDoc); + + bool rowHidden(sal_Int32 nTab, sal_Int32 nRow); + bool rowFiltered(sal_Int32 nTab, sal_Int32 nRow); +private: + Cache maHidden; + Cache maFiltered; + ScDocument* mpDoc; +}; + +#endif diff --git a/sc/source/filter/xml/makefile.mk b/sc/source/filter/xml/makefile.mk index 47d428157993..777d68c086bf 100644 --- a/sc/source/filter/xml/makefile.mk +++ b/sc/source/filter/xml/makefile.mk @@ -47,6 +47,7 @@ PROJECTPCHSOURCE=..\pch\filt_pch SLOFILES = \ $(SLO)$/sheetdata.obj \ + $(SLO)$/cachedattraccess.obj \ $(SLO)$/xmlwrap.obj \ $(SLO)$/xmlimprt.obj \ $(SLO)$/xmlexprt.obj \ diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index f272414ad11b..88551d4c3644 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -69,6 +69,7 @@ #include "externalrefmgr.hxx" #include "editutil.hxx" #include "tabprotection.hxx" +#include "cachedattraccess.hxx" #include <xmloff/xmltoken.hxx> #include <xmloff/xmlnmspe.hxx> @@ -170,43 +171,6 @@ using ::rtl::OUStringBuffer; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::UNO_QUERY; -ScXMLRowAttrAccess::Cache::Cache() : - mnTab(-1), mnRow1(-1), mnRow2(-1), mbValue(false) {} - -bool ScXMLRowAttrAccess::Cache::hasCache(sal_Int32 nTab, sal_Int32 nRow) const -{ - return mnTab == nTab && mnRow1 <= nRow && nRow <= mnRow2; -} - -ScXMLRowAttrAccess::ScXMLRowAttrAccess(ScDocument* pDoc) : - mpDoc(pDoc) {} - -bool ScXMLRowAttrAccess::rowHidden(sal_Int32 nTab, sal_Int32 nRow) -{ - if (!maHidden.hasCache(nTab, nRow)) - { - SCROW nRow1, nRow2; - maHidden.mbValue = mpDoc->RowHidden( - static_cast<SCTAB>(nTab), static_cast<SCROW>(nRow), &nRow1, &nRow2); - maHidden.mnRow1 = static_cast<sal_Int32>(nRow1); - maHidden.mnRow2 = static_cast<sal_Int32>(nRow2); - } - return maHidden.mbValue; -} - -bool ScXMLRowAttrAccess::rowFiltered(sal_Int32 nTab, sal_Int32 nRow) -{ - if (!maFiltered.hasCache(nTab, nRow)) - { - SCROW nRow1, nRow2; - maFiltered.mbValue = mpDoc->RowFiltered( - static_cast<SCTAB>(nTab), static_cast<SCROW>(nRow), &nRow1, &nRow2); - maFiltered.mnRow1 = static_cast<sal_Int32>(nRow1); - maFiltered.mnRow2 = static_cast<sal_Int32>(nRow2); - } - return maFiltered.mbValue; -} - //---------------------------------------------------------------------------- namespace @@ -1340,7 +1304,7 @@ void ScXMLExport::OpenAndCloseRow( pRowFormatRanges->Clear(); } -void ScXMLExport::OpenRow(const sal_Int32 nTable, const sal_Int32 nStartRow, const sal_Int32 nRepeatRow, ScXMLRowAttrAccess& rRowAttr) +void ScXMLExport::OpenRow(const sal_Int32 nTable, const sal_Int32 nStartRow, const sal_Int32 nRepeatRow, ScXMLCachedRowAttrAccess& rRowAttr) { if (nRepeatRow > 1) { @@ -1437,7 +1401,7 @@ void ScXMLExport::ExportFormatRanges(const sal_Int32 nStartCol, const sal_Int32 const sal_Int32 nEndCol, const sal_Int32 nEndRow, const sal_Int32 nSheet) { pRowFormatRanges->Clear(); - ScXMLRowAttrAccess aRowAttr(pDoc); + ScXMLCachedRowAttrAccess aRowAttr(pDoc); if (nStartRow == nEndRow) { pCellStyles->GetFormatRanges(nStartCol, nEndCol, nStartRow, nSheet, pRowFormatRanges); diff --git a/sc/source/filter/xml/xmlexprt.hxx b/sc/source/filter/xml/xmlexprt.hxx index 222b84ddb3c7..43b32949898e 100644 --- a/sc/source/filter/xml/xmlexprt.hxx +++ b/sc/source/filter/xml/xmlexprt.hxx @@ -65,32 +65,10 @@ class ScChartListener; class SfxItemPool; class ScAddress; class ScBaseCell; +class ScXMLCachedRowAttrAccess; typedef std::vector< com::sun::star::uno::Reference < com::sun::star::drawing::XShapes > > ScMyXShapesVec; -class ScXMLRowAttrAccess -{ - struct Cache - { - sal_Int32 mnTab; - sal_Int32 mnRow1; - sal_Int32 mnRow2; - bool mbValue; - Cache(); - bool hasCache(sal_Int32 nTab, sal_Int32 nRow) const; - }; - -public: - ScXMLRowAttrAccess(ScDocument* pDoc); - - bool rowHidden(sal_Int32 nTab, sal_Int32 nRow); - bool rowFiltered(sal_Int32 nTab, sal_Int32 nRow); -private: - Cache maHidden; - Cache maFiltered; - ScDocument* mpDoc; -}; - class ScXMLExport : public SvXMLExport { ScDocument* pDoc; @@ -190,7 +168,7 @@ class ScXMLExport : public SvXMLExport bool bHidden, bool bFiltered); void OpenAndCloseRow(const sal_Int32 nIndex, const sal_Int32 nStartRow, const sal_Int32 nEmptyRows, bool bHidden, bool bFiltered); - void OpenRow(const sal_Int32 nTable, const sal_Int32 nStartRow, const sal_Int32 nRepeatRow, ScXMLRowAttrAccess& rRowAttr); + void OpenRow(const sal_Int32 nTable, const sal_Int32 nStartRow, const sal_Int32 nRepeatRow, ScXMLCachedRowAttrAccess& rRowAttr); void CloseRow(const sal_Int32 nRow); void GetColumnRowHeader(sal_Bool& bHasColumnHeader, com::sun::star::table::CellRangeAddress& aColumnHeaderRange, sal_Bool& bHasRowHeader, com::sun::star::table::CellRangeAddress& aRowHeaderRange, |