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;
