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);