refactor into a shareable base class

Change-Id: I5eb1f2b6b7b2dbc3bc675845730cb3aef1cab5f0
Reviewed-on: https://gerrit.libreoffice.org/69528
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/sfx2/basedlgs.hxx b/include/sfx2/basedlgs.hxx
index 6b86abe..893481e2 100644
--- a/include/sfx2/basedlgs.hxx
+++ b/include/sfx2/basedlgs.hxx
@@ -111,8 +111,21 @@ class SFX2_DLLPUBLIC SfxDialogController : public weld::GenericDialogController
{
private:
    DECL_DLLPRIVATE_STATIC_LINK(SfxDialogController, InstallLOKNotifierHdl, void*, vcl::ILibreOfficeKitNotifier*);

    DECL_DLLPRIVATE_LINK(FocusInHdl, weld::Widget&, void);
    DECL_DLLPRIVATE_LINK(FocusOutHdl, weld::Widget&, void);

public:
    SfxDialogController(weld::Widget* pParent, const OUString& rUIFile, const OString& rDialogId);
    // dialog gets focus
    virtual void Activate() {}
    // dialog loses focus
    virtual void DeActivate() {}

    // when the dialog has an associated SfxChildWin, typically for Modeless interaction
    virtual void ChildWinDispose() {} // called from the associated SfxChildWin dtor
    virtual void Close() {} // called by the SfxChildWin when the dialog is closed
    virtual void EndDialog(); // called by the SfxChildWin to close the dialog
};

class SfxModelessDialog_Impl;
@@ -126,8 +139,6 @@ class SFX2_DLLPUBLIC SfxModelessDialogController : public SfxDialogController

    void Init(SfxBindings *pBindinx, SfxChildWindow *pCW);

    DECL_DLLPRIVATE_LINK(FocusInHdl, weld::Widget&, void);
    DECL_DLLPRIVATE_LINK(FocusOutHdl, weld::Widget&, void);
protected:
    SfxModelessDialogController(SfxBindings*, SfxChildWindow* pChildWin,
        weld::Window* pParent, const OUString& rUIXMLDescription, const OString& rID);
@@ -135,11 +146,13 @@ protected:

public:
    void                    FillInfo(SfxChildWinInfo&) const;
    virtual void            Activate() {}
    void                    Initialize (SfxChildWinInfo const * pInfo);
    void                    Close();
    void                    DeInit();
    void                    EndDialog();
    virtual void            Close() override;
    virtual void            EndDialog() override;
    virtual void            Activate() override;
    virtual void            DeActivate() override;
    virtual void            ChildWinDispose() override;
    SfxBindings&            GetBindings() { return *m_pBindings; }
};

diff --git a/include/sfx2/childwin.hxx b/include/sfx2/childwin.hxx
index b07c6d1..8d99f20 100644
--- a/include/sfx2/childwin.hxx
+++ b/include/sfx2/childwin.hxx
@@ -146,7 +146,7 @@ class SFX2_DLLPUBLIC SfxChildWindow
    VclPtr<vcl::Window>        pParent;         // parent window ( Topwindow )
    sal_uInt16 const           nType;           // ChildWindow-Id
    VclPtr<vcl::Window>        pWindow;         // actual contents
    std::shared_ptr<SfxModelessDialogController> xController;     // actual contents
    std::shared_ptr<SfxDialogController> xController;     // actual contents
    SfxChildAlignment          eChildAlignment; // Current css::drawing::Alignment
    std::unique_ptr< SfxChildWindow_Impl>       pImpl;            // Implementation data
    std::unique_ptr<SfxChildWindowContext>      pContext;        // With context-sensitive ChildWindows:
@@ -162,9 +162,9 @@ public:
    void                Destroy();
    vcl::Window*        GetWindow() const
                        { return pWindow; }
    void                SetController(std::shared_ptr<SfxModelessDialogController> controller) { xController = controller; }
    void                SetController(std::shared_ptr<SfxDialogController> controller) { xController = controller; }
    void                ClearController() { xController.reset(); }
    std::shared_ptr<SfxModelessDialogController>& GetController() { return xController; }
    std::shared_ptr<SfxDialogController>& GetController() { return xController; }
    vcl::Window*        GetParent() const
                        { return pParent; }
    SfxChildAlignment   GetAlignment() const
diff --git a/sfx2/source/appl/childwin.cxx b/sfx2/source/appl/childwin.cxx
index ca2919c..6a02b5b 100644
--- a/sfx2/source/appl/childwin.cxx
+++ b/sfx2/source/appl/childwin.cxx
@@ -196,12 +196,13 @@ SfxChildWindow::~SfxChildWindow()
    pContext.reset();
    ClearWorkwin();
    if (xController)
        xController->DeInit();
    else
        pWindow.disposeAndClear();
    {
        xController->ChildWinDispose();
        xController.reset();
    }
    pWindow.disposeAndClear();
}


std::unique_ptr<SfxChildWindow> SfxChildWindow::CreateChildWindow( sal_uInt16 nId,
        vcl::Window *pParent, SfxBindings* pBindings, SfxChildWinInfo const & rInfo)
{
diff --git a/sfx2/source/appl/workwin.cxx b/sfx2/source/appl/workwin.cxx
index 5294519..8e86d03 100644
--- a/sfx2/source/appl/workwin.cxx
+++ b/sfx2/source/appl/workwin.cxx
@@ -882,7 +882,7 @@ SfxChild_Impl* SfxWorkWindow::RegisterChild_Impl( vcl::Window& rWindow,
    return aChildren.back().get();
}

SfxChild_Impl* SfxWorkWindow::RegisterChild_Impl(std::shared_ptr<SfxModelessDialogController>& rController,
SfxChild_Impl* SfxWorkWindow::RegisterChild_Impl(std::shared_ptr<SfxDialogController>& rController,
                    SfxChildAlignment eAlign )
{
    DBG_ASSERT( aChildren.size() < 255, "too many children" );
@@ -915,7 +915,7 @@ void SfxWorkWindow::ReleaseChild_Impl( vcl::Window& rWindow )
    OSL_FAIL( "releasing unregistered child" );
}

void SfxWorkWindow::ReleaseChild_Impl(SfxModelessDialogController& rController)
void SfxWorkWindow::ReleaseChild_Impl(SfxDialogController& rController)
{

    SfxChild_Impl *pChild = nullptr;
diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx
index b5056df..81ccb97 100644
--- a/sfx2/source/dialog/basedlgs.cxx
+++ b/sfx2/source/dialog/basedlgs.cxx
@@ -408,8 +408,6 @@ SfxModelessDialogController::SfxModelessDialogController(SfxBindings* pBindinx,
    : SfxDialogController(pParent, rUIXMLDescription, rID)
{
    Init(pBindinx, pCW);
    m_xDialog->connect_focus_in(LINK(this, SfxModelessDialogController, FocusInHdl));
    m_xDialog->connect_focus_out(LINK(this, SfxModelessDialogController, FocusOutHdl));
}

void SfxModelessDialogController::Init(SfxBindings *pBindinx, SfxChildWindow *pCW)
@@ -423,35 +421,30 @@ void SfxModelessDialogController::Init(SfxBindings *pBindinx, SfxChildWindow *pC
        m_xImpl->StartListening( *pBindinx );
}

void SfxModelessDialogController::DeInit()
{
    if (m_xImpl->pMgr)
    {
        WindowStateMask nMask = WindowStateMask::Pos | WindowStateMask::State;
        if (m_xDialog->get_resizable())
            nMask |= WindowStateMask::Width | WindowStateMask::Height;
        m_xImpl->aWinState = m_xDialog->get_window_state(nMask);
        GetBindings().GetWorkWindow_Impl()->ConfigChild_Impl( SfxChildIdentifier::DOCKINGWINDOW, SfxDockingConfig::ALIGNDOCKINGWINDOW, m_xImpl->pMgr->GetType() );
    }

    m_xImpl->pMgr = nullptr;
}

/*  [Description]

    If a ModelessDialog is enabled its ViewFrame will be activated.
    This is necessary by PluginInFrames.
*/
IMPL_LINK_NOARG(SfxModelessDialogController, FocusInHdl, weld::Widget&, void)
IMPL_LINK_NOARG(SfxDialogController, FocusInHdl, weld::Widget&, void)
{
    Activate();
}

void SfxModelessDialogController::Activate()
{
    if (!m_xImpl)
        return;
    m_pBindings->SetActiveFrame(m_xImpl->pMgr->GetFrame());
    m_xImpl->pMgr->Activate_Impl();
    Activate();
}

IMPL_LINK_NOARG(SfxModelessDialogController, FocusOutHdl, weld::Widget&, void)
IMPL_LINK_NOARG(SfxDialogController, FocusOutHdl, weld::Widget&, void)
{
    DeActivate();
}

void SfxModelessDialogController::DeActivate()
{
    if (!m_xImpl)
        return;
@@ -469,15 +462,34 @@ SfxModelessDialogController::~SfxModelessDialogController()
        m_pBindings->SetActiveFrame(nullptr);
}

void SfxModelessDialogController::EndDialog()
void SfxDialogController::EndDialog()
{
    if (!m_xDialog->get_visible())
        return;
    m_xImpl->bClosing = true;
    response(RET_CLOSE);
}

void SfxModelessDialogController::EndDialog()
{
    m_xImpl->bClosing = true;
    SfxDialogController::EndDialog();
    m_xImpl->bClosing = false;
}

void SfxModelessDialogController::ChildWinDispose()
{
    if (m_xImpl->pMgr)
    {
        WindowStateMask nMask = WindowStateMask::Pos | WindowStateMask::State;
        if (m_xDialog->get_resizable())
            nMask |= WindowStateMask::Width | WindowStateMask::Height;
        m_xImpl->aWinState = m_xDialog->get_window_state(nMask);
        GetBindings().GetWorkWindow_Impl()->ConfigChild_Impl( SfxChildIdentifier::DOCKINGWINDOW, SfxDockingConfig::ALIGNDOCKINGWINDOW, m_xImpl->pMgr->GetType() );
    }

    m_xImpl->pMgr = nullptr;
}

/*  [Description]

    The window is closed when the ChildWindow is destroyed by running the
@@ -837,6 +849,8 @@ SfxDialogController::SfxDialogController(weld::Widget* pParent, const OUString& 
    : GenericDialogController(pParent, rUIFile, rDialogId)
{
    m_xDialog->SetInstallLOKNotifierHdl(LINK(this, SfxDialogController, InstallLOKNotifierHdl));
    m_xDialog->connect_focus_in(LINK(this, SfxDialogController, FocusInHdl));
    m_xDialog->connect_focus_out(LINK(this, SfxDialogController, FocusOutHdl));
}

IMPL_STATIC_LINK_NOARG(SfxDialogController, InstallLOKNotifierHdl, void*, vcl::ILibreOfficeKitNotifier*)
diff --git a/sfx2/source/inc/workwin.hxx b/sfx2/source/inc/workwin.hxx
index 040065f6..6b98946 100644
--- a/sfx2/source/inc/workwin.hxx
+++ b/sfx2/source/inc/workwin.hxx
@@ -85,7 +85,7 @@ namespace o3tl
struct SfxChild_Impl
{
    VclPtr<vcl::Window>             pWin;
    std::shared_ptr<SfxModelessDialogController> xController;
    std::shared_ptr<SfxDialogController> xController;
    Size                            aSize;
    SfxChildAlignment               eAlign;
    SfxChildVisibility              nVisible;
@@ -100,7 +100,7 @@ struct SfxChild_Impl
        nVisible = bIsVisible ? SfxChildVisibility::VISIBLE : SfxChildVisibility::NOT_VISIBLE;
    }

    SfxChild_Impl(const std::shared_ptr<SfxModelessDialogController>& rChild,
    SfxChild_Impl(const std::shared_ptr<SfxDialogController>& rChild,
                  SfxChildAlignment eAlignment):
        pWin(nullptr), xController(rChild), eAlign(eAlignment), bResize(false),
        bSetFocus( false )
@@ -249,9 +249,9 @@ public:
    // Methods for all Child windows
    void                    DataChanged_Impl();
    void                    ReleaseChild_Impl( vcl::Window& rWindow );
    void                    ReleaseChild_Impl(SfxModelessDialogController&);
    void                    ReleaseChild_Impl(SfxDialogController&);
    SfxChild_Impl*          RegisterChild_Impl( vcl::Window& rWindow, SfxChildAlignment eAlign );
    SfxChild_Impl*          RegisterChild_Impl(std::shared_ptr<SfxModelessDialogController>& rController, SfxChildAlignment eAlign);
    SfxChild_Impl*          RegisterChild_Impl(std::shared_ptr<SfxDialogController>& rController, SfxChildAlignment eAlign);
    void                    ShowChildren_Impl();
    void                    HideChildren_Impl();
    bool                    PrepareClose_Impl();
diff --git a/sw/inc/swabstdlg.hxx b/sw/inc/swabstdlg.hxx
index 10d0fe9..e6f3a5e 100644
--- a/sw/inc/swabstdlg.hxx
+++ b/sw/inc/swabstdlg.hxx
@@ -203,7 +203,7 @@ protected:
public:
    virtual void        UpdateCounts() = 0;
    virtual void        SetCounts(const SwDocStat &rCurrCnt, const SwDocStat &rDocStat) = 0;
    virtual std::shared_ptr<SfxModelessDialogController> GetController() = 0;
    virtual std::shared_ptr<SfxDialogController> GetController() = 0;
};

class AbstractSwInsertAbstractDlg : public VclAbstractDialog
@@ -338,7 +338,7 @@ protected:
    virtual ~AbstractMarkFloatDlg() override = default;
public:
    virtual void    ReInitDlg(SwWrtShell& rWrtShell) = 0;
    virtual std::shared_ptr<SfxModelessDialogController> GetController() = 0;
    virtual std::shared_ptr<SfxDialogController> GetController() = 0;
};

#define RET_LOAD_DOC            100
diff --git a/sw/source/ui/dialog/swdlgfact.cxx b/sw/source/ui/dialog/swdlgfact.cxx
index 85cb3ad..fb764f1 100644
--- a/sw/source/ui/dialog/swdlgfact.cxx
+++ b/sw/source/ui/dialog/swdlgfact.cxx
@@ -674,7 +674,7 @@ void AbstractIndexMarkFloatDlg_Impl::ReInitDlg(SwWrtShell& rWrtShell)
    m_xDlg->ReInitDlg( rWrtShell);
}

std::shared_ptr<SfxModelessDialogController> AbstractIndexMarkFloatDlg_Impl::GetController()
std::shared_ptr<SfxDialogController> AbstractIndexMarkFloatDlg_Impl::GetController()
{
    return m_xDlg;
}
@@ -684,12 +684,12 @@ void AbstractAuthMarkFloatDlg_Impl::ReInitDlg(SwWrtShell& rWrtShell)
    m_xDlg->ReInitDlg(rWrtShell);
}

std::shared_ptr<SfxModelessDialogController> AbstractAuthMarkFloatDlg_Impl::GetController()
std::shared_ptr<SfxDialogController> AbstractAuthMarkFloatDlg_Impl::GetController()
{
    return m_xDlg;
}

std::shared_ptr<SfxModelessDialogController> AbstractSwWordCountFloatDlg_Impl::GetController()
std::shared_ptr<SfxDialogController> AbstractSwWordCountFloatDlg_Impl::GetController()
{
    return m_xDlg;
}
diff --git a/sw/source/ui/dialog/swdlgfact.hxx b/sw/source/ui/dialog/swdlgfact.hxx
index 3f51a2c..d17ccab 100644
--- a/sw/source/ui/dialog/swdlgfact.hxx
+++ b/sw/source/ui/dialog/swdlgfact.hxx
@@ -84,7 +84,7 @@ public:
    virtual short Execute() override;
    virtual void  UpdateCounts() override;
    virtual void  SetCounts(const SwDocStat &rCurrCnt, const SwDocStat &rDocStat) override;
    virtual std::shared_ptr<SfxModelessDialogController> GetController() override;
    virtual std::shared_ptr<SfxDialogController> GetController() override;
};

class AbstractSwInsertAbstractDlg_Impl : public AbstractSwInsertAbstractDlg
@@ -546,7 +546,7 @@ public:
    }
    virtual short Execute() override;
    virtual void ReInitDlg(SwWrtShell& rWrtShell) override;
    virtual std::shared_ptr<SfxModelessDialogController> GetController() override;
    virtual std::shared_ptr<SfxDialogController> GetController() override;
};

class SwAuthMarkFloatDlg;
@@ -560,7 +560,7 @@ public:
    }
    virtual short Execute() override;
    virtual void ReInitDlg(SwWrtShell& rWrtShell) override;
    virtual std::shared_ptr<SfxModelessDialogController> GetController() override;
    virtual std::shared_ptr<SfxDialogController> GetController() override;
};

class SwMailMergeWizard;