summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenry Castro <hcastro@collabora.com>2023-09-28 14:23:55 -0400
committerHenry Castro <hcastro@collabora.com>2023-10-04 21:07:37 +0200
commit89d6b13b8fa4edf5d1df79dded799c531c656652 (patch)
treeb8c11832c7c9bc2faf085b3bc3c8c1917fa8149f
parentRelated: tdf#126449 sw floattable: fix bad position of in-table follow fly (diff)
downloadcore-89d6b13b8fa4edf5d1df79dded799c531c656652.tar.gz
core-89d6b13b8fa4edf5d1df79dded799c531c656652.zip
tdf#155512: oox: ppt: abstraction "importMasterSlide"
Signed-off-by: Henry Castro <hcastro@collabora.com> Change-Id: Icfe8e3abbada7f728b2ad1f8e300a688f51d8f75 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157386 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com> (cherry picked from commit 84ac58c37fffa0c8b6d55c70009515d013ad65b4) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157468 Tested-by: Jenkins (cherry picked from commit 9fabd7c11989c2a89c5bb238e6cb52b0a6678851) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157543
-rw-r--r--include/oox/ppt/presentationfragmenthandler.hxx6
-rw-r--r--oox/source/ppt/presentationfragmenthandler.cxx137
2 files changed, 80 insertions, 63 deletions
diff --git a/include/oox/ppt/presentationfragmenthandler.hxx b/include/oox/ppt/presentationfragmenthandler.hxx
index 7ac929ec555b..4685ea2d8316 100644
--- a/include/oox/ppt/presentationfragmenthandler.hxx
+++ b/include/oox/ppt/presentationfragmenthandler.hxx
@@ -38,6 +38,8 @@ namespace oox::core { class XmlFilterBase; }
namespace oox::ppt {
+class PowerPointImport;
+
class PresentationFragmentHandler final : public ::oox::core::FragmentHandler2
{
public:
@@ -50,6 +52,10 @@ private:
void importSlide( const ::oox::core::FragmentHandlerRef& rSlideFragmentHandler,
const oox::ppt::SlidePersistPtr& rPersist );
void importSlide(sal_uInt32 nSlide, bool bFirstSlide, bool bImportNotes);
+ oox::ppt::SlidePersistPtr importMasterSlide(const ::com::sun::star::uno::Reference<::com::sun::star::frame::XModel>& xModel,
+ ::oox::ppt::PowerPointImport& rFilter,
+ const OUString& rLayoutFragmentPath,
+ const OUString& rMasterFragmentPath);
void saveThemeToGrabBag(const oox::drawingml::ThemePtr& pThemePtr, sal_Int32 nThemeIdx);
void importCustomSlideShow(std::vector<CustomShow>& rCustomShowList);
static void importSlideNames(::oox::core::XmlFilterBase& rFilter, const std::vector<SlidePersistPtr>& rSlidePersist);
diff --git a/oox/source/ppt/presentationfragmenthandler.cxx b/oox/source/ppt/presentationfragmenthandler.cxx
index cc972b80a8b0..8dd0af1345df 100644
--- a/oox/source/ppt/presentationfragmenthandler.cxx
+++ b/oox/source/ppt/presentationfragmenthandler.cxx
@@ -215,6 +215,79 @@ void PresentationFragmentHandler::importCustomSlideShow(std::vector<CustomShow>&
}
}
+SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<frame::XModel>& xModel,
+ PowerPointImport& rFilter,
+ const OUString& rLayoutFragmentPath,
+ const OUString& rMasterFragmentPath)
+{
+ SlidePersistPtr pMasterPersistPtr;
+ Reference< drawing::XDrawPage > xMasterPage;
+ Reference< drawing::XMasterPagesSupplier > xMPS( xModel, uno::UNO_QUERY_THROW );
+ Reference< drawing::XDrawPages > xMasterPages( xMPS->getMasterPages(), uno::UNO_SET_THROW );
+
+ sal_Int32 nIndex;
+ if( rFilter.getMasterPages().empty() )
+ {
+ nIndex = 0;
+ xMasterPages->getByIndex( nIndex ) >>= xMasterPage;
+ }
+ else
+ {
+ nIndex = xMasterPages->getCount();
+ xMasterPage = xMasterPages->insertNewByIndex( nIndex );
+ }
+
+ pMasterPersistPtr = std::make_shared<SlidePersist>( rFilter, true, false, xMasterPage,
+ std::make_shared<PPTShape>( Master, "com.sun.star.drawing.GroupShape" ), mpTextListStyle );
+ pMasterPersistPtr->setLayoutPath( rLayoutFragmentPath );
+ rFilter.getMasterPages().push_back( pMasterPersistPtr );
+ rFilter.setActualSlidePersist( pMasterPersistPtr );
+ FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( rFilter, rMasterFragmentPath, pMasterPersistPtr, Master ) );
+
+ // set the correct theme
+ OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc( u"theme" );
+ if( !aThemeFragmentPath.isEmpty() )
+ {
+ std::map< OUString, oox::drawingml::ThemePtr >& rThemes( rFilter.getThemes() );
+ std::map< OUString, oox::drawingml::ThemePtr >::iterator aIter2( rThemes.find( aThemeFragmentPath ) );
+ if( aIter2 == rThemes.end() )
+ {
+ oox::drawingml::ThemePtr pThemePtr = std::make_shared<oox::drawingml::Theme>();
+ pMasterPersistPtr->setTheme( pThemePtr );
+ Reference<xml::dom::XDocument> xDoc=
+ rFilter.importFragment(aThemeFragmentPath);
+
+ auto pTheme = std::make_shared<model::Theme>();
+ pThemePtr->setTheme(pTheme);
+
+ rFilter.importFragment(
+ new ThemeFragmentHandler(rFilter, aThemeFragmentPath, *pThemePtr, *pTheme),
+ Reference<xml::sax::XFastSAXSerializable>(
+ xDoc,
+ UNO_QUERY_THROW));
+ rThemes[ aThemeFragmentPath ] = pThemePtr;
+ pThemePtr->setFragment(xDoc);
+ saveThemeToGrabBag(pThemePtr, nIndex + 1);
+ }
+ else
+ {
+ pMasterPersistPtr->setTheme( (*aIter2).second );
+ }
+ }
+ importSlide( xMasterFragmentHandler, pMasterPersistPtr );
+ rFilter.importFragment( new LayoutFragmentHandler( rFilter, rLayoutFragmentPath, pMasterPersistPtr ) );
+ pMasterPersistPtr->createBackground( rFilter );
+ pMasterPersistPtr->createXShapes( rFilter );
+
+ oox::drawingml::ThemePtr pTheme = pMasterPersistPtr->getTheme();
+ if (pTheme)
+ {
+ pTheme->addTheme(pMasterPersistPtr->getPage());
+ }
+
+ return pMasterPersistPtr;
+}
+
void PresentationFragmentHandler::saveThemeToGrabBag(const oox::drawingml::ThemePtr& pThemePtr,
sal_Int32 nThemeIdx)
{
@@ -332,69 +405,7 @@ void PresentationFragmentHandler::importSlide(sal_uInt32 nSlide, bool bFirstPage
if ( !pMasterPersistPtr )
{ // masterpersist not found, we have to load it
- Reference< drawing::XDrawPage > xMasterPage;
- Reference< drawing::XMasterPagesSupplier > xMPS( xModel, uno::UNO_QUERY_THROW );
- Reference< drawing::XDrawPages > xMasterPages( xMPS->getMasterPages(), uno::UNO_SET_THROW );
-
- sal_Int32 nIndex;
- if( rFilter.getMasterPages().empty() )
- {
- nIndex = 0;
- xMasterPages->getByIndex( nIndex ) >>= xMasterPage;
- }
- else
- {
- nIndex = xMasterPages->getCount();
- xMasterPage = xMasterPages->insertNewByIndex( nIndex );
- }
-
- pMasterPersistPtr = std::make_shared<SlidePersist>( rFilter, true, false, xMasterPage,
- std::make_shared<PPTShape>( Master, "com.sun.star.drawing.GroupShape" ), mpTextListStyle );
- pMasterPersistPtr->setLayoutPath( aLayoutFragmentPath );
- rFilter.getMasterPages().push_back( pMasterPersistPtr );
- rFilter.setActualSlidePersist( pMasterPersistPtr );
- FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( rFilter, aMasterFragmentPath, pMasterPersistPtr, Master ) );
-
- // set the correct theme
- OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc( u"theme" );
- if( !aThemeFragmentPath.isEmpty() )
- {
- std::map< OUString, oox::drawingml::ThemePtr >& rThemes( rFilter.getThemes() );
- std::map< OUString, oox::drawingml::ThemePtr >::iterator aIter2( rThemes.find( aThemeFragmentPath ) );
- if( aIter2 == rThemes.end() )
- {
- oox::drawingml::ThemePtr pThemePtr = std::make_shared<oox::drawingml::Theme>();
- pMasterPersistPtr->setTheme( pThemePtr );
- Reference<xml::dom::XDocument> xDoc=
- rFilter.importFragment(aThemeFragmentPath);
-
- auto pTheme = std::make_shared<model::Theme>();
- pThemePtr->setTheme(pTheme);
-
- rFilter.importFragment(
- new ThemeFragmentHandler(rFilter, aThemeFragmentPath, *pThemePtr, *pTheme),
- Reference<xml::sax::XFastSAXSerializable>(
- xDoc,
- UNO_QUERY_THROW));
- rThemes[ aThemeFragmentPath ] = pThemePtr;
- pThemePtr->setFragment(xDoc);
- saveThemeToGrabBag(pThemePtr, nIndex + 1);
- }
- else
- {
- pMasterPersistPtr->setTheme( (*aIter2).second );
- }
- }
- importSlide( xMasterFragmentHandler, pMasterPersistPtr );
- rFilter.importFragment( new LayoutFragmentHandler( rFilter, aLayoutFragmentPath, pMasterPersistPtr ) );
- pMasterPersistPtr->createBackground( rFilter );
- pMasterPersistPtr->createXShapes( rFilter );
-
- oox::drawingml::ThemePtr pTheme = pMasterPersistPtr->getTheme();
- if (pTheme)
- {
- pTheme->addTheme(pMasterPersistPtr->getPage());
- }
+ pMasterPersistPtr = importMasterSlide(xModel, rFilter, aLayoutFragmentPath, aMasterFragmentPath);
}
}
}