tdf#126043 use another bulk_insert_for_each

Change-Id: I05c3fc6e708d000ba955981dbd8d11371ea99da2
Reviewed-on: https://gerrit.libreoffice.org/83686
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/cui/source/customize/SvxMenuConfigPage.cxx b/cui/source/customize/SvxMenuConfigPage.cxx
index 218d087..7289b35 100644
--- a/cui/source/customize/SvxMenuConfigPage.cxx
+++ b/cui/source/customize/SvxMenuConfigPage.cxx
@@ -263,22 +263,21 @@ short SvxMenuConfigPage::QueryReset()

void SvxMenuConfigPage::SelectElement()
{
    m_xContentsListBox->clear();
    weld::TreeView& rTreeView = m_xContentsListBox->get_widget();

    SvxConfigEntry* pMenuData = GetTopLevelSelection();

    if ( pMenuData )
    if (!pMenuData)
        rTreeView.clear();
    else
    {
        SvxEntries* pEntries = pMenuData->GetEntries();

        int i = 0;
        for (auto const& entry : *pEntries)
        {
        rTreeView.bulk_insert_for_each(pEntries->size(), [this, &rTreeView, pEntries](weld::TreeIter& rIter, int nIdx) {
            auto const& entry = (*pEntries)[nIdx];
            OUString sId(OUString::number(reinterpret_cast<sal_Int64>(entry)));
            m_xContentsListBox->insert(i, sId);
            InsertEntryIntoUI(entry, i, 0);
            ++i;
        }
            rTreeView.set_id(rIter, sId);
            InsertEntryIntoUI(entry, rTreeView, rIter, 0);
        });
    }

    UpdateButtonStates();
@@ -364,9 +363,10 @@ IMPL_LINK_NOARG( SvxMenuConfigPage, AddCommandHdl, weld::Button&, void )
    int nPos = AddFunction(-1, /*bAllowDuplicates*/false);
    if (nPos == -1)
        return;
    weld::TreeView& rTreeView = m_xContentsListBox->get_widget();
    SvxConfigEntry* pEntry =
        reinterpret_cast<SvxConfigEntry*>(m_xContentsListBox->get_id(nPos).toInt64());
    InsertEntryIntoUI(pEntry, nPos, 0);
        reinterpret_cast<SvxConfigEntry*>(rTreeView.get_id(nPos).toInt64());
    InsertEntryIntoUI(pEntry, rTreeView, nPos, 0);
}

IMPL_LINK_NOARG( SvxMenuConfigPage, RemoveCommandHdl, weld::Button&, void )
@@ -380,12 +380,13 @@ IMPL_LINK_NOARG( SvxMenuConfigPage, RemoveCommandHdl, weld::Button&, void )

IMPL_LINK(SvxMenuConfigPage, InsertHdl, const OString&, rIdent, void)
{
    weld::TreeView& rTreeView = m_xContentsListBox->get_widget();
    if (rIdent == "insertseparator")
    {
        SvxConfigEntry* pNewEntryData = new SvxConfigEntry;
        pNewEntryData->SetUserDefined();
        int nPos = AppendEntry(pNewEntryData, -1);
        InsertEntryIntoUI(pNewEntryData, nPos, 0);
        InsertEntryIntoUI(pNewEntryData, rTreeView, nPos, 0);
    }
    else if (rIdent == "insertsubmenu")
    {
@@ -406,7 +407,7 @@ IMPL_LINK(SvxMenuConfigPage, InsertHdl, const OString&, rIdent, void)
            pNewEntryData->SetUserDefined();

            int nPos = AppendEntry(pNewEntryData, -1);
            InsertEntryIntoUI(pNewEntryData, nPos, 0);
            InsertEntryIntoUI(pNewEntryData, rTreeView, nPos, 0);

            ReloadTopLevelListBox();

diff --git a/cui/source/customize/SvxToolbarConfigPage.cxx b/cui/source/customize/SvxToolbarConfigPage.cxx
index b8058df..b30302d 100644
--- a/cui/source/customize/SvxToolbarConfigPage.cxx
+++ b/cui/source/customize/SvxToolbarConfigPage.cxx
@@ -463,7 +463,7 @@ IMPL_LINK(SvxToolbarConfigPage, InsertHdl, const OString&, rIdent, void)
        pNewEntryData->SetUserDefined();

        int nPos = AppendEntry(pNewEntryData, -1);
        InsertEntryIntoUI(pNewEntryData, nPos, 1);
        InsertEntryIntoUI(pNewEntryData, m_xContentsListBox->get_widget(), nPos, 1);

        static_cast<ToolbarSaveInData*>( GetSaveInData())->ApplyToolbar( pToolbar );

@@ -561,7 +561,7 @@ IMPL_LINK(SvxToolbarConfigPage, ModifyItemHdl, const OString&, rIdent, void)
                    OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pEntry)));
                    m_xContentsListBox->insert(nActEntry, sId);
                    m_xContentsListBox->set_toggle(nActEntry, pEntry->IsVisible() ? TRISTATE_TRUE : TRISTATE_FALSE, 0);
                    InsertEntryIntoUI(pEntry, nActEntry, 1);
                    InsertEntryIntoUI(pEntry, m_xContentsListBox->get_widget(), nActEntry, 1);

                    m_xContentsListBox->select(nActEntry);
                    m_xContentsListBox->scroll_to_row(nActEntry);
@@ -601,7 +601,7 @@ IMPL_LINK(SvxToolbarConfigPage, ModifyItemHdl, const OString&, rIdent, void)
            OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pEntry)));
            m_xContentsListBox->insert(nActEntry, sId);
            m_xContentsListBox->set_toggle(nActEntry, pEntry->IsVisible() ? TRISTATE_TRUE : TRISTATE_FALSE, 0);
            InsertEntryIntoUI(pEntry, nActEntry, 1);
            InsertEntryIntoUI(pEntry, m_xContentsListBox->get_widget(), nActEntry, 1);

            m_xContentsListBox->select(nActEntry);
            m_xContentsListBox->scroll_to_row(nActEntry);
@@ -658,7 +658,7 @@ IMPL_LINK(SvxToolbarConfigPage, ModifyItemHdl, const OString&, rIdent, void)
            m_xContentsListBox->insert(nActEntry, sId);
            m_xContentsListBox->set_toggle(nActEntry,
                pEntry->IsVisible() ? TRISTATE_TRUE : TRISTATE_FALSE, 0);
            InsertEntryIntoUI(pEntry, nActEntry, 1);
            InsertEntryIntoUI(pEntry, m_xContentsListBox->get_widget(), nActEntry, 1);

            m_xContentsListBox->select(nActEntry);
            m_xContentsListBox->scroll_to_row(nActEntry);
@@ -790,7 +790,7 @@ void SvxToolbarConfigPage::SelectElement()
        m_xContentsListBox->insert(i, sId);
        if (entry->IsBinding() && !entry->IsSeparator())
            m_xContentsListBox->set_toggle(i,  entry->IsVisible() ? TRISTATE_TRUE : TRISTATE_FALSE, 0);
        InsertEntryIntoUI(entry, i, 1);
        InsertEntryIntoUI(entry, m_xContentsListBox->get_widget(), i, 1);
        ++i;
    }

@@ -819,7 +819,7 @@ void SvxToolbarConfigPage::AddFunction(int nTarget)
        m_xContentsListBox->set_toggle(nNewLBEntry, TRISTATE_TRUE, 0);
    }

    InsertEntryIntoUI(pEntry, nNewLBEntry, 1);
    InsertEntryIntoUI(pEntry, m_xContentsListBox->get_widget(), nNewLBEntry, 1);

    // Changes are not visible on the toolbar until this point
    // TODO: Figure out a way to show the changes on the toolbar, but revert if
diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx
index 30dd22c..6c98193 100644
--- a/cui/source/customize/cfg.cxx
+++ b/cui/source/customize/cfg.cxx
@@ -1506,34 +1506,49 @@ int SvxConfigPage::AppendEntry(
    return nNewEntry;
}

void SvxConfigPage::InsertEntryIntoUI(SvxConfigEntry* pNewEntryData, int nPos, int nStartCol)
namespace
{
    OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pNewEntryData)));

    m_xContentsListBox->set_id(nPos, sId);

    if (pNewEntryData->IsSeparator())
    template<typename itertype> void TmplInsertEntryIntoUI(SvxConfigEntry* pNewEntryData, weld::TreeView& rTreeView, itertype& rIter, int nStartCol, SaveInData* pSaveInData, VirtualDevice& rDropDown)
    {
        m_xContentsListBox->set_text(nPos, "----------------------------------", nStartCol + 1);
    }
    else
    {
        auto xImage = GetSaveInData()->GetImage(pNewEntryData->GetCommand());
        if (xImage.is())
            m_xContentsListBox->set_image(nPos, xImage, nStartCol);
        OUString aName = SvxConfigPageHelper::stripHotKey( pNewEntryData->GetName() );
        m_xContentsListBox->set_text(nPos, aName, nStartCol + 1);
    }
        OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pNewEntryData)));

    if (nStartCol == 0)  // menus
    {
        if (pNewEntryData->IsPopup() || pNewEntryData->GetStyle() & css::ui::ItemStyle::DROP_DOWN)
            m_xContentsListBox->set_dropdown(nPos, nStartCol + 2);
        rTreeView.set_id(rIter, sId);

        if (pNewEntryData->IsSeparator())
        {
            rTreeView.set_text(rIter, "----------------------------------", nStartCol + 1);
        }
        else
            m_xContentsListBox->set_image(nPos, nullptr, nStartCol + 2);
        {
            auto xImage = pSaveInData->GetImage(pNewEntryData->GetCommand());
            if (xImage.is())
                rTreeView.set_image(rIter, xImage, nStartCol);
            OUString aName = SvxConfigPageHelper::stripHotKey( pNewEntryData->GetName() );
            rTreeView.set_text(rIter, aName, nStartCol + 1);
        }

        if (nStartCol == 0)  // menus
        {
            if (pNewEntryData->IsPopup() || pNewEntryData->GetStyle() & css::ui::ItemStyle::DROP_DOWN)
                rTreeView.set_image(rIter, rDropDown, nStartCol + 2);
            else
                rTreeView.set_image(rIter, css::uno::Reference<css::graphic::XGraphic>(), nStartCol + 2);
        }
    }
}

void SvxConfigPage::InsertEntryIntoUI(SvxConfigEntry* pNewEntryData, weld::TreeView& rTreeView, int nPos, int nStartCol)
{
    TmplInsertEntryIntoUI<int>(pNewEntryData, rTreeView, nPos, nStartCol,
            GetSaveInData(), m_xContentsListBox->get_dropdown_image());
}

void SvxConfigPage::InsertEntryIntoUI(SvxConfigEntry* pNewEntryData, weld::TreeView& rTreeView, weld::TreeIter& rIter, int nStartCol)
{
    TmplInsertEntryIntoUI<weld::TreeIter>(pNewEntryData, rTreeView, rIter, nStartCol,
            GetSaveInData(), m_xContentsListBox->get_dropdown_image());
}

IMPL_LINK(SvxConfigPage, MoveHdl, weld::Button&, rButton, void)
{
    MoveEntry(&rButton == m_xMoveUpButton.get());
diff --git a/cui/source/inc/cfg.hxx b/cui/source/inc/cfg.hxx
index d5410a6..fa825b9 100644
--- a/cui/source/inc/cfg.hxx
+++ b/cui/source/inc/cfg.hxx
@@ -325,6 +325,8 @@ public:
    SvxMenuEntriesListBox(std::unique_ptr<weld::TreeView> xControl, SvxConfigPage* pPage);
    virtual ~SvxMenuEntriesListBox();

    VirtualDevice& get_dropdown_image() const { return *m_xDropDown; }

    int get_selected_index() const { return m_xControl->get_selected_index(); }
    OUString get_id(int nPos) const { return m_xControl->get_id(nPos); }
    void remove(int nPos) { m_xControl->remove(nPos); }
@@ -451,7 +453,12 @@ protected:
                                        SvxConfigEntry const * pParentData );

    void                InsertEntryIntoUI(SvxConfigEntry* pNewEntryData,
                                          int nPos, int nStartCol);
                                          weld::TreeView& rTreeView, int nPos,
                                          int nStartCol);
    void                InsertEntryIntoUI(SvxConfigEntry* pNewEntryData,
                                          weld::TreeView& rTreeView, weld::TreeIter& rIter,
                                          int nStartCol);

    void InsertEntryIntoNotebookbarTabUI(const OUString& sClassId, const OUString& sUIItemId,
                                         const OUString& sUIItemCommand,
                                         weld::TreeView& rTreeView, weld::TreeIter& rIter,
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 194383e..abe71e4 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -870,7 +870,6 @@ public:
    virtual void collapse_row(const TreeIter& rIter) = 0;
    virtual void set_text(const TreeIter& rIter, const OUString& rStr, int col = -1) = 0;
    virtual void set_sensitive(const TreeIter& rIter, bool bSensitive, int col = -1) = 0;
    virtual void set_image(const TreeIter& rIter, const OUString& rImage, int col = -1) = 0;
    virtual void set_text_emphasis(const TreeIter& rIter, bool bOn, int col) = 0;
    virtual bool get_text_emphasis(const TreeIter& rIter, int col) const = 0;
    virtual void set_toggle(const TreeIter& rIter, TriState bOn, int col) = 0;
@@ -878,8 +877,10 @@ public:
    virtual OUString get_text(const TreeIter& rIter, int col = -1) const = 0;
    virtual void set_id(const TreeIter& rIter, const OUString& rId) = 0;
    virtual OUString get_id(const TreeIter& rIter) const = 0;
    virtual void set_image(const TreeIter& rIter, const OUString& rImage, int col = -1) = 0;
    virtual void set_image(const TreeIter& rIter, VirtualDevice& rImage, int col = -1) = 0;
    virtual void set_image(const TreeIter& rIter,
                           const css::uno::Reference<css::graphic::XGraphic>& rImage, int col)
                           const css::uno::Reference<css::graphic::XGraphic>& rImage, int col = -1)
        = 0;
    virtual void set_font_color(const TreeIter& rIter, const Color& rColor) const = 0;
    virtual void scroll_to_row(const TreeIter& rIter) = 0;
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 729901d..b26f485 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -4098,13 +4098,19 @@ public:
        set_image(m_xTreeView->GetEntry(nullptr, pos), createImage(rImage), col);
    }

    virtual void set_image(const weld::TreeIter& rIter, const OUString& rImage, int col) override
    {
        const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter);
        set_image(rVclIter.iter, createImage(rImage), col);
    }

    virtual void set_image(const weld::TreeIter& rIter, const css::uno::Reference<css::graphic::XGraphic>& rImage, int col) override
    {
        const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter);
        set_image(rVclIter.iter, Image(rImage), col);
    }

    virtual void set_image(const weld::TreeIter& rIter, const OUString& rImage, int col) override
    virtual void set_image(const weld::TreeIter& rIter, VirtualDevice& rImage, int col) override
    {
        const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter);
        set_image(rVclIter.iter, createImage(rImage), col);
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index eaa83a4..71242e1 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -9116,6 +9116,12 @@ public:
        set_image(rGtkIter.iter, col, getPixbuf(rImage));
    }

    virtual void set_image(const weld::TreeIter& rIter, VirtualDevice& rImage, int col) override
    {
        const GtkInstanceTreeIter& rGtkIter = static_cast<const GtkInstanceTreeIter&>(rIter);
        set_image(rGtkIter.iter, col, getPixbuf(rImage));
    }

    virtual OUString get_id(int pos) const override
    {
        return get(pos, m_nIdCol);