cui/source/customize/cfg.cxx                     |    4 
 cui/source/dialogs/cuicharmap.cxx                |   15 +--
 cui/source/options/optjava.cxx                   |    2 
 cui/source/tabpages/chardlg.cxx                  |    7 -
 include/svx/langbox.hxx                          |    4 
 include/vcl/weld.hxx                             |   69 ++++++++++---
 sc/source/ui/miscdlgs/mvtabdlg.cxx               |    3 
 sd/source/ui/dlg/PhotoAlbumDialog.cxx            |    8 -
 sd/source/ui/dlg/custsdlg.cxx                    |    5 -
 sfx2/source/dialog/mgetempl.cxx                  |    3 
 sfx2/source/doc/saveastemplatedlg.cxx            |    2 
 svtools/source/control/ctrlbox.cxx               |    4 
 svx/source/dialog/dlgctrl.cxx                    |    4 
 svx/source/dialog/langbox.cxx                    |   53 +++++++---
 sw/source/ui/dbui/customizeaddresslistdialog.cxx |    4 
 sw/source/ui/frmdlg/column.cxx                   |    3 
 sw/source/ui/misc/outline.cxx                    |    2 
 sw/source/ui/table/tautofmt.cxx                  |    4 
 sw/source/uibase/misc/numberingtypelistbox.cxx   |    3 
 sw/source/uibase/utlui/uitool.cxx                |    2 
 vcl/source/app/salvtables.cxx                    |   32 +++---
 vcl/unx/generic/print/prtsetup.cxx               |    3 
 vcl/unx/gtk3/gtk3gtkinst.cxx                     |  114 +++++++++++------------
 23 files changed, 209 insertions(+), 141 deletions(-)

New commits:
commit 3b21fed4b153e3bbf1d47c3073f31a3735538596
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Oct 10 12:18:13 2018 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Wed Oct 10 16:57:12 2018 +0200

    optimize adding a block of entries at one time
    
    Change-Id: I9a59154fa445cf3c44ede3ceb1d09f408d906530
    Reviewed-on: https://gerrit.libreoffice.org/61618
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>

diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx
index af8fea0455f7..3d48ae269a56 100644
--- a/cui/source/customize/cfg.cxx
+++ b/cui/source/customize/cfg.cxx
@@ -1971,7 +1971,7 @@ IMPL_LINK_NOARG(SvxMainMenuOrganizerDialog, ModifyHdl, 
weld::Entry&, void)
     const int nNewMenuPos = m_xMenuListBox->find_id(m_sNewMenuEntryId);
     const int nOldSelection = m_xMenuListBox->get_selected_index();
     m_xMenuListBox->remove(nNewMenuPos);
-    m_xMenuListBox->insert(nNewMenuPos, m_sNewMenuEntryId, 
pNewEntryData->GetName(), nullptr, nullptr);
+    m_xMenuListBox->insert(nNewMenuPos, pNewEntryData->GetName(), 
&m_sNewMenuEntryId, nullptr, nullptr);
     m_xMenuListBox->select(nOldSelection);
 }
 
@@ -2009,7 +2009,7 @@ IMPL_LINK( SvxMainMenuOrganizerDialog, MoveHdl, 
weld::Button&, rButton, void )
     OUString sId = m_xMenuListBox->get_id(nSourceEntry);
     OUString sEntry = m_xMenuListBox->get_text(nSourceEntry);
     m_xMenuListBox->remove(nSourceEntry);
-    m_xMenuListBox->insert(nTargetEntry, sId, sEntry, nullptr, nullptr);
+    m_xMenuListBox->insert(nTargetEntry, sEntry, &sId, nullptr, nullptr);
     m_xMenuListBox->select(nTargetEntry);
 
     UpdateButtonStates();
diff --git a/cui/source/dialogs/cuicharmap.cxx 
b/cui/source/dialogs/cuicharmap.cxx
index c0de50c1e564..4ffc213003ca 100644
--- a/cui/source/dialogs/cuicharmap.cxx
+++ b/cui/source/dialogs/cuicharmap.cxx
@@ -422,17 +422,18 @@ void SvxCharacterMap::init()
     OUString aDefStr( aFont.GetFamilyName() );
     OUString aLastName;
     int nCount = m_xVirDev->GetDevFontCount();
-    m_xFontLB->freeze();
+    std::vector<weld::ComboBoxEntry> aEntries;
+    aEntries.reserve(nCount);
     for (int i = 0; i < nCount; ++i)
     {
         OUString aFontName( m_xVirDev->GetDevFont( i ).GetFamilyName() );
         if (aFontName != aLastName)
         {
             aLastName = aFontName;
-            m_xFontLB->append(OUString::number(i), aFontName);
+            aEntries.emplace_back(aFontName, OUString::number(i));
         }
     }
-    m_xFontLB->thaw();
+    m_xFontLB->insert_vector(aEntries, true);
     // the font may not be in the list =>
     // try to find a font name token in list and select found font,
     // else select topmost entry
@@ -596,14 +597,12 @@ void SvxCharacterMap::SetCharFont( const vcl::Font& rFont 
)
 void SvxCharacterMap::fillAllSubsets(weld::ComboBox& rListBox)
 {
     SubsetMap aAll(nullptr);
-    rListBox.clear();
-    rListBox.freeze();
+    std::vector<weld::ComboBoxEntry> aEntries;
     for (auto & subset : aAll.GetSubsetMap())
-        rListBox.append_text(subset.GetName());
-    rListBox.thaw();
+        aEntries.emplace_back(subset.GetName());
+    rListBox.insert_vector(aEntries, true);
 }
 
-
 void SvxCharacterMap::insertCharToDoc(const OUString& sGlyph)
 {
     if(sGlyph.isEmpty())
diff --git a/cui/source/options/optjava.cxx b/cui/source/options/optjava.cxx
index f115faedc701..9b3660d35592 100644
--- a/cui/source/options/optjava.cxx
+++ b/cui/source/options/optjava.cxx
@@ -804,7 +804,7 @@ void SvxJavaParameterDlg::EditParameter()
         if ( !editedClassPath.isEmpty() && editableClassPath != 
editedClassPath )
         {
             m_xAssignedList->remove(nPos);
-            m_xAssignedList->insert_text(editedClassPath, nPos);
+            m_xAssignedList->insert_text(nPos, editedClassPath);
             m_xAssignedList->select(nPos);
         }
     }
diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx
index c4b7432e1bdc..eb80b4187fdf 100644
--- a/cui/source/tabpages/chardlg.cxx
+++ b/cui/source/tabpages/chardlg.cxx
@@ -604,14 +604,15 @@ namespace
     void FillFontNames(weld::ComboBox& rBox, const FontList& rList)
     {
         // insert fonts
-        rBox.freeze();
         sal_uInt16 nFontCount = rList.GetFontNameCount();
+        std::vector<weld::ComboBoxEntry> aVector;
+        aVector.reserve(nFontCount);
         for (sal_uInt16 i = 0; i < nFontCount; ++i)
         {
             const FontMetric& rFontMetric = rList.GetFontName(i);
-            rBox.append_text(rFontMetric.GetFamilyName());
+            aVector.emplace_back(rFontMetric.GetFamilyName());
         }
-        rBox.thaw();
+        rBox.insert_vector(aVector, false);
     }
 }
 
diff --git a/include/svx/langbox.hxx b/include/svx/langbox.hxx
index 3dbb96977e37..74ecd76673d9 100644
--- a/include/svx/langbox.hxx
+++ b/include/svx/langbox.hxx
@@ -150,6 +150,10 @@ private:
     bool m_bLangNoneIsLangAll;
     bool m_bWithCheckmark;
 
+    SVX_DLLPRIVATE weld::ComboBoxEntry BuildEntry(const LanguageType 
nLangType);
+    SVX_DLLPRIVATE void AddLanguages(const std::vector< LanguageType >& 
rLanguageTypes, SvxLanguageListFlags nLangList,
+                                     std::vector<weld::ComboBoxEntry>& 
rEntries);
+
     SVX_DLLPRIVATE int ImplTypeToPos(LanguageType eType) const;
     SVX_DLLPRIVATE void ImplClear();
     DECL_LINK(ChangeHdl, weld::ComboBox&, void);
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 86ecdfe01032..b7f39954be2c 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -253,6 +253,28 @@ public:
     virtual Container* weld_message_area() = 0;
 };
 
+struct VCL_DLLPUBLIC ComboBoxEntry
+{
+    OUString sString;
+    OUString sId;
+    OUString sImage;
+    ComboBoxEntry(const OUString& rString)
+        : sString(rString)
+    {
+    }
+    ComboBoxEntry(const OUString& rString, const OUString& rId)
+        : sString(rString)
+        , sId(rId)
+    {
+    }
+    ComboBoxEntry(const OUString& rString, const OUString& rId, const 
OUString& rImage)
+        : sString(rString)
+        , sId(rId)
+        , sImage(rImage)
+    {
+    }
+};
+
 class VCL_DLLPUBLIC ComboBox : virtual public Container
 {
 private:
@@ -265,22 +287,27 @@ protected:
     void signal_changed() { m_aChangeHdl.Call(*this); }
 
 public:
-    virtual void insert_text(int pos, const OUString& rStr) = 0;
-    void append_text(const OUString& rStr) { insert_text(-1, rStr); }
-    virtual void insert(int pos, const OUString& rId, const OUString& rStr,
+    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
                         const OUString* pIconName, VirtualDevice* 
pImageSurface)
         = 0;
+    virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems, 
bool bKeepExisting)
+        = 0;
+    void insert_text(int pos, const OUString& rStr)
+    {
+        insert(pos, rStr, nullptr, nullptr, nullptr);
+    }
+    void append_text(const OUString& rStr) { insert(-1, rStr, nullptr, 
nullptr, nullptr); }
     void append(const OUString& rId, const OUString& rStr)
     {
-        insert(-1, rId, rStr, nullptr, nullptr);
+        insert(-1, rStr, &rId, nullptr, nullptr);
     }
     void append(const OUString& rId, const OUString& rStr, const OUString& 
rImage)
     {
-        insert(-1, rId, rStr, &rImage, nullptr);
+        insert(-1, rStr, &rId, &rImage, nullptr);
     }
     void append(const OUString& rId, const OUString& rStr, VirtualDevice& 
rImage)
     {
-        insert(-1, rId, rStr, nullptr, &rImage);
+        insert(-1, rStr, &rId, nullptr, &rImage);
     }
 
     virtual int get_count() const = 0;
@@ -334,22 +361,25 @@ protected:
     void signal_row_activated() { m_aRowActivatedHdl.Call(*this); }
 
 public:
-    virtual void insert_text(const OUString& rText, int pos) = 0;
-    virtual void insert(int pos, const OUString& rId, const OUString& rStr,
+    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
                         const OUString* pIconName, VirtualDevice* 
pImageSurface)
         = 0;
-    void append_text(const OUString& rText) { insert_text(rText, -1); }
+    void insert_text(int pos, const OUString& rStr)
+    {
+        insert(pos, rStr, nullptr, nullptr, nullptr);
+    }
+    void append_text(const OUString& rStr) { insert(-1, rStr, nullptr, 
nullptr, nullptr); }
     void append(const OUString& rId, const OUString& rStr)
     {
-        insert(-1, rId, rStr, nullptr, nullptr);
+        insert(-1, rStr, &rId, nullptr, nullptr);
     }
     void append(const OUString& rId, const OUString& rStr, const OUString& 
rImage)
     {
-        insert(-1, rId, rStr, &rImage, nullptr);
+        insert(-1, rStr, &rId, &rImage, nullptr);
     }
     void append(const OUString& rId, const OUString& rStr, VirtualDevice& 
rImage)
     {
-        insert(-1, rId, rStr, nullptr, &rImage);
+        insert(-1, rStr, &rId, nullptr, &rImage);
     }
 
     void connect_changed(const Link<TreeView&, void>& rLink) { m_aChangeHdl = 
rLink; }
@@ -671,14 +701,21 @@ protected:
 public:
     EntryTreeView(std::unique_ptr<Entry> xEntry, std::unique_ptr<TreeView> 
xTreeView);
 
-    virtual void insert_text(int pos, const OUString& rStr) override
+    virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems,
+                               bool bKeepExisting) override
     {
-        m_xTreeView->insert_text(rStr, pos);
+        m_xTreeView->freeze();
+        if (!bKeepExisting)
+            m_xTreeView->clear();
+        for (const auto& rItem : rItems)
+            m_xTreeView->insert(-1, rItem.sString, &rItem.sId, &rItem.sImage, 
nullptr);
+        m_xTreeView->thaw();
     }
-    virtual void insert(int pos, const OUString& rId, const OUString& rStr,
+
+    virtual void insert(int pos, const OUString& rStr, const OUString* pId,
                         const OUString* pIconName, VirtualDevice* 
pImageSurface) override
     {
-        m_xTreeView->insert(pos, rId, rStr, pIconName, pImageSurface);
+        m_xTreeView->insert(pos, rStr, pId, pIconName, pImageSurface);
     }
 
     virtual int get_count() const override { return m_xTreeView->n_children(); 
}
diff --git a/sc/source/ui/miscdlgs/mvtabdlg.cxx 
b/sc/source/ui/miscdlgs/mvtabdlg.cxx
index 95762ac114c5..ab594ee8bf9f 100644
--- a/sc/source/ui/miscdlgs/mvtabdlg.cxx
+++ b/sc/source/ui/miscdlgs/mvtabdlg.cxx
@@ -220,7 +220,8 @@ void ScMoveTableDlg::InitDocListBox()
                 aEntryName += msCurrentDoc;
             }
 
-            m_xLbDoc->insert(i, 
OUString::number(reinterpret_cast<sal_uInt64>(&pScSh->GetDocument())), 
aEntryName, nullptr, nullptr);
+            OUString 
sId(OUString::number(reinterpret_cast<sal_uInt64>(&pScSh->GetDocument())));
+            m_xLbDoc->insert(i, aEntryName, &sId, nullptr, nullptr);
 
             i++;
         }
diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.cxx 
b/sd/source/ui/dlg/PhotoAlbumDialog.cxx
index 403876b7c3da..934e3be37217 100644
--- a/sd/source/ui/dlg/PhotoAlbumDialog.cxx
+++ b/sd/source/ui/dlg/PhotoAlbumDialog.cxx
@@ -550,8 +550,8 @@ IMPL_LINK_NOARG(SdPhotoAlbumDialog, UpHdl, weld::Button&, 
void)
         m_xImagesLst->remove_text(sActEntry);
         m_xImagesLst->remove_text(sUpperEntry);
 
-        m_xImagesLst->insert(nActPos - 1, sAct, sActEntry, nullptr, nullptr);
-        m_xImagesLst->insert(nActPos, sUpper, sUpperEntry, nullptr, nullptr);
+        m_xImagesLst->insert(nActPos - 1, sActEntry, &sAct, nullptr, nullptr);
+        m_xImagesLst->insert(nActPos, sUpperEntry, &sUpper, nullptr, nullptr);
 
         m_xImagesLst->select(nActPos - 1);
     }
@@ -573,8 +573,8 @@ IMPL_LINK_NOARG(SdPhotoAlbumDialog, DownHdl, weld::Button&, 
void)
         m_xImagesLst->remove_text(sActEntry);
         m_xImagesLst->remove_text(sDownEntry);
 
-        m_xImagesLst->insert(nActPos, sDown, sDownEntry, nullptr, nullptr);
-        m_xImagesLst->insert(nActPos + 1, sAct, sActEntry, nullptr, nullptr);
+        m_xImagesLst->insert(nActPos, sDownEntry, &sDown, nullptr, nullptr);
+        m_xImagesLst->insert(nActPos + 1, sActEntry, &sAct, nullptr, nullptr);
 
         m_xImagesLst->select(nActPos + 1);
     }
diff --git a/sd/source/ui/dlg/custsdlg.cxx b/sd/source/ui/dlg/custsdlg.cxx
index b7b384073666..da736e59f8ac 100644
--- a/sd/source/ui/dlg/custsdlg.cxx
+++ b/sd/source/ui/dlg/custsdlg.cxx
@@ -154,7 +154,7 @@ void SdCustomShowDlg::SelectHdl(void const *p)
                     (*pCustomShowList)[nPos] = pCustomShow;
                     pCustomShowList->Seek(nPos);
                     m_xLbCustomShows->remove(nPos);
-                    m_xLbCustomShows->insert_text(pCustomShow->GetName(), 
nPos);
+                    m_xLbCustomShows->insert_text(nPos, 
pCustomShow->GetName());
                     m_xLbCustomShows->select(nPos);
                 }
                 if (aDlg.IsModified())
@@ -378,7 +378,8 @@ void SdDefineCustomShowDlg::ClickButtonHdl2(void const * p)
             {
                 OUString aStr = m_xLbPages->get_text(i);
                 SdPage* pPage = rDoc.GetSdPage(i, PageKind::Standard);
-                m_xLbCustomPages->insert(nPosCP, 
OUString::number(reinterpret_cast<sal_uInt64>(pPage)), aStr, nullptr, nullptr);
+                OUString 
sId(OUString::number(reinterpret_cast<sal_uInt64>(pPage)));
+                m_xLbCustomPages->insert(nPosCP, aStr, &sId, nullptr, nullptr);
                 m_xLbCustomPages->select(nPosCP != -1 ? nPosCP : 
m_xLbCustomPages->n_children() - 1);
 
                 if (nPosCP != -1)
diff --git a/sfx2/source/dialog/mgetempl.cxx b/sfx2/source/dialog/mgetempl.cxx
index db19bb92dc1f..7557fead6834 100644
--- a/sfx2/source/dialog/mgetempl.cxx
+++ b/sfx2/source/dialog/mgetempl.cxx
@@ -208,7 +208,8 @@ 
SfxManageStyleSheetPage::SfxManageStyleSheetPage(TabPageParent pParent, const Sf
                  rTupel.nFlags != SfxStyleSearchBits::AllVisible &&
                  rTupel.nFlags != SfxStyleSearchBits::All )
             {
-                m_xFilterLb->insert(nIdx, OUString::number(i), rTupel.aName, 
nullptr, nullptr);
+                OUString sId(OUString::number(i));
+                m_xFilterLb->insert(nIdx, rTupel.aName, &sId, nullptr, 
nullptr);
                 if ( ( rTupel.nFlags & nMask ) == nMask )
                     nStyleFilterIdx = nIdx;
                 ++nIdx;
diff --git a/sfx2/source/doc/saveastemplatedlg.cxx 
b/sfx2/source/doc/saveastemplatedlg.cxx
index 85eee202541e..a7af9dda560e 100644
--- a/sfx2/source/doc/saveastemplatedlg.cxx
+++ b/sfx2/source/doc/saveastemplatedlg.cxx
@@ -117,7 +117,7 @@ void SfxSaveAsTemplateDialog::SetCategoryLBEntries(const 
std::vector<OUString>&
     if (!rFolderNames.empty())
     {
         for (size_t i = 0, n = rFolderNames.size(); i < n; ++i)
-            m_xLBCategory->insert_text(rFolderNames[i], i+1);
+            m_xLBCategory->insert_text(i+1, rFolderNames[i]);
     }
     m_xLBCategory->select(0);
 }
diff --git a/svtools/source/control/ctrlbox.cxx 
b/svtools/source/control/ctrlbox.cxx
index 38a42a46567d..6efb5c2a9777 100644
--- a/svtools/source/control/ctrlbox.cxx
+++ b/svtools/source/control/ctrlbox.cxx
@@ -1682,7 +1682,7 @@ void SvtFontSizeBox::Fill( const FontMetric* pFontMetric, 
const FontList* pList
                 OUString    aSizeName = aFontSizeNames.GetIndexName( i );
                 sal_IntPtr  nSize = aFontSizeNames.GetIndexSize( i );
                 OUString sId(OUString::number(-nSize)); // mark as special
-                m_xComboBox->insert(nPos, sId, aSizeName, nullptr, nullptr);
+                m_xComboBox->insert(nPos, aSizeName, &sId, nullptr, nullptr);
                 nPos++;
             }
         }
@@ -1696,7 +1696,7 @@ void SvtFontSizeBox::Fill( const FontMetric* pFontMetric, 
const FontList* pList
                 if ( !aSizeName.isEmpty() )
                 {
                     OUString sId(OUString::number(-(*pTempAry))); // mark as 
special
-                    m_xComboBox->insert(nPos, sId, aSizeName, nullptr, 
nullptr);
+                    m_xComboBox->insert(nPos, aSizeName, &sId, nullptr, 
nullptr);
                     nPos++;
                 }
                 pTempAry++;
diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx
index 37c647280206..d2f6b9d3e7bc 100644
--- a/svx/source/dialog/dlgctrl.cxx
+++ b/svx/source/dialog/dlgctrl.cxx
@@ -1060,7 +1060,7 @@ void SvxLineLB::Modify(const XDashEntry& rEntry, 
sal_Int32 nPos, const BitmapEx&
         const Size aBmpSize(rBitmap.GetSizePixel());
         pVD->SetOutputSizePixel(aBmpSize, false);
         pVD->DrawBitmapEx(Point(), rBitmap);
-        m_xControl->insert(nPos, "", rEntry.GetName(), nullptr, pVD);
+        m_xControl->insert(nPos, rEntry.GetName(), nullptr, nullptr, pVD);
     }
     else
     {
@@ -1128,7 +1128,7 @@ void SvxLineEndLB::Modify( const XLineEndEntry& rEntry, 
sal_Int32 nPos, const Bi
         const Size aBmpSize(rBitmap.GetSizePixel());
         pVD->SetOutputSizePixel(Size(aBmpSize.Width() / 2, aBmpSize.Height()), 
false);
         pVD->DrawBitmapEx(Point(-aBmpSize.Width() / 2, 0), rBitmap);
-        m_xControl->insert(nPos, "", rEntry.GetName(), nullptr, pVD);
+        m_xControl->insert(nPos, rEntry.GetName(), nullptr, nullptr, pVD);
     }
     else
     {
diff --git a/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx
index 4c22822f5eb8..abac537091ad 100644
--- a/svx/source/dialog/langbox.cxx
+++ b/svx/source/dialog/langbox.cxx
@@ -530,8 +530,8 @@ void LanguageBox::set_active_id(const LanguageType 
eLangType)
         m_xControl->set_active(nAt);
 }
 
-void LanguageBox::AddLanguages( const std::vector< LanguageType >& 
rLanguageTypes,
-        SvxLanguageListFlags nLangList )
+void LanguageBox::AddLanguages(const std::vector< LanguageType >& 
rLanguageTypes,
+        SvxLanguageListFlags nLangList, std::vector<weld::ComboBoxEntry>& 
rEntries)
 {
     for ( auto const & nLangType : rLanguageTypes )
     {
@@ -542,7 +542,11 @@ void LanguageBox::AddLanguages( const std::vector< 
LanguageType >& rLanguageType
             {
                 int nAt = ImplTypeToPos(nLang);
                 if (nAt == -1)
-                    InsertLanguage( nLang );
+                {
+                    rEntries.push_back(BuildEntry(nLang));
+                    if (rEntries.back().sString.isEmpty())
+                        rEntries.pop_back();
+                }
             }
         }
     }
@@ -556,14 +560,15 @@ void LanguageBox::ImplClear()
 void LanguageBox::SetLanguageList( SvxLanguageListFlags nLangList,
         bool bHasLangNone, bool bLangNoneIsLangAll, bool bCheckSpellAvail )
 {
-    ImplClear();
-
     m_bHasLangNone          = bHasLangNone;
     m_bLangNoneIsLangAll    = bLangNoneIsLangAll;
     m_bWithCheckmark        = bCheckSpellAvail;
 
-    if ( SvxLanguageListFlags::EMPTY == nLangList )
+    if (SvxLanguageListFlags::EMPTY == nLangList)
+    {
+        ImplClear();
         return;
+    }
 
     bool bAddAvailable = (!(nLangList & SvxLanguageListFlags::ONLY_KNOWN) &&
             ((nLangList & SvxLanguageListFlags::ALL) ||
@@ -632,7 +637,7 @@ void LanguageBox::SetLanguageList( SvxLanguageListFlags 
nLangList,
         nCount = SvtLanguageTable::GetLanguageEntryCount();
     }
 
-    m_xControl->freeze();
+    std::vector<weld::ComboBoxEntry> aEntries;
     for ( sal_uInt32 i = 0; i < nCount; i++ )
     {
         LanguageType nLangType;
@@ -656,22 +661,26 @@ void LanguageBox::SetLanguageList( SvxLanguageListFlags 
nLangList,
                lcl_SeqHasLang(aHyphUsedLang, nLangType)) ||
               (bool(nLangList & SvxLanguageListFlags::THES_USED) &&
                lcl_SeqHasLang(aThesUsedLang, nLangType))) )
-            InsertLanguage( nLangType );
+        {
+            aEntries.push_back(BuildEntry(nLangType));
+            if (aEntries.back().sString.isEmpty())
+                aEntries.pop_back();
+        }
     }
 
     if (bAddAvailable)
     {
         // Spell checkers, hyphenators and thesauri may add language tags
         // unknown so far.
-        AddLanguages( aSpellAvailLang, nLangList);
-        AddLanguages( aHyphAvailLang, nLangList);
-        AddLanguages( aThesAvailLang, nLangList);
+        AddLanguages(aSpellAvailLang, nLangList, aEntries);
+        AddLanguages(aHyphAvailLang, nLangList, aEntries);
+        AddLanguages(aThesAvailLang, nLangList, aEntries);
     }
 
     if (bHasLangNone)
-        InsertLanguage( LANGUAGE_NONE );
+       aEntries.push_back(BuildEntry(LANGUAGE_NONE));
 
-    m_xControl->thaw();
+    m_xControl->insert_vector(aEntries, false);
 }
 
 int LanguageBox::ImplTypeToPos(LanguageType eType) const
@@ -681,6 +690,17 @@ int LanguageBox::ImplTypeToPos(LanguageType eType) const
 
 void LanguageBox::InsertLanguage(const LanguageType nLangType)
 {
+    weld::ComboBoxEntry aEntry = BuildEntry(nLangType);
+    if (aEntry.sString.isEmpty())
+        return;
+    if (aEntry.sImage.isEmpty())
+        m_xControl->append(aEntry.sId, aEntry.sString);
+    else
+        m_xControl->append(aEntry.sId, aEntry.sString, aEntry.sImage);
+}
+
+weld::ComboBoxEntry LanguageBox::BuildEntry(const LanguageType nLangType)
+{
     LanguageType nLang = 
MsLangId::getReplacementForObsoleteLanguage(nLangType);
     // For obsolete and to be replaced languages check whether an entry of the
     // replacement already exists and if so don't add an entry with identical
@@ -689,7 +709,7 @@ void LanguageBox::InsertLanguage(const LanguageType 
nLangType)
     {
         int nAt = ImplTypeToPos( nLang );
         if (nAt != -1)
-            return;
+            return weld::ComboBoxEntry("");
     }
 
     OUString aStrEntry = SvtLanguageTable::GetLanguageString( nLang );
@@ -721,11 +741,10 @@ void LanguageBox::InsertLanguage(const LanguageType 
nLangType)
 
         bool bFound = m_xSpellUsedLang && lcl_SeqHasLang(*m_xSpellUsedLang, 
static_cast<sal_uInt16>(nRealLang));
 
-        
m_xControl->append(OUString::number(static_cast<sal_uInt16>(nLangType)), 
aStrEntry,
-                           bFound ? OUString(RID_SVXBMP_CHECKED) : 
OUString(RID_SVXBMP_NOTCHECKED));
+        return weld::ComboBoxEntry(aStrEntry, 
OUString::number(static_cast<sal_uInt16>(nLangType)), bFound ? 
OUString(RID_SVXBMP_CHECKED) : OUString(RID_SVXBMP_NOTCHECKED));
     }
     else
-        
m_xControl->append(OUString::number(static_cast<sal_uInt16>(nLangType)), 
aStrEntry);
+        return weld::ComboBoxEntry(aStrEntry, 
OUString::number(static_cast<sal_uInt16>(nLangType)));
 }
 
 IMPL_LINK(LanguageBox, ChangeHdl, weld::ComboBox&, rControl, void)
diff --git a/sw/source/ui/dbui/customizeaddresslistdialog.cxx 
b/sw/source/ui/dbui/customizeaddresslistdialog.cxx
index ee0ad8e15c0e..af6162bfd0f5 100644
--- a/sw/source/ui/dbui/customizeaddresslistdialog.cxx
+++ b/sw/source/ui/dbui/customizeaddresslistdialog.cxx
@@ -103,7 +103,7 @@ IMPL_LINK(SwCustomizeAddressListDialog, AddRenameHdl_Impl, 
weld::Button&, rButto
 
         }
 
-        m_xFieldsLB->insert_text(sNew, nPos);
+        m_xFieldsLB->insert_text(nPos, sNew);
         m_xFieldsLB->select(nPos);
     }
     UpdateButtons();
@@ -135,7 +135,7 @@ IMPL_LINK(SwCustomizeAddressListDialog, UpDownHdl_Impl, 
weld::Button&, rButton,
         --nPos;
     else
         ++nPos;
-    m_xFieldsLB->insert_text(aTemp, nPos);
+    m_xFieldsLB->insert_text(nPos, aTemp);
     m_xFieldsLB->select(nPos);
     //align m_xNewData
     OUString sHeader = m_xNewData->aDBColumnHeaders[nOldPos];
diff --git a/sw/source/ui/frmdlg/column.cxx b/sw/source/ui/frmdlg/column.cxx
index 8c8b155b3a46..d7a327bc2dad 100644
--- a/sw/source/ui/frmdlg/column.cxx
+++ b/sw/source/ui/frmdlg/column.cxx
@@ -189,7 +189,8 @@ SwColumnDlg::SwColumnDlg(weld::Window* pParent, SwWrtShell& 
rSh)
     {
         const OUString sPageStr = pApplyToLB->get_text(nPagePos) + 
pPageDesc->GetName();
         pApplyToLB->remove(nPagePos);
-        pApplyToLB->insert(nPagePos, OUString::number(LISTBOX_PAGE), sPageStr, 
nullptr, nullptr);
+        OUString sId(OUString::number(LISTBOX_PAGE));
+        pApplyToLB->insert(nPagePos, sPageStr, &sId, nullptr, nullptr);
     }
     else
         pApplyToLB->remove( nPagePos );
diff --git a/sw/source/ui/misc/outline.cxx b/sw/source/ui/misc/outline.cxx
index 7b70104318fd..8cf7246243d7 100644
--- a/sw/source/ui/misc/outline.cxx
+++ b/sw/source/ui/misc/outline.cxx
@@ -91,7 +91,7 @@ void SwNumNamesDlg::SetUserNames(const OUString *pList[])
         if(pList[i])
         {
             m_xFormBox->remove(i);
-            m_xFormBox->insert_text(*pList[i], i);
+            m_xFormBox->insert_text(i, *pList[i]);
             if (i == nSelect && nSelect < SwChapterNumRules::nMaxRules)
                 nSelect++;
         }
diff --git a/sw/source/ui/table/tautofmt.cxx b/sw/source/ui/table/tautofmt.cxx
index 5e666a2e31bc..a395be977d54 100644
--- a/sw/source/ui/table/tautofmt.cxx
+++ b/sw/source/ui/table/tautofmt.cxx
@@ -236,7 +236,7 @@ IMPL_LINK_NOARG(SwAutoFormatDlg, AddHdl, weld::Button&, 
void)
                             break;
 
                     m_xTableTable->InsertAutoFormat(n, std::move(pNewData));
-                    m_xLbFormat->insert_text(aFormatName, m_nDfltStylePos + n);
+                    m_xLbFormat->insert_text(m_nDfltStylePos + n, aFormatName);
                     m_xLbFormat->select(m_nDfltStylePos + n);
                     bFormatInserted = true;
                     m_xBtnAdd->set_sensitive(false);
@@ -336,7 +336,7 @@ IMPL_LINK_NOARG(SwAutoFormatDlg, RenameHdl, weld::Button&, 
void)
                         }
 
                     m_xTableTable->InsertAutoFormat( n, std::move(p) );
-                    m_xLbFormat->insert_text(aFormatName, m_nDfltStylePos + n);
+                    m_xLbFormat->insert_text(m_nDfltStylePos + n, aFormatName);
                     m_xLbFormat->select(m_nDfltStylePos + n);
 
                     if ( !m_bCoreDataChanged )
diff --git a/sw/source/uibase/misc/numberingtypelistbox.cxx 
b/sw/source/uibase/misc/numberingtypelistbox.cxx
index 396546199d2c..66ec98433785 100644
--- a/sw/source/uibase/misc/numberingtypelistbox.cxx
+++ b/sw/source/uibase/misc/numberingtypelistbox.cxx
@@ -113,7 +113,8 @@ void SwNumberingTypeListBox::Reload(SwInsertNumTypes 
nTypeFlags)
         }
         if (bInsert)
         {
-            m_xWidget->insert(nPos, OUString::number(nValue), 
SvxNumberingTypeTable::GetString(i), nullptr, nullptr);
+            OUString sId(OUString::number(nValue));
+            m_xWidget->insert(nPos, SvxNumberingTypeTable::GetString(i), &sId, 
nullptr, nullptr);
         }
     }
     if (nTypeFlags & SwInsertNumTypes::Extended)
diff --git a/sw/source/uibase/utlui/uitool.cxx 
b/sw/source/uibase/utlui/uitool.cxx
index ff9438a8111f..79036c5ebdf8 100644
--- a/sw/source/uibase/utlui/uitool.cxx
+++ b/sw/source/uibase/utlui/uitool.cxx
@@ -687,7 +687,7 @@ void InsertStringSorted(const OUString& rId, const 
OUString& rEntry, weld::Combo
             break;
         ++nOffset;
     }
-    rToFill.insert(nOffset, rId, rEntry, nullptr, nullptr);
+    rToFill.insert(nOffset, rEntry, &rId, nullptr, nullptr);
 }
 
 void FillCharStyleListBox(ListBox& rToFill, SwDocShell* pDocSh, bool bSorted, 
bool bWithDefault)
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 102aa450c70a..ffae3928610e 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1692,12 +1692,7 @@ public:
         m_xTreeView->SetDoubleClickHdl(LINK(this, SalInstanceTreeView, 
DoubleClickHdl));
     }
 
-    virtual void insert_text(const OUString& rText, int pos) override
-    {
-        m_xTreeView->InsertEntry(rText, pos == -1 ? LISTBOX_APPEND : pos);
-    }
-
-    virtual void insert(int pos, const OUString& rId, const OUString& rStr, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
+    virtual void insert(int pos, const OUString& rStr, const OUString* pId, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos;
         sal_Int32 nInsertedAt;
@@ -1707,7 +1702,8 @@ public:
             nInsertedAt = m_xTreeView->InsertEntry(rStr, 
createImage(*pIconName), nInsertPos);
         else
             nInsertedAt = m_xTreeView->InsertEntry(rStr, 
createImage(*pImageSurface), nInsertPos);
-        m_xTreeView->SetEntryData(nInsertedAt, new OUString(rId));
+        if (pId)
+            m_xTreeView->SetEntryData(nInsertedAt, new OUString(*pId));
     }
 
     virtual void set_font_color(int pos, const Color& rColor) const override
@@ -2307,9 +2303,17 @@ public:
         return *pRet;
     }
 
-    virtual void insert_text(int pos, const OUString& rStr) override
+    virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems, 
bool bKeepExisting) override
     {
-        m_xComboBox->InsertEntry(rStr, pos == -1 ? COMBOBOX_APPEND : pos);
+        freeze();
+        if (!bKeepExisting)
+            clear();
+        for (const auto& rItem : rItems)
+        {
+            insert(-1, rItem.sString, rItem.sId.isEmpty() ? nullptr : 
&rItem.sId,
+                   rItem.sImage.isEmpty() ? nullptr : &rItem.sImage, nullptr);
+        }
+        thaw();
     }
 
     virtual int get_count() const override
@@ -2381,7 +2385,7 @@ public:
         m_xComboBox->RemoveEntry(pos);
     }
 
-    virtual void insert(int pos, const OUString& rId, const OUString& rStr, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
+    virtual void insert(int pos, const OUString& rStr, const OUString* pId, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos;
         sal_Int32 nInsertedAt;
@@ -2391,7 +2395,8 @@ public:
             nInsertedAt = m_xComboBox->InsertEntry(rStr, 
createImage(*pIconName), nInsertPos);
         else
             nInsertedAt = m_xComboBox->InsertEntry(rStr, 
createImage(*pImageSurface), nInsertPos);
-        m_xComboBox->SetEntryData(nInsertedAt, new OUString(rId));
+        if (pId)
+            m_xComboBox->SetEntryData(nInsertedAt, new OUString(*pId));
     }
 
     virtual bool has_entry() const override
@@ -2477,7 +2482,7 @@ public:
         m_xComboBox->RemoveEntryAt(pos);
     }
 
-    virtual void insert(int pos, const OUString& rId, const OUString& rStr, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
+    virtual void insert(int pos, const OUString& rStr, const OUString* pId, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos;
         sal_Int32 nInsertedAt;
@@ -2487,7 +2492,8 @@ public:
             nInsertedAt = m_xComboBox->InsertEntryWithImage(rStr, 
createImage(*pIconName), nInsertPos);
         else
             nInsertedAt = m_xComboBox->InsertEntryWithImage(rStr, 
createImage(*pImageSurface), nInsertPos);
-        m_xComboBox->SetEntryData(nInsertedAt, new OUString(rId));
+        if (pId)
+            m_xComboBox->SetEntryData(nInsertedAt, new OUString(*pId));
     }
 
     virtual void set_entry_text(const OUString& rText) override
diff --git a/vcl/unx/generic/print/prtsetup.cxx 
b/vcl/unx/generic/print/prtsetup.cxx
index 45efe3dc9feb..6a38db31b1d9 100644
--- a/vcl/unx/generic/print/prtsetup.cxx
+++ b/vcl/unx/generic/print/prtsetup.cxx
@@ -329,7 +329,8 @@ RTSDevicePage::RTSDevicePage(weld::Widget* pPage, 
RTSDialog* pParent)
             || int(bAutoIsPDF) == m_pParent->m_aJobData.m_nPDFDevice);
 
     OUString sStr = m_xLevelBox->get_text(0);
-    m_xLevelBox->insert(0, m_xLevelBox->get_id(0), sStr.replaceAll("%s", 
bAutoIsPDF ? m_xLevelBox->get_text(5) : m_xLevelBox->get_text(1)), nullptr, 
nullptr);
+    OUString sId = m_xLevelBox->get_id(0);
+    m_xLevelBox->insert(0, sStr.replaceAll("%s", bAutoIsPDF ? 
m_xLevelBox->get_text(5) : m_xLevelBox->get_text(1)), &sId, nullptr, nullptr);
     m_xLevelBox->remove(1);
 
     for (int i = 0; i < m_xLevelBox->get_count(); ++i)
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 71131528dd46..5930e6a42441 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3783,16 +3783,14 @@ namespace
         return found;
     }
 
-    void insert_row(GtkListStore* pListStore, int pos, const OUString& rId, 
const OUString& rText, const OUString* pIconName, VirtualDevice* pDevice)
+    void insert_row(GtkListStore* pListStore, GtkTreeIter& iter, int pos, 
const OUString* pId, const OUString& rText, const OUString* pIconName, 
VirtualDevice* pDevice)
     {
-        GtkTreeIter iter;
-        gtk_list_store_insert(pListStore, &iter, pos);
         if (!pIconName && !pDevice)
         {
-            gtk_list_store_set(pListStore, &iter,
-                    0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(),
-                    1, OUStringToOString(rId, RTL_TEXTENCODING_UTF8).getStr(),
-                    -1);
+            gtk_list_store_insert_with_values(pListStore, &iter, pos,
+                                              0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(),
+                                              1, !pId ? nullptr : 
OUStringToOString(*pId, RTL_TEXTENCODING_UTF8).getStr(),
+                                              -1);
         }
         else
         {
@@ -3818,11 +3816,11 @@ namespace
                                                
rSettings.GetUILanguageTag().getBcp47());
                 }
 
-                gtk_list_store_set(pListStore, &iter,
-                        0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(),
-                        1, OUStringToOString(rId, 
RTL_TEXTENCODING_UTF8).getStr(),
-                        2, pixbuf,
-                        -1);
+                gtk_list_store_insert_with_values(pListStore, &iter, pos,
+                                                  0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(),
+                                                  1, !pId ? nullptr : 
OUStringToOString(*pId, RTL_TEXTENCODING_UTF8).getStr(),
+                                                  2, pixbuf,
+                                                  -1);
 
                 if (pixbuf)
                     g_object_unref(pixbuf);
@@ -3842,11 +3840,11 @@ namespace
                 cairo_paint(cr);
                 cairo_destroy(cr);
 
-                gtk_list_store_set(pListStore, &iter,
-                        0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(),
-                        1, OUStringToOString(rId, 
RTL_TEXTENCODING_UTF8).getStr(),
-                        3, target,
-                        -1);
+                gtk_list_store_insert_with_values(pListStore, &iter, pos,
+                                                  0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(),
+                                                  1, !pId ? nullptr : 
OUStringToOString(*pId, RTL_TEXTENCODING_UTF8).getStr(),
+                                                  3, target,
+                                                  -1);
                 cairo_surface_destroy(target);
             }
         }
@@ -3908,19 +3906,11 @@ public:
     {
     }
 
-    virtual void insert_text(const OUString& rText, int pos) override
+    virtual void insert(int pos, const OUString& rText, const OUString* pId, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         disable_notify_events();
         GtkTreeIter iter;
-        gtk_list_store_insert(m_pListStore, &iter, pos);
-        gtk_list_store_set(m_pListStore, &iter, 0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(), -1);
-        enable_notify_events();
-    }
-
-    virtual void insert(int pos, const OUString& rId, const OUString& rText, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
-    {
-        disable_notify_events();
-        insert_row(m_pListStore, pos, rId, rText, pIconName, pImageSurface);
+        insert_row(m_pListStore, iter, pos, pId, rText, pIconName, 
pImageSurface);
         enable_notify_events();
     }
 
@@ -4799,6 +4789,7 @@ class GtkInstanceComboBox : public GtkInstanceContainer, 
public vcl::ISearchable
 {
 private:
     GtkComboBox* m_pComboBox;
+    GtkTreeModel* m_pTreeModel;
     GtkMenu* m_pMenu;
     std::unique_ptr<comphelper::string::NaturalStringSorter> m_xSorter;
     vcl::QuickSelectionEngine m_aQuickSelectionEngine;
@@ -4854,12 +4845,11 @@ private:
     OUString get(int pos, int col) const
     {
         OUString sRet;
-        GtkTreeModel *pModel = gtk_combo_box_get_model(m_pComboBox);
         GtkTreeIter iter;
-        if (gtk_tree_model_iter_nth_child(pModel, &iter, nullptr, pos))
+        if (gtk_tree_model_iter_nth_child(m_pTreeModel, &iter, nullptr, pos))
         {
             gchar* pStr;
-            gtk_tree_model_get(pModel, &iter, col, &pStr, -1);
+            gtk_tree_model_get(m_pTreeModel, &iter, col, &pStr, -1);
             sRet = OUString(pStr, pStr ? strlen(pStr) : 0, 
RTL_TEXTENCODING_UTF8);
             g_free(pStr);
         }
@@ -4868,9 +4858,8 @@ private:
 
     int find(const OUString& rStr, int col) const
     {
-        GtkTreeModel *pModel = gtk_combo_box_get_model(m_pComboBox);
         GtkTreeIter iter;
-        if (!gtk_tree_model_get_iter_first(pModel, &iter))
+        if (!gtk_tree_model_get_iter_first(m_pTreeModel, &iter))
             return -1;
 
         OString aStr(OUStringToOString(rStr, RTL_TEXTENCODING_UTF8).getStr());
@@ -4878,13 +4867,13 @@ private:
         do
         {
             gchar* pStr;
-            gtk_tree_model_get(pModel, &iter, col, &pStr, -1);
+            gtk_tree_model_get(m_pTreeModel, &iter, col, &pStr, -1);
             const bool bEqual = g_strcmp0(pStr, aStr.getStr()) == 0;
             g_free(pStr);
             if (bEqual)
                 return nRet;
             ++nRet;
-        } while (gtk_tree_model_iter_next(pModel, &iter));
+        } while (gtk_tree_model_iter_next(m_pTreeModel, &iter));
 
         return -1;
     }
@@ -4902,7 +4891,7 @@ private:
         if (gtk_entry_get_completion(pEntry))
             return;
         GtkEntryCompletion* pCompletion = gtk_entry_completion_new();
-        gtk_entry_completion_set_model(pCompletion, 
gtk_combo_box_get_model(m_pComboBox));
+        gtk_entry_completion_set_model(pCompletion, m_pTreeModel);
         gtk_entry_completion_set_text_column(pCompletion, 0);
         gtk_entry_completion_set_inline_selection(pCompletion, true);
         gtk_entry_completion_set_inline_completion(pCompletion, true);
@@ -5052,6 +5041,7 @@ public:
     GtkInstanceComboBox(GtkComboBox* pComboBox, bool bTakeOwnership)
         : GtkInstanceContainer(GTK_CONTAINER(pComboBox), bTakeOwnership)
         , m_pComboBox(pComboBox)
+        , m_pTreeModel(gtk_combo_box_get_model(m_pComboBox))
         , m_pMenu(nullptr)
         , m_aQuickSelectionEngine(*this)
         , m_bPopupActive(false)
@@ -5149,10 +5139,9 @@ public:
         if (!gtk_combo_box_get_active_iter(m_pComboBox, &iter))
             return OUString();
 
-        GtkTreeModel *pModel = gtk_combo_box_get_model(m_pComboBox);
         gint col = gtk_combo_box_get_entry_text_column(m_pComboBox);
         gchar* pStr = nullptr;
-        gtk_tree_model_get(pModel, &iter, col, &pStr, -1);
+        gtk_tree_model_get(m_pTreeModel, &iter, col, &pStr, -1);
         OUString sRet(pStr, pStr ? strlen(pStr) : 0, RTL_TEXTENCODING_UTF8);
         g_free(pStr);
 
@@ -5188,40 +5177,42 @@ public:
 #endif
     }
 
-    virtual void insert_text(int pos, const OUString& rText) override
+    virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems, 
bool bKeepExisting) override
     {
-        disable_notify_events();
+        freeze();
+        if (!bKeepExisting)
+            clear();
         GtkTreeIter iter;
-        GtkListStore* pListStore = 
GTK_LIST_STORE(gtk_combo_box_get_model(m_pComboBox));
-        gtk_list_store_insert(pListStore, &iter, pos);
-        gtk_list_store_set(pListStore, &iter, 0, OUStringToOString(rText, 
RTL_TEXTENCODING_UTF8).getStr(), -1);
-        enable_notify_events();
-        bodge_wayland_menu_not_appearing();
+        for (const auto& rItem : rItems)
+        {
+            insert_row(GTK_LIST_STORE(m_pTreeModel), iter, -1, 
rItem.sId.isEmpty() ? nullptr : &rItem.sId,
+                       rItem.sString, rItem.sImage.isEmpty() ? nullptr : 
&rItem.sImage, nullptr);
+        }
+        thaw();
     }
 
     virtual void remove(int pos) override
     {
         disable_notify_events();
         GtkTreeIter iter;
-        GtkListStore* pListStore = 
GTK_LIST_STORE(gtk_combo_box_get_model(m_pComboBox));
-        gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(pListStore), &iter, 
nullptr, pos);
-        gtk_list_store_remove(pListStore, &iter);
+        gtk_tree_model_iter_nth_child(m_pTreeModel, &iter, nullptr, pos);
+        gtk_list_store_remove(GTK_LIST_STORE(m_pTreeModel), &iter);
         enable_notify_events();
         bodge_wayland_menu_not_appearing();
     }
 
-    virtual void insert(int pos, const OUString& rId, const OUString& rText, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
+    virtual void insert(int pos, const OUString& rText, const OUString* pId, 
const OUString* pIconName, VirtualDevice* pImageSurface) override
     {
         disable_notify_events();
-        insert_row(GTK_LIST_STORE(gtk_combo_box_get_model(m_pComboBox)), pos, 
rId, rText, pIconName, pImageSurface);
+        GtkTreeIter iter;
+        insert_row(GTK_LIST_STORE(m_pTreeModel), iter, pos, pId, rText, 
pIconName, pImageSurface);
         enable_notify_events();
         bodge_wayland_menu_not_appearing();
     }
 
     virtual int get_count() const override
     {
-        GtkTreeModel *pModel = gtk_combo_box_get_model(m_pComboBox);
-        return gtk_tree_model_iter_n_children(pModel, nullptr);
+        return gtk_tree_model_iter_n_children(m_pTreeModel, nullptr);
     }
 
     virtual int find_text(const OUString& rStr) const override
@@ -5237,8 +5228,7 @@ public:
     virtual void clear() override
     {
         disable_notify_events();
-        GtkTreeModel *pModel = gtk_combo_box_get_model(m_pComboBox);
-        gtk_list_store_clear(GTK_LIST_STORE(pModel));
+        gtk_list_store_clear(GTK_LIST_STORE(m_pTreeModel));
         enable_notify_events();
         bodge_wayland_menu_not_appearing();
     }
@@ -5248,8 +5238,7 @@ public:
         m_xSorter.reset(new comphelper::string::NaturalStringSorter(
                             ::comphelper::getProcessComponentContext(),
                             
Application::GetSettings().GetUILanguageTag().getLocale()));
-        GtkTreeModel* pModel = gtk_combo_box_get_model(m_pComboBox);
-        GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(pModel);
+        GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeModel);
         gtk_tree_sortable_set_sort_func(pSortable, 0, sort_func, 
m_xSorter.get(), nullptr);
         gtk_tree_sortable_set_sort_column_id(pSortable, 0, GTK_SORT_ASCENDING);
     }
@@ -5340,24 +5329,31 @@ public:
 
     virtual void freeze() override
     {
+        disable_notify_events();
+        g_object_ref(m_pTreeModel);
         GtkInstanceContainer::freeze();
+        gtk_combo_box_set_model(m_pComboBox, nullptr);
         if (m_xSorter)
         {
-            GtkTreeModel* pModel = gtk_combo_box_get_model(m_pComboBox);
-            GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(pModel);
+            GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeModel);
             gtk_tree_sortable_set_sort_column_id(pSortable, 
GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
         }
+        enable_notify_events();
     }
 
     virtual void thaw() override
     {
+        disable_notify_events();
         if (m_xSorter)
         {
-            GtkTreeModel* pModel = gtk_combo_box_get_model(m_pComboBox);
-            GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(pModel);
+            GtkTreeSortable* pSortable = GTK_TREE_SORTABLE(m_pTreeModel);
             gtk_tree_sortable_set_sort_column_id(pSortable, 0, 
GTK_SORT_ASCENDING);
         }
+        gtk_combo_box_set_model(m_pComboBox, m_pTreeModel);
         GtkInstanceContainer::thaw();
+        g_object_unref(m_pTreeModel);
+        enable_notify_events();
+
         bodge_wayland_menu_not_appearing();
     }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to