tdf#139063 crash when add a new sheet to a RTL sheet

Change-Id: Icbfb45036f93ed92e5c83039cd4c3b536f0df0d4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108036
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/svx/gridctrl.hxx b/include/svx/gridctrl.hxx
index e09b0a1..7667d45 100644
--- a/include/svx/gridctrl.hxx
+++ b/include/svx/gridctrl.hxx
@@ -190,8 +190,8 @@ class NavigationBar final : public InterimItemWindow
    std::unique_ptr<weld::Button> m_xLastBtn;         // Button for 'go to the last record'
    std::unique_ptr<weld::Button> m_xNewBtn;          // Button for 'go to a new record'

    weld::ButtonPressRepeater m_aPrevRepeater;
    weld::ButtonPressRepeater m_aNextRepeater;
    std::shared_ptr<weld::ButtonPressRepeater> m_xPrevRepeater;
    std::shared_ptr<weld::ButtonPressRepeater> m_xNextRepeater;

    sal_Int32            m_nCurrentPos;

diff --git a/include/vcl/weldutils.hxx b/include/vcl/weldutils.hxx
index 43461ab..86af6c6 100644
--- a/include/vcl/weldutils.hxx
+++ b/include/vcl/weldutils.hxx
@@ -397,6 +397,7 @@ private:
};

class VCL_DLLPUBLIC ButtonPressRepeater final
    : public std::enable_shared_from_this<ButtonPressRepeater>
{
private:
    weld::Button& m_rButton;
diff --git a/svtools/source/control/tabbar.cxx b/svtools/source/control/tabbar.cxx
index 1beda5f..640d767 100644
--- a/svtools/source/control/tabbar.cxx
+++ b/svtools/source/control/tabbar.cxx
@@ -426,9 +426,9 @@ public:
    std::unique_ptr<weld::Button> m_xNextButton;
    std::unique_ptr<weld::Button> m_xLastButton;
    std::unique_ptr<weld::Button> m_xAddButton;
    std::unique_ptr<weld::ButtonPressRepeater> m_xAddRepeater;
    std::unique_ptr<weld::ButtonPressRepeater> m_xPrevRepeater;
    std::unique_ptr<weld::ButtonPressRepeater> m_xNextRepeater;
    std::shared_ptr<weld::ButtonPressRepeater> m_xAddRepeater;
    std::shared_ptr<weld::ButtonPressRepeater> m_xPrevRepeater;
    std::shared_ptr<weld::ButtonPressRepeater> m_xNextRepeater;

    TabButtons(TabBar* pParent)
        : InterimItemWindow(pParent,
@@ -780,8 +780,8 @@ void TabBar::ImplInitControls()
    if (mnWinStyle & WB_INSERTTAB)
    {
        Link<weld::Button&,void> aLink = LINK(this, TabBar, ImplAddClickHandler);
        mpImpl->mxButtonBox->m_xAddRepeater.reset(new weld::ButtonPressRepeater(
                    *mpImpl->mxButtonBox->m_xAddButton, aLink, aContextLink));
        mpImpl->mxButtonBox->m_xAddRepeater = std::make_shared<weld::ButtonPressRepeater>(
                    *mpImpl->mxButtonBox->m_xAddButton, aLink, aContextLink);
        mpImpl->mxButtonBox->m_xAddButton->show();
    }

@@ -789,11 +789,11 @@ void TabBar::ImplInitControls()

    if (mnWinStyle & (WB_MINSCROLL | WB_SCROLL))
    {
        mpImpl->mxButtonBox->m_xPrevRepeater.reset(new weld::ButtonPressRepeater(
                    *mpImpl->mxButtonBox->m_xPrevButton, aLink, aContextLink));
        mpImpl->mxButtonBox->m_xPrevRepeater = std::make_shared<weld::ButtonPressRepeater>(
                    *mpImpl->mxButtonBox->m_xPrevButton, aLink, aContextLink);
        mpImpl->mxButtonBox->m_xPrevButton->show();
        mpImpl->mxButtonBox->m_xNextRepeater.reset(new weld::ButtonPressRepeater(
                    *mpImpl->mxButtonBox->m_xNextButton, aLink, aContextLink));
        mpImpl->mxButtonBox->m_xNextRepeater = std::make_shared<weld::ButtonPressRepeater>(
                    *mpImpl->mxButtonBox->m_xNextButton, aLink, aContextLink);
        mpImpl->mxButtonBox->m_xNextButton->show();
    }

diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx
index b004aed..41f3255 100644
--- a/svx/source/fmcomp/gridctrl.cxx
+++ b/svx/source/fmcomp/gridctrl.cxx
@@ -317,8 +317,8 @@ NavigationBar::NavigationBar(vcl::Window* pParent)
    , m_xNextBtn(m_xBuilder->weld_button("next"))
    , m_xLastBtn(m_xBuilder->weld_button("last"))
    , m_xNewBtn(m_xBuilder->weld_button("new"))
    , m_aPrevRepeater(*m_xPrevBtn, LINK(this,NavigationBar,OnClick))
    , m_aNextRepeater(*m_xNextBtn, LINK(this,NavigationBar,OnClick))
    , m_xPrevRepeater(std::make_shared<weld::ButtonPressRepeater>(*m_xPrevBtn, LINK(this,NavigationBar,OnClick)))
    , m_xNextRepeater(std::make_shared<weld::ButtonPressRepeater>(*m_xNextBtn, LINK(this,NavigationBar,OnClick)))
    , m_nCurrentPos(-1)
    , m_bPositioning(false)
{
@@ -577,9 +577,9 @@ void NavigationBar::SetState(DbGridControlNavigationBarState nWhich)
    if (!bAvailable)
    {
        if (pWnd == m_xNextBtn.get())
            m_aNextRepeater.Stop();
            m_xNextRepeater->Stop();
        else if (pWnd == m_xPrevBtn.get())
            m_aPrevRepeater.Stop();
            m_xPrevRepeater->Stop();
    }
}

diff --git a/vcl/source/app/weldutils.cxx b/vcl/source/app/weldutils.cxx
index bce1f47..836f622 100644
--- a/vcl/source/app/weldutils.cxx
+++ b/vcl/source/app/weldutils.cxx
@@ -576,7 +576,10 @@ IMPL_LINK(ButtonPressRepeater, MousePressHdl, const MouseEvent&, rMouseEvent, bo
    m_bModKey = rMouseEvent.IsMod1();
    if (!m_rButton.get_sensitive())
        return false;
    auto self = weak_from_this();
    RepeatTimerHdl(nullptr);
    if (!self.lock())
        return false;
    if (!m_rButton.get_sensitive())
        return false;
    m_aRepeat.SetTimeout(MouseSettings::GetButtonStartRepeat());