diff options
Diffstat (limited to 'sc/source/ui/cctrl/checklistmenu.cxx')
-rw-r--r-- | sc/source/ui/cctrl/checklistmenu.cxx | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx index 833857614e72..36c2f891fb24 100644 --- a/sc/source/ui/cctrl/checklistmenu.cxx +++ b/sc/source/ui/cctrl/checklistmenu.cxx @@ -450,6 +450,7 @@ ScCheckListMenuControl::Config::Config() : ScCheckListMember::ScCheckListMember() : mnValue(0.0) , mbVisible(true) + , mbHiddenByOtherFilter(false) , mbDate(false) , mbLeaf(false) , mbValue(false) @@ -719,6 +720,7 @@ namespace aLabel = ScResId(STR_EMPTYDATA); rView.set_toggle(rIter, bChecked ? TRISTATE_TRUE : TRISTATE_FALSE); rView.set_text(rIter, aLabel, 0); + rView.set_sensitive(rIter, !rMember.mbHiddenByOtherFilter); } } @@ -727,7 +729,8 @@ IMPL_LINK_NOARG(ScCheckListMenuControl, EdModifyHdl, weld::Entry&, void) OUString aSearchText = mxEdSearch->get_text(); aSearchText = ScGlobal::getCharClass().lowercase( aSearchText ); bool bSearchTextEmpty = aSearchText.isEmpty(); - size_t n = maMembers.size(); + size_t nEnableMember = std::count_if(maMembers.begin(), maMembers.end(), + [](const ScCheckListMember& rLMem) { return !rLMem.mbHiddenByOtherFilter; }); size_t nSelCount = 0; // This branch is the general case, the other is an optimized variant of @@ -738,7 +741,7 @@ IMPL_LINK_NOARG(ScCheckListMenuControl, EdModifyHdl, weld::Entry&, void) bool bSomeDateDeletes = false; - for (size_t i = 0; i < n; ++i) + for (size_t i = 0; i < nEnableMember; ++i) { bool bIsDate = maMembers[i].mbDate; bool bPartialMatch = false; @@ -785,7 +788,7 @@ IMPL_LINK_NOARG(ScCheckListMenuControl, EdModifyHdl, weld::Entry&, void) if ( bSomeDateDeletes ) { - for (size_t i = 0; i < n; ++i) + for (size_t i = 0; i < nEnableMember; ++i) { if (!maMembers[i].mbDate) continue; @@ -813,7 +816,7 @@ IMPL_LINK_NOARG(ScCheckListMenuControl, EdModifyHdl, weld::Entry&, void) { std::vector<size_t> aShownIndexes; - for (size_t i = 0; i < n; ++i) + for (size_t i = 0; i < nEnableMember; ++i) { assert(!maMembers[i].mbDate); @@ -839,7 +842,7 @@ IMPL_LINK_NOARG(ScCheckListMenuControl, EdModifyHdl, weld::Entry&, void) } } - if ( nSelCount == n ) + if ( nSelCount == nEnableMember ) mxChkToggleAll->set_state( TRISTATE_TRUE ); else if ( nSelCount == 0 ) mxChkToggleAll->set_state( TRISTATE_FALSE ); @@ -874,7 +877,9 @@ void ScCheckListMenuControl::Check(const weld::TreeIter* pEntry) if (pEntry) CheckEntry(*pEntry, mpChecks->get_toggle(*pEntry) == TRISTATE_TRUE); size_t nNumChecked = GetCheckedEntryCount(); - if (nNumChecked == maMembers.size()) + size_t nEnableMember = std::count_if(maMembers.begin(), maMembers.end(), + [](const ScCheckListMember& rLMem) { return !rLMem.mbHiddenByOtherFilter; }); + if (nNumChecked == nEnableMember) // all members visible mxChkToggleAll->set_state(TRISTATE_TRUE); else if (nNumChecked == 0) @@ -938,7 +943,7 @@ void ScCheckListMenuControl::setMemberSize(size_t n) maMembers.reserve(n); } -void ScCheckListMenuControl::addDateMember(const OUString& rsName, double nVal, bool bVisible) +void ScCheckListMenuControl::addDateMember(const OUString& rsName, double nVal, bool bVisible, bool bHiddenByOtherFilter) { SvNumberFormatter* pFormatter = mrViewData.GetDocument().GetFormatTable(); @@ -972,12 +977,14 @@ void ScCheckListMenuControl::addDateMember(const OUString& rsName, double nVal, mpChecks->insert(nullptr, -1, nullptr, nullptr, nullptr, nullptr, false, xYearEntry.get()); mpChecks->set_toggle(*xYearEntry, TRISTATE_FALSE); mpChecks->set_text(*xYearEntry, aYearName, 0); + mpChecks->set_sensitive(*xYearEntry, !bHiddenByOtherFilter); ScCheckListMember aMemYear; aMemYear.maName = aYearName; aMemYear.maRealName = rsName; aMemYear.mbDate = true; aMemYear.mbLeaf = false; aMemYear.mbVisible = bVisible; + aMemYear.mbHiddenByOtherFilter = bHiddenByOtherFilter; aMemYear.mxParent.reset(); aMemYear.meDatePartType = ScCheckListMember::YEAR; maMembers.emplace_back(std::move(aMemYear)); @@ -990,12 +997,14 @@ void ScCheckListMenuControl::addDateMember(const OUString& rsName, double nVal, mpChecks->insert(xYearEntry.get(), -1, nullptr, nullptr, nullptr, nullptr, false, xMonthEntry.get()); mpChecks->set_toggle(*xMonthEntry, TRISTATE_FALSE); mpChecks->set_text(*xMonthEntry, aMonthName, 0); + mpChecks->set_sensitive(*xMonthEntry, !bHiddenByOtherFilter); ScCheckListMember aMemMonth; aMemMonth.maName = aMonthName; aMemMonth.maRealName = rsName; aMemMonth.mbDate = true; aMemMonth.mbLeaf = false; aMemMonth.mbVisible = bVisible; + aMemMonth.mbHiddenByOtherFilter = bHiddenByOtherFilter; aMemMonth.mxParent = std::move(xYearEntry); aMemMonth.meDatePartType = ScCheckListMember::MONTH; maMembers.emplace_back(std::move(aMemMonth)); @@ -1009,6 +1018,7 @@ void ScCheckListMenuControl::addDateMember(const OUString& rsName, double nVal, mpChecks->insert(xMonthEntry.get(), -1, nullptr, nullptr, nullptr, nullptr, false, xDayEntry.get()); mpChecks->set_toggle(*xDayEntry, TRISTATE_FALSE); mpChecks->set_text(*xDayEntry, aDayName, 0); + mpChecks->set_sensitive(*xDayEntry, !bHiddenByOtherFilter); ScCheckListMember aMemDay; aMemDay.maName = aDayName; aMemDay.maRealName = rsName; @@ -1018,6 +1028,7 @@ void ScCheckListMenuControl::addDateMember(const OUString& rsName, double nVal, aMemDay.mbDate = true; aMemDay.mbLeaf = true; aMemDay.mbVisible = bVisible; + aMemDay.mbHiddenByOtherFilter = bHiddenByOtherFilter; aMemDay.mxParent = std::move(xMonthEntry); aMemDay.meDatePartType = ScCheckListMember::DAY; maMembers.emplace_back(std::move(aMemDay)); @@ -1026,7 +1037,7 @@ void ScCheckListMenuControl::addDateMember(const OUString& rsName, double nVal, mpChecks->thaw(); } -void ScCheckListMenuControl::addMember(const OUString& rName, const double nVal, bool bVisible, bool bValue) +void ScCheckListMenuControl::addMember(const OUString& rName, const double nVal, bool bVisible, bool bHiddenByOtherFilter, bool bValue) { ScCheckListMember aMember; // tdf#46062 - indicate hidden whitespaces using quotes @@ -1037,6 +1048,7 @@ void ScCheckListMenuControl::addMember(const OUString& rName, const double nVal, aMember.mbLeaf = true; aMember.mbValue = bValue; aMember.mbVisible = bVisible; + aMember.mbHiddenByOtherFilter = bHiddenByOtherFilter; aMember.mxParent.reset(); maMembers.emplace_back(std::move(aMember)); } @@ -1255,7 +1267,7 @@ IMPL_LINK(ScCheckListMenuControl, KeyInputHdl, const KeyEvent&, rKEvt, bool) { std::unique_ptr<weld::TreeIter> xEntry = mpChecks->make_iterator(); bool bEntry = mpChecks->get_cursor(xEntry.get()); - if (bEntry) + if (bEntry && mpChecks->get_sensitive(*xEntry, 0)) { bool bOldCheck = mpChecks->get_toggle(*xEntry) == TRISTATE_TRUE; CheckEntry(*xEntry, !bOldCheck); @@ -1272,6 +1284,8 @@ IMPL_LINK(ScCheckListMenuControl, KeyInputHdl, const KeyEvent&, rKEvt, bool) size_t ScCheckListMenuControl::initMembers(int nMaxMemberWidth) { size_t n = maMembers.size(); + size_t nEnableMember = std::count_if(maMembers.begin(), maMembers.end(), + [](const ScCheckListMember& rLMem) { return !rLMem.mbHiddenByOtherFilter; }); size_t nVisMemCount = 0; if (nMaxMemberWidth == -1) @@ -1326,7 +1340,7 @@ size_t ScCheckListMenuControl::initMembers(int nMaxMemberWidth) mpChecks->expand_row(*rRow); } - if (nVisMemCount == n) + if (nVisMemCount == nEnableMember) { // all members visible mxChkToggleAll->set_state(TRISTATE_TRUE); @@ -1389,7 +1403,7 @@ void ScCheckListMenuControl::getResult(ResultType& rResult) bool bState = vCheckeds.find(aLabel.makeStringAndClear()) != vCheckeds.end(); ResultEntry aResultEntry; - aResultEntry.bValid = bState; + aResultEntry.bValid = bState && !maMembers[i].mbHiddenByOtherFilter; aResultEntry.aName = maMembers[i].maRealName; aResultEntry.nValue = maMembers[i].mnValue; aResultEntry.bDate = maMembers[i].mbDate; |