diff options
author | Ursache Vladimir <ursache@collabora.co.uk> | 2015-02-13 06:23:53 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2015-02-14 01:40:43 +0100 |
commit | 6a348503ad504a82778f86d35325737b712c5352 (patch) | |
tree | 1cc4741fce222ee123d24776000b3ff7f4c95d91 /sc | |
parent | 10e3e75ce8b88a0ba5157d17d10f5e9aca4360fa (diff) |
tdf#89004 improve performance of document data collection
Change-Id: Ie74495745b48d721c7dda0b447fc59066c869874
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/data/document10.cxx | 58 |
1 files changed, 16 insertions, 42 deletions
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx index 0a2e3cbfd6b6..362acbf8ec91 100644 --- a/sc/source/core/data/document10.cxx +++ b/sc/source/core/data/document10.cxx @@ -19,6 +19,7 @@ #include <poolhelp.hxx> #include <bcaslot.hxx> #include <cellvalues.hxx> +#include <docpool.hxx> #include "dociter.hxx" #include "patattr.hxx" @@ -157,53 +158,26 @@ void ScDocument::CopyCellValuesFrom( const ScAddress& rTopPos, const sc::CellVal std::vector<Color> ScDocument::GetDocColors() { - std::vector<Color> docColors; - - for( unsigned int nTabIx = 0; nTabIx < maTabs.size(); ++nTabIx ) + std::vector<Color> aDocColors; + ScDocumentPool *pPool = GetPool(); + const sal_uInt16 pAttribs[] = {ATTR_BACKGROUND, ATTR_FONT_COLOR}; + for (size_t i=0; i<SAL_N_ELEMENTS( pAttribs ); i++) { - ScUsedAreaIterator aIt(this, nTabIx, 0, 0, MAXCOLCOUNT-1, MAXROWCOUNT-1); - - for( bool bIt = aIt.GetNext(); bIt; bIt = aIt.GetNext() ) + const sal_uInt16 nAttrib = pAttribs[i]; + const sal_uInt32 nCount = pPool->GetItemCount2(nAttrib); + for (sal_uInt32 j=0; j<nCount; j++) { - const ScPatternAttr* pPattern = aIt.GetPattern(); - - if( pPattern == 0 ) + const SvxColorItem *pItem = static_cast<const SvxColorItem*>(pPool->GetItem2(nAttrib, j)); + if (pItem == 0) continue; - - const SfxItemSet& rItemSet = pPattern->GetItemSet(); - - SfxWhichIter aIter( rItemSet ); - sal_uInt16 nWhich = aIter.FirstWhich(); - while( nWhich ) - { - const SfxPoolItem *pItem; - if( SfxItemState::SET == rItemSet.GetItemState( nWhich, false, &pItem ) ) - { - sal_uInt16 aWhich = pItem->Which(); - switch (aWhich) - { - // attributes we want to collect - case ATTR_FONT_COLOR: - case ATTR_BACKGROUND: - { - Color aColor( static_cast<const SvxColorItem*>(pItem)->GetValue() ); - if( COL_AUTO != aColor.GetColor() && - std::find(docColors.begin(), docColors.end(), aColor) == docColors.end() ) - { - docColors.push_back( aColor ); - } - } - break; - default: - break; - } - } - - nWhich = aIter.NextWhich(); - } + Color aColor( pItem->GetValue() ); + if (COL_AUTO == aColor.GetColor()) + continue; + if (std::find(aDocColors.begin(), aDocColors.end(), aColor) == aDocColors.end()) + aDocColors.push_back(aColor); } } - return docColors; + return aDocColors; } void ScDocument::SetCalcConfig( const ScCalcConfig& rConfig ) |