summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUrsache Vladimir <ursache@collabora.co.uk>2015-02-13 06:23:53 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2015-02-14 01:50:01 +0100
commite7672e9633d0fe23917a2a348e77808a40ae0942 (patch)
tree542e503425bff7bf0a1245aab57af9b58f82e4ef
parent167cb85eb8e904cd79525fd589c0e66e47c1564d (diff)
tdf#89004 improve performance of document data collection
Change-Id: Ie74495745b48d721c7dda0b447fc59066c869874
-rw-r--r--sc/source/core/data/document10.cxx58
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 )