[Libreoffice-commits] core.git: include/sfx2 sc/source sd/source sfx2/source sw/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu Mar 11 09:08:39 UTC 2021


 include/sfx2/navigat.hxx                  |   28 +++++--------
 sc/source/ui/app/scdll.cxx                |    3 -
 sc/source/ui/inc/navipi.hxx               |   17 ++-----
 sc/source/ui/navipi/navipi.cxx            |   41 ++++++++++++++-----
 sd/source/ui/app/sddll.cxx                |    4 -
 sd/source/ui/dlg/NavigatorChildWindow.cxx |   51 ++++++++++++++++-------
 sd/source/ui/inc/NavigatorChildWindow.hxx |   17 ++-----
 sd/source/ui/inc/navigatr.hxx             |   21 ++++++++-
 sd/source/ui/view/drviews4.cxx            |    2 
 sd/source/ui/view/drviewsd.cxx            |    2 
 sfx2/source/appl/appreg.cxx               |    1 
 sfx2/source/dialog/navigat.cxx            |   28 ++++---------
 sw/source/uibase/app/swmodule.cxx         |    3 -
 sw/source/uibase/inc/navipi.hxx           |   17 ++-----
 sw/source/uibase/utlui/navipi.cxx         |   64 +++++++++++++++---------------
 15 files changed, 165 insertions(+), 134 deletions(-)

New commits:
commit 001cf630f14109b4200b218161418350562713fa
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue Mar 9 15:51:53 2021 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Mar 11 10:07:57 2021 +0100

    register navigator individually in each module that it exists in
    
    instead of globally. This makes the navigators the same
    as everything else and easier to deal with.
    
    Change-Id: I882612e73d36485b84161a2d3fbc1188f734c0fb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112244
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/sfx2/navigat.hxx b/include/sfx2/navigat.hxx
index 29b7c84f41c6..f5fc9acb3fd7 100644
--- a/include/sfx2/navigat.hxx
+++ b/include/sfx2/navigat.hxx
@@ -23,30 +23,24 @@
 #include <sfx2/childwin.hxx>
 #include <sfx2/dockwin.hxx>
 
-class SfxNavigatorWrapper final : public SfxChildWindow
+class SFX2_DLLPUBLIC SfxNavigatorWrapper : public SfxChildWindow
 {
-
+protected:
+    void Initialize(SfxChildWinInfo* pInfo);
 public:
-                        SfxNavigatorWrapper( vcl::Window* pParent ,
-                                                sal_uInt16 nId ,
-                                                SfxBindings* pBindings ,
-                                                SfxChildWinInfo* pInfo );
-
-                        SFX_DECL_CHILDWINDOW(SfxNavigatorWrapper);
+    SfxNavigatorWrapper( vcl::Window* pParent ,
+                            sal_uInt16 nId ,
+                            SfxBindings* pBindings ,
+                            SfxChildWinInfo* pInfo );
 };
 
-class SFX2_DLLPUBLIC SfxNavigator final : public SfxDockingWindow
+class SFX2_DLLPUBLIC SfxNavigator : public SfxDockingWindow
 {
-    SfxChildWindow*     pWrapper;
-
 public:
-                        SfxNavigator( SfxBindings* pBindings ,
-                            SfxChildWindow* pChildWin ,
-                            vcl::Window* pParent ,
-                            WinBits nBits );
+    SfxNavigator(SfxBindings* pBindings, SfxChildWindow* pChildWin,
+                 vcl::Window* pParent);
 
-    virtual void        Resize() override;
-    virtual bool        Close() override;
+    virtual void Resize() override;
 };
 
 #endif
diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx
index 56d5e106e042..548ae028853a 100644
--- a/sc/source/ui/app/scdll.cxx
+++ b/sc/source/ui/app/scdll.cxx
@@ -177,7 +177,6 @@ void ScDLL::Init()
     // Child Windows
 
     ScInputWindowWrapper        ::RegisterChildWindow(true, pMod, SfxChildWindowFlags::TASK|SfxChildWindowFlags::FORCEDOCK);
-    ScNavigatorDialogWrapper    ::RegisterChildWindowContext(static_cast<sal_uInt16>(ScTabViewShell::GetInterfaceId()), pMod);
     ScSolverDlgWrapper          ::RegisterChildWindow(false, pMod);
     ScOptSolverDlgWrapper       ::RegisterChildWindow(false, pMod);
     ScXMLSourceDlgWrapper       ::RegisterChildWindow(false, pMod);
@@ -225,6 +224,8 @@ void ScDLL::Init()
     sc::SearchResultsDlgWrapper::RegisterChildWindow(false, pMod);
     ScCondFormatDlgWrapper::RegisterChildWindow(false, pMod);
 
+    ScNavigatorWrapper::RegisterChildWindow(false, pMod, SfxChildWindowFlags::NEVERHIDE);
+
     // Add 3DObject Factory
     E3dObjFactory();
 
diff --git a/sc/source/ui/inc/navipi.hxx b/sc/source/ui/inc/navipi.hxx
index fae782112f7c..37f6bffffbb1 100644
--- a/sc/source/ui/inc/navipi.hxx
+++ b/sc/source/ui/inc/navipi.hxx
@@ -24,6 +24,7 @@
 #include <vcl/idle.hxx>
 #include <svl/lstner.hxx>
 #include <sfx2/childwin.hxx>
+#include <sfx2/navigat.hxx>
 #include <sfx2/sidebar/PanelLayout.hxx>
 #include "content.hxx"
 
@@ -85,8 +86,8 @@ private:
 
 class ScNavigatorDlg : public PanelLayout, public SfxListener
 {
+friend class ScNavigatorWin;
 friend class ScNavigatorControllerItem;
-friend class ScNavigatorDialogWrapper;
 friend class ScContentTree;
 
 private:
@@ -179,18 +180,12 @@ public:
     virtual void StateChanged(StateChangedType nStateChange) override;
 };
 
-class ScNavigatorDialogWrapper: public SfxChildWindowContext
+class ScNavigatorWrapper final : public SfxNavigatorWrapper
 {
 public:
-            ScNavigatorDialogWrapper( vcl::Window*           pParent,
-                                      sal_uInt16            nId,
-                                      SfxBindings*      pBindings,
-                                      SfxChildWinInfo*  pInfo );
-
-    SFX_DECL_CHILDWINDOWCONTEXT(ScNavigatorDialogWrapper)
-
-private:
-    VclPtr<ScNavigatorDlg> pNavigator;
+    ScNavigatorWrapper(vcl::Window *pParent, sal_uInt16 nId,
+                       SfxBindings* pBindings, SfxChildWinInfo* pInfo);
+    SFX_DECL_CHILDWINDOW(ScNavigatorWrapper);
 };
 
 #endif // INCLUDED_SC_SOURCE_UI_INC_NAVIPI_HXX
diff --git a/sc/source/ui/navipi/navipi.cxx b/sc/source/ui/navipi/navipi.cxx
index eda7cc08fb4d..5d813e172033 100644
--- a/sc/source/ui/navipi/navipi.cxx
+++ b/sc/source/ui/navipi/navipi.cxx
@@ -309,18 +309,29 @@ ScNavigatorSettings::ScNavigatorSettings()
     maExpandedVec.fill(false);
 }
 
-SFX_IMPL_CHILDWINDOWCONTEXT( ScNavigatorDialogWrapper, SID_NAVIGATOR )
+class ScNavigatorWin : public SfxNavigator
+{
+private:
+    VclPtr<ScNavigatorDlg> pNavigator;
+public:
+    ScNavigatorWin(SfxBindings* _pBindings, SfxChildWindow* pMgr, vcl::Window* pParent);
+    virtual void dispose() override
+    {
+        pNavigator.disposeAndClear();
+        SfxNavigator::dispose();
+    }
+    virtual ~ScNavigatorWin() override
+    {
+        disposeOnce();
+    }
+};
 
-ScNavigatorDialogWrapper::ScNavigatorDialogWrapper(vcl::Window* pParent,
-                                                   sal_uInt16 nId,
-                                                   SfxBindings* pBind,
-                                                   SAL_UNUSED_PARAMETER SfxChildWinInfo* /* pInfo */)
-    : SfxChildWindowContext(nId)
+ScNavigatorWin::ScNavigatorWin(SfxBindings* _pBindings, SfxChildWindow* _pMgr, vcl::Window* _pParent)
+    : SfxNavigator(_pBindings, _pMgr, _pParent)
 {
-    pNavigator = VclPtr<ScNavigatorDlg>::Create(pBind, pParent);
-    if (SfxNavigator* pNav = dynamic_cast<SfxNavigator*>(pParent))
-        pNav->SetMinOutputSizePixel(pNavigator->GetOptimalSize());
-    SetWindow(pNavigator);
+    pNavigator = VclPtr<ScNavigatorDlg>::Create(_pBindings, this);
+    pNavigator->Show();
+    SetMinOutputSizePixel(pNavigator->GetOptimalSize());
 }
 
 ScNavigatorDlg::ScNavigatorDlg(SfxBindings* pB, vcl::Window* pParent)
@@ -936,4 +947,14 @@ void ScNavigatorDlg::EndOfDataArea()
     }
 }
 
+SFX_IMPL_DOCKINGWINDOW(ScNavigatorWrapper, SID_NAVIGATOR);
+
+ScNavigatorWrapper::ScNavigatorWrapper(vcl::Window *_pParent, sal_uInt16 nId,
+                                       SfxBindings* pBindings, SfxChildWinInfo* pInfo)
+    : SfxNavigatorWrapper(_pParent, nId, pBindings, pInfo)
+{
+    SetWindow(VclPtr<ScNavigatorWin>::Create(pBindings, this, _pParent));
+    Initialize(pInfo);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx
index 828ab885e9dd..cbcd201095d3 100644
--- a/sd/source/ui/app/sddll.cxx
+++ b/sd/source/ui/app/sddll.cxx
@@ -148,8 +148,6 @@ void SdDLL::RegisterControllers(SdModule* pMod)
     SdTbxCtlGlueEscDir::RegisterControl( SID_GLUE_ESCDIR, pMod );
 
     ::sd::AnimationChildWindow::RegisterChildWindow(false, pMod);
-    ::sd::NavigatorChildWindow::RegisterChildWindowContext( static_cast<sal_uInt16>(::sd::DrawViewShell::GetInterfaceId()), pMod );
-    ::sd::NavigatorChildWindow::RegisterChildWindowContext( static_cast<sal_uInt16>(::sd::GraphicViewShell::GetInterfaceId()), pMod );
 
     Svx3DChildWindow::RegisterChildWindow(false, pMod);
     SvxFontWorkChildWindow::RegisterChildWindow(false, pMod);
@@ -169,6 +167,8 @@ void SdDLL::RegisterControllers(SdModule* pMod)
     ::sfx2::sidebar::SidebarChildWindow::RegisterChildWindow(false, pMod);
     DevelopmentToolChildWindow::RegisterChildWindow(false, pMod);
 
+    ::sd::SdNavigatorWrapper::RegisterChildWindow(false, pMod, SfxChildWindowFlags::NEVERHIDE);
+
     SvxFillToolBoxControl::RegisterControl(0, pMod);
     SvxLineWidthToolBoxControl::RegisterControl(0, pMod);
 
diff --git a/sd/source/ui/dlg/NavigatorChildWindow.cxx b/sd/source/ui/dlg/NavigatorChildWindow.cxx
index 1773734dd64c..804a7ccad262 100644
--- a/sd/source/ui/dlg/NavigatorChildWindow.cxx
+++ b/sd/source/ui/dlg/NavigatorChildWindow.cxx
@@ -22,14 +22,11 @@
 #include <app.hrc>
 #include <sfx2/bindings.hxx>
 #include <sfx2/dispatch.hxx>
-#include <sfx2/navigat.hxx>
 #include <sfx2/sfxsids.hrc>
 #include <svl/eitem.hxx>
 
 namespace sd {
 
-SFX_IMPL_CHILDWINDOWCONTEXT(NavigatorChildWindow, SID_NAVIGATOR)
-
 static void RequestNavigatorUpdate (SfxBindings const * pBindings)
 {
     if (pBindings != nullptr
@@ -43,23 +40,47 @@ static void RequestNavigatorUpdate (SfxBindings const * pBindings)
     }
 }
 
-NavigatorChildWindow::NavigatorChildWindow (
-    vcl::Window* pParent,
-    sal_uInt16 nId,
-    SfxBindings* pBindings,
-    SfxChildWinInfo* )
-    : SfxChildWindowContext( nId )
+SdNavigatorFloat::SdNavigatorFloat(SfxBindings* _pBindings, SfxChildWindow* _pMgr, vcl::Window* _pParent)
+    : SfxNavigator(_pBindings, _pMgr, _pParent)
 {
-    VclPtr<SdNavigatorWin> pNavWin = VclPtr<SdNavigatorWin>::Create(
-        pParent, pBindings);
+    pNavWin = VclPtr<SdNavigatorWin>::Create(this, _pBindings);
+    pNavWin->Show();
 
     pNavWin->SetUpdateRequestFunctor(
-        [pBindings] () { return RequestNavigatorUpdate(pBindings); });
+        [_pBindings] () { return RequestNavigatorUpdate(_pBindings); });
+
+    SetMinOutputSizePixel(pNavWin->GetOptimalSize());
+}
+
+void SdNavigatorFloat::InitTreeLB(const SdDrawDocument* pDoc)
+{
+    pNavWin->InitTreeLB(pDoc);
+}
+
+void SdNavigatorFloat::FreshTree(const SdDrawDocument* pDoc)
+{
+    pNavWin->FreshTree(pDoc);
+}
+
+void SdNavigatorFloat::dispose()
+{
+    pNavWin.disposeAndClear();
+    SfxNavigator::dispose();
+}
 
-    if (SfxNavigator* pNav = dynamic_cast<SfxNavigator*>(pParent))
-        pNav->SetMinOutputSizePixel(pNavWin->GetOptimalSize());
+SdNavigatorFloat::~SdNavigatorFloat()
+{
+    disposeOnce();
+}
 
-    SetWindow( pNavWin );
+SFX_IMPL_DOCKINGWINDOW(SdNavigatorWrapper, SID_NAVIGATOR);
+
+SdNavigatorWrapper::SdNavigatorWrapper(vcl::Window *_pParent, sal_uInt16 nId,
+                                       SfxBindings* pBindings, SfxChildWinInfo* pInfo)
+    : SfxNavigatorWrapper(_pParent, nId, pBindings, pInfo)
+{
+    SetWindow(VclPtr<SdNavigatorFloat>::Create(pBindings, this, _pParent));
+    Initialize(pInfo);
 }
 
 } // end of namespace sd
diff --git a/sd/source/ui/inc/NavigatorChildWindow.hxx b/sd/source/ui/inc/NavigatorChildWindow.hxx
index 4654c23a0ef6..4199cab677ba 100644
--- a/sd/source/ui/inc/NavigatorChildWindow.hxx
+++ b/sd/source/ui/inc/NavigatorChildWindow.hxx
@@ -20,26 +20,19 @@
 #pragma once
 
 #include <sfx2/childwin.hxx>
+#include <sfx2/navigat.hxx>
 
 namespace vcl { class Window; }
 class SfxBindings;
 
 namespace sd {
 
-/**
- * Derivative of SfxChildWindowContext as "container" for navigator
- */
-class NavigatorChildWindow
-    : public SfxChildWindowContext
+class SdNavigatorWrapper final : public SfxNavigatorWrapper
 {
 public:
-    NavigatorChildWindow (
-        vcl::Window*,
-        sal_uInt16,
-        SfxBindings*,
-        SfxChildWinInfo*);
-
-    SFX_DECL_CHILDWINDOWCONTEXT(NavigatorChildWindow)
+    SdNavigatorWrapper(vcl::Window *pParent, sal_uInt16 nId,
+                       SfxBindings* pBindings, SfxChildWinInfo* pInfo);
+    SFX_DECL_CHILDWINDOW(SdNavigatorWrapper);
 };
 
 } // end of namespace sd
diff --git a/sd/source/ui/inc/navigatr.hxx b/sd/source/ui/inc/navigatr.hxx
index e43175600d24..ece000c7371e 100644
--- a/sd/source/ui/inc/navigatr.hxx
+++ b/sd/source/ui/inc/navigatr.hxx
@@ -22,6 +22,7 @@
 
 #include <sfx2/ctrlitem.hxx>
 #include <sfx2/sidebar/PanelLayout.hxx>
+#include <sfx2/navigat.hxx>
 #include "sdtreelb.hxx"
 #include <pres.hxx>
 
@@ -30,7 +31,7 @@ namespace vcl { class Window; }
 
 namespace sd {
 class DrawDocShell;
-class NavigatorChildWindow;
+class SdNavigatorFloat;
 }
 class Menu;
 class SdNavigatorControllerItem;
@@ -77,6 +78,22 @@ private:
     ::sd::DrawDocShell* mpDocShell;
 };
 
+namespace sd {
+
+class SdNavigatorFloat : public SfxNavigator
+{
+private:
+    VclPtr<SdNavigatorWin> pNavWin;
+public:
+    SdNavigatorFloat(SfxBindings* _pBindings, SfxChildWindow* pMgr, vcl::Window* pParent);
+    void InitTreeLB(const SdDrawDocument* pDoc);
+    void FreshTree(const SdDrawDocument* pDoc);
+    virtual void dispose() override;
+    virtual ~SdNavigatorFloat() override;
+};
+
+}
+
 class SD_DLLPUBLIC SdNavigatorWin : public PanelLayout
 {
 public:
@@ -103,7 +120,7 @@ public:
     SdPageObjsTLV&              GetObjects();
 
 private:
-    friend class ::sd::NavigatorChildWindow;
+    friend class SdNavigatorFloat;
     friend class SdNavigatorControllerItem;
     friend class SdPageNameControllerItem;
 
diff --git a/sd/source/ui/view/drviews4.cxx b/sd/source/ui/view/drviews4.cxx
index 74844b847d73..fa8d9672e2d5 100644
--- a/sd/source/ui/view/drviews4.cxx
+++ b/sd/source/ui/view/drviews4.cxx
@@ -271,7 +271,7 @@ void DrawViewShell::FreshNavigatrTree()
     SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( SID_NAVIGATOR );
     if( pWindow )
     {
-        SdNavigatorWin* pNavWin = static_cast<SdNavigatorWin*>( pWindow->GetContextWindow( SD_MOD() ) );
+        SdNavigatorFloat* pNavWin = static_cast<SdNavigatorFloat*>( pWindow->GetWindow() );
         if( pNavWin )
             pNavWin->FreshTree( GetDoc() );
     }
diff --git a/sd/source/ui/view/drviewsd.cxx b/sd/source/ui/view/drviewsd.cxx
index 879051bc4c1f..763ae13eac91 100644
--- a/sd/source/ui/view/drviewsd.cxx
+++ b/sd/source/ui/view/drviewsd.cxx
@@ -57,7 +57,7 @@ void DrawViewShell::ExecNavigatorWin( SfxRequest& rReq )
             SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( SID_NAVIGATOR );
             if( pWindow )
             {
-                SdNavigatorWin* pNavWin = static_cast<SdNavigatorWin*>( pWindow->GetContextWindow( SD_MOD() ) );
+                SdNavigatorFloat* pNavWin = static_cast<SdNavigatorFloat*>(pWindow->GetWindow());
                 if( pNavWin )
                     pNavWin->InitTreeLB( GetDoc() );
             }
diff --git a/sfx2/source/appl/appreg.cxx b/sfx2/source/appl/appreg.cxx
index 4e74737d3aad..6c9810cbf02c 100644
--- a/sfx2/source/appl/appreg.cxx
+++ b/sfx2/source/appl/appreg.cxx
@@ -47,7 +47,6 @@ void SfxApplication::Registrations_Impl()
 
     // ChildWindows
     SfxRecordingFloatWrapper_Impl::RegisterChildWindow();
-    SfxNavigatorWrapper::RegisterChildWindow( false, nullptr, SfxChildWindowFlags::NEVERHIDE );
     SfxPartChildWnd_Impl::RegisterChildWindow();
     SfxDockingWrapper::RegisterChildWindow();
     SfxInfoBarContainerChild::RegisterChildWindow( true, nullptr, SfxChildWindowFlags::NEVERHIDE );
diff --git a/sfx2/source/dialog/navigat.cxx b/sfx2/source/dialog/navigat.cxx
index 0d52109d5c86..1487bcbcc8f3 100644
--- a/sfx2/source/dialog/navigat.cxx
+++ b/sfx2/source/dialog/navigat.cxx
@@ -24,20 +24,20 @@
 #include <sfx2/sfxsids.hrc>
 #include <sfx2/strings.hrc>
 #include <sfx2/sfxresid.hxx>
+#include <vcl/layout.hxx>
 #include <helpids.h>
 #include <tools/debug.hxx>
 
-SFX_IMPL_DOCKINGWINDOW( SfxNavigatorWrapper , SID_NAVIGATOR );
-
 SfxNavigatorWrapper::SfxNavigatorWrapper( vcl::Window* pParentWnd ,
                                                 sal_uInt16 nId ,
-                                                SfxBindings* pBindings ,
-                                                SfxChildWinInfo* pInfo )
+                                                SfxBindings* /*pBindings*/ ,
+                                                SfxChildWinInfo* /*pInfo*/ )
                     : SfxChildWindow( pParentWnd , nId )
 {
-    SetWindow( VclPtr<SfxNavigator>::Create( pBindings, this, pParentWnd,
-        WB_STDDOCKWIN | WB_CLIPCHILDREN | WB_SIZEABLE | WB_3DLOOK ) );
+}
 
+void SfxNavigatorWrapper::Initialize(SfxChildWinInfo* pInfo)
+{
     GetWindow()->SetHelpId ( HID_NAVIGATOR_WINDOW );
     GetWindow()->SetOutputSizePixel( Size( 270, 240 ) );
 
@@ -47,13 +47,11 @@ SfxNavigatorWrapper::SfxNavigatorWrapper( vcl::Window* pParentWnd ,
 
 SfxNavigator::SfxNavigator( SfxBindings* pBind ,
                             SfxChildWindow* pChildWin ,
-                            vcl::Window* pParent ,
-                            WinBits nBits )
+                            vcl::Window* pParent )
                         : SfxDockingWindow( pBind ,
                                             pChildWin ,
                                             pParent ,
-                                            nBits )
-                        , pWrapper( pChildWin )
+                                            WB_STDDOCKWIN | WB_CLIPCHILDREN | WB_SIZEABLE | WB_3DLOOK )
 {
     SetText(SfxResId(STR_SID_NAVIGATOR));
 }
@@ -61,14 +59,8 @@ SfxNavigator::SfxNavigator( SfxBindings* pBind ,
 void SfxNavigator::Resize()
 {
     SfxDockingWindow::Resize();
-    if ( pWrapper->GetContextWindow() )
-        pWrapper->GetContextWindow()->SetSizePixel( GetOutputSizePixel() );
-}
-
-bool SfxNavigator::Close()
-{
-    DBG_ASSERT( GetChildWindow_Impl()->GetContext_Impl(), "No Context!" );
-    return SfxDockingWindow::Close();
+    if (vcl::Window *pChild = GetWindow(GetWindowType::FirstChild))
+        VclContainer::setLayoutAllocation(*pChild, Point(0, 0), GetSizePixel());
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/app/swmodule.cxx b/sw/source/uibase/app/swmodule.cxx
index d07ca6aa59aa..f8e5c016db90 100644
--- a/sw/source/uibase/app/swmodule.cxx
+++ b/sw/source/uibase/app/swmodule.cxx
@@ -295,7 +295,6 @@ void SwDLL::RegisterControls()
     SwFieldDlgWrapper::RegisterChildWindow( false, pMod );
     SwFieldDataOnlyDlgWrapper::RegisterChildWindow( false, pMod );
     SvxContourDlgChildWindow::RegisterChildWindow( false, pMod );
-    SwNavigationChild::RegisterChildWindowContext( pMod );
     SwInputChild::RegisterChildWindow( false, pMod, SfxChildWindowFlags::FORCEDOCK );
     SwRedlineAcceptChild::RegisterChildWindow( false, pMod );
     SwSyncChildWin::RegisterChildWindow( true, pMod );
@@ -324,6 +323,8 @@ void SwDLL::RegisterControls()
 
     ::sfx2::sidebar::SidebarChildWindow::RegisterChildWindow(false, pMod);
 
+    SwNavigatorWrapper::RegisterChildWindow(false, pMod, SfxChildWindowFlags::NEVERHIDE);
+
     SwJumpToSpecificPageControl::RegisterControl(SID_JUMP_TO_SPECIFIC_PAGE, pMod);
 }
 
diff --git a/sw/source/uibase/inc/navipi.hxx b/sw/source/uibase/inc/navipi.hxx
index 8f0dd968f37f..0b0d0134a811 100644
--- a/sw/source/uibase/inc/navipi.hxx
+++ b/sw/source/uibase/inc/navipi.hxx
@@ -24,6 +24,7 @@
 #include <vcl/transfer.hxx>
 #include <sfx2/childwin.hxx>
 #include <sfx2/sidebar/ControllerItem.hxx>
+#include <sfx2/navigat.hxx>
 #include <sfx2/weldutils.hxx>
 #include <sfx2/sidebar/PanelLayout.hxx>
 #include "conttree.hxx"
@@ -31,7 +32,6 @@
 #include <memory>
 
 class SwWrtShell;
-class SwNavigationChild;
 class SfxBindings;
 class SwNavigationConfig;
 class SwView;
@@ -43,7 +43,7 @@ class SwNavigationPI : public PanelLayout
                      , public ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface
                      , public SfxListener
 {
-    friend class SwNavigationChild;
+    friend class SwNavigatorWin;
     friend class SwContentTree;
     friend class SwGlobalTree;
 
@@ -157,17 +157,12 @@ public:
     SwView*         GetCreateView() const;
 };
 
-class SwNavigationChild : public SfxChildWindowContext
+class SwNavigatorWrapper final : public SfxNavigatorWrapper
 {
 public:
-    SwNavigationChild( vcl::Window* ,
-                        sal_uInt16 nId,
-                        SfxBindings*  );
-
-    //! soon obsolete !
-    static  std::unique_ptr<SfxChildWindowContext> CreateImpl(vcl::Window *pParent,
-                SfxBindings *pBindings, SfxChildWinInfo* pInfo );
-    static  void RegisterChildWindowContext(SfxModule *pMod);
+    SwNavigatorWrapper(vcl::Window *pParent, sal_uInt16 nId,
+                       SfxBindings* pBindings, SfxChildWinInfo* pInfo);
+    SFX_DECL_CHILDWINDOW(SwNavigatorWrapper);
 };
 
 #endif
diff --git a/sw/source/uibase/utlui/navipi.cxx b/sw/source/uibase/utlui/navipi.cxx
index c2a428cc412e..6052eafb1911 100644
--- a/sw/source/uibase/utlui/navipi.cxx
+++ b/sw/source/uibase/utlui/navipi.cxx
@@ -25,7 +25,6 @@
 #include <sot/filelist.hxx>
 #include <sfx2/event.hxx>
 #include <sfx2/dispatch.hxx>
-#include <sfx2/navigat.hxx>
 #include <sfx2/viewfrm.hxx>
 #include <tools/urlobj.hxx>
 #include <swtypes.hxx>
@@ -50,25 +49,7 @@
 using namespace ::com::sun::star::uno;
 using namespace ::com::sun::star::frame;
 
-//! soon obsolete !
-std::unique_ptr<SfxChildWindowContext> SwNavigationChild::CreateImpl( vcl::Window *pParent,
-        SfxBindings *pBindings, SfxChildWinInfo* /*pInfo*/ )
-{
-    return std::make_unique<SwNavigationChild>(pParent,
-            /* cast is safe here! */static_cast< sal_uInt16 >(SwView::GetInterfaceId()),
-            pBindings);
-}
-void    SwNavigationChild::RegisterChildWindowContext(SfxModule* pMod)
-{
-    auto pFact = std::make_unique<SfxChildWinContextFactory>(
-       SwNavigationChild::CreateImpl,
-       /* cast is safe here! */static_cast< sal_uInt16 >(SwView::GetInterfaceId()) );
-    SfxChildWindowContext::RegisterChildWindowContext(pMod, SID_NAVIGATOR, std::move(pFact));
-}
-
-
 // Filter the control characters out of the Outline-Entry
-
 OUString SwNavigationPI::CleanEntry(const OUString& rEntry)
 {
     if (rEntry.isEmpty())
@@ -1108,13 +1089,28 @@ SwView*  SwNavigationPI::GetCreateView() const
     return m_pCreateView;
 }
 
-SwNavigationChild::SwNavigationChild( vcl::Window* pParent,
-                        sal_uInt16 nId,
-                        SfxBindings* _pBindings )
-    : SfxChildWindowContext( nId )
+class SwNavigatorWin : public SfxNavigator
+{
+private:
+    VclPtr<SwNavigationPI> pNavi;
+public:
+    SwNavigatorWin(SfxBindings* _pBindings, SfxChildWindow* _pMgr, vcl::Window* pParent);
+    virtual void dispose() override
+    {
+        pNavi.disposeAndClear();
+        SfxNavigator::dispose();
+    }
+    virtual ~SwNavigatorWin() override
+    {
+        disposeOnce();
+    }
+};
+
+SwNavigatorWin::SwNavigatorWin(SfxBindings* _pBindings, SfxChildWindow* _pMgr, vcl::Window* pParent)
+    : SfxNavigator(_pBindings, _pMgr, pParent)
 {
     Reference< XFrame > xFrame = _pBindings->GetActiveFrame();
-    VclPtr< SwNavigationPI > pNavi = VclPtr< SwNavigationPI >::Create( pParent, xFrame, _pBindings );
+    pNavi = VclPtr< SwNavigationPI >::Create( this, xFrame, _pBindings );
     _pBindings->Invalidate(SID_NAVIGATOR);
 
     SwNavigationConfig* pNaviConfig = SW_MOD()->GetNavigationConfig();
@@ -1131,15 +1127,21 @@ SwNavigationChild::SwNavigationChild( vcl::Window* pParent,
     }
     pNavi->m_xContentTree->SetOutlineLevel( static_cast< sal_uInt8 >( pNaviConfig->GetOutlineLevel() ) );
     pNavi->SetRegionDropMode( pNaviConfig->GetRegionMode() );
+    pNavi->Show();
 
-    if (SfxNavigator* pNav = dynamic_cast<SfxNavigator*>(pParent))
-    {
-        pNav->SetMinOutputSizePixel(pNavi->GetOptimalSize());
-        if (pNaviConfig->IsSmall())
-            pNavi->ZoomIn();
-    }
+    SetMinOutputSizePixel(pNavi->GetOptimalSize());
+    if (pNaviConfig->IsSmall())
+        pNavi->ZoomIn();
+}
 
-    SetWindow(pNavi);
+SFX_IMPL_DOCKINGWINDOW(SwNavigatorWrapper, SID_NAVIGATOR);
+
+SwNavigatorWrapper::SwNavigatorWrapper(vcl::Window *_pParent, sal_uInt16 nId,
+                                       SfxBindings* pBindings, SfxChildWinInfo* pInfo)
+    : SfxNavigatorWrapper(_pParent, nId, pBindings, pInfo)
+{
+    SetWindow(VclPtr<SwNavigatorWin>::Create(pBindings, this, _pParent));
+    Initialize(pInfo);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list