summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-03-26 22:50:18 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2018-08-06 11:19:21 +0200
commit67afc3a01426aba970619afdba4ace1a8e25923a (patch)
tree534c870bb071f6f3467d3dc4251143349d199868
parent128e00114a20ef68cd169790b11041e71db7c707 (diff)
handle date autofilter entries correctly, tdf#106214
Change-Id: I8fd2896c8998e79794a0ccaae1c2442caf8b89ac Reviewed-on: https://gerrit.libreoffice.org/35730 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Reviewed-on: https://gerrit.libreoffice.org/58352 Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--sc/source/ui/cctrl/checklistmenu.cxx10
-rw-r--r--sc/source/ui/inc/checklistmenu.hxx13
-rwxr-xr-xsc/source/ui/view/gridwin.cxx24
-rw-r--r--sc/source/ui/view/gridwin2.cxx14
4 files changed, 35 insertions, 26 deletions
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index a74e5817e34c..8934e8d09c23 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -1911,12 +1911,14 @@ void ScCheckListMenuWindow::getResult(ResultType& rResult)
if (aLabel.isEmpty())
aLabel = ScGlobal::GetRscString(STR_EMPTYDATA);
bool bState = maChecks->IsChecked( aLabel, maMembers[i].mpParent );
- OUString sName;
+ ResultEntry aResultEntry;
+ aResultEntry.bValid = bState;
if ( maMembers[i].mbDate )
- sName = maMembers[i].maRealName;
+ aResultEntry.aName = maMembers[i].maRealName;
else
- sName = maMembers[i].maName;
- aResult.insert(ResultType::value_type(sName, bState));
+ aResultEntry.aName = maMembers[i].maName;
+ aResultEntry.bDate = maMembers[i].mbDate;
+ aResult.insert(aResultEntry);
}
}
rResult.swap(aResult);
diff --git a/sc/source/ui/inc/checklistmenu.hxx b/sc/source/ui/inc/checklistmenu.hxx
index ea9e7edfc4b7..9a8cd973e458 100644
--- a/sc/source/ui/inc/checklistmenu.hxx
+++ b/sc/source/ui/inc/checklistmenu.hxx
@@ -293,7 +293,18 @@ struct ScCheckListMember
class ScCheckListMenuWindow : public ScMenuFloatingWindow
{
public:
- typedef std::unordered_map<OUString, bool, OUStringHash> ResultType;
+ struct ResultEntry
+ {
+ OUString aName;
+ bool bValid;
+ bool bDate;
+
+ bool operator<(const ResultEntry& rhs) const
+ {
+ return aName < rhs.aName;
+ }
+ };
+ typedef std::set<ResultEntry> ResultType;
/**
* Extended data that the client code may need to store. Create a
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index a33b36464848..b9a4afc12874 100755
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -657,13 +657,16 @@ class AddItemToEntry : public std::unary_function<OUString, void>
public:
AddItemToEntry(ScQueryEntry::QueryItemsType& rItems, svl::SharedStringPool& rPool) :
mrItems(rItems), mrPool(rPool) {}
- void operator() (const OUString& rSelected)
+ void operator() (const ScCheckListMenuWindow::ResultEntry& rEntry)
{
- ScQueryEntry::Item aNew;
- aNew.maString = mrPool.intern(rSelected);
- aNew.meType = ScQueryEntry::ByString;
- aNew.mfVal = 0.0;
- mrItems.push_back(aNew);
+ if (rEntry.bValid)
+ {
+ ScQueryEntry::Item aNew;
+ aNew.maString = mrPool.intern(rEntry.aName);
+ aNew.meType = rEntry.bDate ? ScQueryEntry::ByDate : ScQueryEntry::ByString;
+ aNew.mfVal = 0.0;
+ mrItems.push_back(aNew);
+ }
}
};
@@ -863,17 +866,10 @@ void ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode)
ScCheckListMenuWindow::ResultType aResult;
mpAutoFilterPopup->getResult(aResult);
- std::vector<OUString> aSelected;
- ScCheckListMenuWindow::ResultType::const_iterator itr = aResult.begin(), itrEnd = aResult.end();
- for (; itr != itrEnd; ++itr)
- {
- if (itr->second)
- aSelected.push_back(itr->first);
- }
ScQueryEntry::QueryItemsType& rItems = pEntry->GetQueryItems();
rItems.clear();
- std::for_each(aSelected.begin(), aSelected.end(), AddItemToEntry(rItems, rPool));
+ std::for_each(aResult.begin(), aResult.end(), AddItemToEntry(rItems, rPool));
if (mpAutoFilterPopup->isAllSelected())
{
diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx
index d99972898a9b..ad6a16f4d092 100644
--- a/sc/source/ui/view/gridwin2.cxx
+++ b/sc/source/ui/view/gridwin2.cxx
@@ -555,29 +555,29 @@ void ScGridWindow::UpdateDPFromFieldPopupMenu()
ScCheckListMenuWindow::ResultType aRawResult;
mpDPFieldPopup->getResult(aRawResult);
- ScCheckListMenuWindow::ResultType aResult;
+ std::unordered_map<OUString, bool, OUStringHash> aResult;
ScCheckListMenuWindow::ResultType::const_iterator itr = aRawResult.begin(), itrEnd = aRawResult.end();
for (; itr != itrEnd; ++itr)
{
- MemNameMapType::const_iterator itrNameMap = aMemNameMap.find(itr->first);
+ MemNameMapType::const_iterator itrNameMap = aMemNameMap.find(itr->aName);
if (itrNameMap == aMemNameMap.end())
{
// This is an original member name. Use it as-is.
- OUString aName = itr->first;
+ OUString aName = itr->aName;
if (aName.equals(ScGlobal::GetRscString(STR_EMPTYDATA)))
// Translate the special empty name into an empty string.
aName.clear();
aResult.insert(
- ScCheckListMenuWindow::ResultType::value_type(
- aName, itr->second));
+ std::unordered_map<OUString, bool, OUStringHash>::value_type(
+ aName, itr->bValid));
}
else
{
// This is a layout name. Get the original member name and use it.
aResult.insert(
- ScCheckListMenuWindow::ResultType::value_type(
- itrNameMap->second, itr->second));
+ std::unordered_map<OUString, bool, OUStringHash>::value_type(
+ itrNameMap->second, itr->bValid));
}
}
pDim->UpdateMemberVisibility(aResult);