diff options
-rw-r--r-- | sc/inc/column.hxx | 3 | ||||
-rw-r--r-- | sc/inc/document.hxx | 6 | ||||
-rw-r--r-- | sc/inc/filterentries.hxx | 39 | ||||
-rw-r--r-- | sc/inc/table.hxx | 4 | ||||
-rw-r--r-- | sc/source/core/data/column3.cxx | 32 | ||||
-rw-r--r-- | sc/source/core/data/documen3.cxx | 15 | ||||
-rw-r--r-- | sc/source/core/data/table3.cxx | 13 | ||||
-rw-r--r-- | sc/source/ui/dbgui/filtdlg.cxx | 24 | ||||
-rw-r--r-- | sc/source/ui/dbgui/pfiltdlg.cxx | 9 | ||||
-rw-r--r-- | sc/source/ui/inc/filtdlg.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/inc/pfiltdlg.hxx | 3 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 11 |
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(); |