include/vcl/toolkit/treelist.hxx    |    1 
 include/vcl/toolkit/treelistbox.hxx |    4 -
 include/vcl/weld/TreeView.hxx       |    7 ++-
 vcl/inc/qt5/QtInstanceTreeView.hxx  |    2 
 vcl/inc/salvtables.hxx              |    4 -
 vcl/qt5/QtInstanceTreeView.cxx      |   31 --------------
 vcl/source/app/salvtables.cxx       |   18 --------
 vcl/source/treelist/treelist.cxx    |   23 ----------
 vcl/source/weld/TreeView.cxx        |   42 +++++++++++++++++++
 vcl/unx/gtk3/gtkinst.cxx            |   78 ------------------------------------
 10 files changed, 47 insertions(+), 163 deletions(-)

New commits:
commit bca36c302f6f568562bc4dc8ba7488dcf8ee8c45
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sun Jan 11 00:53:45 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Jan 13 19:37:05 2026 +0100

    vcl: Drop now unused SvTreeList::Prev
    
    ... and SvTreeListBox::Prev.
    
    These are no longer used after
    
        Change-Id: Ic7ac2c5e358d126d325e38740e2bd9a6fb8c063a
        Author: Michael Weghorn <[email protected]>
        Date:   Sat Jan 10 23:56:23 2026 +0100
    
            tdf#130857 weld:  Implement weld::TreeView::iter_previous in base 
class
    
    Change-Id: Ie81b60543317119f05b955e74a7ee890d8edd25e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197001
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/include/vcl/toolkit/treelist.hxx b/include/vcl/toolkit/treelist.hxx
index efe5b12a204a..e7b2f96255d4 100644
--- a/include/vcl/toolkit/treelist.hxx
+++ b/include/vcl/toolkit/treelist.hxx
@@ -142,7 +142,6 @@ public:
     sal_uInt32          GetEntryCount() const { return nEntryCount; }
     SvTreeListEntry*    First() const;
     SvTreeListEntry*    Next( SvTreeListEntry* pEntry, sal_uInt16* 
pDepth=nullptr ) const;
-    SvTreeListEntry*    Prev( SvTreeListEntry* pEntry ) const;
     SvTreeListEntry*    Last() const;
 
     SvTreeListEntry* FirstChild(const SvTreeListEntry* pParent) const;
diff --git a/include/vcl/toolkit/treelistbox.hxx 
b/include/vcl/toolkit/treelistbox.hxx
index 553490a5334b..d5123bc37bc0 100644
--- a/include/vcl/toolkit/treelistbox.hxx
+++ b/include/vcl/toolkit/treelistbox.hxx
@@ -355,10 +355,6 @@ public:
     {
          return pModel->Next(pEntry);
     }
-    SvTreeListEntry* Prev( SvTreeListEntry* pEntry ) const
-    {
-        return pModel->Prev(pEntry);
-    }
     SvTreeListEntry* Last() const
     {
         return pModel ? pModel->Last() : nullptr;
diff --git a/vcl/source/treelist/treelist.cxx b/vcl/source/treelist/treelist.cxx
index 2d695f5205fc..6f1f21bc9452 100644
--- a/vcl/source/treelist/treelist.cxx
+++ b/vcl/source/treelist/treelist.cxx
@@ -523,29 +523,6 @@ SvTreeListEntry* SvTreeList::Next( SvTreeListEntry* 
pActEntry, sal_uInt16* pDept
     return nullptr;
 }
 
-SvTreeListEntry* SvTreeList::Prev( SvTreeListEntry* pActEntry ) const
-{
-    assert(pActEntry && "Entry?");
-
-    if (SvTreeListEntry* pPrevSibling = pActEntry->PrevSibling())
-    {
-        pActEntry = pPrevSibling;
-        while (!pActEntry->m_Children.empty())
-            pActEntry = pActEntry->m_Children.back().get();
-        return pActEntry;
-    }
-    if ( pActEntry->pParent == pRootItem.get() )
-        return nullptr;
-
-    pActEntry = pActEntry->pParent;
-
-    if ( pActEntry )
-    {
-        return pActEntry;
-    }
-    return nullptr;
-}
-
 SvTreeListEntry* SvTreeList::Last() const
 {
     SvTreeListEntries* pActList = &pRootItem->m_Children;
commit 72bf50fe339c9302378e1e5ee85486e435cf800b
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sat Jan 10 23:56:23 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Jan 13 19:36:58 2026 +0100

    tdf#130857 weld: Implement weld::TreeView::iter_previous in base class
    
    This is similar to previous commit
    
        Change-Id: Ie54463f7e5fbf0cd3665ab5db416b44e87e4a037
        Author: Michael Weghorn <[email protected]>
        Date:   Sat Jan 10 23:23:56 2026 +0100
    
            tdf#130857 weld: Implement TreeView::iter_next in base class
    
    , but now for weld::TreeView::iter_previous.
    
    Change-Id: Ic7ac2c5e358d126d325e38740e2bd9a6fb8c063a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197000
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/include/vcl/weld/TreeView.hxx b/include/vcl/weld/TreeView.hxx
index 96ecf6aa48b0..e4e0c5df04f5 100644
--- a/include/vcl/weld/TreeView.hxx
+++ b/include/vcl/weld/TreeView.hxx
@@ -317,7 +317,7 @@ public:
     // set iter to point to next node, depth first, then sibling
     bool iter_next(TreeIter& rIter) const;
     // set iter to point to previous node, sibling first then depth
-    virtual bool iter_previous(TreeIter& rIter) const = 0;
+    bool iter_previous(TreeIter& rIter) const;
     // set iter to point to first child node
     bool iter_children(TreeIter& rIter) const;
     bool iter_nth_sibling(TreeIter& rIter, int nChild) const
@@ -521,6 +521,9 @@ public:
 
     using Widget::set_sensitive;
     using Widget::get_sensitive;
+
+private:
+    void last_child(weld::TreeIter& rIter, int nChildren) const;
 };
 }
 
diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx 
b/vcl/inc/qt5/QtInstanceTreeView.hxx
index 5ed584aba535..0ff27ecfd967 100644
--- a/vcl/inc/qt5/QtInstanceTreeView.hxx
+++ b/vcl/inc/qt5/QtInstanceTreeView.hxx
@@ -62,7 +62,6 @@ public:
 
     virtual void copy_iterator(const weld::TreeIter& rSource, weld::TreeIter& 
rDest) const override;
     virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override;
-    virtual bool iter_previous(weld::TreeIter& rIter) const override;
     virtual bool do_iter_children(weld::TreeIter& rIter) const override;
     virtual bool iter_parent(weld::TreeIter& rIter) const override;
     virtual int get_iter_depth(const weld::TreeIter& rIter) const override;
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index 529a2b3683e9..30f6c9d1499d 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1728,8 +1728,6 @@ public:
 
     virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override;
 
-    virtual bool iter_previous(weld::TreeIter& rIter) const override;
-
     virtual bool do_iter_children(weld::TreeIter& rIter) const override;
 
     virtual bool iter_parent(weld::TreeIter& rIter) const override;
diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx
index ed216d4bf859..1fe18cd213d4 100644
--- a/vcl/qt5/QtInstanceTreeView.cxx
+++ b/vcl/qt5/QtInstanceTreeView.cxx
@@ -204,12 +204,6 @@ bool 
QtInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const
     return true;
 }
 
-bool QtInstanceTreeView::iter_previous(weld::TreeIter&) const
-{
-    assert(false && "Not implemented yet");
-    return false;
-}
-
 bool QtInstanceTreeView::do_iter_children(weld::TreeIter& rIter) const
 {
     QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter);
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 04bc3a0d2103..e9ac8ade121a 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -4507,15 +4507,6 @@ bool 
SalInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const
     return true;
 }
 
-bool SalInstanceTreeView::iter_previous(weld::TreeIter& rIter) const
-{
-    SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
-    rVclIter.iter = m_xTreeView->Prev(rVclIter.iter);
-    if (rVclIter.iter && IsDummyEntry(rVclIter.iter))
-        return iter_previous(rVclIter);
-    return rVclIter.iter != nullptr;
-}
-
 bool SalInstanceTreeView::do_iter_children(weld::TreeIter& rIter) const
 {
     SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
diff --git a/vcl/source/weld/TreeView.cxx b/vcl/source/weld/TreeView.cxx
index 1ddd3f7792fe..944c5a97d9f0 100644
--- a/vcl/source/weld/TreeView.cxx
+++ b/vcl/source/weld/TreeView.cxx
@@ -145,6 +145,30 @@ bool weld::TreeView::iter_next(TreeIter& rIter) const
     return false;
 }
 
+void weld::TreeView::last_child(weld::TreeIter& rIter, int nChildren) const
+{
+    iter_nth_child(rIter, nChildren - 1);
+    nChildren = iter_n_children(rIter);
+    if (nChildren)
+        last_child(rIter, nChildren);
+}
+
+bool weld::TreeView::iter_previous(weld::TreeIter& rIter) const
+{
+    if (iter_previous_sibling(rIter))
+    {
+        // Move down level(s) until we find the level where the last node 
exists.
+        const int nChildren = iter_n_children(rIter);
+        if (!nChildren)
+            return true;
+        last_child(rIter, nChildren);
+        return true;
+    }
+
+    // Move up level
+    return iter_parent(rIter);
+}
+
 bool weld::TreeView::iter_children(TreeIter& rIter) const
 {
     if (get_children_on_demand(rIter))
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 791b7e4d37e4..cf498e9338d4 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15606,43 +15606,6 @@ public:
         return true;
     }
 
-    virtual bool iter_previous(weld::TreeIter& rIter) const override
-    {
-        bool ret = false;
-        GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
-        GtkTreeIter iter = rGtkIter.iter;
-        GtkTreeIter tmp = iter;
-        if (gtk_tree_model_iter_previous(m_pTreeModel, &tmp))
-        {
-            // Move down level(s) until we find the level where the last node 
exists.
-            int nChildren = gtk_tree_model_iter_n_children(m_pTreeModel, &tmp);
-            if (!nChildren)
-                rGtkIter.iter = tmp;
-            else
-                last_child(m_pTreeModel, &rGtkIter.iter, &tmp, nChildren);
-            ret = true;
-        }
-        else
-        {
-            // Move up level
-            if (gtk_tree_model_iter_parent(m_pTreeModel, &tmp, &iter))
-            {
-                rGtkIter.iter = tmp;
-                ret = true;
-            }
-        }
-
-        if (ret)
-        {
-            //on-demand dummy entry doesn't count
-            if (get_text(rGtkIter, -1) == "<dummy>")
-                return iter_previous(rGtkIter);
-            return true;
-        }
-
-        return false;
-    }
-
     virtual bool do_iter_children(weld::TreeIter& rIter) const override
     {
         GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
commit e8741ecd289d8f5fb878e191e65ab5c9ff7f78ca
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sat Jan 10 23:23:56 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Jan 13 19:36:50 2026 +0100

    tdf#130857 weld: Implement TreeView::iter_next in base class
    
    Instead of having a purely virtual
    weld::TreeView::iter_next that needs to be implemented
    separately in each of the toolkit-specific subclasses,
    implement the logic right in the base class.
    
    This implementation is mostly based on the GTK implementation
    in GtkInstanceTreeView that is now dropped.
    
    This also aligns the implementation to no longer set the
    passed iterator to a new value if no next item exists, see
    also
    
        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.
    
    This also means that it's now no longer necessary
    for each of the implementations to manually filter
    out dummy entries:
    weld::TreeView::iter_children already returns false
    for entries with on-demand children enabled.
    For siblings and parents, that check seems to have
    been unnecessary anyway, because the iter passed as
    a param should always be a non-dummy one, which also means
    that its parent and siblings are no dummy entries either.
    
    This commit also prepares for implementing support for
    on-demand children in QtInstanceTreeView in an upcoming
    commit in the future.
    
    Change-Id: Ie54463f7e5fbf0cd3665ab5db416b44e87e4a037
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196999
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/include/vcl/weld/TreeView.hxx b/include/vcl/weld/TreeView.hxx
index 6fb8b9ed8031..96ecf6aa48b0 100644
--- a/include/vcl/weld/TreeView.hxx
+++ b/include/vcl/weld/TreeView.hxx
@@ -315,7 +315,7 @@ public:
     // set iter to point to previous node at the current level
     virtual bool iter_previous_sibling(TreeIter& rIter) const = 0;
     // set iter to point to next node, depth first, then sibling
-    virtual bool iter_next(TreeIter& rIter) const = 0;
+    bool iter_next(TreeIter& rIter) const;
     // set iter to point to previous node, sibling first then depth
     virtual bool iter_previous(TreeIter& rIter) const = 0;
     // set iter to point to first child node
diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx 
b/vcl/inc/qt5/QtInstanceTreeView.hxx
index f7b6dcbaf15e..5ed584aba535 100644
--- a/vcl/inc/qt5/QtInstanceTreeView.hxx
+++ b/vcl/inc/qt5/QtInstanceTreeView.hxx
@@ -62,7 +62,6 @@ public:
 
     virtual void copy_iterator(const weld::TreeIter& rSource, weld::TreeIter& 
rDest) const override;
     virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override;
-    virtual bool iter_next(weld::TreeIter& rIter) const override;
     virtual bool iter_previous(weld::TreeIter& rIter) const override;
     virtual bool do_iter_children(weld::TreeIter& rIter) const override;
     virtual bool iter_parent(weld::TreeIter& rIter) const override;
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index 10bda5c0cee1..529a2b3683e9 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1728,8 +1728,6 @@ public:
 
     virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override;
 
-    virtual bool iter_next(weld::TreeIter& rIter) const override;
-
     virtual bool iter_previous(weld::TreeIter& rIter) const override;
 
     virtual bool do_iter_children(weld::TreeIter& rIter) const override;
diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx
index c2e1f250216f..ed216d4bf859 100644
--- a/vcl/qt5/QtInstanceTreeView.cxx
+++ b/vcl/qt5/QtInstanceTreeView.cxx
@@ -204,31 +204,6 @@ bool 
QtInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const
     return true;
 }
 
-bool QtInstanceTreeView::iter_next(weld::TreeIter& rIter) const
-{
-    QtInstanceTreeIter& rQtIter = static_cast<QtInstanceTreeIter&>(rIter);
-    QModelIndex aIndex = rQtIter.modelIndex();
-    if (m_pModel->hasChildren(aIndex))
-    {
-        rQtIter.setModelIndex(modelIndex(0, 0, aIndex));
-        return true;
-    }
-
-    while (aIndex.isValid())
-    {
-        const QModelIndex aSiblingIndex = m_pModel->sibling(aIndex.row() + 1, 
0, aIndex);
-        if (aSiblingIndex.isValid())
-        {
-            rQtIter.setModelIndex(aSiblingIndex);
-            return true;
-        }
-
-        aIndex = aIndex.parent();
-    }
-
-    return false;
-}
-
 bool QtInstanceTreeView::iter_previous(weld::TreeIter&) const
 {
     assert(false && "Not implemented yet");
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 114022150c83..04bc3a0d2103 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -4507,15 +4507,6 @@ bool 
SalInstanceTreeView::iter_previous_sibling(weld::TreeIter& rIter) const
     return true;
 }
 
-bool SalInstanceTreeView::iter_next(weld::TreeIter& rIter) const
-{
-    SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
-    rVclIter.iter = m_xTreeView->Next(rVclIter.iter);
-    if (rVclIter.iter && IsDummyEntry(rVclIter.iter))
-        return iter_next(rVclIter);
-    return rVclIter.iter != nullptr;
-}
-
 bool SalInstanceTreeView::iter_previous(weld::TreeIter& rIter) const
 {
     SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter);
diff --git a/vcl/source/weld/TreeView.cxx b/vcl/source/weld/TreeView.cxx
index 2e2ce98baaa8..1ddd3f7792fe 100644
--- a/vcl/source/weld/TreeView.cxx
+++ b/vcl/source/weld/TreeView.cxx
@@ -127,6 +127,24 @@ bool weld::TreeView::is_selected(int pos) const
     return false;
 }
 
+bool weld::TreeView::iter_next(TreeIter& rIter) const
+{
+    if (iter_children(rIter))
+        return true;
+
+    if (iter_next_sibling(rIter))
+        return true;
+
+    // Move up level(s) until we find the level where the next node exists.
+    while (iter_parent(rIter))
+    {
+        if (iter_next_sibling(rIter))
+            return true;
+    }
+
+    return false;
+}
+
 bool weld::TreeView::iter_children(TreeIter& rIter) const
 {
     if (get_children_on_demand(rIter))
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 36abafa309a2..791b7e4d37e4 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15606,47 +15606,6 @@ public:
         return true;
     }
 
-    virtual bool iter_next(weld::TreeIter& rIter) const override
-    {
-        GtkInstanceTreeIter& rGtkIter = 
static_cast<GtkInstanceTreeIter&>(rIter);
-        GtkTreeIter tmp;
-        GtkTreeIter iter = rGtkIter.iter;
-
-        bool ret = gtk_tree_model_iter_children(m_pTreeModel, &tmp, &iter);
-        rGtkIter.iter = tmp;
-        if (ret)
-        {
-            //on-demand dummy entry doesn't count
-            if (get_text(rGtkIter, -1) == "<dummy>")
-                return iter_next(rGtkIter);
-            return true;
-        }
-
-        tmp = iter;
-        if (gtk_tree_model_iter_next(m_pTreeModel, &tmp))
-        {
-            rGtkIter.iter = tmp;
-            //on-demand dummy entry doesn't count
-            if (get_text(rGtkIter, -1) == "<dummy>")
-                return iter_next(rGtkIter);
-            return true;
-        }
-        // Move up level(s) until we find the level where the next node exists.
-        while (gtk_tree_model_iter_parent(m_pTreeModel, &tmp, &iter))
-        {
-            iter = tmp;
-            if (gtk_tree_model_iter_next(m_pTreeModel, &tmp))
-            {
-                rGtkIter.iter = tmp;
-                //on-demand dummy entry doesn't count
-                if (get_text(rGtkIter, -1) == "<dummy>")
-                    return iter_next(rGtkIter);
-                return true;
-            }
-        }
-        return false;
-    }
-
     virtual bool iter_previous(weld::TreeIter& rIter) const override
     {
         bool ret = false;

Reply via email to