sc/inc/document.hxx | 2 ++ sc/inc/documentimport.hxx | 2 ++ sc/inc/olinetab.hxx | 2 ++ sc/inc/table.hxx | 2 ++ sc/source/core/data/document10.cxx | 10 ++++++++++ sc/source/core/data/documentimport.cxx | 16 ++++++++++++++++ sc/source/core/data/olinetab.cxx | 21 +++++++++++++++++++++ sc/source/core/data/table7.cxx | 9 +++++++++ sc/source/filter/xml/xmlrowi.cxx | 6 ++++-- 9 files changed, 68 insertions(+), 2 deletions(-)
New commits: commit a8232b30687879f31768b89f4ff0bcf9457a7e77 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Tue Feb 9 04:26:49 2016 +0100 tdf#94858, avoid O(n^2) algorithm during outline import The old code set called the outline visibility code for each row. Now we are just calling it once at the end of the import. Change-Id: Ie19f8bd538495cb50a7618156aed8de832885c2a Reviewed-on: https://gerrit.libreoffice.org/22239 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index ce1017e..9b8ab5e 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -2164,6 +2164,8 @@ public: void SwapNonEmpty( sc::TableValues& rValues ); + void finalizeOutlineImport(); + private: /** diff --git a/sc/inc/documentimport.hxx b/sc/inc/documentimport.hxx index fc1c7c4..e90be0b 100644 --- a/sc/inc/documentimport.hxx +++ b/sc/inc/documentimport.hxx @@ -103,6 +103,8 @@ public: */ void setAttrEntries( SCTAB nTab, SCCOL nCol, Attrs& rAttrs ); + void setRowsVisible(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, bool bVisible); + void finalize(); private: diff --git a/sc/inc/olinetab.hxx b/sc/inc/olinetab.hxx index ec0a83f..27ec0d3 100644 --- a/sc/inc/olinetab.hxx +++ b/sc/inc/olinetab.hxx @@ -136,6 +136,8 @@ public: bool ManualAction( SCCOLROW nStartPos, SCCOLROW nEndPos, bool bShow, const ScTable& rTable, bool bCol); + void finalizeImport(ScTable& rTable, bool bCol); + void RemoveAll(); }; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 43a4897..e1b0706 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -954,6 +954,8 @@ public: void SwapNonEmpty( sc::TableValues& rValues, sc::StartListeningContext& rStartCxt, sc::EndListeningContext& rEndCxt ); + void finalizeOutlineImport(); + #if DEBUG_COLUMN_STORAGE void DumpFormulaGroups( SCCOL nCol ) const; #endif diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx index a2f13920..d73eac5 100644 --- a/sc/source/core/data/document10.cxx +++ b/sc/source/core/data/document10.cxx @@ -429,4 +429,14 @@ void ScDocument::StartAllListeners( const ScRange& rRange ) } } +void ScDocument::finalizeOutlineImport() +{ + TableContainer::iterator it = maTabs.begin(), itEnd = maTabs.end(); + for (; it != itEnd; ++it) + { + ScTable* p = *it; + p->finalizeOutlineImport(); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/documentimport.cxx b/sc/source/core/data/documentimport.cxx index 49243d8..6f7030b 100644 --- a/sc/source/core/data/documentimport.cxx +++ b/sc/source/core/data/documentimport.cxx @@ -465,6 +465,20 @@ void ScDocumentImport::setAttrEntries( SCTAB nTab, SCCOL nCol, Attrs& rAttrs ) pCol->pAttrArray->SetAttrEntries(rAttrs.mpData, rAttrs.mnSize); } +void ScDocumentImport::setRowsVisible(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, bool bVisible) +{ + if (!bVisible) + { + getDoc().ShowRows(nRowStart, nRowEnd, nTab, false); + getDoc().SetDrawPageSize(nTab); + getDoc().UpdatePageBreaks( nTab ); + } + else + { + assert(false); + } +} + namespace { class CellStoreInitializer @@ -597,6 +611,8 @@ void ScDocumentImport::finalize() for (SCCOL nColIdx = 0; nColIdx < nNumCols; ++nColIdx) initColumn(rTab.aCol[nColIdx]); } + + mpImpl->mrDoc.finalizeOutlineImport(); } void ScDocumentImport::initColumn(ScColumn& rCol) diff --git a/sc/source/core/data/olinetab.cxx b/sc/source/core/data/olinetab.cxx index a90e0b1..1d94b79 100644 --- a/sc/source/core/data/olinetab.cxx +++ b/sc/source/core/data/olinetab.cxx @@ -769,6 +769,27 @@ void ScOutlineArray::RemoveAll() nDepth = 0; } +void ScOutlineArray::finalizeImport(ScTable& rTable, bool bCol) +{ + ScSubOutlineIterator aIter( this ); + ScOutlineEntry* pEntry; + while((pEntry=aIter.GetNext())!=nullptr) + { + + if (!pEntry->IsHidden()) + continue; + + SCCOLROW nEntryStart = pEntry->GetStart(); + SCCOLROW nEntryEnd = pEntry->GetEnd(); + SCCOLROW nEnd = rTable.LastHiddenColRow(nEntryStart, bCol); + bool bAllHidden = (nEntryEnd <= nEnd && nEnd < + ::std::numeric_limits<SCCOLROW>::max()); + + pEntry->SetHidden(bAllHidden); + SetVisibleBelow(aIter.LastLevel(), aIter.LastEntry(), !bAllHidden, !bAllHidden); + } +} + ScOutlineTable::ScOutlineTable() { } diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx index 6c0cefa..c6f6f9f 100644 --- a/sc/source/core/data/table7.cxx +++ b/sc/source/core/data/table7.cxx @@ -15,6 +15,7 @@ #include <segmenttree.hxx> #include <sharedformula.hxx> #include <cellvalues.hxx> +#include "olinetab.hxx" bool ScTable::IsMerged( SCCOL nCol, SCROW nRow ) const { @@ -238,4 +239,12 @@ void ScTable::SetNeedsListeningGroup( SCCOL nCol, SCROW nRow ) aCol[nCol].SetNeedsListeningGroup(nRow); } +void ScTable::finalizeOutlineImport() +{ + if (pOutlineTable && pRowFlags) + { + pOutlineTable->GetRowArray().finalizeImport(*this, false); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/xml/xmlrowi.cxx b/sc/source/filter/xml/xmlrowi.cxx index 521209b..2de0899 100644 --- a/sc/source/filter/xml/xmlrowi.cxx +++ b/sc/source/filter/xml/xmlrowi.cxx @@ -26,6 +26,7 @@ #include "docuno.hxx" #include "olinetab.hxx" #include "sheetdata.hxx" +#include "documentimport.hxx" #include <xmloff/xmltkmap.hxx> #include <xmloff/nmspmap.hxx> @@ -39,7 +40,6 @@ #include <com/sun/star/table/CellAddress.hpp> -#define SC_ISVISIBLE "IsVisible" #define SC_ISFILTERED "IsFiltered" using namespace com::sun::star; @@ -200,7 +200,9 @@ void ScXMLTableRowContext::EndElement() bFiltered = true; } if (!bVisible) - xRowProperties->setPropertyValue(SC_ISVISIBLE, uno::makeAny(bVisible)); + { + rXMLImport.GetDoc().setRowsVisible(nSheet, nFirstRow, nCurrentRow, false); + } if (bFiltered) xRowProperties->setPropertyValue(SC_ISFILTERED, uno::makeAny(bFiltered)); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits