summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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();