vcl/qt5/QtInstanceItemView.cxx |   11 +++++++--
 vcl/qt5/QtInstanceTreeView.cxx |   18 ++++++++++------
 vcl/source/app/salvtables.cxx  |   40 ++++++++++++++++++++++++++---------
 vcl/unx/gtk3/gtkinst.cxx       |   46 ++++++++++++++++++++++++++++++++---------
 4 files changed, 87 insertions(+), 28 deletions(-)

New commits:
commit 1105df8305f777d8acf5b85c17503659a3eeb618
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sat Jan 10 23:00:39 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Jan 13 19:36:18 2026 +0100

    tdf#130857 weld: Only update iter in ItemView::get_iter_first if valid
    
    In weld::ItemView::get_iter_first, only set the passed
    iterator to a new value if at least one item actually exists.
    Otherwise leave it unchanged. See
    
        Change-Id: Idb2144cce43845ddf21279581ea72f91ca38a72d
        Author: Michael Weghorn <[email protected]>
        Date:   Sat Jan 10 22:39:40 2026 +0100
    
            tdf#130857 weld: Only update iter in 
TreeView::iter_{children,parent} if valid
    
    for more background/context.
    
    Change-Id: Ia8537fe94644f76190cad6af044015185cac7018
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196998
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/vcl/qt5/QtInstanceItemView.cxx b/vcl/qt5/QtInstanceItemView.cxx
index e17096387957..924156b154b5 100644
--- a/vcl/qt5/QtInstanceItemView.cxx
+++ b/vcl/qt5/QtInstanceItemView.cxx
@@ -26,8 +26,11 @@ bool QtInstanceItemView::get_iter_first(weld::TreeIter& 
rIter) const
 {
     QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter);
     const QModelIndex aIndex = modelIndex(0);
+    if (!aIndex.isValid())
+        return false;
+
     rQtIter.setModelIndex(aIndex);
-    return aIndex.isValid();
+    return true;
 }
 
 bool QtInstanceItemView::iter_next_sibling(weld::TreeIter& rIter) const
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 1d8b817964d9..a6c9e738b309 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3523,8 +3523,12 @@ SalInstanceItemView::make_iterator(const weld::TreeIter* 
pOrig) const
 bool SalInstanceItemView::get_iter_first(weld::TreeIter& rIter) const
 {
     SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
-    rVclIter.iter = m_pTreeListBox->GetEntry(0);
-    return rVclIter.iter != nullptr;
+    SvTreeListEntry* pFirst = m_pTreeListBox->GetEntry(0);
+    if (!pFirst)
+        return false;
+
+    rVclIter.iter = pFirst;
+    return true;
 }
 
 bool SalInstanceItemView::iter_next_sibling(weld::TreeIter& rIter) const
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 43031f98132e..36abafa309a2 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15576,7 +15576,12 @@ public:
     virtual bool get_iter_first(weld::TreeIter& rIter) const override
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
-        return gtk_tree_model_get_iter_first(m_pTreeModel, &rGtkIter.iter);
+        GtkTreeIter aFirstIter;
+        if (!gtk_tree_model_get_iter_first(m_pTreeModel, &aFirstIter))
+            return false;
+
+        rGtkIter.iter = aFirstIter;
+        return true;
     }
 
     virtual bool iter_next_sibling(weld::TreeIter& rIter) const override
@@ -16941,7 +16946,12 @@ public:
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
         GtkTreeModel *pModel = GTK_TREE_MODEL(m_pTreeStore);
-        return gtk_tree_model_get_iter_first(pModel, &rGtkIter.iter);
+        GtkTreeIter aFirstIter;
+        if (!gtk_tree_model_get_iter_first(pModel, &aFirstIter))
+            return false;
+
+        rGtkIter.iter = aFirstIter;
+        return true;
     }
 
     virtual bool iter_next_sibling(weld::TreeIter& rIter) const override
commit eae0dc849d06f4ca2408a591ddc16f7bfdd7ef38
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sat Jan 10 22:55:48 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Jan 13 19:36:10 2026 +0100

    tdf#130857 weld: Only update iter in iter_{next,previous}_sibling if valid
    
    In weld::TreeView::iter_previous_sibling and
    weld::ItemView::iter_next_sibling, only set the passed
    iterator to a new value if a sibling actually exists.
    Otherwise leave it unchanged. See
    
        Change-Id: Idb2144cce43845ddf21279581ea72f91ca38a72d
        Author: Michael Weghorn <[email protected]>
        Date:   Sat Jan 10 22:39:40 2026 +0100
    
            tdf#130857 weld: Only update iter in 
TreeView::iter_{children,parent} if valid
    
    for more background/context.
    
    Change-Id: I04137c9545e5026f2b28a8da3dd8b53937754d8d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196997
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/qt5/QtInstanceItemView.cxx b/vcl/qt5/QtInstanceItemView.cxx
index fdcd928a87a3..e17096387957 100644
--- a/vcl/qt5/QtInstanceItemView.cxx
+++ b/vcl/qt5/QtInstanceItemView.cxx
@@ -35,9 +35,11 @@ bool QtInstanceItemView::iter_next_sibling(weld::TreeIter& 
rIter) const
     QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter);
     const QModelIndex aIndex = rQtIter.modelIndex();
     const QModelIndex aSiblingIndex = m_rModel.sibling(aIndex.row() + 1, 0, 
aIndex);
-    rQtIter.setModelIndex(aSiblingIndex);
+    if (!aSiblingIndex.isValid())
+        return false;
 
-    return aSiblingIndex.isValid();
+    rQtIter.setModelIndex(aSiblingIndex);
+    return true;
 }
 
 int QtInstanceItemView::get_iter_index_in_parent(const weld::TreeIter& rIter) 
const
diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx
index 2d5bbe583373..c2e1f250216f 100644
--- a/vcl/qt5/QtInstanceTreeView.cxx
+++ b/vcl/qt5/QtInstanceTreeView.cxx
@@ -197,9 +197,11 @@ bool 
QtInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const
     QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter);
     const QModelIndex aIndex = rQtIter.modelIndex();
     const QModelIndex aSiblingIndex = m_pModel->sibling(aIndex.row() - 1, 0, 
aIndex);
-    rQtIter.setModelIndex(aSiblingIndex);
+    if (!aSiblingIndex.isValid())
+        return false;
 
-    return aSiblingIndex.isValid();
+    rQtIter.setModelIndex(aSiblingIndex);
+    return true;
 }
 
 bool QtInstanceTreeView::iter_next(weld::TreeIter& rIter) const
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 8d91d711170b..1d8b817964d9 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3530,8 +3530,12 @@ bool SalInstanceItemView::get_iter_first(weld::TreeIter& 
rIter) const
 bool SalInstanceItemView::iter_next_sibling(weld::TreeIter& rIter) const
 {
     SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
-    rVclIter.iter = rVclIter.iter->NextSibling();
-    return rVclIter.iter != nullptr;
+    SvTreeListEntry* pSibling = rVclIter.iter->NextSibling();
+    if (!pSibling)
+        return false;
+
+    rVclIter.iter = pSibling;
+    return true;
 }
 
 int SalInstanceItemView::get_iter_index_in_parent(const weld::TreeIter& rIter) 
const
@@ -4491,8 +4495,12 @@ bool 
SalInstanceTreeView::get_iter_abs_pos(weld::TreeIter& rIter, int nAbsPos) c
 bool SalInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const
 {
     SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
-    rVclIter.iter = rVclIter.iter->PrevSibling();
-    return rVclIter.iter != nullptr;
+    SvTreeListEntry* pSibling = rVclIter.iter->PrevSibling();
+    if (!pSibling)
+        return false;
+
+    rVclIter.iter = pSibling;
+    return true;
 }
 
 bool SalInstanceTreeView::iter_next(weld::TreeIter& rIter) const
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 8f616eeceb26..43031f98132e 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15582,13 +15582,23 @@ public:
     virtual bool iter_next_sibling(weld::TreeIter& rIter) const override
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
-        return gtk_tree_model_iter_next(m_pTreeModel, &rGtkIter.iter);
+        GtkTreeIter aTmpIter = rGtkIter.iter;
+        if (!gtk_tree_model_iter_next(m_pTreeModel, &aTmpIter))
+            return false;
+
+        rGtkIter.iter = aTmpIter;
+        return true;
     }
 
     virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
-        return gtk_tree_model_iter_previous(m_pTreeModel, &rGtkIter.iter);
+        GtkTreeIter aTmpIter = rGtkIter.iter;
+        if (!gtk_tree_model_iter_previous(m_pTreeModel, &aTmpIter))
+            return false;
+
+        rGtkIter.iter = aTmpIter;
+        return true;
     }
 
     virtual bool iter_next(weld::TreeIter& rIter) const override
@@ -16938,7 +16948,12 @@ public:
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
         GtkTreeModel* pModel = GTK_TREE_MODEL(m_pTreeStore);
-        return gtk_tree_model_iter_next(pModel, &rGtkIter.iter);
+        GtkTreeIter aTmpIter = rGtkIter.iter;
+        if (!gtk_tree_model_iter_next(pModel, &aTmpIter))
+            return false;
+
+        rGtkIter.iter = aTmpIter;
+        return true;
     }
 
     virtual int get_iter_index_in_parent(const weld::TreeIter& rIter) const 
override
commit 58c1a55bdad3bd06a829be585d31ff8b45181b47
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sat Jan 10 22:39:40 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Jan 13 19:36:03 2026 +0100

    tdf#130857 weld: Only update iter in TreeView::iter_{children,parent} if 
valid
    
    In weld::TreeView::iter_children and weld::TreeView::iter_parent,
    only set the passed iterator to a new value if
    a parent/child actually exists.
    Otherwise leave it unchanged.
    
    This prepares for implementing weld::TreeView::iter_next
    directly in the base class instead of separately in each of
    the toolkit-specific implementations.
    
    The following similar methods will also be adjusted
    accordingly in upcoming commits for consistency:
    
    * ItemView::iter_next_sibling
    * TreeView::iter_previous_sibling
    * weld::ItemView::get_iter_first
    
    Change-Id: Idb2144cce43845ddf21279581ea72f91ca38a72d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196996
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx
index e59ef68c67f1..2d5bbe583373 100644
--- a/vcl/qt5/QtInstanceTreeView.cxx
+++ b/vcl/qt5/QtInstanceTreeView.cxx
@@ -237,18 +237,22 @@ bool QtInstanceTreeView::do_iter_children(weld::TreeIter& 
rIter) const
 {
     QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter);
     const QModelIndex aChildIndex = m_pModel->index(0, 0, 
rQtIter.modelIndex());
-    rQtIter.setModelIndex(aChildIndex);
+    if (!aChildIndex.isValid())
+        return false;
 
-    return aChildIndex.isValid();
+    rQtIter.setModelIndex(aChildIndex);
+    return true;
 }
 
 bool QtInstanceTreeView::iter_parent(weld::TreeIter& rIter) const
 {
     QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter);
     const QModelIndex aParentIndex = rQtIter.modelIndex().parent();
-    rQtIter.setModelIndex(aParentIndex);
+    if (!aParentIndex.isValid())
+        return false;
 
-    return aParentIndex.isValid();
+    rQtIter.setModelIndex(aParentIndex);
+    return true;
 }
 
 int QtInstanceTreeView::get_iter_depth(const weld::TreeIter& rIter) const
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index c59762ec6c9e..8d91d711170b 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -4516,15 +4516,23 @@ bool SalInstanceTreeView::iter_previous(weld::TreeIter& 
rIter) const
 bool SalInstanceTreeView::do_iter_children(weld::TreeIter& rIter) const
 {
     SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
-    rVclIter.iter = m_xTreeView->FirstChild(rVclIter.iter);
-    return rVclIter.iter != nullptr;
+    SvTreeListEntry* pChild = m_xTreeView->FirstChild(rVclIter.iter);
+    if (!pChild)
+        return false;
+
+    rVclIter.iter = pChild;
+    return true;
 }
 
 bool SalInstanceTreeView::iter_parent(weld::TreeIter& rIter) const
 {
     SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
-    rVclIter.iter = m_xTreeView->GetParent(rVclIter.iter);
-    return rVclIter.iter != nullptr;
+    SvTreeListEntry* pParent = m_xTreeView->GetParent(rVclIter.iter);
+    if (!pParent)
+        return false;
+
+    rVclIter.iter = pParent;
+    return true;
 }
 
 void SalInstanceTreeView::do_select(const weld::TreeIter& rIter)
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 6ee98ef27d36..8f616eeceb26 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15673,18 +15673,21 @@ public:
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
         GtkTreeIter tmp;
-        bool ret = gtk_tree_model_iter_children(m_pTreeModel, &tmp, 
&rGtkIter.iter);
+        if (!gtk_tree_model_iter_children(m_pTreeModel, &tmp, &rGtkIter.iter))
+            return false;
         rGtkIter.iter = tmp;
-        return ret;
+        return true;
     }
 
     virtual bool iter_parent(weld::TreeIter& rIter) const override
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
         GtkTreeIter tmp;
-        bool ret = gtk_tree_model_iter_parent(m_pTreeModel, &tmp, 
&rGtkIter.iter);
+        if (!gtk_tree_model_iter_parent(m_pTreeModel, &tmp, &rGtkIter.iter))
+            return false;
+
         rGtkIter.iter = tmp;
-        return ret;
+        return true;
     }
 
     virtual void do_remove(const weld::TreeIter& rIter) override

Reply via email to