[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - include/vcl vcl/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Mon Nov 30 17:25:57 UTC 2020


 include/vcl/salvtables.hxx    |    2 +
 include/vcl/treelist.hxx      |    1 
 vcl/source/app/salvtables.cxx |   55 +++++++++++++++++++++++++++++++++++-------
 3 files changed, 50 insertions(+), 8 deletions(-)

New commits:
commit c5e4f29fde9ed9e10dbaf1b22f9ad8ada528300b
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Sep 10 09:33:39 2020 +0100
Commit:     Szymon Kłos <szymon.klos at collabora.com>
CommitDate: Mon Nov 30 18:25:18 2020 +0100

    tdf#131581 inhibit updates during all_foreach
    
    Change-Id: I8494b4c9175e427bfb89696d49c2da7607af37ef
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102371
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106887
    Tested-by: Szymon Kłos <szymon.klos at collabora.com>
    Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>

diff --git a/include/vcl/salvtables.hxx b/include/vcl/salvtables.hxx
index 9673ef62c5b5..7e98f133251b 100644
--- a/include/vcl/salvtables.hxx
+++ b/include/vcl/salvtables.hxx
@@ -1151,6 +1151,8 @@ private:
 
     void update_checkbutton_column_width(SvTreeListEntry* pEntry);
 
+    void InvalidateModelEntry(SvTreeListEntry* pEntry);
+
     void do_set_toggle(SvTreeListEntry* pEntry, TriState eState, int col);
 
     static TriState do_get_toggle(SvTreeListEntry* pEntry, int col);
diff --git a/include/vcl/treelist.hxx b/include/vcl/treelist.hxx
index 20045cb21804..ffb359a4e8f8 100644
--- a/include/vcl/treelist.hxx
+++ b/include/vcl/treelist.hxx
@@ -133,6 +133,7 @@ public:
                         );
 
     void                EnableInvalidate( bool bEnable );
+    bool                IsEnableInvalidate() const { return mbEnableInvalidate; }
 
     // Notify all Listeners
     void                InvalidateEntry( SvTreeListEntry* );
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index b0e33be5cf6f..dd07cd7a5979 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3237,6 +3237,37 @@ int SalInstanceTreeView::to_external_model(int col) const
     return col;
 }
 
+namespace
+{
+    class UpdateGuard
+    {
+    private:
+        SvTabListBox& m_rTreeView;
+        bool m_bOrigUpdate;
+        bool m_bOrigEnableInvalidate;
+
+    public:
+        UpdateGuard(SvTabListBox& rTreeView)
+            : m_rTreeView(rTreeView)
+            , m_bOrigUpdate(m_rTreeView.IsUpdateMode())
+            , m_bOrigEnableInvalidate(m_rTreeView.GetModel()->IsEnableInvalidate())
+        {
+            if (m_bOrigUpdate)
+                m_rTreeView.SetUpdateMode(false);
+            if (m_bOrigEnableInvalidate)
+                m_rTreeView.GetModel()->EnableInvalidate(false);
+        }
+
+        ~UpdateGuard()
+        {
+            if (m_bOrigUpdate)
+                m_rTreeView.SetUpdateMode(true);
+            if (m_bOrigEnableInvalidate)
+                m_rTreeView.GetModel()->EnableInvalidate(true);
+        }
+    };
+}
+
 bool SalInstanceTreeView::IsDummyEntry(SvTreeListEntry* pEntry) const
 {
     return m_xTreeView->GetEntryText(pEntry).trim() == "<dummy>";
@@ -3337,6 +3368,13 @@ void SalInstanceTreeView::update_checkbutton_column_width(SvTreeListEntry* pEntr
     m_xTreeView->CheckBoxInserted(pEntry);
 }
 
+void SalInstanceTreeView::InvalidateModelEntry(SvTreeListEntry* pEntry)
+{
+    if (!m_xTreeView->GetModel()->IsEnableInvalidate())
+        return;
+    m_xTreeView->ModelHasEntryInvalidated(pEntry);
+}
+
 void SalInstanceTreeView::do_set_toggle(SvTreeListEntry* pEntry, TriState eState, int col)
 {
     assert(col >= 0 && static_cast<unsigned>(col) < pEntry->ItemCount());
@@ -3363,7 +3401,7 @@ void SalInstanceTreeView::do_set_toggle(SvTreeListEntry* pEntry, TriState eState
             break;
     }
 
-    m_xTreeView->ModelHasEntryInvalidated(pEntry);
+    InvalidateModelEntry(pEntry);
 }
 
 TriState SalInstanceTreeView::do_get_toggle(SvTreeListEntry* pEntry, int col)
@@ -3802,7 +3840,7 @@ void SalInstanceTreeView::set_text(SvTreeListEntry* pEntry, const OUString& rTex
         assert(dynamic_cast<SvLBoxString*>(&rItem));
         static_cast<SvLBoxString&>(rItem).SetText(rText);
     }
-    m_xTreeView->ModelHasEntryInvalidated(pEntry);
+    InvalidateModelEntry(pEntry);
 }
 
 void SalInstanceTreeView::set_text(int pos, const OUString& rText, int col)
@@ -3822,8 +3860,7 @@ void SalInstanceTreeView::set_sensitive(SvTreeListEntry* pEntry, bool bSensitive
             if (rItem.GetType() == SvLBoxItemType::String)
             {
                 rItem.Enable(bSensitive);
-                m_xTreeView->ModelHasEntryInvalidated(pEntry);
-                break;
+                InvalidateModelEntry(pEntry);
             }
         }
         return;
@@ -3835,7 +3872,7 @@ void SalInstanceTreeView::set_sensitive(SvTreeListEntry* pEntry, bool bSensitive
     SvLBoxItem& rItem = pEntry->GetItem(col);
     rItem.Enable(bSensitive);
 
-    m_xTreeView->ModelHasEntryInvalidated(pEntry);
+    InvalidateModelEntry(pEntry);
 }
 
 void SalInstanceTreeView::set_sensitive(int pos, bool bSensitive, int col)
@@ -3894,7 +3931,7 @@ void SalInstanceTreeView::set_text_emphasis(SvTreeListEntry* pEntry, bool bOn, i
     assert(dynamic_cast<SvLBoxString*>(&rItem));
     static_cast<SvLBoxString&>(rItem).Emphasize(bOn);
 
-    m_xTreeView->ModelHasEntryInvalidated(pEntry);
+    InvalidateModelEntry(pEntry);
 }
 
 void SalInstanceTreeView::set_text_emphasis(const weld::TreeIter& rIter, bool bOn, int col)
@@ -3930,7 +3967,7 @@ void SalInstanceTreeView::set_text_align(SvTreeListEntry* pEntry, double fAlign,
     assert(dynamic_cast<SvLBoxString*>(&rItem));
     static_cast<SvLBoxString&>(rItem).Align(fAlign);
 
-    m_xTreeView->ModelHasEntryInvalidated(pEntry);
+    InvalidateModelEntry(pEntry);
 }
 
 void SalInstanceTreeView::set_text_align(const weld::TreeIter& rIter, double fAlign, int col)
@@ -3995,7 +4032,7 @@ void SalInstanceTreeView::set_image(SvTreeListEntry* pEntry, const Image& rImage
     }
 
     m_xTreeView->SetEntryHeight(pEntry);
-    m_xTreeView->ModelHasEntryInvalidated(pEntry);
+    InvalidateModelEntry(pEntry);
 }
 
 void SalInstanceTreeView::set_image(int pos, const OUString& rImage, int col)
@@ -4272,6 +4309,8 @@ void SalInstanceTreeView::set_selection_mode(SelectionMode eMode)
 
 void SalInstanceTreeView::all_foreach(const std::function<bool(weld::TreeIter&)>& func)
 {
+    UpdateGuard aGuard(*m_xTreeView);
+
     SalInstanceTreeIter aVclIter(m_xTreeView->First());
     while (aVclIter.iter)
     {


More information about the Libreoffice-commits mailing list