include/vcl/weld/TreeView.hxx      |   27 ++++++---------------------
 vcl/inc/qt5/QtInstanceTreeView.hxx |    2 --
 vcl/inc/salvtables.hxx             |    4 ----
 vcl/qt5/QtInstanceTreeView.cxx     |    4 ----
 vcl/source/app/salvtables.cxx      |   15 ---------------
 vcl/source/weld/TreeView.cxx       |   21 +++++++++++++++++++++
 vcl/unx/gtk3/gtkinst.cxx           |   18 ------------------
 7 files changed, 27 insertions(+), 64 deletions(-)

New commits:
commit 8ca520cf127a37fc72ccae3c657fdba07f28dc45
Author:     Michael Weghorn <[email protected]>
AuthorDate: Mon Dec 22 22:57:00 2025 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Dec 23 10:13:03 2025 +0100

    weld: Deduplicate TreeView::is_selected implementations
    
    The variant taking an int param can be implemented using
    the variant taking a weld::TreeIter param.
    
    Do so once in the abstract weld::TreeView base class, and drop
    the toolkit-specific implementations.
    
    Also move the method declarations of both methods
    next to each other.
    
    Change-Id: I8480b43ecb190f8f10ae87c28d32466d6b602ac5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196140
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/include/vcl/weld/TreeView.hxx b/include/vcl/weld/TreeView.hxx
index 059f9dfabae8..a31de1d522b1 100644
--- a/include/vcl/weld/TreeView.hxx
+++ b/include/vcl/weld/TreeView.hxx
@@ -277,7 +277,8 @@ public:
     void scroll_to_row(int row);
     void scroll_to_row(const TreeIter& rIter);
 
-    virtual bool is_selected(int pos) const = 0;
+    bool is_selected(int pos) const;
+    virtual bool is_selected(const TreeIter& rIter) const = 0;
 
     using weld::ItemView::set_cursor;
     void set_cursor(int pos)
@@ -345,8 +346,6 @@ public:
     //visually indent this row as if it was at get_iter_depth() + nIndentLevel
     virtual void set_extra_row_indent(const TreeIter& rIter, int nIndentLevel) 
= 0;
 
-    virtual bool is_selected(const TreeIter& rIter) const = 0;
-
     virtual void move_subtree(TreeIter& rNode, const TreeIter* pNewParent, int 
nIndexInNewParent)
         = 0;
 
diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx 
b/vcl/inc/qt5/QtInstanceTreeView.hxx
index f945ef8d214d..a4a6d3ead119 100644
--- a/vcl/inc/qt5/QtInstanceTreeView.hxx
+++ b/vcl/inc/qt5/QtInstanceTreeView.hxx
@@ -54,7 +54,6 @@ public:
 
     virtual void swap(int nPos1, int nPos2) override;
     virtual std::vector<int> get_selected_rows() const override;
-    virtual bool is_selected(int nPos) const override;
     using QtInstanceItemView::do_set_cursor;
     virtual void do_set_cursor(int pos) override;
 
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index a21d801c14c4..1069c252df51 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1664,8 +1664,6 @@ public:
     using SalInstanceItemView::do_set_cursor;
     virtual void do_set_cursor(int pos) override;
 
-    virtual bool is_selected(int pos) const override;
-
     virtual std::vector<int> get_selected_rows() const override;
 
     OUString get_text(SvTreeListEntry* pEntry, int col) const;
diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx
index 8ee9fac10124..d0f5cbb4cd57 100644
--- a/vcl/qt5/QtInstanceTreeView.cxx
+++ b/vcl/qt5/QtInstanceTreeView.cxx
@@ -150,8 +150,6 @@ std::vector<int> QtInstanceTreeView::get_selected_rows() 
const
     return aSelectedRows;
 }
 
-bool QtInstanceTreeView::is_selected(int nPos) const { return 
is_selected(treeIter(nPos)); }
-
 void QtInstanceTreeView::do_set_cursor(int nPos) { 
do_set_cursor(treeIter(nPos)); }
 
 int QtInstanceTreeView::find_text(const OUString& rText) const
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index e64f78ac739e..9f7d2577beb5 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -4201,12 +4201,6 @@ void SalInstanceTreeView::do_set_cursor(int pos)
     }
 }
 
-bool SalInstanceTreeView::is_selected(int pos) const
-{
-    SvTreeListEntry* pEntry = m_xTreeView->GetEntry(nullptr, pos);
-    return m_xTreeView->IsSelected(pEntry);
-}
-
 std::vector<int> SalInstanceTreeView::get_selected_rows() const
 {
     std::vector<int> aRows;
diff --git a/vcl/source/weld/TreeView.cxx b/vcl/source/weld/TreeView.cxx
index f708516aabde..c19791de8dc1 100644
--- a/vcl/source/weld/TreeView.cxx
+++ b/vcl/source/weld/TreeView.cxx
@@ -118,6 +118,14 @@ void weld::TreeView::scroll_to_row(const TreeIter& rIter)
     do_scroll_to_row(rIter);
     enable_notify_events();
 }
+
+bool weld::TreeView::is_selected(int pos) const
+{
+    if (std::unique_ptr<weld::TreeIter> pIter = get_iterator(pos))
+        return is_selected(*pIter);
+
+    return false;
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 0d7a9b02a0ce..5bcc294881e0 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15171,13 +15171,6 @@ public:
         enable_notify_events();
     }
 
-    virtual bool is_selected(int pos) const override
-    {
-        GtkTreeIter iter;
-        gtk_tree_model_iter_nth_child(m_pTreeModel, &iter, nullptr, pos);
-        return 
gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(m_pTreeView), 
&iter);
-    }
-
     virtual std::vector<int> get_selected_rows() const override
     {
         std::vector<int> aRows;
commit 2d7a769bf845008ef10ac1e0e6e31b38ec95320d
Author:     Michael Weghorn <[email protected]>
AuthorDate: Mon Dec 22 22:51:04 2025 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Tue Dec 23 10:12:55 2025 +0100

    weld: Deduplicate TreeView::{,do_}scroll_to_row implementations
    
    The variant taking an int param can be implemented using
    the variant taking a weld::TreeIter param.
    
    Do so once in the abstract weld::TreeView base class, and drop
    the toolkit-specific implementations.
    
    Also move the method declarations of both methods
    next to each other.
    
    Change-Id: Ifbf04cd01f6ea4cbbd2dddcde32f7466407d2948
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196139
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/include/vcl/weld/TreeView.hxx b/include/vcl/weld/TreeView.hxx
index 0fc4e09195f4..059f9dfabae8 100644
--- a/include/vcl/weld/TreeView.hxx
+++ b/include/vcl/weld/TreeView.hxx
@@ -129,7 +129,6 @@ protected:
                            VirtualDevice* pImageSurface, bool 
bChildrenOnDemand, TreeIter* pRet)
         = 0;
     virtual void do_insert_separator(int pos, const OUString& rId) = 0;
-    virtual void do_scroll_to_row(int row) = 0;
     using weld::ItemView::do_set_cursor;
     virtual void do_set_cursor(int pos) = 0;
     virtual void do_scroll_to_row(const TreeIter& rIter) = 0;
@@ -273,14 +272,10 @@ public:
     void set_font_color(int pos, const Color& rColor);
     virtual void set_font_color(const TreeIter& rIter, const Color& rColor) = 
0;
 
-    // scroll to make 'row' visible, this will also expand all parent rows of 
'row' as necessary to
-    // make 'row' visible
-    void scroll_to_row(int row)
-    {
-        disable_notify_events();
-        do_scroll_to_row(row);
-        enable_notify_events();
-    }
+    // scroll to make given row visible, this will also expand all parent rows
+    // of the row as necessary to make the row visible
+    void scroll_to_row(int row);
+    void scroll_to_row(const TreeIter& rIter);
 
     virtual bool is_selected(int pos) const = 0;
 
@@ -350,15 +345,6 @@ public:
     //visually indent this row as if it was at get_iter_depth() + nIndentLevel
     virtual void set_extra_row_indent(const TreeIter& rIter, int nIndentLevel) 
= 0;
 
-    // scroll to make rIter visible, this will also expand all parent rows of 
rIter as necessary to
-    // make rIter visible
-    void scroll_to_row(const TreeIter& rIter)
-    {
-        disable_notify_events();
-        do_scroll_to_row(rIter);
-        enable_notify_events();
-    }
-
     virtual bool is_selected(const TreeIter& rIter) const = 0;
 
     virtual void move_subtree(TreeIter& rNode, const TreeIter* pNewParent, int 
nIndexInNewParent)
diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx 
b/vcl/inc/qt5/QtInstanceTreeView.hxx
index dca83bfed8fa..f945ef8d214d 100644
--- a/vcl/inc/qt5/QtInstanceTreeView.hxx
+++ b/vcl/inc/qt5/QtInstanceTreeView.hxx
@@ -54,7 +54,6 @@ public:
 
     virtual void swap(int nPos1, int nPos2) override;
     virtual std::vector<int> get_selected_rows() const override;
-    virtual void do_scroll_to_row(int nRow) override;
     virtual bool is_selected(int nPos) const override;
     using QtInstanceItemView::do_set_cursor;
     virtual void do_set_cursor(int pos) override;
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index cce28c543c31..a21d801c14c4 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1664,8 +1664,6 @@ public:
     using SalInstanceItemView::do_set_cursor;
     virtual void do_set_cursor(int pos) override;
 
-    virtual void do_scroll_to_row(int pos) override;
-
     virtual bool is_selected(int pos) const override;
 
     virtual std::vector<int> get_selected_rows() const override;
diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx
index ea75bf778516..8ee9fac10124 100644
--- a/vcl/qt5/QtInstanceTreeView.cxx
+++ b/vcl/qt5/QtInstanceTreeView.cxx
@@ -150,8 +150,6 @@ std::vector<int> QtInstanceTreeView::get_selected_rows() 
const
     return aSelectedRows;
 }
 
-void QtInstanceTreeView::do_scroll_to_row(int nRow) { 
scroll_to_row(treeIter(nRow)); }
-
 bool QtInstanceTreeView::is_selected(int nPos) const { return 
is_selected(treeIter(nPos)); }
 
 void QtInstanceTreeView::do_set_cursor(int nPos) { 
do_set_cursor(treeIter(nPos)); }
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index d3d7dcd05a3a..e64f78ac739e 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -4201,15 +4201,6 @@ void SalInstanceTreeView::do_set_cursor(int pos)
     }
 }
 
-void SalInstanceTreeView::do_scroll_to_row(int pos)
-{
-    assert(m_xTreeView->IsUpdateMode()
-           && "don't select when frozen, select after thaw. Note selection 
doesn't survive a "
-              "freeze");
-    SvTreeListEntry* pEntry = m_xTreeView->GetEntry(nullptr, pos);
-    m_xTreeView->MakeVisible(pEntry);
-}
-
 bool SalInstanceTreeView::is_selected(int pos) const
 {
     SvTreeListEntry* pEntry = m_xTreeView->GetEntry(nullptr, pos);
diff --git a/vcl/source/weld/TreeView.cxx b/vcl/source/weld/TreeView.cxx
index a405a14d5c82..f708516aabde 100644
--- a/vcl/source/weld/TreeView.cxx
+++ b/vcl/source/weld/TreeView.cxx
@@ -105,6 +105,19 @@ void weld::TreeView::set_font_color(int pos, const Color& 
rColor)
     if (std::unique_ptr<weld::TreeIter> pIter = get_iterator(pos))
         set_font_color(*pIter, rColor);
 }
+
+void weld::TreeView::scroll_to_row(int row)
+{
+    if (std::unique_ptr<weld::TreeIter> pIter = get_iterator(row))
+        scroll_to_row(*pIter);
+}
+
+void weld::TreeView::scroll_to_row(const TreeIter& rIter)
+{
+    disable_notify_events();
+    do_scroll_to_row(rIter);
+    enable_notify_events();
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 577384b19905..0d7a9b02a0ce 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15171,17 +15171,6 @@ public:
         enable_notify_events();
     }
 
-    virtual void do_scroll_to_row(int pos) override
-    {
-        assert(gtk_tree_view_get_model(m_pTreeView) && "don't select when 
frozen, select after thaw. Note selection doesn't survive a freeze");
-        disable_notify_events();
-        GtkTreePath* path = gtk_tree_path_new_from_indices(pos, -1);
-        gtk_tree_view_expand_to_path(m_pTreeView, path);
-        gtk_tree_view_scroll_to_cell(m_pTreeView, path, nullptr, true, 0, 0);
-        gtk_tree_path_free(path);
-        enable_notify_events();
-    }
-
     virtual bool is_selected(int pos) const override
     {
         GtkTreeIter iter;

Reply via email to