diff options
author | Jean-Sebastien Bevilacqua <realitix@gmail.com> | 2017-06-01 18:27:13 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2017-06-06 12:23:11 +0200 |
commit | 2a39dc74724d3648ff76aa900edfebe0dd19b296 (patch) | |
tree | bdd5cc7dfbc0bfc2fdbc5aa7a43b38811b42b17d | |
parent | a915f55c1867c73b3d231afc6e9f6dee17965c00 (diff) |
tdf#108259 Fix nested checkbox handling in autofilter popup
The regression breaks autofilter with hierarchy (date for example).
Commit id which introduces the regression 511fb8e80d298d42f5c45e7410bf64f2a25b441e
Change-Id: If15f32db6b8c1a90d96fefe9740173c2cbfb919a
Reviewed-on: https://gerrit.libreoffice.org/38343
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
-rw-r--r-- | sc/source/ui/cctrl/checklistmenu.cxx | 37 | ||||
-rw-r--r-- | sc/source/ui/inc/checklistmenu.hxx | 1 |
2 files changed, 30 insertions, 8 deletions
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx index 6625101788d6..d4ff05e72f6c 100644 --- a/sc/source/ui/cctrl/checklistmenu.cxx +++ b/sc/source/ui/cctrl/checklistmenu.cxx @@ -1639,21 +1639,39 @@ void ScCheckListBox::Init() SetNodeDefaultImages(); } +void ScCheckListBox::GetRecursiveChecked(SvTreeListEntry* pEntry, std::unordered_set<OUString, OUStringHash>& vOut, SvTreeListEntry* pParent) +{ + if (GetCheckButtonState(pEntry) == SvButtonState::Checked) + { + // we have to hash both parent and child together + OUString aName = GetEntryText(pEntry); + if (pParent) aName += GetEntryText(pParent); + vOut.insert(aName); + } + + if (pEntry->HasChildren()) + { + const SvTreeListEntries& rChildren = pEntry->GetChildEntries(); + for (auto& rChild : rChildren) + { + GetRecursiveChecked(rChild.get(), vOut, pEntry); + } + } + +} + std::unordered_set<OUString, OUStringHash> ScCheckListBox::GetAllChecked() { - std::unordered_set<OUString, OUStringHash> results(0); + std::unordered_set<OUString, OUStringHash> vResults(0); sal_uInt32 nRootPos = 0; SvTreeListEntry* pEntry = GetEntry(nRootPos); while (pEntry) { - if (GetCheckButtonState(pEntry) == SvButtonState::Checked) - { - results.insert(GetEntryText(pEntry)); - } + GetRecursiveChecked(pEntry, vResults, nullptr); pEntry = GetEntry(++nRootPos); } - return results; + return vResults; } bool ScCheckListBox::IsChecked( const OUString& sName, SvTreeListEntry* pParent ) @@ -1924,7 +1942,7 @@ bool ScCheckListMenuWindow::isAllSelected() const void ScCheckListMenuWindow::getResult(ResultType& rResult) { ResultType aResult; - std::unordered_set<OUString, OUStringHash> checkeds = maChecks->GetAllChecked(); + std::unordered_set<OUString, OUStringHash> vCheckeds = maChecks->GetAllChecked(); size_t n = maMembers.size(); for (size_t i = 0; i < n; ++i) { @@ -1933,7 +1951,10 @@ void ScCheckListMenuWindow::getResult(ResultType& rResult) OUString aLabel = maMembers[i].maName; if (aLabel.isEmpty()) aLabel = ScGlobal::GetRscString(STR_EMPTYDATA); - bool bState = checkeds.find(aLabel) != checkeds.end(); + + bool bState = vCheckeds.find(maMembers[i].mpParent ? + aLabel.copy(0).concat(maChecks->GetEntryText(maMembers[i].mpParent)) : + aLabel) != vCheckeds.end(); ResultEntry aResultEntry; aResultEntry.bValid = bState; if ( maMembers[i].mbDate ) diff --git a/sc/source/ui/inc/checklistmenu.hxx b/sc/source/ui/inc/checklistmenu.hxx index 7bae3853e82e..6ac7c4879fc2 100644 --- a/sc/source/ui/inc/checklistmenu.hxx +++ b/sc/source/ui/inc/checklistmenu.hxx @@ -240,6 +240,7 @@ class ScCheckListBox : public SvTreeListBox void CheckEntry( const OUString& sName, SvTreeListEntry* pParent, bool bCheck ); void CheckEntry( SvTreeListEntry* pEntry, bool bCheck ); SvTreeListEntry* ShowCheckEntry( const OUString& sName, ScCheckListMember& rMember, bool bShow = true, bool bCheck = true ); + void GetRecursiveChecked(SvTreeListEntry* pEntry, std::unordered_set<OUString, OUStringHash>& vOut, SvTreeListEntry* pParent); std::unordered_set<OUString, OUStringHash> GetAllChecked(); bool IsChecked( const OUString& sName, SvTreeListEntry* pParent ); SvTreeListEntry* FindEntry( SvTreeListEntry* pParent, const OUString& sNode ); |