summaryrefslogtreecommitdiff
path: root/sc/source/ui/dbgui/filtdlg.cxx
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2017-09-08 19:06:41 +0200
committerEike Rathke <erack@redhat.com>2017-09-08 21:53:46 +0200
commit9c1826d98065c30411cbf2e731560165ca2b7668 (patch)
tree06de32ee651e03fce5f9e5497ed4af7218caeced /sc/source/ui/dbgui/filtdlg.cxx
parent276536fc10368dbe7e16cf859b6da903cec6b8aa (diff)
sc-perf: do not add a million empty filter entries just to sort and discard
Which can happen if an (anonymous) database range as filter range was selected to span an entire column of which most (the tail) is empty cells. The entries are processed to be unique anyway. This significantly shortens the time to display the filter dialog. Happened with attachment http://bugs.documentfoundation.org/attachment.cgi?id=136074 of bug https://bugs.documentfoundation.org/show_bug.cgi?id=112258 Change-Id: Ia169911d6f23611a3b3ecbf291757465f1998210 Reviewed-on: https://gerrit.libreoffice.org/42118 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'sc/source/ui/dbgui/filtdlg.cxx')
-rw-r--r--sc/source/ui/dbgui/filtdlg.cxx24
1 files changed, 12 insertions, 12 deletions
diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index 1570e05dffcf..02784428a192 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -500,34 +500,34 @@ void ScFilterDlg::UpdateValueList( size_t nList )
pList = r.first->second.get();
pDoc->GetFilterEntriesArea(
nColumn, nFirstRow+1, nLastRow,
- nTab, bCaseSens, pList->maList, maHasDates[nOffset+nList-1] );
+ nTab, bCaseSens, pList->maFilterEntries);
+ maHasDates[nOffset+nList-1] = pList->maFilterEntries.mbHasDates;
// Entry for the first line
//! Entry (pHdrEntry) doesn't generate collection?
pList->mnHeaderPos = INVALID_HEADER_POS;
- std::vector<ScTypedStrData> aHdrColl;
- bool bDummy = false;
+ ScFilterEntries aHdrColl;
pDoc->GetFilterEntriesArea(
- nColumn, nFirstRow, nFirstRow, nTab, true, aHdrColl, bDummy );
+ nColumn, nFirstRow, nFirstRow, nTab, true, aHdrColl );
if (!aHdrColl.empty())
{
// See if the header value is already in the list.
- std::vector<ScTypedStrData>::iterator itBeg = pList->maList.begin(), itEnd = pList->maList.end();
+ std::vector<ScTypedStrData>::iterator itBeg = pList->maFilterEntries.begin(), itEnd = pList->maFilterEntries.end();
std::vector<ScTypedStrData>::iterator it = std::find_if(
itBeg, itEnd, FindTypedStrData(aHdrColl.front(), bCaseSens));
if (it == itEnd)
{
// Not in the list. Insert it.
- pList->maList.push_back(aHdrColl.front());
+ pList->maFilterEntries.push_back(aHdrColl.front());
if (bCaseSens)
- std::sort(pList->maList.begin(), pList->maList.end(), ScTypedStrData::LessCaseSensitive());
+ std::sort(pList->maFilterEntries.begin(), pList->maFilterEntries.end(), ScTypedStrData::LessCaseSensitive());
else
- std::sort(pList->maList.begin(), pList->maList.end(), ScTypedStrData::LessCaseInsensitive());
+ std::sort(pList->maFilterEntries.begin(), pList->maFilterEntries.end(), ScTypedStrData::LessCaseInsensitive());
// Record its position.
- itBeg = pList->maList.begin();
- itEnd = pList->maList.end();
+ itBeg = pList->maFilterEntries.begin();
+ itEnd = pList->maFilterEntries.end();
it = std::find_if(itBeg, itEnd, FindTypedStrData(aHdrColl.front(), bCaseSens));
pList->mnHeaderPos = std::distance(itBeg, it);
}
@@ -538,7 +538,7 @@ void ScFilterDlg::UpdateValueList( size_t nList )
OSL_ASSERT(pList);
- std::vector<ScTypedStrData>::const_iterator it = pList->maList.begin(), itEnd = pList->maList.end();
+ std::vector<ScTypedStrData>::const_iterator it = pList->maFilterEntries.begin(), itEnd = pList->maFilterEntries.end();
for (; it != itEnd; ++it)
{
pValList->InsertEntry(it->GetString(), nListPos++);
@@ -579,7 +579,7 @@ void ScFilterDlg::UpdateHdrInValueList( size_t nList )
ComboBox* pValList = maValueEdArr[nList-1].get();
size_t nListPos = nPos + 2; // for "empty" and "non-empty"
- const ScTypedStrData& rHdrEntry = m_EntryLists[nColumn]->maList[nPos];
+ const ScTypedStrData& rHdrEntry = m_EntryLists[nColumn]->maFilterEntries.maStrData[nPos];
const OUString& aHdrStr = rHdrEntry.GetString();
bool bWasThere = aHdrStr == pValList->GetEntry(nListPos);