summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Sebastien Bevilacqua <realitix@gmail.com>2017-06-01 18:27:13 +0200
committerEike Rathke <erack@redhat.com>2017-06-06 12:23:11 +0200
commit2a39dc74724d3648ff76aa900edfebe0dd19b296 (patch)
treebdd5cc7dfbc0bfc2fdbc5aa7a43b38811b42b17d
parenta915f55c1867c73b3d231afc6e9f6dee17965c00 (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.cxx37
-rw-r--r--sc/source/ui/inc/checklistmenu.hxx1
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 );