include/oox/ppt/presentationfragmenthandler.hxx |    6 +
 oox/source/ppt/presentationfragmenthandler.cxx  |  137 ++++++++++++------------
 2 files changed, 80 insertions(+), 63 deletions(-)

New commits:
commit 84ac58c37fffa0c8b6d55c70009515d013ad65b4
Author:     Henry Castro <hcas...@collabora.com>
AuthorDate: Thu Sep 28 14:23:55 2023 -0400
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue Oct 3 11:28:41 2023 +0200

    tdf#155512: oox: ppt: abstraction "importMasterSlide"
    
    Signed-off-by: Henry Castro <hcas...@collabora.com>
    Change-Id: Icfe8e3abbada7f728b2ad1f8e300a688f51d8f75
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157386
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

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 5f35dbdfdb1c..a0f13c83ae05 100644
--- a/oox/source/ppt/presentationfragmenthandler.cxx
+++ b/oox/source/ppt/presentationfragmenthandler.cxx
@@ -199,6 +199,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)
 {
@@ -315,69 +388,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);
                     }
                 }
             }

Reply via email to