include/oox/ppt/presentationfragmenthandler.hxx |    8 ++--
 oox/source/ppt/presentationfragmenthandler.cxx  |   42 ++++++++++++------------
 2 files changed, 26 insertions(+), 24 deletions(-)

New commits:
commit f2ae8b934aaac7c444e8493ed5e8189c6ce63328
Author:     Henry Castro <hcas...@collabora.com>
AuthorDate: Mon Oct 9 07:34:02 2023 -0400
Commit:     Henry Castro <hcas...@collabora.com>
CommitDate: Tue Oct 31 21:09:19 2023 +0100

    tdf#155512: oox: ppt: fix import master slides, follow up
    
    Import all master slides.
    
    Signed-off-by: Henry Castro <hcas...@collabora.com>
    Change-Id: Ieac68bacf15c75e4c23ec692aadcb16033cdd092
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157701
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158716
    Tested-by: Jenkins

diff --git a/include/oox/ppt/presentationfragmenthandler.hxx 
b/include/oox/ppt/presentationfragmenthandler.hxx
index 29204b282bdb..20fc521ae8c5 100644
--- a/include/oox/ppt/presentationfragmenthandler.hxx
+++ b/include/oox/ppt/presentationfragmenthandler.hxx
@@ -52,10 +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,
-                                                std::u16string_view 
rLayoutFragmentPath,
-                                                std::u16string_view 
rMasterFragmentPath);
+    void importMasterSlides();
+    void importMasterSlide(const 
::com::sun::star::uno::Reference<::com::sun::star::frame::XModel>& xModel,
+                           ::oox::ppt::PowerPointImport& rFilter,
+                           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 edb523161c9e..2e0f48bbae98 100644
--- a/oox/source/ppt/presentationfragmenthandler.cxx
+++ b/oox/source/ppt/presentationfragmenthandler.cxx
@@ -215,18 +215,16 @@ void 
PresentationFragmentHandler::importCustomSlideShow(std::vector<CustomShow>&
     }
 }
 
-SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const 
Reference<frame::XModel>& xModel,
-                                                               
PowerPointImport& rFilter,
-                                                               
std::u16string_view rLayoutFragmentPath,
-                                                               
std::u16string_view rMasterFragmentPath)
+void PresentationFragmentHandler::importMasterSlide(const 
Reference<frame::XModel>& xModel,
+                                                    PowerPointImport& rFilter,
+                                                    const OUString& 
rMasterFragmentPath)
 {
     OUString aLayoutFragmentPath;
-    OUString aMasterFragmentPath(rMasterFragmentPath);
-    SlidePersistPtr pMasterPersistPtr, pMasterPtr;
+    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 );
-    RelationsRef xMasterRelations = rFilter.importRelations( 
aMasterFragmentPath );
+    RelationsRef xMasterRelations = rFilter.importRelations( 
rMasterFragmentPath );
 
     for (const auto& rEntry : *xMasterRelations)
     {
@@ -252,7 +250,7 @@ SlidePersistPtr 
PresentationFragmentHandler::importMasterSlide(const Reference<f
         pMasterPersistPtr->setLayoutPath( aLayoutFragmentPath );
         rFilter.getMasterPages().push_back( pMasterPersistPtr );
         rFilter.setActualSlidePersist( pMasterPersistPtr );
-        FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( 
rFilter, aMasterFragmentPath, pMasterPersistPtr, Master ) );
+        FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( 
rFilter, rMasterFragmentPath, pMasterPersistPtr, Master ) );
 
         // set the correct theme
         OUString aThemeFragmentPath = 
xMasterFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc( u"theme" );
@@ -297,14 +295,7 @@ SlidePersistPtr 
PresentationFragmentHandler::importMasterSlide(const Reference<f
         {
             pTheme->addTheme(pMasterPersistPtr->getPage());
         }
-
-        if (pMasterPersistPtr->getLayoutPath() == rLayoutFragmentPath)
-        {
-            pMasterPtr = pMasterPersistPtr;
-        }
     }
-
-    return pMasterPtr;
 }
 
 void PresentationFragmentHandler::saveThemeToGrabBag(const 
oox::drawingml::ThemePtr& pThemePtr,
@@ -374,6 +365,19 @@ void PresentationFragmentHandler::saveThemeToGrabBag(const 
oox::drawingml::Theme
     }
 }
 
+void PresentationFragmentHandler::importMasterSlides()
+{
+    OUString aMasterFragmentPath;
+    PowerPointImport& rFilter = dynamic_cast<PowerPointImport&>(getFilter());
+    Reference<frame::XModel> xModel(rFilter.getModel());
+
+    for (size_t nMaster = 0; nMaster < maSlideMasterVector.size(); ++nMaster)
+    {
+        aMasterFragmentPath = 
getFragmentPathFromRelId(maSlideMasterVector[nMaster]);
+        importMasterSlide(xModel, rFilter, aMasterFragmentPath);
+    }
+}
+
 void PresentationFragmentHandler::importSlide(sal_uInt32 nSlide, bool 
bFirstPage, bool bImportNotesPage)
 {
     PowerPointImport& rFilter = dynamic_cast< PowerPointImport& >( getFilter() 
);
@@ -388,7 +392,10 @@ void PresentationFragmentHandler::importSlide(sal_uInt32 
nSlide, bool bFirstPage
     try {
 
         if( bFirstPage )
+        {
             xDrawPages->getByIndex( 0 ) >>= xSlide;
+            importMasterSlides();
+        }
         else
             xSlide = xDrawPages->insertNewByIndex( xDrawPages->getCount() );
 
@@ -421,11 +428,6 @@ void PresentationFragmentHandler::importSlide(sal_uInt32 
nSlide, bool bFirstPage
                             break;
                         }
                     }
-
-                    if ( !pMasterPersistPtr )
-                    {   // masterpersist not found, we have to load it
-                        pMasterPersistPtr = importMasterSlide(xModel, rFilter, 
aLayoutFragmentPath, aMasterFragmentPath);
-                    }
                 }
             }
 

Reply via email to