summaryrefslogtreecommitdiff
path: root/sc/source/ui/cctrl/checklistmenu.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/cctrl/checklistmenu.cxx')
-rw-r--r--sc/source/ui/cctrl/checklistmenu.cxx36
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;