include/sfx2/basedlgs.hxx | 23 ++++++++++++--- include/sfx2/childwin.hxx | 6 ++-- sfx2/source/appl/childwin.cxx | 9 +++--- sfx2/source/appl/workwin.cxx | 4 +- sfx2/source/dialog/basedlgs.cxx | 56 +++++++++++++++++++++++--------------- sfx2/source/inc/workwin.hxx | 8 ++--- sw/inc/swabstdlg.hxx | 4 +- sw/source/ui/dialog/swdlgfact.cxx | 6 ++-- sw/source/ui/dialog/swdlgfact.hxx | 6 ++-- 9 files changed, 75 insertions(+), 47 deletions(-)
New commits: commit 7d0bd54bad1782f74c156aa667e875c33efee0c1 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Wed Mar 20 21:18:04 2019 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Fri Mar 22 14:20:43 2019 +0100 refactor into a shareable base class Change-Id: I5eb1f2b6b7b2dbc3bc675845730cb3aef1cab5f0 Reviewed-on: https://gerrit.libreoffice.org/69528 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/sfx2/basedlgs.hxx b/include/sfx2/basedlgs.hxx index 6b86abed0b01..893481e2d4d5 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 b07c6d1cd983..8d99f20642de 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 ca2919cf263e..6a02b5bacab6 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 529451920676..8e86d0300ba3 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 b5056df8b1a9..81ccb97b910e 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 040065f62543..6b9894628e94 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 10d0fe9f882e..e6f3a5e714e3 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 85cb3ad716b2..fb764f190916 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 3f51a2ca9eb8..d17ccab6a473 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; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits