include/svtools/treelistbox.hxx       |    1 +
 svtools/source/contnr/treelistbox.cxx |   30 ++++++++++++++++++++++++------
 2 files changed, 25 insertions(+), 6 deletions(-)

New commits:
commit 3b6e61c3968a4aaec0b594803219961f3fcc9232
Author: Caolán McNamara <[email protected]>
Date:   Thu Apr 25 20:21:43 2013 +0100

    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.
    
    Change-Id: I3c284c360f06ac383e8c38045fc4c2946f505b35

diff --git a/include/svtools/treelistbox.hxx b/include/svtools/treelistbox.hxx
index 1800505..305cfbe 100644
--- a/include/svtools/treelistbox.hxx
+++ b/include/svtools/treelistbox.hxx
@@ -578,6 +578,7 @@ protected:
     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 ba81f9e..0dc2350 100644
--- a/svtools/source/contnr/treelistbox.cxx
+++ b/svtools/source/contnr/treelistbox.cxx
@@ -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 )
_______________________________________________
Libreoffice-commits mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to