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.cxx79
1 files changed, 51 insertions, 28 deletions
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index 7a4d8348f913..f095e66c2e6d 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -1161,43 +1161,71 @@ void ScCheckListMenuControl::setHasDates(bool bHasDates)
mxChecks->set_show_expanders(mbHasDates);
}
+namespace
+{
+ void insertMember(weld::TreeView& rView, weld::TreeIter& rIter, const ScCheckListMember& rMember)
+ {
+ OUString aLabel = rMember.maName;
+ if (aLabel.isEmpty())
+ aLabel = ScResId(STR_EMPTYDATA);
+ rView.set_toggle(rIter, rMember.mbVisible ? TRISTATE_TRUE : TRISTATE_FALSE);
+ rView.set_text(rIter, aLabel, 0);
+ }
+}
+
size_t ScCheckListMenuControl::initMembers()
{
size_t n = maMembers.size();
size_t nVisMemCount = 0;
- mxChecks->freeze();
+ if (!mxChecks->n_children() && !mbHasDates)
+ {
+ // tdf#134038 insert in the fastest order, this might be backwards so only do it for
+ // the !mbHasDates case where no entry depends on another to exist before getting
+ // inserted. We cannot retain pre-existing treeview content, only clear and fill it.
+ mxChecks->bulk_insert_for_each(n, [this, &nVisMemCount](weld::TreeIter& rIter, int i) {
+ assert(!maMembers[i].mbDate);
+ insertMember(*mxChecks, rIter, maMembers[i]);
+ if (maMembers[i].mbVisible)
+ ++nVisMemCount;
+ });
+ }
+ else
+ {
+ mxChecks->freeze();
- std::unique_ptr<weld::TreeIter> xEntry = mxChecks->make_iterator();
- std::vector<std::unique_ptr<weld::TreeIter>> aExpandRows;
+ std::unique_ptr<weld::TreeIter> xEntry = mxChecks->make_iterator();
+ std::vector<std::unique_ptr<weld::TreeIter>> aExpandRows;
- for (size_t i = 0; i < n; ++i)
- {
- if (maMembers[i].mbDate)
+ for (size_t i = 0; i < n; ++i)
{
- CheckEntry(maMembers[i].maName, maMembers[i].mxParent.get(), maMembers[i].mbVisible);
- // Expand first node of checked dates
- if (!maMembers[i].mxParent && IsChecked(maMembers[i].maName, maMembers[i].mxParent.get()))
+ if (maMembers[i].mbDate)
{
- std::unique_ptr<weld::TreeIter> xDateEntry = FindEntry(nullptr, maMembers[i].maName);
- if (xDateEntry)
- aExpandRows.emplace_back(std::move(xDateEntry));
+ CheckEntry(maMembers[i].maName, maMembers[i].mxParent.get(), maMembers[i].mbVisible);
+ // Expand first node of checked dates
+ if (!maMembers[i].mxParent && IsChecked(maMembers[i].maName, maMembers[i].mxParent.get()))
+ {
+ std::unique_ptr<weld::TreeIter> xDateEntry = FindEntry(nullptr, maMembers[i].maName);
+ if (xDateEntry)
+ aExpandRows.emplace_back(std::move(xDateEntry));
+ }
+ }
+ else
+ {
+ mxChecks->append(xEntry.get());
+ insertMember(*mxChecks, *xEntry, maMembers[i]);
}
- }
- else
- {
- OUString aLabel = maMembers[i].maName;
- if (aLabel.isEmpty())
- aLabel = ScResId(STR_EMPTYDATA);
- mxChecks->append(xEntry.get());
- mxChecks->set_toggle(*xEntry, maMembers[i].mbVisible ? TRISTATE_TRUE : TRISTATE_FALSE);
- mxChecks->set_text(*xEntry, aLabel, 0);
+ if (maMembers[i].mbVisible)
+ ++nVisMemCount;
}
- if (maMembers[i].mbVisible)
- ++nVisMemCount;
+ mxChecks->thaw();
+
+ for (auto& rRow : aExpandRows)
+ mxChecks->expand_row(*rRow);
}
+
if (nVisMemCount == n)
{
// all members visible
@@ -1216,11 +1244,6 @@ size_t ScCheckListMenuControl::initMembers()
mePrevToggleAllState = TRISTATE_INDET;
}
- mxChecks->thaw();
-
- for (auto& rRow : aExpandRows)
- mxChecks->expand_row(*rRow);
-
if (nVisMemCount)
mxChecks->select(0);