[Libreoffice-commits] core.git: include/vcl reportdesign/source reportdesign/uiconfig vcl/source vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Wed Dec 4 08:55:29 UTC 2019


 include/vcl/weld.hxx                                   |    2 
 reportdesign/source/ui/dlg/Navigator.cxx               |  688 +++++++----------
 reportdesign/source/ui/inc/DesignView.hxx              |    2 
 reportdesign/source/ui/inc/Navigator.hxx               |   15 
 reportdesign/source/ui/report/DesignView.cxx           |   35 
 reportdesign/uiconfig/dbreport/ui/floatingnavigator.ui |  101 ++
 reportdesign/uiconfig/dbreport/ui/navigatormenu.ui     |    2 
 vcl/source/app/salvtables.cxx                          |    6 
 vcl/unx/gtk3/gtk3gtkinst.cxx                           |    6 
 9 files changed, 433 insertions(+), 424 deletions(-)

New commits:
commit 754afe85b2ddec45987f3060066f55dda05cdb67
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue Dec 3 12:34:37 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Dec 4 09:54:36 2019 +0100

    weld ONavigator
    
    Change-Id: I0b1ae0d50fa8b4c01c36ece0fdd1c2b316ccd27b
    Reviewed-on: https://gerrit.libreoffice.org/84357
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 32720b074dec..c8eeb9ba04a0 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -868,6 +868,8 @@ public:
     */
     virtual int iter_compare(const TreeIter& a, const TreeIter& b) const = 0;
     virtual bool iter_has_child(const TreeIter& rIter) const = 0;
+    // returns the number of direct children rIter has
+    virtual int iter_n_children(const TreeIter& rIter) const = 0;
     virtual void remove(const TreeIter& rIter) = 0;
     virtual void select(const TreeIter& rIter) = 0;
     virtual void unselect(const TreeIter& rIter) = 0;
diff --git a/reportdesign/source/ui/dlg/Navigator.cxx b/reportdesign/source/ui/dlg/Navigator.cxx
index e4b968acdc18..4d8fa29179ba 100644
--- a/reportdesign/source/ui/dlg/Navigator.cxx
+++ b/reportdesign/source/ui/dlg/Navigator.cxx
@@ -41,6 +41,7 @@
 #include <comphelper/SelectionMultiplex.hxx>
 #include <vcl/treelistbox.hxx>
 #include <vcl/treelistentry.hxx>
+#include <vcl/weld.hxx>
 #include <vcl/commandevent.hxx>
 #include <svl/solar.hrc>
 #include <ReportVisitor.hxx>
@@ -50,10 +51,6 @@
 #include <memory>
 #include <algorithm>
 
-#define DROP_ACTION_TIMER_INITIAL_TICKS     10
-#define DROP_ACTION_TIMER_SCROLL_TICKS      3
-#define DROP_ACTION_TIMER_TICK_BASE         10
-
 namespace rptui
 {
 using namespace ::com::sun::star;
@@ -104,11 +101,10 @@ static OUString lcl_getName(const uno::Reference< beans::XPropertySet>& _xElemen
 
 namespace {
 
-class NavigatorTree :   public ::cppu::BaseMutex
-                    ,   public SvTreeListBox
-                    ,   public reportdesign::ITraverseReport
-                    ,   public comphelper::OSelectionChangeListener
-                    ,   public ::comphelper::OPropertyChangeListener
+class NavigatorTree : public ::cppu::BaseMutex
+                    , public reportdesign::ITraverseReport
+                    , public comphelper::OSelectionChangeListener
+                    , public ::comphelper::OPropertyChangeListener
 {
     class UserData;
     friend class UserData;
@@ -119,9 +115,9 @@ class NavigatorTree :   public ::cppu::BaseMutex
         uno::Reference< uno::XInterface >                           m_xContent;
         ::rtl::Reference< comphelper::OPropertyChangeMultiplexer>   m_pListener;
         ::rtl::Reference< comphelper::OContainerListenerAdapter>    m_pContainerListener;
-        VclPtr<NavigatorTree>                                       m_pTree;
+        NavigatorTree*                                              m_pTree;
     public:
-        UserData(NavigatorTree* _pTree,const uno::Reference<uno::XInterface>& _xContent);
+        UserData(NavigatorTree* pTree, const uno::Reference<uno::XInterface>& xContent);
         virtual ~UserData() override;
 
         const uno::Reference< uno::XInterface >& getContent() const { return m_xContent; }
@@ -138,29 +134,18 @@ class NavigatorTree :   public ::cppu::BaseMutex
         virtual void _disposing(const lang::EventObject& _rSource) override;
     };
 
-    enum DROP_ACTION        { DA_SCROLLUP, DA_SCROLLDOWN, DA_EXPANDNODE };
-    AutoTimer                                                                   m_aDropActionTimer;
-    Point                                                                       m_aTimerTriggered;      // position at which the DropTimer started
-    DROP_ACTION                                                                 m_aDropActionType;
+    std::unique_ptr<weld::TreeView>                                             m_xTreeView;
     OReportController&                                                          m_rController;
-    SvTreeListEntry*                                                                m_pMasterReport;
-    SvTreeListEntry*                                                                m_pDragedEntry;
+    std::unique_ptr<weld::TreeIter>                                             m_xMasterReport;
     ::rtl::Reference< comphelper::OPropertyChangeMultiplexer>                   m_pReportListener;
     ::rtl::Reference< comphelper::OSelectionChangeMultiplexer>                  m_pSelectionListener;
-    unsigned short                                                              m_nTimerCounter;
 
-    SvTreeListEntry* insertEntry(const OUString& _sName,SvTreeListEntry* _pParent, const OUString& rImageId, sal_uLong _nPosition,UserData* _pData);
-    void traverseSection(const uno::Reference< report::XSection>& _xSection,SvTreeListEntry* _pParent, const OUString& rImageId, sal_uLong _nPosition = TREELIST_APPEND);
-    void traverseFunctions(const uno::Reference< report::XFunctions>& _xFunctions,SvTreeListEntry* _pParent);
+    void insertEntry(const OUString& rName, weld::TreeIter* pParent, const OUString& rImageId, int nPosition, UserData* pData, weld::TreeIter& rRet);
 
-protected:
-    virtual void        Command( const CommandEvent& rEvt ) override;
-    // DragSourceHelper overridables
-    virtual void        StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override;
-    // DropTargetHelper overridables
-    virtual sal_Int8    AcceptDrop( const AcceptDropEvent& _rEvt ) override;
-    virtual sal_Int8    ExecuteDrop( const ExecuteDropEvent& _rEvt ) override;
+    void traverseSection(const uno::Reference<report::XSection>& xSection, weld::TreeIter* pParent, const OUString& rImageId, int nPosition = -1);
+    void traverseFunctions(const uno::Reference< report::XFunctions>& xFunctions, weld::TreeIter* pParent);
 
+protected:
     // OSelectionChangeListener
     virtual void _disposing(const lang::EventObject& _rSource) override;
 
@@ -173,54 +158,65 @@ protected:
     void _elementReplaced( const container::ContainerEvent& _rEvent );
 
 public:
-    NavigatorTree(vcl::Window* pParent,OReportController& _rController );
+    NavigatorTree(std::unique_ptr<weld::TreeView>, OReportController& rController);
     virtual ~NavigatorTree() override;
-    virtual void dispose() override;
 
-    DECL_LINK(OnEntrySelDesel, SvTreeListBox*, void);
-    DECL_LINK( OnDropActionTimer, Timer*, void );
+    DECL_LINK(OnEntrySelDesel, weld::TreeView&, void);
+    DECL_LINK(CommandHdl, const CommandEvent&, bool);
 
     virtual void _selectionChanged( const lang::EventObject& aEvent ) override;
 
     // ITraverseReport
-    virtual void traverseReport(const uno::Reference< report::XReportDefinition>& _xReport) override;
-    virtual void traverseReportFunctions(const uno::Reference< report::XFunctions>& _xFunctions) override;
-    virtual void traverseReportHeader(const uno::Reference< report::XSection>& _xSection) override;
-    virtual void traverseReportFooter(const uno::Reference< report::XSection>& _xSection) override;
-    virtual void traversePageHeader(const uno::Reference< report::XSection>& _xSection) override;
-    virtual void traversePageFooter(const uno::Reference< report::XSection>& _xSection) override;
-
-    virtual void traverseGroups(const uno::Reference< report::XGroups>& _xGroups) override;
-    virtual void traverseGroup(const uno::Reference< report::XGroup>& _xGroup) override;
-    virtual void traverseGroupFunctions(const uno::Reference< report::XFunctions>& _xFunctions) override;
-    virtual void traverseGroupHeader(const uno::Reference< report::XSection>& _xSection) override;
-    virtual void traverseGroupFooter(const uno::Reference< report::XSection>& _xSection) override;
-
-    virtual void traverseDetail(const uno::Reference< report::XSection>& _xSection) override;
-
-    SvTreeListEntry* find(const uno::Reference< uno::XInterface >& _xContent);
-    void removeEntry(SvTreeListEntry* _pEntry,bool _bRemove = true);
-
-    virtual Size GetOptimalSize() const override;
-private:
-    using SvTreeListBox::ExecuteDrop;
+    virtual void traverseReport(const uno::Reference< report::XReportDefinition>& xReport) override;
+    virtual void traverseReportFunctions(const uno::Reference< report::XFunctions>& xFunctions) override;
+    virtual void traverseReportHeader(const uno::Reference< report::XSection>& xSection) override;
+    virtual void traverseReportFooter(const uno::Reference< report::XSection>& xSection) override;
+    virtual void traversePageHeader(const uno::Reference< report::XSection>& xSection) override;
+    virtual void traversePageFooter(const uno::Reference< report::XSection>& xSection) override;
+
+    virtual void traverseGroups(const uno::Reference< report::XGroups>& xGroups) override;
+    virtual void traverseGroup(const uno::Reference< report::XGroup>& xGroup) override;
+    virtual void traverseGroupFunctions(const uno::Reference< report::XFunctions>& xFunctions) override;
+    virtual void traverseGroupHeader(const uno::Reference< report::XSection>& xSection) override;
+    virtual void traverseGroupFooter(const uno::Reference< report::XSection>& xSection) override;
+
+    virtual void traverseDetail(const uno::Reference< report::XSection>& xSection) override;
+
+    bool find(const uno::Reference<uno::XInterface>& xContent, weld::TreeIter& rIter);
+    void removeEntry(weld::TreeIter& rEntry, bool bRemove = true);
+
+    void grab_focus() { m_xTreeView->grab_focus(); }
+
+    void set_text(const weld::TreeIter& rIter, const OUString& rStr)
+    {
+        m_xTreeView->set_text(rIter, rStr);
+    }
+
+    void expand_row(const weld::TreeIter& rIter)
+    {
+        m_xTreeView->expand_row(rIter);
+    }
+
+    std::unique_ptr<weld::TreeIter> make_iterator() const
+    {
+        return m_xTreeView->make_iterator();
+    }
+
+    int iter_n_children(const weld::TreeIter& rIter) const
+    {
+        return m_xTreeView->iter_n_children(rIter);
+    }
 };
 
 }
 
-NavigatorTree::NavigatorTree( vcl::Window* pParent,OReportController& _rController )
-        :SvTreeListBox( pParent, WB_TABSTOP| WB_HASBUTTONS|WB_HASLINES|WB_BORDER|WB_HSCROLL|WB_HASBUTTONSATROOT )
-        ,comphelper::OSelectionChangeListener()
-        ,OPropertyChangeListener(m_aMutex)
-        ,m_aTimerTriggered(-1,-1)
-        ,m_aDropActionType( DA_SCROLLUP )
-        ,m_rController(_rController)
-        ,m_pMasterReport(nullptr)
-        ,m_pDragedEntry(nullptr)
-        ,m_nTimerCounter( DROP_ACTION_TIMER_INITIAL_TICKS )
+NavigatorTree::NavigatorTree(std::unique_ptr<weld::TreeView> xTreeView, OReportController& rController)
+    : comphelper::OSelectionChangeListener()
+    , OPropertyChangeListener(m_aMutex)
+    , m_xTreeView(std::move(xTreeView))
+    , m_rController(rController)
 {
-    set_hexpand(true);
-    set_vexpand(true);
+    m_xTreeView->set_size_request(m_xTreeView->get_approximate_digit_width() * 25, m_xTreeView->get_height_rows(18));
 
     m_pReportListener = new OPropertyChangeMultiplexer(this,m_rController.getReportDefinition().get());
     m_pReportListener->addProperty(PROPERTY_PAGEHEADERON);
@@ -230,38 +226,22 @@ NavigatorTree::NavigatorTree( vcl::Window* pParent,OReportController& _rControll
 
     m_pSelectionListener = new OSelectionChangeMultiplexer(this,&m_rController);
 
-    SetHelpId( HID_REPORT_NAVIGATOR_TREE );
-
-    SetNodeBitmaps(
-        Image(StockImage::Yes, RID_SVXBMP_COLLAPSEDNODE),
-        Image(StockImage::Yes, RID_SVXBMP_EXPANDEDNODE)
-    );
+    m_xTreeView->set_help_id(HID_REPORT_NAVIGATOR_TREE);
 
-    SetDragDropMode(DragDropMode::ALL);
-    EnableInplaceEditing( false );
-    SetSelectionMode(SelectionMode::Multiple);
-    Clear();
+    m_xTreeView->set_selection_mode(SelectionMode::Multiple);
 
-    m_aDropActionTimer.SetInvokeHandler(LINK(this, NavigatorTree, OnDropActionTimer));
-    SetSelectHdl(LINK(this, NavigatorTree, OnEntrySelDesel));
-    SetDeselectHdl(LINK(this, NavigatorTree, OnEntrySelDesel));
+    m_xTreeView->connect_changed(LINK(this, NavigatorTree, OnEntrySelDesel));
+    m_xTreeView->connect_popup_menu(LINK(this, NavigatorTree, CommandHdl));
 }
 
 NavigatorTree::~NavigatorTree()
 {
-    disposeOnce();
-}
-
-void NavigatorTree::dispose()
-{
-    SvTreeListEntry* pCurrent = First();
-    while ( pCurrent )
-    {
-        delete static_cast<UserData*>(pCurrent->GetUserData());
-        pCurrent = Next(pCurrent);
-    }
+    m_xTreeView->all_foreach([this](weld::TreeIter& rIter) {
+        UserData* pData = reinterpret_cast<UserData*>(m_xTreeView->get_id(rIter).toInt64());
+        delete pData;
+        return false;
+    });
     m_pReportListener->dispose();
-    SvTreeListBox::dispose();
 }
 
 namespace
@@ -284,69 +264,49 @@ namespace
     }
 }
 
-void NavigatorTree::Command( const CommandEvent& rEvt )
+IMPL_LINK(NavigatorTree, CommandHdl, const CommandEvent&, rEvt, bool)
 {
     bool bHandled = false;
     switch( rEvt.GetCommand())
     {
     case CommandEventId::ContextMenu:
         {
-            // the point that was clicked on
-            SvTreeListEntry* ptClickedOn = nullptr;
-            ::Point aWhere;
-            if (rEvt.IsMouseEvent())
-            {
-                aWhere = rEvt.GetMousePosPixel();
-                ptClickedOn = GetEntry(aWhere);
-                if (ptClickedOn == nullptr)
-                    break;
-                if ( !IsSelected(ptClickedOn) )
-                {
-                    SelectAll(false);
-                    Select(ptClickedOn);
-                    SetCurEntry(ptClickedOn);
-                }
-            }
-            else
-            {
-                ptClickedOn = GetCurEntry();
-                if ( !ptClickedOn )
-                    break;
-                aWhere = GetEntryPosition(ptClickedOn);
-            }
-            UserData* pData = static_cast<UserData*>(ptClickedOn->GetUserData());
+            UserData* pData = reinterpret_cast<UserData*>(m_xTreeView->get_selected_id().toInt64());
+            if (!pData)
+                break;
+
             uno::Reference< report::XFunctionsSupplier> xSupplier(pData->getContent(),uno::UNO_QUERY);
             uno::Reference< report::XFunctions> xFunctions(pData->getContent(),uno::UNO_QUERY);
             uno::Reference< report::XGroup> xGroup(pData->getContent(),uno::UNO_QUERY);
             bool bDeleteAllowed = m_rController.isEditable() && (xGroup.is() ||
                                       uno::Reference< report::XFunction>(pData->getContent(),uno::UNO_QUERY).is());
 
-            VclBuilder aBuilder(nullptr, VclBuilderContainer::getUIRootDir(), "modules/dbreport/ui/navigatormenu.ui", "");
-            VclPtr<PopupMenu> aContextMenu(aBuilder.get_menu("menu"));
+            std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xTreeView.get(), "modules/dbreport/ui/navigatormenu.ui"));
+            std::unique_ptr<weld::Menu> xContextMenu(xBuilder->weld_menu("menu"));
 
-            sal_uInt16 nCount = aContextMenu->GetItemCount();
-            for (sal_uInt16 i = 0; i < nCount; ++i)
+            const OString aIds[] = { "sorting", "page", "report", "function", "properties", "delete" };
+            for (size_t i = 0; i < SAL_N_ELEMENTS(aIds); ++i)
             {
-                if ( MenuItemType::SEPARATOR != aContextMenu->GetItemType(i))
-                {
-                    sal_uInt16 nMId = aContextMenu->GetItemId(i);
-                    sal_uInt16 nSId = mapIdent(aContextMenu->GetItemIdent(nMId));
-
-                    aContextMenu->CheckItem(nMId, m_rController.isCommandChecked(nSId));
-                    bool bEnabled = m_rController.isCommandEnabled(nSId);
-                    if (nSId == SID_RPT_NEW_FUNCTION)
-                        aContextMenu->EnableItem(nMId, m_rController.isEditable() && (xSupplier.is() || xFunctions.is()));
-                    // special condition, check for function and group
-                    else if (nSId == SID_DELETE)
-                        aContextMenu->EnableItem(nMId, bDeleteAllowed);
-                    else
-                        aContextMenu->EnableItem(nMId, bEnabled);
-                }
+                sal_uInt16 nSId = mapIdent(aIds[i]);
+
+                if (aIds[i] == "page" || aIds[i] == "report" || aIds[i] == "properties")
+                    xContextMenu->set_active(aIds[i], m_rController.isCommandChecked(nSId));
+                bool bEnabled = m_rController.isCommandEnabled(nSId);
+                if (nSId == SID_RPT_NEW_FUNCTION)
+                    xContextMenu->set_sensitive(aIds[i], m_rController.isEditable() && (xSupplier.is() || xFunctions.is()));
+                // special condition, check for function and group
+                else if (nSId == SID_DELETE)
+                    xContextMenu->set_sensitive(aIds[i], bDeleteAllowed);
+                else
+                    xContextMenu->set_sensitive(aIds[i], bEnabled);
             }
 
-            if (aContextMenu->Execute(this, aWhere))
+            // the point that was clicked on
+            ::Point aWhere(rEvt.GetMousePosPixel());
+            OString sCurItemIdent = xContextMenu->popup_at_rect(m_xTreeView.get(), tools::Rectangle(aWhere, Size(1,1)));
+            if (!sCurItemIdent.isEmpty())
             {
-                sal_uInt16 nId = mapIdent(aContextMenu->GetCurItemIdent());
+                sal_uInt16 nId = mapIdent(sCurItemIdent);
                 uno::Sequence< beans::PropertyValue> aArgs;
                 if ( nId == SID_RPT_NEW_FUNCTION )
                 {
@@ -370,115 +330,19 @@ void NavigatorTree::Command( const CommandEvent& rEvt )
         default: break;
     }
 
-    if (!bHandled)
-        SvTreeListBox::Command( rEvt );
+    return bHandled;
 }
 
-sal_Int8 NavigatorTree::AcceptDrop( const AcceptDropEvent& _rEvt )
-{
-    ::Point aDropPos = _rEvt.maPosPixel;
-    if (_rEvt.mbLeaving)
-    {
-        if (m_aDropActionTimer.IsActive())
-            m_aDropActionTimer.Stop();
-    }
-    else
-    {
-        bool bNeedTrigger = false;
-        // At the first record?
-        if ((aDropPos.Y() >= 0) && (aDropPos.Y() < GetEntryHeight()))
-        {
-            m_aDropActionType = DA_SCROLLUP;
-            bNeedTrigger = true;
-        }
-        else if ((aDropPos.Y() < GetSizePixel().Height()) && (aDropPos.Y() >= GetSizePixel().Height() - GetEntryHeight()))
-        {
-            m_aDropActionType = DA_SCROLLDOWN;
-            bNeedTrigger = true;
-        }
-        else
-        {
-            SvTreeListEntry* pDroppedOn = GetEntry(aDropPos);
-            if (pDroppedOn && (GetChildCount(pDroppedOn) > 0) && !IsExpanded(pDroppedOn))
-            {
-                m_aDropActionType = DA_EXPANDNODE;
-                bNeedTrigger = true;
-            }
-        }
-
-        if (bNeedTrigger && (m_aTimerTriggered != aDropPos))
-        {
-            // again start counting
-            m_nTimerCounter = DROP_ACTION_TIMER_INITIAL_TICKS;
-            // remember the position, because I also get AcceptDrops, if the mouse does not move
-            m_aTimerTriggered = aDropPos;
-            // start Timer
-            if (!m_aDropActionTimer.IsActive()) // Does the Timer already exists?
-            {
-                m_aDropActionTimer.SetTimeout(DROP_ACTION_TIMER_TICK_BASE);
-                m_aDropActionTimer.Start();
-            }
-        }
-        else if (!bNeedTrigger)
-            m_aDropActionTimer.Stop();
-    }
-
-    return DND_ACTION_NONE;
-}
-
-sal_Int8 NavigatorTree::ExecuteDrop( const ExecuteDropEvent& /*_rEvt*/ )
-{
-    return DND_ACTION_NONE;
-}
-
-void NavigatorTree::StartDrag( sal_Int8 /*_nAction*/, const Point& _rPosPixel )
-{
-    m_pDragedEntry = GetEntry(_rPosPixel);
-    if ( m_pDragedEntry )
-    {
-        EndSelection();
-    }
-}
-
-IMPL_LINK_NOARG(NavigatorTree, OnDropActionTimer, Timer *, void)
-{
-    if (--m_nTimerCounter > 0)
-        return;
-
-    switch ( m_aDropActionType )
-    {
-        case DA_EXPANDNODE:
-        {
-            SvTreeListEntry* pToExpand = GetEntry(m_aTimerTriggered);
-            if (pToExpand && (GetChildCount(pToExpand) > 0) &&  !IsExpanded(pToExpand))
-                Expand(pToExpand);
-            m_aDropActionTimer.Stop();
-        }
-        break;
-
-        case DA_SCROLLUP :
-            ScrollOutputArea( 1 );
-            m_nTimerCounter = DROP_ACTION_TIMER_SCROLL_TICKS;
-            break;
-
-        case DA_SCROLLDOWN :
-            ScrollOutputArea( -1 );
-            m_nTimerCounter = DROP_ACTION_TIMER_SCROLL_TICKS;
-            break;
-
-    }
-}
-
-
-IMPL_LINK_NOARG(NavigatorTree, OnEntrySelDesel, SvTreeListBox*, void)
+IMPL_LINK_NOARG(NavigatorTree, OnEntrySelDesel, weld::TreeView&, void)
 {
     if ( !m_pSelectionListener->locked() )
     {
         m_pSelectionListener->lock();
-        SvTreeListEntry* pEntry = GetCurEntry();
+        std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+        bool bEntry = m_xTreeView->get_cursor(xEntry.get());
         uno::Any aSelection;
-        if ( IsSelected(pEntry) )
-            aSelection <<= static_cast<UserData*>(pEntry->GetUserData())->getContent();
+        if (bEntry && m_xTreeView->is_selected(*xEntry))
+            aSelection <<= reinterpret_cast<UserData*>(m_xTreeView->get_id(*xEntry).toInt64())->getContent();
         m_rController.select(aSelection);
         m_pSelectionListener->unlock();
     }
@@ -491,172 +355,211 @@ void NavigatorTree::_selectionChanged( const lang::EventObject& aEvent )
     uno::Any aSec = xSelectionSupplier->getSelection();
     uno::Sequence< uno::Reference< report::XReportComponent > > aSelection;
     aSec >>= aSelection;
+    std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
     if ( !aSelection.hasElements() )
     {
         uno::Reference< uno::XInterface> xSelection(aSec,uno::UNO_QUERY);
-        SvTreeListEntry* pEntry = find(xSelection);
-        if ( pEntry && !IsSelected(pEntry) )
+        bool bEntry = find(xSelection, *xEntry);
+        if (bEntry && !m_xTreeView->is_selected(*xEntry))
         {
-            Select(pEntry);
-            SetCurEntry(pEntry);
+            m_xTreeView->select(*xEntry);
+            m_xTreeView->set_cursor(*xEntry);
         }
-        else if ( !pEntry )
-            SelectAll(false,false);
+        else if (!bEntry)
+            m_xTreeView->unselect_all();
     }
     else
     {
         for (const uno::Reference<report::XReportComponent>& rElem : std::as_const(aSelection))
         {
-            SvTreeListEntry* pEntry = find(rElem);
-            if ( pEntry && !IsSelected(pEntry) )
+            bool bEntry = find(rElem, *xEntry);
+            if (bEntry && !m_xTreeView->is_selected(*xEntry))
             {
-                Select(pEntry);
-                SetCurEntry(pEntry);
+                m_xTreeView->select(*xEntry);
+                m_xTreeView->set_cursor(*xEntry);
             }
         }
     }
     m_pSelectionListener->unlock();
 }
 
-SvTreeListEntry* NavigatorTree::insertEntry(const OUString& _sName,SvTreeListEntry* _pParent, const OUString& rImageId, sal_uLong _nPosition,UserData* _pData)
+void NavigatorTree::insertEntry(const OUString& rName, weld::TreeIter* pParent, const OUString& rImageId,
+                                int nPosition, UserData* pData, weld::TreeIter& rRet)
 {
-    SvTreeListEntry* pEntry = nullptr;
+    OUString sId = pData ? OUString::number(reinterpret_cast<sal_Int64>(pData)) : OUString();
+    m_xTreeView->insert(pParent, nPosition, &rName, &sId, nullptr, nullptr, nullptr, false, &rRet);
     if (!rImageId.isEmpty())
-    {
-        const Image aImage(StockImage::Yes, rImageId);
-        pEntry = InsertEntry(_sName,aImage,aImage,_pParent,false,_nPosition,_pData);
-    }
-    else
-        pEntry = InsertEntry(_sName,_pParent,false,_nPosition,_pData);
-    return pEntry;
+        m_xTreeView->set_image(rRet, rImageId);
 }
 
-void NavigatorTree::traverseSection(const uno::Reference< report::XSection>& _xSection,SvTreeListEntry* _pParent, const OUString& rImageId, sal_uLong _nPosition)
+void NavigatorTree::traverseSection(const uno::Reference<report::XSection>& xSection, weld::TreeIter* pParent, const OUString& rImageId, int nPosition)
 {
-    SvTreeListEntry* pSection = insertEntry(_xSection->getName(),_pParent, rImageId, _nPosition,new UserData(this,_xSection));
-    const sal_Int32 nCount = _xSection->getCount();
+    std::unique_ptr<weld::TreeIter> xSectionIter = m_xTreeView->make_iterator();
+    std::unique_ptr<weld::TreeIter> xScratch = m_xTreeView->make_iterator();
+    insertEntry(xSection->getName(), pParent, rImageId, nPosition, new UserData(this, xSection), *xSectionIter);
+    const sal_Int32 nCount = xSection->getCount();
     for (sal_Int32 i = 0; i < nCount; ++i)
     {
-        uno::Reference< report::XReportComponent> xElement(_xSection->getByIndex(i),uno::UNO_QUERY_THROW);
-        insertEntry(lcl_getName(xElement.get()),pSection,lcl_getImageId(xElement),TREELIST_APPEND,new UserData(this,xElement));
+        uno::Reference< report::XReportComponent> xElement(xSection->getByIndex(i), uno::UNO_QUERY_THROW);
+        insertEntry(lcl_getName(xElement.get()), xSectionIter.get(), lcl_getImageId(xElement), -1, new UserData(this, xElement), *xScratch);
         uno::Reference< report::XReportDefinition> xSubReport(xElement,uno::UNO_QUERY);
         if ( xSubReport.is() )
         {
-            m_pMasterReport = find(_xSection->getReportDefinition());
+            bool bMasterReport = find(xSection->getReportDefinition(), *xScratch);
+            if (!bMasterReport)
+                m_xMasterReport.reset();
+            else
+                m_xMasterReport = m_xTreeView->make_iterator(xScratch.get());
             reportdesign::OReportVisitor aSubVisitor(this);
             aSubVisitor.start(xSubReport);
         }
     }
 }
 
-void NavigatorTree::traverseFunctions(const uno::Reference< report::XFunctions>& _xFunctions,SvTreeListEntry* _pParent)
+void NavigatorTree::traverseFunctions(const uno::Reference< report::XFunctions>& xFunctions, weld::TreeIter* pParent)
 {
-    SvTreeListEntry* pFunctions = insertEntry(RptResId(RID_STR_FUNCTIONS), _pParent, RID_SVXBMP_RPT_NEW_FUNCTION, TREELIST_APPEND, new UserData(this,_xFunctions));
-    const sal_Int32 nCount = _xFunctions->getCount();
+    std::unique_ptr<weld::TreeIter> xFunctionIter = m_xTreeView->make_iterator();
+    std::unique_ptr<weld::TreeIter> xScratch = m_xTreeView->make_iterator();
+    insertEntry(RptResId(RID_STR_FUNCTIONS), pParent, RID_SVXBMP_RPT_NEW_FUNCTION, -1, new UserData(this, xFunctions), *xFunctionIter);
+    const sal_Int32 nCount = xFunctions->getCount();
     for (sal_Int32 i = 0; i< nCount; ++i)
     {
-        uno::Reference< report::XFunction> xElement(_xFunctions->getByIndex(i),uno::UNO_QUERY);
-        insertEntry(xElement->getName(),pFunctions,RID_SVXBMP_RPT_NEW_FUNCTION,TREELIST_APPEND,new UserData(this,xElement));
+        uno::Reference< report::XFunction> xElement(xFunctions->getByIndex(i),uno::UNO_QUERY);
+        insertEntry(xElement->getName(), xFunctionIter.get(), RID_SVXBMP_RPT_NEW_FUNCTION, -1, new UserData(this,xElement), *xScratch);
     }
 }
 
-SvTreeListEntry* NavigatorTree::find(const uno::Reference< uno::XInterface >& _xContent)
+bool NavigatorTree::find(const uno::Reference<uno::XInterface>& xContent, weld::TreeIter& rRet)
 {
-    SvTreeListEntry* pRet = nullptr;
-    if ( _xContent.is() )
+    bool bRet = false;
+    if (xContent.is())
     {
-        SvTreeListEntry* pCurrent = First();
-        while ( pCurrent )
-        {
-            UserData* pData = static_cast<UserData*>(pCurrent->GetUserData());
-            OSL_ENSURE(pData,"No UserData set an entry!");
-            if ( pData->getContent() == _xContent )
+        m_xTreeView->all_foreach([this, &xContent, &bRet, &rRet](weld::TreeIter& rIter) {
+            UserData* pData = reinterpret_cast<UserData*>(m_xTreeView->get_id(rIter).toInt64());
+            if (pData->getContent() == xContent)
             {
-                pRet = pCurrent;
-                break;
+                m_xTreeView->copy_iterator(rIter, rRet);
+                bRet = true;
+                return true;
             }
-            pCurrent = Next(pCurrent);
-        }
+            return false;
+        });
     }
-    return pRet;
+    return bRet;
 }
 
 // ITraverseReport
 
-void NavigatorTree::traverseReport(const uno::Reference< report::XReportDefinition>& _xReport)
+void NavigatorTree::traverseReport(const uno::Reference< report::XReportDefinition>& xReport)
 {
-    insertEntry(_xReport->getName(),m_pMasterReport,RID_SVXBMP_SELECT_REPORT,TREELIST_APPEND,new UserData(this,_xReport));
+    std::unique_ptr<weld::TreeIter> xScratch = m_xTreeView->make_iterator();
+    insertEntry(xReport->getName(), m_xMasterReport.get(), RID_SVXBMP_SELECT_REPORT,-1, new UserData(this, xReport), *xScratch);
 }
 
-void NavigatorTree::traverseReportFunctions(const uno::Reference< report::XFunctions>& _xFunctions)
+void NavigatorTree::traverseReportFunctions(const uno::Reference< report::XFunctions>& xFunctions)
 {
-    SvTreeListEntry* pReport = find(_xFunctions->getParent());
-    traverseFunctions(_xFunctions,pReport);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xFunctions->getParent(), *xReport);
+    if (!bReport)
+        xReport.reset();
+    traverseFunctions(xFunctions, xReport.get());
 }
 
-void NavigatorTree::traverseReportHeader(const uno::Reference< report::XSection>& _xSection)
+void NavigatorTree::traverseReportHeader(const uno::Reference< report::XSection>& xSection)
 {
-    SvTreeListEntry* pReport = find(_xSection->getReportDefinition());
-    traverseSection(_xSection,pReport,RID_SVXBMP_REPORTHEADERFOOTER);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xSection->getReportDefinition(), *xReport);
+    if (!bReport)
+        xReport.reset();
+    traverseSection(xSection, xReport.get(), RID_SVXBMP_REPORTHEADERFOOTER);
 }
 
-void NavigatorTree::traverseReportFooter(const uno::Reference< report::XSection>& _xSection)
+void NavigatorTree::traverseReportFooter(const uno::Reference< report::XSection>& xSection)
 {
-    SvTreeListEntry* pReport = find(_xSection->getReportDefinition());
-    traverseSection(_xSection,pReport,RID_SVXBMP_REPORTHEADERFOOTER);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xSection->getReportDefinition(), *xReport);
+    if (!bReport)
+        xReport.reset();
+    traverseSection(xSection, xReport.get(), RID_SVXBMP_REPORTHEADERFOOTER);
 }
 
-void NavigatorTree::traversePageHeader(const uno::Reference< report::XSection>& _xSection)
+void NavigatorTree::traversePageHeader(const uno::Reference< report::XSection>& xSection)
 {
-    SvTreeListEntry* pReport = find(_xSection->getReportDefinition());
-    traverseSection(_xSection,pReport,RID_SVXBMP_PAGEHEADERFOOTER);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xSection->getReportDefinition(), *xReport);
+    if (!bReport)
+        xReport.reset();
+    traverseSection(xSection, xReport.get(), RID_SVXBMP_PAGEHEADERFOOTER);
 }
 
-void NavigatorTree::traversePageFooter(const uno::Reference< report::XSection>& _xSection)
+void NavigatorTree::traversePageFooter(const uno::Reference< report::XSection>& xSection)
 {
-    SvTreeListEntry* pReport = find(_xSection->getReportDefinition());
-    traverseSection(_xSection,pReport,RID_SVXBMP_PAGEHEADERFOOTER);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xSection->getReportDefinition(), *xReport);
+    if (!bReport)
+        xReport.reset();
+    traverseSection(xSection, xReport.get(), RID_SVXBMP_PAGEHEADERFOOTER);
 }
 
-void NavigatorTree::traverseGroups(const uno::Reference< report::XGroups>& _xGroups)
+void NavigatorTree::traverseGroups(const uno::Reference< report::XGroups>& xGroups)
 {
-    SvTreeListEntry* pReport = find(_xGroups->getReportDefinition());
-    insertEntry(RptResId(RID_STR_GROUPS), pReport, RID_SVXBMP_SORTINGANDGROUPING, TREELIST_APPEND, new UserData(this,_xGroups));
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xGroups->getReportDefinition(), *xReport);
+    if (!bReport)
+        xReport.reset();
+    std::unique_ptr<weld::TreeIter> xScratch = m_xTreeView->make_iterator();
+    insertEntry(RptResId(RID_STR_GROUPS), xReport.get(), RID_SVXBMP_SORTINGANDGROUPING, -1, new UserData(this, xGroups), *xScratch);
 }
 
-void NavigatorTree::traverseGroup(const uno::Reference< report::XGroup>& _xGroup)
+void NavigatorTree::traverseGroup(const uno::Reference< report::XGroup>& xGroup)
 {
-    uno::Reference< report::XGroups> xGroups(_xGroup->getParent(),uno::UNO_QUERY);
-    SvTreeListEntry* pGroups = find(xGroups);
-    OSL_ENSURE(pGroups,"No Groups inserted so far. Why!");
-    insertEntry(_xGroup->getExpression(),pGroups,RID_SVXBMP_GROUP,rptui::getPositionInIndexAccess(xGroups.get(),_xGroup),new UserData(this,_xGroup));
+    uno::Reference< report::XGroups> xGroups(xGroup->getParent(),uno::UNO_QUERY);
+    std::unique_ptr<weld::TreeIter> xGroupsIter = m_xTreeView->make_iterator();
+    bool bGroups = find(xGroups, *xGroupsIter);
+    OSL_ENSURE(bGroups, "No Groups inserted so far. Why!");
+    if (!bGroups)
+        xGroupsIter.reset();
+    std::unique_ptr<weld::TreeIter> xScratch = m_xTreeView->make_iterator();
+    insertEntry(xGroup->getExpression(), xGroupsIter.get(), RID_SVXBMP_GROUP, rptui::getPositionInIndexAccess(xGroups.get(),xGroup), new UserData(this,xGroup), *xScratch);
 }
 
-void NavigatorTree::traverseGroupFunctions(const uno::Reference< report::XFunctions>& _xFunctions)
+void NavigatorTree::traverseGroupFunctions(const uno::Reference< report::XFunctions>& xFunctions)
 {
-    SvTreeListEntry* pGroup = find(_xFunctions->getParent());
-    traverseFunctions(_xFunctions,pGroup);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xFunctions->getParent(), *xReport);
+    if (!bReport)
+        xReport.reset();
+    traverseFunctions(xFunctions, xReport.get());
 }
 
-void NavigatorTree::traverseGroupHeader(const uno::Reference< report::XSection>& _xSection)
+void NavigatorTree::traverseGroupHeader(const uno::Reference< report::XSection>& xSection)
 {
-    SvTreeListEntry* pGroup = find(_xSection->getGroup());
-    OSL_ENSURE(pGroup,"No group found");
-    traverseSection(_xSection,pGroup,RID_SVXBMP_GROUPHEADER,1);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xSection->getGroup(), *xReport);
+    OSL_ENSURE(bReport, "No group found");
+    if (!bReport)
+        xReport.reset();
+    traverseSection(xSection, xReport.get(), RID_SVXBMP_GROUPHEADER, 1);
 }
 
-void NavigatorTree::traverseGroupFooter(const uno::Reference< report::XSection>& _xSection)
+void NavigatorTree::traverseGroupFooter(const uno::Reference< report::XSection>& xSection)
 {
-    SvTreeListEntry* pGroup = find(_xSection->getGroup());
-    OSL_ENSURE(pGroup,"No group found");
-    traverseSection(_xSection,pGroup,RID_SVXBMP_GROUPFOOTER);
+    std::unique_ptr<weld::TreeIter> xReport = m_xTreeView->make_iterator();
+    bool bReport = find(xSection->getGroup(), *xReport);
+    OSL_ENSURE(bReport, "No group found");
+    if (!bReport)
+        xReport.reset();
+    traverseSection(xSection, xReport.get(), RID_SVXBMP_GROUPFOOTER);
 }
 
-void NavigatorTree::traverseDetail(const uno::Reference< report::XSection>& _xSection)
+void NavigatorTree::traverseDetail(const uno::Reference< report::XSection>& xSection)
 {
-    uno::Reference< report::XReportDefinition> xReport = _xSection->getReportDefinition();
-    SvTreeListEntry* pParent = find(xReport);
-    traverseSection(_xSection,pParent,RID_SVXBMP_ICON_DETAIL);
+    uno::Reference< report::XReportDefinition> xReport = xSection->getReportDefinition();
+    std::unique_ptr<weld::TreeIter> xParent = m_xTreeView->make_iterator();
+    bool bParent = find(xReport, *xParent);
+    if (!bParent)
+        xParent.reset();
+    traverseSection(xSection, xParent.get(), RID_SVXBMP_ICON_DETAIL);
 }
 
 void NavigatorTree::_propertyChanged(const beans::PropertyChangeEvent& _rEvent)
@@ -668,22 +571,27 @@ void NavigatorTree::_propertyChanged(const beans::PropertyChangeEvent& _rEvent)
         _rEvent.NewValue >>= bEnabled;
         if ( bEnabled )
         {
-            SvTreeListEntry* pParent = find(xReport);
+            std::unique_ptr<weld::TreeIter> xParent = m_xTreeView->make_iterator();
+            bool bParent = find(xReport, *xParent);
+            if (!bParent)
+                xParent.reset();
             if ( _rEvent.PropertyName == PROPERTY_REPORTHEADERON )
             {
                 sal_uLong nPos = xReport->getReportHeaderOn() ? 2 : 1;
-                traverseSection(xReport->getReportHeader(),pParent,RID_SVXBMP_REPORTHEADERFOOTER,nPos);
+                traverseSection(xReport->getReportHeader(),xParent.get(),RID_SVXBMP_REPORTHEADERFOOTER,nPos);
             }
             else if ( _rEvent.PropertyName == PROPERTY_PAGEHEADERON )
             {
-                traverseSection(xReport->getPageHeader(),pParent, RID_SVXBMP_PAGEHEADERFOOTER,1);
+                traverseSection(xReport->getPageHeader(),xParent.get(), RID_SVXBMP_PAGEHEADERFOOTER,1);
             }
             else if ( _rEvent.PropertyName == PROPERTY_PAGEFOOTERON )
-                traverseSection(xReport->getPageFooter(),pParent, RID_SVXBMP_PAGEHEADERFOOTER);
+                traverseSection(xReport->getPageFooter(),xParent.get(), RID_SVXBMP_PAGEHEADERFOOTER);
             else if ( _rEvent.PropertyName == PROPERTY_REPORTFOOTERON )
             {
-                sal_uLong nPos = xReport->getPageFooterOn() ? (GetLevelChildCount(pParent) - 1) : TREELIST_APPEND;
-                traverseSection(xReport->getReportFooter(),pParent,RID_SVXBMP_REPORTHEADERFOOTER,nPos);
+                int nPos = -1;
+                if (xReport->getPageFooterOn() && xParent)
+                    nPos = m_xTreeView->iter_n_children(*xParent) - 1;
+                traverseSection(xReport->getReportFooter(),xParent.get(),RID_SVXBMP_REPORTHEADERFOOTER,nPos);
             }
         }
     }
@@ -691,7 +599,10 @@ void NavigatorTree::_propertyChanged(const beans::PropertyChangeEvent& _rEvent)
 
 void NavigatorTree::_elementInserted( const container::ContainerEvent& _rEvent )
 {
-    SvTreeListEntry* pEntry = find(_rEvent.Source);
+    std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+    bool bEntry = find(_rEvent.Source, *xEntry);
+    if (!bEntry)
+        xEntry.reset();
     uno::Reference<beans::XPropertySet> xProp(_rEvent.Element,uno::UNO_QUERY_THROW);
     OUString sName;
     uno::Reference< beans::XPropertySetInfo> xInfo = xProp->getPropertySetInfo();
@@ -713,66 +624,69 @@ void NavigatorTree::_elementInserted( const container::ContainerEvent& _rEvent )
         uno::Reference< report::XReportComponent> xElement(xProp,uno::UNO_QUERY);
         if ( xProp.is() )
             sName = lcl_getName(xProp);
-        insertEntry(sName,pEntry,(!xElement.is() ? OUString(RID_SVXBMP_RPT_NEW_FUNCTION) : lcl_getImageId(xElement)),TREELIST_APPEND,new UserData(this,xProp));
+        std::unique_ptr<weld::TreeIter> xScratch = m_xTreeView->make_iterator();
+        insertEntry(sName, xEntry.get(), (!xElement.is() ? OUString(RID_SVXBMP_RPT_NEW_FUNCTION) : lcl_getImageId(xElement)),
+                    -1, new UserData(this,xProp), *xScratch);
     }
-    if ( !IsExpanded(pEntry) )
-        Expand(pEntry);
+    if (bEntry && !m_xTreeView->get_row_expanded(*xEntry))
+        m_xTreeView->expand_row(*xEntry);
 }
 
 void NavigatorTree::_elementRemoved( const container::ContainerEvent& _rEvent )
 {
     uno::Reference<beans::XPropertySet> xProp(_rEvent.Element,uno::UNO_QUERY);
-    SvTreeListEntry* pEntry = find(xProp);
-    OSL_ENSURE(pEntry,"NavigatorTree::_elementRemoved: No Entry found!");
+    std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+    bool bEntry = find(xProp, *xEntry);
+    OSL_ENSURE(bEntry,"NavigatorTree::_elementRemoved: No Entry found!");
 
-    if (pEntry)
+    if (bEntry)
     {
-        removeEntry(pEntry);
-        Invalidate();
+        removeEntry(*xEntry);
     }
 }
 
 void NavigatorTree::_elementReplaced( const container::ContainerEvent& _rEvent )
 {
     uno::Reference<beans::XPropertySet> xProp(_rEvent.ReplacedElement,uno::UNO_QUERY);
-    SvTreeListEntry* pEntry = find(xProp);
-    if ( pEntry )
+    std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+    bool bEntry = find(xProp, *xEntry);
+    if (bEntry)
     {
-        UserData* pData = static_cast<UserData*>(pEntry->GetUserData());
+        UserData* pData = reinterpret_cast<UserData*>(m_xTreeView->get_id(*xEntry).toInt64());
         xProp.set(_rEvent.Element,uno::UNO_QUERY);
         pData->setContent(xProp);
         OUString sName;
         xProp->getPropertyValue(PROPERTY_NAME) >>= sName;
-        SetEntryText(pEntry,sName);
+        m_xTreeView->set_text(*xEntry, sName);
     }
 }
 
 void NavigatorTree::_disposing(const lang::EventObject& _rSource)
 {
-    removeEntry(find(_rSource.Source));
+    std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+    if (find(_rSource.Source, *xEntry))
+        removeEntry(*xEntry);
 }
 
-void NavigatorTree::removeEntry(SvTreeListEntry* _pEntry,bool _bRemove)
+void NavigatorTree::removeEntry(weld::TreeIter& rEntry, bool bRemove)
 {
-    if ( _pEntry )
+    std::unique_ptr<weld::TreeIter> xChild = m_xTreeView->make_iterator(&rEntry);
+    bool bChild = m_xTreeView->iter_children(*xChild);
+    while (bChild)
     {
-        SvTreeListEntry* pChild = FirstChild(_pEntry);
-        while( pChild )
-        {
-            removeEntry(pChild,false);
-            pChild = pChild->NextSibling();
-        }
-        delete static_cast<UserData*>(_pEntry->GetUserData());
-        if ( _bRemove )
-            GetModel()->Remove(_pEntry);
+        removeEntry(*xChild, false);
+        bChild = m_xTreeView->iter_next_sibling(*xChild);
     }
+    delete reinterpret_cast<UserData*>(m_xTreeView->get_id(rEntry).toInt64());
+    if (bRemove)
+        m_xTreeView->remove(rEntry);
 }
 
-NavigatorTree::UserData::UserData(NavigatorTree* _pTree,const uno::Reference<uno::XInterface>& _xContent)
+NavigatorTree::UserData::UserData(NavigatorTree* pTree,const uno::Reference<uno::XInterface>& xContent)
     : OPropertyChangeListener(m_aMutex)
     , OContainerListener(m_aMutex)
-    , m_xContent(_xContent)
-    , m_pTree(_pTree)
+    , m_xContent(xContent)
+    , m_pTree(pTree)
 {
     uno::Reference<beans::XPropertySet> xProp(m_xContent,uno::UNO_QUERY);
     if ( xProp.is() )
@@ -813,8 +727,11 @@ NavigatorTree::UserData::~UserData()
 // OPropertyChangeListener
 void NavigatorTree::UserData::_propertyChanged(const beans::PropertyChangeEvent& _rEvent)
 {
-    SvTreeListEntry* pEntry = m_pTree->find(_rEvent.Source);
-    OSL_ENSURE(pEntry,"No entry could be found! Why not!");
+    std::unique_ptr<weld::TreeIter> xEntry = m_pTree->make_iterator();
+    bool bEntry = m_pTree->find(_rEvent.Source, *xEntry);
+    OSL_ENSURE(bEntry,"No entry could be found! Why not!");
+    if (!bEntry)
+        return;
     const bool bFooterOn = (PROPERTY_FOOTERON == _rEvent.PropertyName);
     try
     {
@@ -828,7 +745,7 @@ void NavigatorTree::UserData::_propertyChanged(const beans::PropertyChangeEvent&
             {
                 pIsOn = ::std::mem_fn(&OGroupHelper::getFooterOn);
                 pMemFunSection = ::std::mem_fn(&OGroupHelper::getFooter);
-                nPos = m_pTree->GetChildCount(pEntry) - 1;
+                nPos = m_pTree->iter_n_children(*xEntry) - 1;
             }
 
             OGroupHelper aGroupHelper(xGroup);
@@ -836,19 +753,19 @@ void NavigatorTree::UserData::_propertyChanged(const beans::PropertyChangeEvent&
             {
                 if ( bFooterOn )
                     ++nPos;
-                m_pTree->traverseSection(pMemFunSection(&aGroupHelper),pEntry,bFooterOn ? OUString(RID_SVXBMP_GROUPFOOTER) : OUString(RID_SVXBMP_GROUPHEADER),nPos);
+                m_pTree->traverseSection(pMemFunSection(&aGroupHelper),xEntry.get(),bFooterOn ? OUString(RID_SVXBMP_GROUPFOOTER) : OUString(RID_SVXBMP_GROUPHEADER),nPos);
             }
         }
         else if ( PROPERTY_EXPRESSION == _rEvent.PropertyName)
         {
             OUString sNewName;
             _rEvent.NewValue >>= sNewName;
-            m_pTree->SetEntryText(pEntry,sNewName);
+            m_pTree->set_text(*xEntry, sNewName);
         }
         else if ( PROPERTY_DATAFIELD == _rEvent.PropertyName || PROPERTY_LABEL == _rEvent.PropertyName || PROPERTY_NAME == _rEvent.PropertyName )
         {
             uno::Reference<beans::XPropertySet> xProp(_rEvent.Source,uno::UNO_QUERY);
-            m_pTree->SetEntryText(pEntry,lcl_getName(xProp));
+            m_pTree->set_text(*xEntry, lcl_getName(xProp));
         }
     }
     catch(const uno::Exception &)
@@ -875,56 +792,49 @@ void NavigatorTree::UserData::_disposing(const lang::EventObject& _rSource)
     m_pTree->_disposing( _rSource );
 }
 
-Size NavigatorTree::GetOptimalSize() const
-{
-    return LogicToPixel(Size(100, 70), MapMode(MapUnit::MapAppFont));
-}
-
 class ONavigatorImpl
 {
 public:
-    ONavigatorImpl(OReportController& _rController,ONavigator* _pParent);
+    ONavigatorImpl(OReportController& rController, weld::Builder& rBuilder);
     ONavigatorImpl(const ONavigatorImpl&) = delete;
     ONavigatorImpl& operator=(const ONavigatorImpl&) = delete;
 
     uno::Reference< report::XReportDefinition>  m_xReport;
     ::rptui::OReportController&                 m_rController;
-    VclPtr<NavigatorTree>                       m_pNavigatorTree;
+    std::unique_ptr<NavigatorTree>              m_xNavigatorTree;
 };
 
-ONavigatorImpl::ONavigatorImpl(OReportController& _rController,ONavigator* _pParent)
-    :m_xReport(_rController.getReportDefinition())
-    ,m_rController(_rController)
-    ,m_pNavigatorTree(VclPtr<NavigatorTree>::Create(_pParent->get<vcl::Window>("box"),_rController))
+ONavigatorImpl::ONavigatorImpl(OReportController& rController, weld::Builder& rBuilder)
+    : m_xReport(rController.getReportDefinition())
+    , m_rController(rController)
+    , m_xNavigatorTree(std::make_unique<NavigatorTree>(rBuilder.weld_tree_view("treeview"), rController))
 {
-    reportdesign::OReportVisitor aVisitor(m_pNavigatorTree.get());
+    reportdesign::OReportVisitor aVisitor(m_xNavigatorTree.get());
     aVisitor.start(m_xReport);
-    m_pNavigatorTree->Expand(m_pNavigatorTree->find(m_xReport));
+    std::unique_ptr<weld::TreeIter> xScratch = m_xNavigatorTree->make_iterator();
+    if (m_xNavigatorTree->find(m_xReport, *xScratch))
+        m_xNavigatorTree->expand_row(*xScratch);
     lang::EventObject aEvent(m_rController);
-    m_pNavigatorTree->_selectionChanged(aEvent);
+    m_xNavigatorTree->_selectionChanged(aEvent);
 }
 
-ONavigator::ONavigator(vcl::Window* _pParent ,OReportController& _rController)
-    : FloatingWindow( _pParent, "FloatingNavigator", "modules/dbreport/ui/floatingnavigator.ui")
+ONavigator::ONavigator(weld::Window* pParent, OReportController& rController)
+    : GenericDialogController(pParent, "modules/dbreport/ui/floatingnavigator.ui", "FloatingNavigator")
 {
-    m_pImpl.reset(new ONavigatorImpl(_rController,this));
+    m_pImpl.reset(new ONavigatorImpl(rController, *m_xBuilder));
+    m_pImpl->m_xNavigatorTree->grab_focus();
 
-    m_pImpl->m_pNavigatorTree->Show();
-    m_pImpl->m_pNavigatorTree->GrabFocus();
-    Show();
+    m_xDialog->connect_toplevel_focus_changed(LINK(this, ONavigator, FocusChangeHdl));
 }
 
-void ONavigator::GetFocus()
+ONavigator::~ONavigator()
 {
-    Window::GetFocus();
-    if ( m_pImpl->m_pNavigatorTree.get() )
-        m_pImpl->m_pNavigatorTree->GrabFocus();
 }
 
-void ONavigator::dispose()
+IMPL_LINK_NOARG(ONavigator, FocusChangeHdl, weld::Widget&, void)
 {
-    m_pImpl->m_pNavigatorTree.disposeAndClear();
-    FloatingWindow::dispose();
+    if (m_xDialog->has_toplevel_focus())
+        m_pImpl->m_xNavigatorTree->grab_focus();
 }
 
 } // rptui
diff --git a/reportdesign/source/ui/inc/DesignView.hxx b/reportdesign/source/ui/inc/DesignView.hxx
index 05136a7544c3..7b78d7327cf4 100644
--- a/reportdesign/source/ui/inc/DesignView.hxx
+++ b/reportdesign/source/ui/inc/DesignView.hxx
@@ -65,7 +65,7 @@ namespace rptui
         VclPtr<PropBrw>                     m_pPropWin;
         std::shared_ptr<OAddFieldWindow>    m_xAddField;
         OSectionView*                       m_pCurrentView;
-        VclPtr<ONavigator>                  m_pReportExplorer;
+        std::shared_ptr<ONavigator>         m_xReportExplorer;
         Idle                                m_aMarkIdle;
         DlgEdMode                           m_eMode;
         sal_uInt16                          m_eActObj;
diff --git a/reportdesign/source/ui/inc/Navigator.hxx b/reportdesign/source/ui/inc/Navigator.hxx
index 43550c9f3929..5c28d240138c 100644
--- a/reportdesign/source/ui/inc/Navigator.hxx
+++ b/reportdesign/source/ui/inc/Navigator.hxx
@@ -19,24 +19,23 @@
 #ifndef INCLUDED_REPORTDESIGN_SOURCE_UI_INC_NAVIGATOR_HXX
 #define INCLUDED_REPORTDESIGN_SOURCE_UI_INC_NAVIGATOR_HXX
 
-#include <vcl/floatwin.hxx>
+#include <vcl/weld.hxx>
 #include <memory>
 namespace rptui
 {
     class OReportController;
     class ONavigatorImpl;
-    class ONavigator :  public FloatingWindow
+    class ONavigator : public weld::GenericDialogController
     {
         ::std::unique_ptr<ONavigatorImpl> m_pImpl;
         ONavigator(const ONavigator&) = delete;
         void operator =(const ONavigator&) = delete;
-    public:
-           ONavigator( vcl::Window* pParent
-                    ,OReportController& _rController);
 
-        // window
-        virtual void GetFocus() override;
-        virtual void dispose() override;
+        DECL_LINK(FocusChangeHdl, weld::Widget&, void);
+
+    public:
+        ONavigator(weld::Window* pParent, OReportController& rController);
+        ~ONavigator();
     };
 
 } // namespace rptui
diff --git a/reportdesign/source/ui/report/DesignView.cxx b/reportdesign/source/ui/report/DesignView.cxx
index 7f5df21d53a3..e20ce6663e15 100644
--- a/reportdesign/source/ui/report/DesignView.cxx
+++ b/reportdesign/source/ui/report/DesignView.cxx
@@ -91,7 +91,6 @@ ODesignView::ODesignView(   vcl::Window* pParent,
     ,m_aScrollWindow(VclPtr<rptui::OScrollWindowHelper>::Create(this))
     ,m_pPropWin(nullptr)
     ,m_pCurrentView(nullptr)
-    ,m_pReportExplorer(nullptr)
     ,m_eMode( DlgEdMode::Select )
     ,m_eActObj( OBJ_NONE )
     ,m_aGridSizeCoarse( 1000, 1000 )    // #i93595# 100TH_MM changed to grid using coarse 1 cm grid
@@ -144,12 +143,15 @@ void ODesignView::dispose()
 
         m_xAddField.reset();
     }
-    if ( m_pReportExplorer )
+    if ( m_xReportExplorer )
     {
-        SvtViewOptions aDlgOpt(EViewType::Window, OStringToOUString(m_pReportExplorer->GetHelpId(), RTL_TEXTENCODING_UTF8));
-        aDlgOpt.SetWindowState(OStringToOUString(m_pReportExplorer->GetWindowState(), RTL_TEXTENCODING_ASCII_US));
-        notifySystemWindow(this,m_pReportExplorer,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
-        m_pReportExplorer.disposeAndClear();
+        SvtViewOptions aDlgOpt(EViewType::Window, OStringToOUString(m_xReportExplorer->get_help_id(), RTL_TEXTENCODING_UTF8));
+        aDlgOpt.SetWindowState(OStringToOUString(m_xReportExplorer->getDialog()->get_window_state(WindowStateMask::All), RTL_TEXTENCODING_ASCII_US));
+
+        if (m_xReportExplorer->getDialog()->get_visible())
+            m_xReportExplorer->response(RET_CANCEL);
+
+        m_xReportExplorer.reset();
     }
 
     m_pTaskPane.disposeAndClear();
@@ -188,7 +190,7 @@ bool ODesignView::PreNotify( NotifyEvent& rNEvt )
                 return false;
             if (m_xAddField && m_xAddField->getDialog()->has_toplevel_focus())
                 return false;
-            if ( m_pReportExplorer && m_pReportExplorer->HasChildPathFocus() )
+            if ( m_xReportExplorer && m_xReportExplorer->getDialog()->has_toplevel_focus())
                 return false;
             const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
             if ( handleKeyEvent(*pKeyEvent) )
@@ -464,23 +466,24 @@ void ODesignView::showProperties(const uno::Reference< uno::XInterface>& _xRepor
 
 bool ODesignView::isReportExplorerVisible() const
 {
-    return m_pReportExplorer && m_pReportExplorer->IsVisible();
+    return m_xReportExplorer && m_xReportExplorer->getDialog()->get_visible();
 }
 
 void ODesignView::toggleReportExplorer()
 {
-    if ( !m_pReportExplorer )
+    if ( !m_xReportExplorer )
     {
         OReportController& rReportController = getController();
-        m_pReportExplorer = VclPtr<ONavigator>::Create(this,rReportController);
-        SvtViewOptions aDlgOpt(EViewType::Window, OStringToOUString(m_pReportExplorer->GetHelpId(), RTL_TEXTENCODING_UTF8));
+        m_xReportExplorer = std::make_shared<ONavigator>(GetFrameWeld(), rReportController);
+        SvtViewOptions aDlgOpt(EViewType::Window, OStringToOUString(m_xReportExplorer->get_help_id(), RTL_TEXTENCODING_UTF8));
         if ( aDlgOpt.Exists() )
-            m_pReportExplorer->SetWindowState(OUStringToOString(aDlgOpt.GetWindowState(), RTL_TEXTENCODING_ASCII_US));
-        m_pReportExplorer->AddEventListener(LINK(&rReportController,OReportController,EventLstHdl));
-        notifySystemWindow(this,m_pReportExplorer,::comphelper::mem_fun(&TaskPaneList::AddWindow));
+            m_xReportExplorer->getDialog()->set_window_state(OUStringToOString(aDlgOpt.GetWindowState(), RTL_TEXTENCODING_ASCII_US));
     }
+
+    if (!m_xReportExplorer->getDialog()->get_visible())
+        weld::DialogController::runAsync(m_xReportExplorer, [this](sal_Int32 /*nResult*/) { m_xReportExplorer.reset(); });
     else
-        m_pReportExplorer->Show(!m_pReportExplorer->IsVisible());
+        m_xReportExplorer->response(RET_CANCEL);
 }
 
 bool ODesignView::isAddFieldVisible() const
@@ -587,7 +590,7 @@ bool ODesignView::handleKeyEvent(const KeyEvent& _rEvent)
         return false;
     if (m_xAddField && m_xAddField->getDialog()->has_toplevel_focus())
         return false;
-    if ( m_pReportExplorer && m_pReportExplorer->HasChildPathFocus() )
+    if (m_xReportExplorer && m_xReportExplorer->getDialog()->has_toplevel_focus())
         return false;
     return m_aScrollWindow->handleKeyEvent(_rEvent);
 }
diff --git a/reportdesign/uiconfig/dbreport/ui/floatingnavigator.ui b/reportdesign/uiconfig/dbreport/ui/floatingnavigator.ui
index 800bb803b11e..030d87a0205c 100644
--- a/reportdesign/uiconfig/dbreport/ui/floatingnavigator.ui
+++ b/reportdesign/uiconfig/dbreport/ui/floatingnavigator.ui
@@ -1,23 +1,106 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.1 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="rpt">
   <requires lib="gtk+" version="3.18"/>
-  <object class="GtkWindow" id="FloatingNavigator">
-    <property name="visible">True</property>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name expander -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name text -->
+      <column type="gchararray"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkDialog" id="FloatingNavigator">
     <property name="can_focus">False</property>
     <property name="no_show_all">True</property>
     <property name="border_width">6</property>
     <property name="title" translatable="yes" context="floatingnavigator|FloatingNavigator">Report navigator</property>
-    <property name="type_hint">utility</property>
+    <property name="default_width">0</property>
+    <property name="default_height">0</property>
+    <property name="type_hint">dialog</property>
     <child>
-      <object class="GtkBox" id="box">
-        <property name="visible">True</property>
+      <placeholder/>
+    </child>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
         <property name="can_focus">False</property>
-        <property name="hexpand">True</property>
-        <property name="vexpand">True</property>
         <property name="orientation">vertical</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox">
+            <property name="can_focus">False</property>
+            <property name="no_show_all">True</property>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
         <child>
-          <placeholder/>
+          <object class="GtkBox" id="box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="shadow_type">in</property>
+                <child>
+                  <object class="GtkTreeView" id="treeview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
+                    <property name="model">liststore1</property>
+                    <property name="headers_visible">False</property>
+                    <property name="search_column">0</property>
+                    <property name="enable_tree_lines">True</property>
+                    <child internal-child="selection">
+                      <object class="GtkTreeSelection"/>
+                    </child>
+                    <child>
+                      <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/>
+                          <attributes>
+                            <attribute name="pixbuf">0</attribute>
+                          </attributes>
+                        </child>
+                        <child>
+                          <object class="GtkCellRendererText" id="cellrenderertext2"/>
+                          <attributes>
+                            <attribute name="text">1</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
         </child>
       </object>
     </child>
diff --git a/reportdesign/uiconfig/dbreport/ui/navigatormenu.ui b/reportdesign/uiconfig/dbreport/ui/navigatormenu.ui
index 940be456abc0..6ae04d4fd1fb 100644
--- a/reportdesign/uiconfig/dbreport/ui/navigatormenu.ui
+++ b/reportdesign/uiconfig/dbreport/ui/navigatormenu.ui
@@ -56,7 +56,7 @@
       </object>
     </child>
     <child>
-      <object class="GtkMenuItem" id="properties">
+      <object class="GtkCheckMenuItem" id="properties">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="label" translatable="yes" context="navigatormenu|properties">Properties...</property>
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 96195407f1a0..3731f365b68f 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3753,6 +3753,12 @@ public:
         return m_xTreeView->GetModel()->GetChildList(nullptr).size();
     }
 
+    virtual int iter_n_children(const weld::TreeIter& rIter) const override
+    {
+        const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter);
+        return m_xTreeView->GetModel()->GetChildList(rVclIter.iter).size();
+    }
+
     virtual void select(int pos) override
     {
         assert(m_xTreeView->IsUpdateMode() && "don't select when frozen");
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 3f7d424ee6d2..15a6981a4a8f 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -8882,6 +8882,12 @@ public:
         return gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_pTreeStore), nullptr);
     }
 
+    virtual int iter_n_children(const weld::TreeIter& rIter) const override
+    {
+        const GtkInstanceTreeIter& rGtkIter = static_cast<const GtkInstanceTreeIter&>(rIter);
+        return gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_pTreeStore), const_cast<GtkTreeIter*>(&rGtkIter.iter));
+    }
+
     virtual void select(int pos) override
     {
         assert(gtk_tree_view_get_model(m_pTreeView) && "don't select when frozen");


More information about the Libreoffice-commits mailing list