crash on double-clicking an entry in Available language modules

tools, options, language settings, writing aids, entry in Available language modules

Change-Id: I0146a313cfae206bc9399c964a746dd00cba0fa2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95610
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/cui/source/inc/optlingu.hxx b/cui/source/inc/optlingu.hxx
index 35d34eb..5f64e47 100644
--- a/cui/source/inc/optlingu.hxx
+++ b/cui/source/inc/optlingu.hxx
@@ -75,8 +75,9 @@ public:
    virtual ~SvxEditModulesDlg() override;
};

// class SvxLinguTabPage -------------------------------------------------
struct ImplSVEvent;

// class SvxLinguTabPage -------------------------------------------------
class SvxLinguTabPage : public SfxTabPage
{
private:
@@ -95,6 +96,8 @@ private:
    int nUPN_HYPH_MIN_LEADING;
    int nUPN_HYPH_MIN_TRAILING;

    ImplSVEvent* m_nDlbClickEventId;

    css::uno::Reference<
        css::linguistic2::XLinguProperties >     xProp;

diff --git a/cui/source/options/optlingu.cxx b/cui/source/options/optlingu.cxx
index 525a260..da4aeb8 100644
--- a/cui/source/options/optlingu.cxx
+++ b/cui/source/options/optlingu.cxx
@@ -836,6 +836,7 @@ SvxLinguTabPage::SvxLinguTabPage(weld::Container* pPage, weld::DialogController*
    , nUPN_HYPH_MIN_WORD_LENGTH(-1)
    , nUPN_HYPH_MIN_LEADING(-1)
    , nUPN_HYPH_MIN_TRAILING(-1)
    , m_nDlbClickEventId(nullptr)
    , m_xLinguModulesFT(m_xBuilder->weld_label("lingumodulesft"))
    , m_xLinguModulesCLB(m_xBuilder->weld_tree_view("lingumodules"))
    , m_xLinguModulesEditPB(m_xBuilder->weld_button("lingumodulesedit"))
@@ -903,6 +904,11 @@ SvxLinguTabPage::SvxLinguTabPage(weld::Container* pPage, weld::DialogController*

SvxLinguTabPage::~SvxLinguTabPage()
{
    if (m_nDlbClickEventId)
    {
        Application::RemoveUserEvent(m_nDlbClickEventId);
        m_nDlbClickEventId = nullptr;
    }
    pLinguData.reset();
}

@@ -1282,13 +1288,12 @@ void SvxLinguTabPage::Reset( const SfxItemSet* rSet )

IMPL_LINK(SvxLinguTabPage, BoxDoubleClickHdl_Impl, weld::TreeView&, rBox, bool)
{
    if (&rBox == m_xLinguModulesCLB.get())
    if (&rBox == m_xLinguModulesCLB.get() && !m_nDlbClickEventId)
    {
        //! in order to avoid a bug causing a GPF when double clicking
        //! on a module entry and exiting the "Edit Modules" dialog
        //! after that.
        Application::PostUserEvent( LINK(
                    this, SvxLinguTabPage, PostDblClickHdl_Impl ), nullptr, true);
        m_nDlbClickEventId = Application::PostUserEvent(LINK(this, SvxLinguTabPage, PostDblClickHdl_Impl));
    }
    else if (&rBox == m_xLinguOptionsCLB.get())
    {
@@ -1299,6 +1304,7 @@ IMPL_LINK(SvxLinguTabPage, BoxDoubleClickHdl_Impl, weld::TreeView&, rBox, bool)

IMPL_LINK_NOARG(SvxLinguTabPage, PostDblClickHdl_Impl, void*, void)
{
    m_nDlbClickEventId = nullptr;
    ClickHdl_Impl(*m_xLinguModulesEditPB);
}