summaryrefslogtreecommitdiffstats
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
parentsvl: assert calls of SfxPoolItem::Create/Store (diff)
downloadcore-9c1826d98065c30411cbf2e731560165ca2b7668.tar.gz
core-9c1826d98065c30411cbf2e731560165ca2b7668.zip
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>
-rw-r--r--sc/inc/column.hxx3
-rw-r--r--sc/inc/document.hxx6
-rw-r--r--sc/inc/filterentries.hxx39
-rw-r--r--sc/inc/table.hxx4
-rw-r--r--sc/source/core/data/column3.cxx32
-rw-r--r--sc/source/core/data/documen3.cxx15
-rw-r--r--sc/source/core/data/table3.cxx13
-rw-r--r--sc/source/ui/dbgui/filtdlg.cxx24
-rw-r--r--sc/source/ui/dbgui/pfiltdlg.cxx9
-rw-r--r--sc/source/ui/inc/filtdlg.hxx4
-rw-r--r--sc/source/ui/inc/pfiltdlg.hxx3
-rw-r--r--sc/source/ui/view/gridwin.cxx11
12 files changed, 100 insertions, 63 deletions
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index b9b5b01f3fe2..6d2ac9e44cf1 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -105,6 +105,7 @@ struct ScCellValue;
class ScDocumentImport;
class ScHint;
enum class ScMF;
+struct ScFilterEntries;
struct ScNeededSizeOptions
{
@@ -522,7 +523,7 @@ public:
void GetFilterEntries(
sc::ColumnBlockConstPosition& rBlockPos, SCROW nStartRow, SCROW nEndRow,
- std::vector<ScTypedStrData>& rStrings, bool& rHasDates );
+ ScFilterEntries& rFilterEntries );
bool GetDataEntries( SCROW nRow, std::set<ScTypedStrData>& rStrings, bool bLimit ) const;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index e08378e2242c..a7b9fcdc4d17 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -199,6 +199,7 @@ enum class ScDBDataPortion;
enum class ScSheetEventId;
class BitmapEx;
class ScColumnsRange;
+struct ScFilterEntries;
namespace sc {
@@ -1900,12 +1901,11 @@ public:
* database range that contains the specified cell position.
*/
void GetFilterEntries( SCCOL nCol, SCROW nRow,
- SCTAB nTab, std::vector<ScTypedStrData>& rStrings,
- bool& rHasDates);
+ SCTAB nTab, ScFilterEntries& rFilterEntries );
SC_DLLPUBLIC void GetFilterEntriesArea( SCCOL nCol, SCROW nStartRow, SCROW nEndRow,
SCTAB nTab, bool bCaseSens,
- std::vector<ScTypedStrData>& rStrings, bool& rHasDates);
+ ScFilterEntries& rFilterEntries );
void GetDataEntries( SCCOL nCol, SCROW nRow, SCTAB nTab,
std::vector<ScTypedStrData>& rStrings, bool bLimit = false );
diff --git a/sc/inc/filterentries.hxx b/sc/inc/filterentries.hxx
new file mode 100644
index 000000000000..2a8dccd99cb3
--- /dev/null
+++ b/sc/inc/filterentries.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef SC_INC_FILTERENTRIES_HXX
+#define SC_INC_FILTERENTRIES_HXX
+
+#include <sal/config.h>
+#include "typedstrdata.hxx"
+#include <vector>
+
+struct ScFilterEntries
+{
+ std::vector<ScTypedStrData> maStrData;
+ bool mbHasDates;
+ bool mbHasEmpties;
+
+ ScFilterEntries() : mbHasDates(false), mbHasEmpties(false) {}
+
+ std::vector<ScTypedStrData>::iterator begin() { return maStrData.begin(); }
+ std::vector<ScTypedStrData>::iterator end() { return maStrData.end(); }
+ std::vector<ScTypedStrData>::const_iterator begin() const { return maStrData.begin(); }
+ std::vector<ScTypedStrData>::const_iterator end() const { return maStrData.end(); }
+ std::vector<ScTypedStrData>::size_type size() const { return maStrData.size(); }
+ ScTypedStrData& front() { return maStrData.front(); }
+ const ScTypedStrData& front() const { return maStrData.front(); }
+ bool empty() const { return maStrData.empty(); }
+ void push_back( const ScTypedStrData& r ) { maStrData.push_back(r); }
+ void push_back( ScTypedStrData&& r ) { maStrData.push_back(r); }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 4c734c7d7823..10974065d571 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -928,8 +928,8 @@ public:
SCSIZE Query(const ScQueryParam& rQueryParam, bool bKeepSub);
bool CreateQueryParam(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam& rQueryParam);
- void GetFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, std::vector<ScTypedStrData>& rStrings, bool& rHasDates);
- void GetFilteredFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, const ScQueryParam& rParam, std::vector<ScTypedStrData>& rStrings, bool& rHasDates );
+ void GetFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, ScFilterEntries& rFilterEntries );
+ void GetFilteredFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, const ScQueryParam& rParam, ScFilterEntries& rFilterEntries );
bool GetDataEntries(SCCOL nCol, SCROW nRow, std::set<ScTypedStrData>& rStrings, bool bLimit);
bool HasColHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ) const;
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index fcd529e14aff..af251cb8439c 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -47,6 +47,7 @@
#include "editutil.hxx"
#include "sharedformula.hxx"
#include <listenercontext.hxx>
+#include "filterentries.hxx"
#include <com/sun/star/i18n/LocaleDataItem.hpp>
@@ -2046,8 +2047,7 @@ namespace {
class FilterEntriesHandler
{
ScColumn& mrColumn;
- std::vector<ScTypedStrData>& mrStrings;
- bool mbHasDates;
+ ScFilterEntries& mrFilterEntries;
void processCell(SCROW nRow, ScRefCellValue& rCell)
{
@@ -2058,7 +2058,7 @@ class FilterEntriesHandler
if (rCell.hasString())
{
- mrStrings.push_back(ScTypedStrData(aStr));
+ mrFilterEntries.push_back(ScTypedStrData(aStr));
return;
}
@@ -2080,7 +2080,7 @@ class FilterEntriesHandler
OUString aErr = ScGlobal::GetErrorString(nErr);
if (!aErr.isEmpty())
{
- mrStrings.push_back(ScTypedStrData(aErr));
+ mrFilterEntries.push_back(ScTypedStrData(aErr));
return;
}
}
@@ -2099,7 +2099,7 @@ class FilterEntriesHandler
// special case for date values. Disregard the time
// element if the number format is of date type.
fVal = rtl::math::approxFloor(fVal);
- mbHasDates = true;
+ mrFilterEntries.mbHasDates = true;
bDate = true;
// Convert string representation to ISO 8601 date to eliminate
// locale dependent behaviour later when filtering for dates.
@@ -2107,12 +2107,12 @@ class FilterEntriesHandler
pFormatter->GetInputLineString( fVal, nIndex, aStr);
}
// maybe extend ScTypedStrData enum is also an option here
- mrStrings.push_back(ScTypedStrData(aStr, fVal, ScTypedStrData::Value,bDate));
+ mrFilterEntries.push_back(ScTypedStrData(aStr, fVal, ScTypedStrData::Value,bDate));
}
public:
- FilterEntriesHandler(ScColumn& rColumn, std::vector<ScTypedStrData>& rStrings) :
- mrColumn(rColumn), mrStrings(rStrings), mbHasDates(false) {}
+ FilterEntriesHandler(ScColumn& rColumn, ScFilterEntries& rFilterEntries) :
+ mrColumn(rColumn), mrFilterEntries(rFilterEntries) {}
void operator() (size_t nRow, double fVal)
{
@@ -2140,27 +2140,29 @@ public:
void operator() (const int nElemType, size_t nRow, size_t /* nDataSize */)
{
- if ( nElemType == sc::element_type_empty ) {
- mrStrings.push_back(ScTypedStrData(OUString()));
+ if ( nElemType == sc::element_type_empty )
+ {
+ if (!mrFilterEntries.mbHasEmpties)
+ {
+ mrFilterEntries.push_back(ScTypedStrData(OUString()));
+ mrFilterEntries.mbHasEmpties = true;
+ }
return;
}
ScRefCellValue aCell = mrColumn.GetCellValue(nRow);
processCell(nRow, aCell);
}
-
- bool hasDates() const { return mbHasDates; }
};
}
void ScColumn::GetFilterEntries(
sc::ColumnBlockConstPosition& rBlockPos, SCROW nStartRow, SCROW nEndRow,
- std::vector<ScTypedStrData>& rStrings, bool& rHasDates )
+ ScFilterEntries& rFilterEntries )
{
- FilterEntriesHandler aFunc(*this, rStrings);
+ FilterEntriesHandler aFunc(*this, rFilterEntries);
rBlockPos.miCellPos =
sc::ParseAll(rBlockPos.miCellPos, maCells, nStartRow, nEndRow, aFunc, aFunc);
- rHasDates = aFunc.hasDates();
}
namespace {
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index 5fb5c8dcd539..f40f756a22c9 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -73,6 +73,7 @@
#include "formulacell.hxx"
#include "refupdatecontext.hxx"
#include "scopetools.hxx"
+#include "filterentries.hxx"
#include "globalnames.hxx"
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
@@ -1501,7 +1502,7 @@ void ScDocument::GetFilterSelCount( SCCOL nCol, SCROW nRow, SCTAB nTab, SCSIZE&
* Entries for AutoFilter listbox
*/
void ScDocument::GetFilterEntries(
- SCCOL nCol, SCROW nRow, SCTAB nTab, std::vector<ScTypedStrData>& rStrings, bool& rHasDates)
+ SCCOL nCol, SCROW nRow, SCTAB nTab, ScFilterEntries& rFilterEntries )
{
if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && pDBCollection )
{
@@ -1537,14 +1538,14 @@ void ScDocument::GetFilterEntries(
if ( bFilter )
{
- maTabs[nTab]->GetFilteredFilterEntries( nCol, nStartRow, nEndRow, aParam, rStrings, rHasDates );
+ maTabs[nTab]->GetFilteredFilterEntries( nCol, nStartRow, nEndRow, aParam, rFilterEntries );
}
else
{
- maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates );
+ maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rFilterEntries );
}
- sortAndRemoveDuplicates(rStrings, aParam.bCaseSens);
+ sortAndRemoveDuplicates( rFilterEntries.maStrData, aParam.bCaseSens);
}
}
}
@@ -1554,12 +1555,12 @@ void ScDocument::GetFilterEntries(
*/
void ScDocument::GetFilterEntriesArea(
SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bCaseSens,
- std::vector<ScTypedStrData>& rStrings, bool& rHasDates)
+ ScFilterEntries& rFilterEntries )
{
if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
{
- maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates );
- sortAndRemoveDuplicates(rStrings, bCaseSens);
+ maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rFilterEntries );
+ sortAndRemoveDuplicates( rFilterEntries.maStrData, bCaseSens);
}
}
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 5f4a101e2e3d..6aa3cdf1e3c2 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -3364,15 +3364,15 @@ bool ScTable::HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCR
return false;
}
-void ScTable::GetFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, std::vector<ScTypedStrData>& rStrings, bool& rHasDates)
+void ScTable::GetFilterEntries( SCCOL nCol, SCROW nRow1, SCROW nRow2, ScFilterEntries& rFilterEntries )
{
sc::ColumnBlockConstPosition aBlockPos;
aCol[nCol].InitBlockPosition(aBlockPos);
- aCol[nCol].GetFilterEntries(aBlockPos, nRow1, nRow2, rStrings, rHasDates);
+ aCol[nCol].GetFilterEntries(aBlockPos, nRow1, nRow2, rFilterEntries);
}
void ScTable::GetFilteredFilterEntries(
- SCCOL nCol, SCROW nRow1, SCROW nRow2, const ScQueryParam& rParam, std::vector<ScTypedStrData>& rStrings, bool& rHasDates)
+ SCCOL nCol, SCROW nRow1, SCROW nRow2, const ScQueryParam& rParam, ScFilterEntries& rFilterEntries )
{
sc::ColumnBlockConstPosition aBlockPos;
aCol[nCol].InitBlockPosition(aBlockPos);
@@ -3382,18 +3382,13 @@ void ScTable::GetFilteredFilterEntries(
aParam.RemoveEntryByField(nCol);
lcl_PrepareQuery(pDocument, this, aParam);
- bool bHasDates = false;
for ( SCROW j = nRow1; j <= nRow2; ++j )
{
if (ValidQuery(j, aParam))
{
- bool bThisHasDates = false;
- aCol[nCol].GetFilterEntries(aBlockPos, j, j, rStrings, bThisHasDates);
- bHasDates |= bThisHasDates;
+ aCol[nCol].GetFilterEntries(aBlockPos, j, j, rFilterEntries);
}
}
-
- rHasDates = bHasDates;
}
bool ScTable::GetDataEntries(SCCOL nCol, SCROW nRow, std::set<ScTypedStrData>& rStrings, bool bLimit)
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);
diff --git a/sc/source/ui/dbgui/pfiltdlg.cxx b/sc/source/ui/dbgui/pfiltdlg.cxx
index 4b28bd0c202d..37da46a92b63 100644
--- a/sc/source/ui/dbgui/pfiltdlg.cxx
+++ b/sc/source/ui/dbgui/pfiltdlg.cxx
@@ -29,7 +29,7 @@
#include "dbdata.hxx"
#include "scresid.hxx"
#include "queryentry.hxx"
-#include "typedstrdata.hxx"
+#include "filterentries.hxx"
#include "sc.hrc"
#include "strings.hrc"
@@ -309,14 +309,13 @@ void ScPivotFilterDlg::UpdateValueList( sal_uInt16 nList )
SCROW nFirstRow = theQueryData.nRow1;
SCROW nLastRow = theQueryData.nRow2;
nFirstRow++;
- bool bHasDates = false;
bool bCaseSens = m_pBtnCase->IsChecked();
- m_pEntryLists[nColumn].reset( new std::vector<ScTypedStrData> );
+ m_pEntryLists[nColumn].reset( new ScFilterEntries);
pDoc->GetFilterEntriesArea(
- nColumn, nFirstRow, nLastRow, nTab, bCaseSens, *m_pEntryLists[nColumn], bHasDates);
+ nColumn, nFirstRow, nLastRow, nTab, bCaseSens, *m_pEntryLists[nColumn]);
}
- std::vector<ScTypedStrData>* pColl = m_pEntryLists[nColumn].get();
+ const ScFilterEntries* pColl = m_pEntryLists[nColumn].get();
std::vector<ScTypedStrData>::const_iterator it = pColl->begin(), itEnd = pColl->end();
for (; it != itEnd; ++it)
{
diff --git a/sc/source/ui/inc/filtdlg.hxx b/sc/source/ui/inc/filtdlg.hxx
index 558f5eae00d0..d2502af62f9b 100644
--- a/sc/source/ui/inc/filtdlg.hxx
+++ b/sc/source/ui/inc/filtdlg.hxx
@@ -28,7 +28,7 @@
#include "address.hxx"
#include "anyrefdg.hxx"
#include "queryparam.hxx"
-#include "typedstrdata.hxx"
+#include "filterentries.hxx"
#include <memory>
#include <deque>
@@ -44,7 +44,7 @@ class ScFilterDlg : public ScAnyRefDlg
{
struct EntryList
{
- std::vector<ScTypedStrData> maList;
+ ScFilterEntries maFilterEntries;
size_t mnHeaderPos;
EntryList(const EntryList&) = delete;
diff --git a/sc/source/ui/inc/pfiltdlg.hxx b/sc/source/ui/inc/pfiltdlg.hxx
index 74df89df5bc0..36f8ae7bc24d 100644
--- a/sc/source/ui/inc/pfiltdlg.hxx
+++ b/sc/source/ui/inc/pfiltdlg.hxx
@@ -36,6 +36,7 @@ class ScViewData;
class ScDocument;
class ScQueryItem;
class ScTypedStrData;
+struct ScFilterEntries;
class ScPivotFilterDlg : public ModalDialog
{
@@ -81,7 +82,7 @@ private:
VclPtr<ListBox> aFieldLbArr[3];
VclPtr<ListBox> aCondLbArr[3];
- std::array<std::unique_ptr<std::vector<ScTypedStrData>>, MAXCOLCOUNT> m_pEntryLists;
+ std::array<std::unique_ptr<ScFilterEntries>, MAXCOLCOUNT> m_pEntryLists;
private:
void Init ( const SfxItemSet& rArgSet );
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 329ba7a85d7d..683a9ec915ed 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -659,13 +659,12 @@ void ScGridWindow::LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
}
// Populate the check box list.
- bool bHasDates = false;
- std::vector<ScTypedStrData> aStrings;
- pDoc->GetFilterEntries(nCol, nRow, nTab, aStrings, bHasDates);
+ ScFilterEntries aFilterEntries;
+ pDoc->GetFilterEntries(nCol, nRow, nTab, aFilterEntries);
- mpAutoFilterPopup->setHasDates(bHasDates);
- mpAutoFilterPopup->setMemberSize(aStrings.size());
- std::vector<ScTypedStrData>::const_iterator it = aStrings.begin(), itEnd = aStrings.end();
+ mpAutoFilterPopup->setHasDates(aFilterEntries.mbHasDates);
+ mpAutoFilterPopup->setMemberSize(aFilterEntries.size());
+ std::vector<ScTypedStrData>::const_iterator it = aFilterEntries.begin(), itEnd = aFilterEntries.end();
for (; it != itEnd; ++it)
{
const OUString& aVal = it->GetString();