Kaydet (Commit) 3b6e61c3 authored tarafından Caolán McNamara's avatar Caolán McNamara

fix scrolling performance of listboxes with hundreds of entries

make it approximately infinitely faster

a) add a method AdjustEntryHeightAndRecalc that just does AdjustEntryHeight and
RecalcViewData and replace all the places that do the two of those together
with that utility

b) in our SetFont now only call AdjustEntryHeightAndRecalc if the new font is
different to the old font, ignoring color which doesn't have a bearing on row
size.

c) where we originally called SetFont(GetFont()), which would have triggered
AdjustEntryHeightAndRecalc, now call the new AdjustEntryHeightAndRecalc
explicitly.

The performance problem apparently a regression from
ac7acb0a where we seem to now end up drawing on
ourself and calling SetFont on ourself rather than on a pImpl without an
overridden SetFont. So when we redraw on scrolling we triggered a cascade of
calculations and force text layout of every row.

Change-Id: I3c284c360f06ac383e8c38045fc4c2946f505b35
üst 4fc8209e
......@@ -578,6 +578,7 @@ protected:
sal_Bool AreChildrenTransient() const;
void SetChildrenNotTransient();
void AdjustEntryHeightAndRecalc( const Font& rFont );
public:
void SetExtendedWinBits( ExtendedWinBits _nBits );
......
......@@ -1514,7 +1514,10 @@ void SvTreeListBox::InitTreeView()
mbContextBmpExpanded = true;
nContextBmpWidthMax = 0;
SetFont( GetFont() );
AdjustEntryHeightAndRecalc( GetFont() );
SetSpaceBetweenEntries( 0 );
SetLineColor();
InitSettings( sal_True, sal_True, sal_True );
......@@ -2579,15 +2582,32 @@ void SvTreeListBox::SetExpandedNodeBmp( const Image& rBmp )
void SvTreeListBox::SetFont( const Font& rFont )
{
DBG_CHKTHIS(SvTreeListBox,0);
Font aTempFont( rFont );
Font aOrigFont( GetFont() );
aTempFont.SetTransparent( sal_True );
if (aTempFont == aOrigFont)
return;
Control::SetFont( aTempFont );
AdjustEntryHeight( aTempFont );
aTempFont.SetColor(aOrigFont.GetColor());
aTempFont.SetFillColor(aOrigFont.GetFillColor());
aTempFont.SetTransparent(aOrigFont.IsTransparent());
if (aTempFont == aOrigFont)
return;
AdjustEntryHeightAndRecalc( GetFont() );
}
void SvTreeListBox::AdjustEntryHeightAndRecalc( const Font& rFont )
{
DBG_CHKTHIS(SvTreeListBox,0);
AdjustEntryHeight( rFont );
// always invalidate, else things go wrong in SetEntryHeight
RecalcViewData();
}
void SvTreeListBox::Paint( const Rectangle& rRect )
{
DBG_CHKTHIS(SvTreeListBox,0);
......@@ -2630,8 +2650,7 @@ void SvTreeListBox::SetSpaceBetweenEntries( short nOffsLogic )
nEntryHeight = nEntryHeight - nEntryHeightOffs;
nEntryHeightOffs = (short)nOffsLogic;
nEntryHeight = nEntryHeight + nOffsLogic;
AdjustEntryHeight( GetFont() );
RecalcViewData();
AdjustEntryHeightAndRecalc( GetFont() );
pImp->SetEntryHeight( nEntryHeight );
}
}
......@@ -3815,8 +3834,7 @@ void SvTreeListBox::InitSettings(sal_Bool bFont,sal_Bool bForeground,sal_Bool bB
aFont = rStyleSettings.GetFieldFont();
aFont.SetColor( rStyleSettings.GetWindowTextColor() );
SetPointFont( aFont );
AdjustEntryHeight( aFont );
RecalcViewData();
AdjustEntryHeightAndRecalc( aFont );
}
if( bForeground || bFont )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment