tdf#160264 Fixed crash in gallery

Local gallery themes need an additional listener to prevent deleting
the global theme.

Change-Id: If6cfcb5a3eeffdc087b089f2151c45b2cff87bbd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165029
Tested-by: Jenkins
Tested-by: Gabor Kelemen <gabor.kelemen.extern@allotropia.de>
Reviewed-by: Gabor Kelemen <gabor.kelemen.extern@allotropia.de>
diff --git a/svx/source/gallery2/galbrws1.cxx b/svx/source/gallery2/galbrws1.cxx
index c68c2d8..443d9be 100644
--- a/svx/source/gallery2/galbrws1.cxx
+++ b/svx/source/gallery2/galbrws1.cxx
@@ -256,7 +256,7 @@ void GalleryBrowser1::ImplFillExchangeData( const GalleryTheme* pThm, ExchangeDa

void GalleryBrowser1::ImplGetExecuteVector(std::vector<OUString>& o_aExec)
{
    GalleryTheme*           pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
    GalleryTheme*           pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), maLocalListner );

    if( !pTheme )
        return;
@@ -288,14 +288,14 @@ void GalleryBrowser1::ImplGetExecuteVector(std::vector<OUString>& o_aExec)

    o_aExec.emplace_back("properties");

    mpGallery->ReleaseTheme( pTheme, *this );
    mpGallery->ReleaseTheme( pTheme, maLocalListner );
}

void GalleryBrowser1::ImplGalleryThemeProperties( std::u16string_view rThemeName, bool bCreateNew )
{
    DBG_ASSERT(!mpThemePropsDlgItemSet, "mpThemePropsDlgItemSet already set!");
    mpThemePropsDlgItemSet.reset(new SfxItemSet( SfxGetpApp()->GetPool() ));
    GalleryTheme*   pTheme = mpGallery->AcquireTheme( rThemeName, *this );
    GalleryTheme*   pTheme = mpGallery->AcquireTheme( rThemeName, maLocalListner );

    ImplFillExchangeData( pTheme, *mpExchangeData );

@@ -345,7 +345,7 @@ void GalleryBrowser1::ImplEndGalleryThemeProperties(bool bCreateNew, sal_Int32 n
    }

    OUString aThemeName( mpExchangeData->pTheme->GetName() );
    mpGallery->ReleaseTheme( mpExchangeData->pTheme, *this );
    mpGallery->ReleaseTheme( mpExchangeData->pTheme, maLocalListner );

    if ( bCreateNew && ( nRet != RET_OK ) )
    {
@@ -367,13 +367,13 @@ void GalleryBrowser1::ImplExecute(std::u16string_view rIdent)
{
    if (rIdent == u"update")
    {
        GalleryTheme*       pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
        GalleryTheme*       pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), maLocalListner );

        SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
        ScopedVclPtr<VclAbstractDialog> aActualizeProgress(pFact->CreateActualizeProgressDialog(mxThemes.get(), pTheme));

        aActualizeProgress->Execute();
        mpGallery->ReleaseTheme( pTheme, *this );
        mpGallery->ReleaseTheme( pTheme, maLocalListner );
    }
    else if (rIdent == u"delete")
    {
@@ -384,7 +384,7 @@ void GalleryBrowser1::ImplExecute(std::u16string_view rIdent)
    }
    else if (rIdent == u"rename")
    {
        GalleryTheme*   pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
        GalleryTheme*   pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), maLocalListner );
        const OUString  aOldName( pTheme->GetName() );

        SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
@@ -407,11 +407,11 @@ void GalleryBrowser1::ImplExecute(std::u16string_view rIdent)
                mpGallery->RenameTheme( aOldName, aName );
            }
        }
        mpGallery->ReleaseTheme( pTheme, *this );
        mpGallery->ReleaseTheme( pTheme, maLocalListner );
    }
    else if (rIdent == u"assign")
    {
        GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
        GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), maLocalListner );

        if (pTheme && !pTheme->IsReadOnly())
        {
@@ -422,7 +422,7 @@ void GalleryBrowser1::ImplExecute(std::u16string_view rIdent)
                pTheme->SetId( aDlg->GetId(), true );
        }

        mpGallery->ReleaseTheme( pTheme, *this );
        mpGallery->ReleaseTheme( pTheme, maLocalListner );
    }
    else if (rIdent == u"properties")
    {
@@ -1500,13 +1500,12 @@ IMPL_LINK(GalleryBrowser1, SelectTbxHdl, weld::Toggleable&, rBox, void)

void GalleryBrowser1::FillThemeEntries()
{
        SfxListener aListener;
        for (size_t i = 0, nCount = mpGallery->GetThemeCount(); i < nCount; ++i)
        {
            const GalleryThemeEntry* pThemeInfo = mpGallery->GetThemeInfo( i );
            OUString aThemeName = pThemeInfo->GetThemeName();
            //sal_uInt32 nId = pThemeInfo->GetId();
            GalleryTheme* pTheme = mpGallery->AcquireTheme(aThemeName, aListener);
            GalleryTheme* pTheme = mpGallery->AcquireTheme(aThemeName, maLocalListner);
            sal_uInt32 nObjectCount = pTheme->GetObjectCount();
            for (size_t nObject = 0; nObject < nObjectCount; ++nObject)
            {
@@ -1514,7 +1513,7 @@ void GalleryBrowser1::FillThemeEntries()
                OUString aTitle = GetItemText(*xSgaObject, GalleryItemFlags::Title);
                maAllThemeEntries.push_back(ThemeEntry(aThemeName, aTitle, nObject));
            }
            mpGallery->ReleaseTheme(pTheme, aListener);
            mpGallery->ReleaseTheme(pTheme, maLocalListner);
        }
        maFoundThemeEntries.assign(maAllThemeEntries.begin(), maAllThemeEntries.end());
}
diff --git a/svx/source/inc/galbrws1.hxx b/svx/source/inc/galbrws1.hxx
index 5f9988b..50cffa1 100644
--- a/svx/source/inc/galbrws1.hxx
+++ b/svx/source/inc/galbrws1.hxx
@@ -135,6 +135,7 @@ private:
    css::uno::Reference<css::util::XURLTransformer> m_xTransformer;

    CharClass m_aCharacterClassficator;
    SfxListener maLocalListner;

    void ImplInsertThemeEntry(const GalleryThemeEntry* pEntry);
    static void ImplFillExchangeData(const GalleryTheme* pThm, ExchangeData& rData);