sd/pptx export: new PPTXAnimationExport class.

Create a new PPTXAnimationExport and move animation
related member functions from PowerPointExport.

Change-Id: Iaeb9ff032c248d9b540680a4937365004d0c921e
Reviewed-on: https://gerrit.libreoffice.org/59735
Tested-by: Jenkins
Reviewed-by: Mark Hung <marklh9@gmail.com>
diff --git a/sd/source/filter/eppt/epptooxml.hxx b/sd/source/filter/eppt/epptooxml.hxx
index 97f7cf9..4f1a154 100644
--- a/sd/source/filter/eppt/epptooxml.hxx
+++ b/sd/source/filter/eppt/epptooxml.hxx
@@ -83,6 +83,8 @@ public:
    static const char* Get8Direction( sal_uInt8 nDirection );
    static       int   GetPPTXLayoutId( int nOffset );

    sal_Int32 GetShapeID(const css::uno::Reference<css::drawing::XShape>& rXShape);
    sal_Int32 GetNextAnimationNodeID();
private:

    virtual void ImplWriteSlide( sal_uInt32 nPageNum, sal_uInt32 nMasterNum, sal_uInt16 nMode,
@@ -99,16 +101,6 @@ private:
    virtual ::oox::ole::VbaProject* implCreateVbaProject() const override;
    void WriteNotesMaster();

    void WriteAnimations( const ::sax_fastparser::FSHelperPtr& pFS );
    void WriteAnimationNode( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::animations::XAnimationNode >& rXNode, bool bMainSeqChild );
    void WriteAnimationNodeAnimate( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::animations::XAnimationNode >& rXNode, sal_Int32 nXmlNodeType, bool bMainSeqChild );
    void WriteAnimationNodeAnimateInside( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::animations::XAnimationNode >& rXNode, bool bMainSeqChild, bool bSimple, bool bWriteTo = true );
    void WriteAnimationNodeSeq( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::animations::XAnimationNode >& rXNode, sal_Int32 nXmlNodeType, bool bMainSeqChild );
    void WriteAnimationNodeEffect( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::animations::XAnimationNode >& rXNode, sal_Int32 nXmlNodeType, bool bMainSeqChild );
    void WriteAnimationNodeCommand(const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::animations::XAnimationNode >& rXNode, sal_Int32 nXmlNodeType, bool bMainSeqChild );
    void WriteAnimationNodeCommonPropsStart( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::animations::XAnimationNode >& rXNode, bool bSingle, bool bMainSeqChild );

    void WriteAnimationTarget( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Any& rTarget );
    bool WriteComments( sal_uInt32 nPageNum );
    void ImplWriteBackground( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::beans::XPropertySet >& aXBackgroundPropSet );
    void WriteTransition( const ::sax_fastparser::FSHelperPtr& pFS );
diff --git a/sd/source/filter/eppt/pptx-animations.cxx b/sd/source/filter/eppt/pptx-animations.cxx
index d9c98db..17d16de 100644
--- a/sd/source/filter/eppt/pptx-animations.cxx
+++ b/sd/source/filter/eppt/pptx-animations.cxx
@@ -54,11 +54,13 @@
#include <com/sun/star/presentation/TextAnimationType.hpp>
#include <com/sun/star/text/XSimpleText.hpp>
#include <com/sun/star/drawing/XShape.hpp>
#include <com/sun/star/drawing/XDrawPage.hpp>
#include <oox/export/utils.hxx>
#include <oox/ppt/pptfilterhelpers.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>

#include "pptexanimations.hxx"
#include "pptx-animations.hxx"
#include "../ppt/pptanimations.hxx"

using namespace ::com::sun::star::animations;
@@ -71,6 +73,7 @@ using namespace oox::core;
using namespace oox;

using ::com::sun::star::beans::NamedValue;
using ::com::sun::star::drawing::XDrawPage;
using ::com::sun::star::drawing::XShape;
using ::com::sun::star::text::XSimpleText;
using ::sax_fastparser::FSHelperPtr;
@@ -447,9 +450,54 @@ sal_Int32 convertNodeType(sal_Int16 nType)
    }
    return xmlNodeType;
}

class PPTXAnimationExport
{
    void WriteAnimationNode(const FSHelperPtr& pFS, const Reference<XAnimationNode>& rXNode,
                            bool bMainSeqChild);
    void WriteAnimationNodeAnimate(const FSHelperPtr& pFS, const Reference<XAnimationNode>& rXNode,
                                   sal_Int32 nXmlNodeType, bool bMainSeqChild);
    void WriteAnimationNodeAnimateInside(const FSHelperPtr& pFS,
                                         const Reference<XAnimationNode>& rXNode,
                                         bool bMainSeqChild, bool bSimple, bool bWriteTo = true);
    void WriteAnimationNodeSeq(const FSHelperPtr& pFS, const Reference<XAnimationNode>& rXNode,
                               sal_Int32 nXmlNodeType, bool bMainSeqChild);
    void WriteAnimationNodeEffect(const FSHelperPtr& pFS, const Reference<XAnimationNode>& rXNode,
                                  sal_Int32 nXmlNodeType, bool bMainSeqChild);
    void WriteAnimationNodeCommand(const FSHelperPtr& pFS, const Reference<XAnimationNode>& rXNode,
                                   sal_Int32 nXmlNodeType, bool bMainSeqChild);
    void WriteAnimationNodeCommonPropsStart(const FSHelperPtr& pFS,
                                            const Reference<XAnimationNode>& rXNode, bool bSingle,
                                            bool bMainSeqChild);
    void WriteAnimationTarget(const FSHelperPtr& pFS, const Any& rTarget);

    PowerPointExport& mrPowerPointExport;

public:
    PPTXAnimationExport(PowerPointExport& rExport);
    void WriteAnimations(const FSHelperPtr& pFS, const Reference<XDrawPage>& rXDrawPage);
};
}

void PowerPointExport::WriteAnimationTarget(const FSHelperPtr& pFS, const Any& rTarget)
namespace oox
{
namespace core
{
void WriteAnimations(const FSHelperPtr& pFS, const Reference<XDrawPage>& rXDrawPage,
                     PowerPointExport& rExport)
{
    PPTXAnimationExport aAnimationExport(rExport);
    aAnimationExport.WriteAnimations(pFS, rXDrawPage);
}
}
}

PPTXAnimationExport::PPTXAnimationExport(PowerPointExport& rExport)
    : mrPowerPointExport(rExport)
{
}

void PPTXAnimationExport::WriteAnimationTarget(const FSHelperPtr& pFS, const Any& rTarget)
{
    sal_Int32 nParagraph = -1;
    bool bParagraphTarget = false;
@@ -475,9 +523,10 @@ void PowerPointExport::WriteAnimationTarget(const FSHelperPtr& pFS, const Any& r

    if (rXShape.is())
    {
        sal_Int32 nShapeID = mrPowerPointExport.GetShapeID(rXShape);

        pFS->startElementNS(XML_p, XML_tgtEl, FSEND);
        pFS->startElementNS(XML_p, XML_spTgt, XML_spid,
                            I32S(ShapeExport::GetShapeID(rXShape, &maShapeMap)), FSEND);
        pFS->startElementNS(XML_p, XML_spTgt, XML_spid, I32S(nShapeID), FSEND);
        if (bParagraphTarget)
        {
            pFS->startElementNS(XML_p, XML_txEl, FSEND);
@@ -490,9 +539,9 @@ void PowerPointExport::WriteAnimationTarget(const FSHelperPtr& pFS, const Any& r
    }
}

void PowerPointExport::WriteAnimationNodeAnimate(const FSHelperPtr& pFS,
                                                 const Reference<XAnimationNode>& rXNode,
                                                 sal_Int32 nXmlNodeType, bool bMainSeqChild)
void PPTXAnimationExport::WriteAnimationNodeAnimate(const FSHelperPtr& pFS,
                                                    const Reference<XAnimationNode>& rXNode,
                                                    sal_Int32 nXmlNodeType, bool bMainSeqChild)
{
    Reference<XAnimate> rXAnimate(rXNode, UNO_QUERY);
    if (!rXAnimate.is())
@@ -617,10 +666,10 @@ void PowerPointExport::WriteAnimationNodeAnimate(const FSHelperPtr& pFS,
    pFS->endElementNS(XML_p, nXmlNodeType);
}

void PowerPointExport::WriteAnimationNodeAnimateInside(const FSHelperPtr& pFS,
                                                       const Reference<XAnimationNode>& rXNode,
                                                       bool bMainSeqChild, bool bSimple,
                                                       bool bWriteTo)
void PPTXAnimationExport::WriteAnimationNodeAnimateInside(const FSHelperPtr& pFS,
                                                          const Reference<XAnimationNode>& rXNode,
                                                          bool bMainSeqChild, bool bSimple,
                                                          bool bWriteTo)
{
    Reference<XAnimate> rXAnimate(rXNode, UNO_QUERY);
    if (!rXAnimate.is())
@@ -686,9 +735,9 @@ void PowerPointExport::WriteAnimationNodeAnimateInside(const FSHelperPtr& pFS,
        WriteAnimateTo(pFS, rXAnimate->getTo(), rXAnimate->getAttributeName());
}

void PowerPointExport::WriteAnimationNodeCommonPropsStart(const FSHelperPtr& pFS,
                                                          const Reference<XAnimationNode>& rXNode,
                                                          bool bSingle, bool bMainSeqChild)
void PPTXAnimationExport::WriteAnimationNodeCommonPropsStart(
    const FSHelperPtr& pFS, const Reference<XAnimationNode>& rXNode, bool bSingle,
    bool bMainSeqChild)
{
    const char* pDuration = nullptr;
    const char* pRestart = nullptr;
@@ -835,7 +884,7 @@ void PowerPointExport::WriteAnimationNodeCommonPropsStart(const FSHelperPtr& pFS
    bool bAutoReverse = rXNode->getAutoReverse();

    pFS->startElementNS(
        XML_p, XML_cTn, XML_id, I64S(mnAnimationNodeIdMax++), XML_dur,
        XML_p, XML_cTn, XML_id, I64S(mrPowerPointExport.GetNextAnimationNodeID()), XML_dur,
        fDuration != 0 ? I32S(static_cast<sal_Int32>(fDuration * 1000.0)) : pDuration, XML_autoRev,
        bAutoReverse ? "1" : nullptr, XML_restart, pRestart, XML_nodeType, pNodeType, XML_fill,
        pFill, XML_presetClass, pPresetClass, XML_presetID, bPresetId ? I64S(nPresetId) : nullptr,
@@ -924,9 +973,9 @@ void PowerPointExport::WriteAnimationNodeCommonPropsStart(const FSHelperPtr& pFS
        pFS->endElementNS(XML_p, XML_cTn);
}

void PowerPointExport::WriteAnimationNodeSeq(const FSHelperPtr& pFS,
                                             const Reference<XAnimationNode>& rXNode, sal_Int32,
                                             bool bMainSeqChild)
void PPTXAnimationExport::WriteAnimationNodeSeq(const FSHelperPtr& pFS,
                                                const Reference<XAnimationNode>& rXNode, sal_Int32,
                                                bool bMainSeqChild)
{
    SAL_INFO("sd.eppt", "write animation node SEQ");

@@ -940,9 +989,9 @@ void PowerPointExport::WriteAnimationNodeSeq(const FSHelperPtr& pFS,
    pFS->endElementNS(XML_p, XML_seq);
}

void PowerPointExport::WriteAnimationNodeEffect(const FSHelperPtr& pFS,
                                                const Reference<XAnimationNode>& rXNode, sal_Int32,
                                                bool bMainSeqChild)
void PPTXAnimationExport::WriteAnimationNodeEffect(const FSHelperPtr& pFS,
                                                   const Reference<XAnimationNode>& rXNode,
                                                   sal_Int32, bool bMainSeqChild)
{
    SAL_INFO("sd.eppt", "write animation node FILTER");
    Reference<XTransitionFilter> xFilter(rXNode, UNO_QUERY);
@@ -960,9 +1009,9 @@ void PowerPointExport::WriteAnimationNodeEffect(const FSHelperPtr& pFS,
    }
}

void PowerPointExport::WriteAnimationNodeCommand(const FSHelperPtr& pFS,
                                                 const Reference<XAnimationNode>& rXNode, sal_Int32,
                                                 bool bMainSeqChild)
void PPTXAnimationExport::WriteAnimationNodeCommand(const FSHelperPtr& pFS,
                                                    const Reference<XAnimationNode>& rXNode,
                                                    sal_Int32, bool bMainSeqChild)
{
    SAL_INFO("sd.eppt", "write animation node COMMAND");
    Reference<XCommand> xCommand(rXNode, UNO_QUERY);
@@ -1002,9 +1051,9 @@ void PowerPointExport::WriteAnimationNodeCommand(const FSHelperPtr& pFS,
    }
}

void PowerPointExport::WriteAnimationNode(const FSHelperPtr& pFS,
                                          const Reference<XAnimationNode>& rXNode,
                                          bool bMainSeqChild)
void PPTXAnimationExport::WriteAnimationNode(const FSHelperPtr& pFS,
                                             const Reference<XAnimationNode>& rXNode,
                                             bool bMainSeqChild)
{
    SAL_INFO("sd.eppt", "export node type: " << rXNode->getType());
    sal_Int32 xmlNodeType = convertNodeType(rXNode->getType());
@@ -1055,9 +1104,10 @@ void PowerPointExport::WriteAnimationNode(const FSHelperPtr& pFS,
    }
}

void PowerPointExport::WriteAnimations(const FSHelperPtr& pFS)
void PPTXAnimationExport::WriteAnimations(const FSHelperPtr& pFS,
                                          const Reference<XDrawPage>& rXDrawPage)
{
    Reference<XAnimationNodeSupplier> xNodeSupplier(mXDrawPage, UNO_QUERY);
    Reference<XAnimationNodeSupplier> xNodeSupplier(rXDrawPage, UNO_QUERY);
    if (xNodeSupplier.is())
    {
        const Reference<XAnimationNode> xNode(xNodeSupplier->getAnimationNode());
diff --git a/sd/source/filter/eppt/pptx-animations.hxx b/sd/source/filter/eppt/pptx-animations.hxx
new file mode 100644
index 0000000..738100b
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-animations.hxx
@@ -0,0 +1,23 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
#ifndef INCLUDED_SD_SOURCE_FILTER_EPPT_EPPTANIMATIONS_HXX
#define INCLUDED_SD_SOURCE_FILTER_EPPT_EPPTANIMATIONS_HXX

namespace oox
{
namespace core
{
void WriteAnimations(const ::sax_fastparser::FSHelperPtr& pFS,
                     const css::uno::Reference<css::drawing::XDrawPage>& rXDrawPage,
                     PowerPointExport& rExport);
}
}
#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx
index 6142e15..e625a98 100644
--- a/sd/source/filter/eppt/pptx-epptooxml.cxx
+++ b/sd/source/filter/eppt/pptx-epptooxml.cxx
@@ -61,6 +61,7 @@
#include <basegfx/polygon/b2dpolypolygontools.hxx>

#include "pptexanimations.hxx"
#include "pptx-animations.hxx"
#include "../ppt/pptanimations.hxx"

#include <com/sun/star/document/XDocumentProperties.hpp>
@@ -1108,7 +1109,7 @@ void PowerPointExport::ImplWriteSlide(sal_uInt32 nPageNum, sal_uInt32 nMasterNum
    pFS->endElementNS(XML_p, XML_cSld);

    WriteTransition(pFS);
    WriteAnimations(pFS);
    WriteAnimations(pFS, mXDrawPage, *this);

    pFS->endElementNS(XML_p, XML_sld);

@@ -1929,6 +1930,16 @@ void PowerPointExport::WriteNotesMaster()
    SAL_INFO("sd.eppt", "----------------");
}

sal_Int32 PowerPointExport::GetShapeID(const Reference<XShape>& rXShape)
{
    return ShapeExport::GetShapeID(rXShape, &maShapeMap);
}

sal_Int32 PowerPointExport::GetNextAnimationNodeID()
{
    return mnAnimationNodeIdMax++;
}

bool PowerPointExport::ImplCreateMainNotes()
{
    if (mbCreateNotes)