summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2020-05-21 15:05:08 +0200
committerAndras Timar <andras.timar@collabora.com>2020-07-27 08:36:40 +0200
commit7a988bc0cc6cffdca9982cb154a9de4fb1cbcf24 (patch)
tree6d7f5d1770e55cf6177b589b718ec56a0504f295 /sc
parent46068e8b1eb005dc0503e2f4b028c2d59afd9a29 (diff)
tdf#76481 speed up searching in autofilter pulldown
turning setUpdateMode on/off fixes the common case, but we need to special case the "return to show all items" situation On my machine this takes the searching time from "more than 30s" to "just under 1s" Change-Id: I02d11c428e82dba1e840e981507337a1012dd09f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94633 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> (cherry picked from commit f71557e958a8a626dfc1eef646b84b3c8b72569a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96172 Tested-by: Gabor Kelemen <kelemen.gabor2@nisz.hu> Reviewed-by: Gabor Kelemen <kelemen.gabor2@nisz.hu>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/ui/cctrl/checklistmenu.cxx60
1 files changed, 29 insertions, 31 deletions
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index b9b5acca11c8..664b63444748 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -1222,20 +1222,27 @@ IMPL_LINK_NOARG(ScCheckListMenuWindow, EdModifyHdl, Edit&, void)
bool bSearchTextEmpty = aSearchText.isEmpty();
size_t n = maMembers.size();
size_t nSelCount = 0;
- OUString aLabelDisp;
bool bSomeDateDeletes = false;
- for (size_t i = 0; i < n; ++i)
+ maChecks->SetUpdateMode(false);
+
+ if (bSearchTextEmpty)
+ {
+ // when there are a lot of rows, it is cheaper to simply clear the tree and re-initialise
+ maChecks->Clear();
+ initMembers();
+ }
+ else
{
- bool bIsDate = maMembers[i].mbDate;
- bool bPartialMatch = false;
+ for (size_t i = 0; i < n; ++i)
+ {
+ bool bIsDate = maMembers[i].mbDate;
+ bool bPartialMatch = false;
- aLabelDisp = maMembers[i].maName;
- if ( aLabelDisp.isEmpty() )
- aLabelDisp = ScResId( STR_EMPTYDATA );
+ OUString aLabelDisp = maMembers[i].maName;
+ if ( aLabelDisp.isEmpty() )
+ aLabelDisp = ScResId( STR_EMPTYDATA );
- if ( !bSearchTextEmpty )
- {
if ( !bIsDate )
bPartialMatch = ( ScGlobal::pCharClass->lowercase( aLabelDisp ).indexOf( aSearchText ) != -1 );
else if ( maMembers[i].meDatePartType == ScCheckListMember::DAY ) // Match with both numerical and text version of month
@@ -1243,30 +1250,19 @@ IMPL_LINK_NOARG(ScCheckListMenuWindow, EdModifyHdl, Edit&, void)
maMembers[i].maRealName + maMembers[i].maDateParts[1] )).indexOf( aSearchText ) != -1);
else
continue;
- }
- else if ( bIsDate && maMembers[i].meDatePartType != ScCheckListMember::DAY )
- continue;
- if ( bSearchTextEmpty )
- {
- SvTreeListEntry* pLeaf = maChecks->ShowCheckEntry( aLabelDisp, maMembers[i], true, maMembers[i].mbVisible );
- updateMemberParents( pLeaf, i );
- if ( maMembers[i].mbVisible )
+ if ( bPartialMatch )
+ {
+ SvTreeListEntry* pLeaf = maChecks->ShowCheckEntry( aLabelDisp, maMembers[i] );
+ updateMemberParents( pLeaf, i );
++nSelCount;
- continue;
- }
-
- if ( bPartialMatch )
- {
- SvTreeListEntry* pLeaf = maChecks->ShowCheckEntry( aLabelDisp, maMembers[i] );
- updateMemberParents( pLeaf, i );
- ++nSelCount;
- }
- else
- {
- maChecks->ShowCheckEntry( aLabelDisp, maMembers[i], false, false );
- if( bIsDate )
- bSomeDateDeletes = true;
+ }
+ else
+ {
+ maChecks->ShowCheckEntry( aLabelDisp, maMembers[i], false, false );
+ if( bIsDate )
+ bSomeDateDeletes = true;
+ }
}
}
@@ -1280,6 +1276,8 @@ IMPL_LINK_NOARG(ScCheckListMenuWindow, EdModifyHdl, Edit&, void)
}
}
+ maChecks->SetUpdateMode(true);
+
if ( nSelCount == n )
maChkToggleAll->SetState( TRISTATE_TRUE );
else if ( nSelCount == 0 )