Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/3611
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/11/3611/1
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
ac7acb0ab1329913b0cec79790adcde0263960be 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.
(cherry picked from commit 3b6e61c3968a4aaec0b594803219961f3fcc9232)
Conflicts:
include/svtools/treelistbox.hxx
Change-Id: I3c284c360f06ac383e8c38045fc4c2946f505b35
---
M svtools/inc/svtools/treelistbox.hxx
M svtools/source/contnr/treelistbox.cxx
2 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/svtools/inc/svtools/treelistbox.hxx b/svtools/inc/svtools/treelistbox.hxx
index ba678ae..d259088 100644
--- a/svtools/inc/svtools/treelistbox.hxx
+++ b/svtools/inc/svtools/treelistbox.hxx
@@ -580,6 +580,7 @@
sal_Bool AreChildrenTransient() const;
void SetChildrenNotTransient();
+ void AdjustEntryHeightAndRecalc( const Font& rFont );
public:
void SetExtendedWinBits( ExtendedWinBits _nBits );
diff --git a/svtools/source/contnr/treelistbox.cxx b/svtools/source/contnr/treelistbox.cxx
index b6c9613..2fe94e7 100644
--- a/svtools/source/contnr/treelistbox.cxx
+++ b/svtools/source/contnr/treelistbox.cxx
@@ -1510,7 +1510,10 @@
mbContextBmpExpanded = true;
nContextBmpWidthMax = 0;
+
SetFont( GetFont() );
+ AdjustEntryHeightAndRecalc( GetFont() );
+
SetSpaceBetweenEntries( 0 );
SetLineColor();
InitSettings( sal_True, sal_True, sal_True );
@@ -2575,14 +2578,31 @@
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 )
{
@@ -2626,8 +2646,7 @@
nEntryHeight = nEntryHeight - nEntryHeightOffs;
nEntryHeightOffs = (short)nOffsLogic;
nEntryHeight = nEntryHeight + nOffsLogic;
- AdjustEntryHeight( GetFont() );
- RecalcViewData();
+ AdjustEntryHeightAndRecalc( GetFont() );
pImp->SetEntryHeight( nEntryHeight );
}
}
@@ -3842,8 +3861,7 @@
aFont = rStyleSettings.GetFieldFont();
aFont.SetColor( rStyleSettings.GetWindowTextColor() );
SetPointFont( aFont );
- AdjustEntryHeight( aFont );
- RecalcViewData();
+ AdjustEntryHeightAndRecalc( aFont );
}
if( bForeground || bFont )
--
To view, visit https://gerrit.libreoffice.org/3611
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3c284c360f06ac383e8c38045fc4c2946f505b35
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Caolán McNamara <caolanm@redhat.com>
Context
- [PATCH libreoffice-4-0] fix scrolling performance of listboxes with hundreds of entr... · via Code Review
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.