tdf#147782 retain focus in launching frame on first activate

Change-Id: I813c675ecf7c4a364f9d770af12e99275f510e7b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131017
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/include/sfx2/weldutils.hxx b/include/sfx2/weldutils.hxx
index 81c4cb8..aaa2fe0 100644
--- a/include/sfx2/weldutils.hxx
+++ b/include/sfx2/weldutils.hxx
@@ -56,6 +56,8 @@ public:
    css::uno::Reference<css::frame::XToolbarController>
    GetControllerForCommand(const OUString& rCommand) const;

    css::uno::Reference<css::frame::XFrame> GetFrame() const { return m_xFrame; }

    void dispose();
    ~ToolbarUnoDispatcher();
};
diff --git a/sfx2/source/dialog/recfloat.cxx b/sfx2/source/dialog/recfloat.cxx
index 18833ea5..6a6fc17 100644
--- a/sfx2/source/dialog/recfloat.cxx
+++ b/sfx2/source/dialog/recfloat.cxx
@@ -17,6 +17,7 @@
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#include <com/sun/star/awt/XTopWindow.hpp>
#include <com/sun/star/frame/XDispatchRecorder.hpp>

#include <svl/eitem.hxx>
@@ -101,6 +102,7 @@ SfxRecordingFloat_Impl::SfxRecordingFloat_Impl(SfxBindings* pBind, SfxChildWindo
                                  "FloatingRecord")
    , m_xToolbar(m_xBuilder->weld_toolbar("toolbar"))
    , m_xDispatcher(new ToolbarUnoDispatcher(*m_xToolbar, *m_xBuilder, pBind->GetActiveFrame()))
    , m_bFirstActivate(true)
{
    // start recording
    SfxBoolItem aItem( SID_RECORDMACRO, true );
@@ -108,6 +110,18 @@ SfxRecordingFloat_Impl::SfxRecordingFloat_Impl(SfxBindings* pBind, SfxChildWindo
            SfxCallMode::SYNCHRON, { &aItem });
}

void SfxRecordingFloat_Impl::Activate()
{
    SfxModelessDialogController::Activate();
    if (!m_bFirstActivate)
        return;
    // tdf#147782 retain focus in launching frame on the first activate on automatically gaining focus on getting launched
    m_bFirstActivate = false;
    css::uno::Reference<css::awt::XTopWindow> xTopWindow(m_xDispatcher->GetFrame()->getContainerWindow(), css::uno::UNO_QUERY);
    if (xTopWindow.is())
        xTopWindow->toFront();
}

SfxRecordingFloat_Impl::~SfxRecordingFloat_Impl()
{
    m_xDispatcher->dispose();
diff --git a/sfx2/source/inc/recfloat.hxx b/sfx2/source/inc/recfloat.hxx
index e25ad7f..b7a4882 100644
--- a/sfx2/source/inc/recfloat.hxx
+++ b/sfx2/source/inc/recfloat.hxx
@@ -42,12 +42,14 @@ class SfxRecordingFloat_Impl final : public SfxModelessDialogController
{
    std::unique_ptr<weld::Toolbar> m_xToolbar;
    std::unique_ptr<ToolbarUnoDispatcher> m_xDispatcher;
    bool m_bFirstActivate;
public:
    SfxRecordingFloat_Impl(SfxBindings* pBindings,
                           SfxChildWindow* pChildWin,
                           weld::Window* pParent);
    virtual ~SfxRecordingFloat_Impl() override;
    virtual void FillInfo(SfxChildWinInfo& rInfo) const override;
    virtual void Activate() override;
};

#endif