sd/source/filter/eppt/epptooxml.hxx      |   10 +++
 sd/source/filter/eppt/pptx-epptooxml.cxx |   83 ++++++++++++++++++-------------
 2 files changed, 59 insertions(+), 34 deletions(-)

New commits:
commit e22a70048ba0025107b1a6c4b14564a6e786bc5a
Author:     Sarper Akdemir <sarper.akde...@collabora.com>
AuthorDate: Wed Jun 9 07:54:04 2021 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Jun 23 23:31:58 2021 +0200

    tdf#59323: pptx export: add placeholder index to master footer placeholders
    
    OOXML uses placeholder index to determine from which layout placeholder it
    should be inheriting styles, position etc.
    
    Added maPlaceholderShapeToIndexMap that stores corresponding Placeholder 
index
    for a Placeholder XShape on the master slide.
    
    Right now only used for placeholder types Footer, DateAndTime and 
SlideNumber.
    
    Change-Id: If788f235d00b6d1cde7194d9e4a0789e019432c3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117010
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117538
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/sd/source/filter/eppt/epptooxml.hxx 
b/sd/source/filter/eppt/epptooxml.hxx
index d4f2b618f25d..0b9f5f5fd812 100644
--- a/sd/source/filter/eppt/epptooxml.hxx
+++ b/sd/source/filter/eppt/epptooxml.hxx
@@ -119,6 +119,12 @@ private:
 
     static void WriteDiagram(const FSHelperPtr& pFS, PowerPointShapeExport& 
rDML, const css::uno::Reference<css::drawing::XShape>& rXShape, int nDiagramId);
 
+    /** Create a new placeholder index for a master placeholder shape
+
+        @param rXShape Master placeholder shape
+        @returns Placeholder index
+    */
+    unsigned CreateNewPlaceholderIndex(const 
css::uno::Reference<css::drawing::XShape>& rXShape);
     /// Should we export as .pptm, ie. do we contain macros?
     bool mbPptm;
 
@@ -141,6 +147,10 @@ private:
 
     ::oox::drawingml::ShapeExport::ShapeHashMap maShapeMap;
 
+    unsigned mnPlaceholderIndexMax; ///< Last used placeholder index
+    /// Map of placeholder indexes for Master placeholders
+    std::unordered_map< css::uno::Reference<css::drawing::XShape>, unsigned > 
maPlaceholderShapeToIndexMap;
+
     struct AuthorComments {
         sal_Int32 nId;
         sal_Int32 nLastIndex;
diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx 
b/sd/source/filter/eppt/pptx-epptooxml.cxx
index 8a7db7302ff0..2c7a0dc2fb94 100644
--- a/sd/source/filter/eppt/pptx-epptooxml.cxx
+++ b/sd/source/filter/eppt/pptx-epptooxml.cxx
@@ -128,8 +128,35 @@ void WriteSndAc(const FSHelperPtr& pFS, const OUString& 
sSoundRelId, const OUStr
         pFS->endElement(FSNS(XML_p, XML_stSnd));
         pFS->endElement(FSNS(XML_p, XML_sndAc));
 }
-}
 
+const char* getPlaceholderTypeName(PlaceholderType ePlaceholder)
+{
+    switch (ePlaceholder)
+    {
+        case SlideImage:
+            return "sldImg";
+        case Notes:
+            return "body";
+        case Header:
+            return "hdr";
+        case Footer:
+            return "ftr";
+        case SlideNumber:
+            return "sldNum";
+        case DateAndTime:
+            return "dt";
+        case Outliner:
+            return "body";
+        case Title:
+            return "title";
+        case Subtitle:
+            return "subTitle";
+        default:
+            SAL_INFO("sd.eppt", "warning: unhandled placeholder type: " << 
ePlaceholder);
+            return "";
+    }
+}
+}
 }
 }
 
@@ -335,6 +362,7 @@ PowerPointExport::PowerPointExport(const Reference< 
XComponentContext >& rContex
     , mnAnimationNodeIdMax(1)
     , mnDiagramId(1)
     , mbCreateNotes(false)
+    , mnPlaceholderIndexMax(1)
 {
     comphelper::SequenceAsHashMap aArgumentsMap(rArguments);
     mbPptm = aArgumentsMap.getUnpackedValueOrDefault("IsPPTM", false);
@@ -1449,41 +1477,22 @@ ShapeExport& 
PowerPointShapeExport::WritePlaceholderShape(const Reference< XShap
     mpFS->endElementNS(XML_p, XML_cNvSpPr);
     mpFS->startElementNS(XML_p, XML_nvPr);
 
-    const char* pType = nullptr;
-    switch (ePlaceholder)
+    bool bUsePlaceholderIndex
+        = ePlaceholder == Footer || ePlaceholder == DateAndTime || 
ePlaceholder == SlideNumber;
+    const char* pType = getPlaceholderTypeName(ePlaceholder);
+
+    SAL_INFO("sd.eppt", "write placeholder " << pType);
+    if (bUsePlaceholderIndex)
     {
-    case SlideImage:
-        pType = "sldImg";
-        break;
-    case Notes:
-        pType = "body";
-        break;
-    case Header:
-        pType = "hdr";
-        break;
-    case Footer:
-        pType = "ftr";
-        break;
-    case SlideNumber:
-        pType = "sldNum";
-        break;
-    case DateAndTime:
-        pType = "dt";
-        break;
-    case Outliner:
-        pType = "body";
-        break;
-    case Title:
-        pType = "title";
-        break;
-    case Subtitle:
-        pType = "subTitle";
-        break;
-    default:
-        SAL_INFO("sd.eppt", "warning: unhandled placeholder type: " << 
ePlaceholder);
+        mpFS->singleElementNS(
+            XML_p, XML_ph, XML_type, pType, XML_idx,
+            OString::number(
+                
static_cast<PowerPointExport*>(GetFB())->CreateNewPlaceholderIndex(xShape)));
+    }
+    else
+    {
+        mpFS->singleElementNS(XML_p, XML_ph, XML_type, pType);
     }
-    SAL_INFO("sd.eppt", "write placeholder " << pType);
-    mpFS->singleElementNS(XML_p, XML_ph, XML_type, pType);
     mpFS->endElementNS(XML_p, XML_nvPr);
     mpFS->endElementNS(XML_p, XML_nvSpPr);
 
@@ -2011,6 +2020,12 @@ void PowerPointExport::WriteDiagram(const FSHelperPtr& 
pFS, PowerPointShapeExpor
     pFS->endElementNS(XML_p, XML_graphicFrame);
 }
 
+unsigned PowerPointExport::CreateNewPlaceholderIndex(const 
css::uno::Reference<XShape> &rXShape)
+{
+    maPlaceholderShapeToIndexMap.insert({rXShape, mnPlaceholderIndexMax});
+    return mnPlaceholderIndexMax++;
+}
+
 // UNO component
 extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
 css_comp_Impress_oox_PowerPointExport(uno::XComponentContext* rxCtxt,
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to