tdf#113822 convert animation value in SetTimeNodeContext.

Convert 'to' value of SetTimeNodeContext based on attribute name
and move conversion code in its destructor to convertAnimationValue.
Value conversion in AnimVariantContext is also included in
convertAnimationValue and is removed together.

Change-Id: I5dc693a1bbc7df57f7506e7704f9cd4693bf2056
Reviewed-on: https://gerrit.libreoffice.org/57412
Tested-by: Jenkins
Reviewed-by: Mark Hung <marklh9@gmail.com>
diff --git a/include/oox/ppt/pptfilterhelpers.hxx b/include/oox/ppt/pptfilterhelpers.hxx
index 94ac025..7944b03 100644
--- a/include/oox/ppt/pptfilterhelpers.hxx
+++ b/include/oox/ppt/pptfilterhelpers.hxx
@@ -36,7 +36,7 @@ namespace oox { namespace ppt {
    enum class AnimationAttributeEnum
    {
        PPT_X, PPT_Y, PPT_W, PPT_H, PPT_C, R, XSHEAR, FILLCOLOR, FILLTYPE,
        STROKECOLOR, STROKEON, STYLECOLOR, STYLEROTATION, FONTWEIGHT,
        FILLON, STROKECOLOR, STROKEON, STYLECOLOR, STYLEROTATION, FONTWEIGHT,
        STYLEUNDERLINE, STYLEFONTFAMILY, STYLEFONTSIZE, STYLEFONTSTYLE,
        STYLEVISIBILITY, STYLEOPACITY, UNKNOWN
    };
diff --git a/oox/source/ppt/animvariantcontext.cxx b/oox/source/ppt/animvariantcontext.cxx
index 6cf9135..81a70ac 100644
--- a/oox/source/ppt/animvariantcontext.cxx
+++ b/oox/source/ppt/animvariantcontext.cxx
@@ -38,23 +38,6 @@ using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml::sax;

namespace oox { namespace ppt {

    bool convertFillStyle( const OUString& rString, css::drawing::FillStyle& rValue )
    {
        if( rString == "solid" )
        {
            rValue = css::drawing::FillStyle::FillStyle_SOLID;
            return true;
        }
        else if( rString == "none" )
        {
            rValue = css::drawing::FillStyle::FillStyle_NONE;
            return true;
        }
        else
            return false;
    }

    AnimVariantContext::AnimVariantContext( FragmentHandler2 const & rParent, sal_Int32 aElement, Any & aValue )
        : FragmentHandler2( rParent )
            , mnElement( aElement )
@@ -102,18 +85,7 @@ namespace oox { namespace ppt {
        case PPT_TOKEN( strVal ):
        {
            OUString val = rAttribs.getString( XML_val, OUString() );
            if( convertMeasure( val ) )
            {
                maValue <<= val;
            }
            else
            {
                css::drawing::FillStyle eFillStyle;
                if( convertFillStyle( val, eFillStyle ) )
                    maValue <<= eFillStyle;
                else
                    maValue <<= val;
            }
            maValue <<= val;
            return this;
        }
        default:
diff --git a/oox/source/ppt/pptfilterhelpers.cxx b/oox/source/ppt/pptfilterhelpers.cxx
index a083cc2..3c1ab92 100644
--- a/oox/source/ppt/pptfilterhelpers.cxx
+++ b/oox/source/ppt/pptfilterhelpers.cxx
@@ -60,7 +60,7 @@ namespace oox { namespace ppt {
            { AnimationAttributeEnum::FILLCOLOR,         "fillColor",                    "FillColor" },
            { AnimationAttributeEnum::FILLCOLOR,         "fillcolor",                    "FillColor" },
            { AnimationAttributeEnum::FILLTYPE,          "fill.type",                    "FillStyle" },
            { AnimationAttributeEnum::FILLTYPE,          "fill.on",                      "FillOn" },
            { AnimationAttributeEnum::FILLON,            "fill.on",                      "FillOn" },
            { AnimationAttributeEnum::STROKECOLOR,       "stroke.color",                 "LineColor" },
            { AnimationAttributeEnum::STROKEON,          "stroke.on",                    "LineStyle" },
            { AnimationAttributeEnum::STYLECOLOR,        "style.color",                  "CharColor" },
@@ -313,6 +313,18 @@ namespace oox { namespace ppt {
                }
            }
            break;
            case AnimationAttributeEnum::FILLON:
            {
                // Slideshow doesn't support FillOn, but we need to convert the value type
                // so it can be written out again.
                OUString aString;
                if (rValue >>= aString)
                {
                    rValue <<= aString == "true";
                    bRet = true;
                }
            }
            break;

            case AnimationAttributeEnum::FILLTYPE:
            {
diff --git a/oox/source/ppt/timenodelistcontext.cxx b/oox/source/ppt/timenodelistcontext.cxx
index 0d4df9b..625036a 100644
--- a/oox/source/ppt/timenodelistcontext.cxx
+++ b/oox/source/ppt/timenodelistcontext.cxx
@@ -55,6 +55,35 @@ using namespace ::com::sun::star::presentation;
using namespace ::com::sun::star::xml::sax;
using ::com::sun::star::beans::NamedValue;

namespace {

    oox::ppt::AnimationAttributeEnum getAttributeEnumByAPIName(const OUString &rAPIName)
    {
        oox::ppt::AnimationAttributeEnum eResult = oox::ppt::AnimationAttributeEnum::UNKNOWN;
        const oox::ppt::ImplAttributeNameConversion *attrConv = oox::ppt::getAttributeConversionList();
        while(attrConv->mpAPIName != nullptr)
        {
            if(rAPIName.equalsAscii(attrConv->mpAPIName))
            {
                eResult = attrConv->meAttribute;
                break;
            }
            attrConv++;
        }
        return eResult;
    }

    bool convertAnimationValueWithTimeNode(const oox::ppt::TimeNodePtr& pNode, css::uno::Any &rAny)
    {
        css::uno::Any aAny = pNode->getNodeProperties()[oox::ppt::NP_ATTRIBUTENAME];
        OUString aNameList;
        aAny >>= aNameList;

        // only get first token.
        return oox::ppt::convertAnimationValue(getAttributeEnumByAPIName(aNameList.getToken(0, ';')), rAny);
    }
}

namespace oox { namespace ppt {

    struct AnimColor
@@ -172,25 +201,10 @@ namespace oox { namespace ppt {

        virtual ~SetTimeNodeContext() throw () override
            {
                if( maTo.hasValue() )
                if(maTo.hasValue())
                {
                    // TODO
                    // HACK !!! discard and refactor
                    OUString aString;
                    if( maTo >>= aString )
                    {
                        if( aString == "visible" || aString == "true" )
                            maTo <<= true;
                        else if( aString == "false" )
                            maTo <<= false;

                        if (!maTo.has<bool>())
                        {
                            SAL_WARN("oox.ppt", "conversion failed");
                            maTo <<= false;
                        }
                    }
                    mpNode->setTo( maTo );
                    convertAnimationValueWithTimeNode(mpNode, maTo);
                    mpNode->setTo(maTo);
                }

            }
diff --git a/sd/qa/unit/data/pptx/tdf113822underline.pptx b/sd/qa/unit/data/pptx/tdf113822underline.pptx
new file mode 100644
index 0000000..2d0d076
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf113822underline.pptx
Binary files differ
diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx
index 0394b0a..7ac6fc0 100644
--- a/sd/qa/unit/export-tests.cxx
+++ b/sd/qa/unit/export-tests.cxx
@@ -99,6 +99,7 @@ public:
    void testTextRotation();
    void testTdf115394PPT();
    void testBulletsAsImage();
    void testTdf113822();

    CPPUNIT_TEST_SUITE(SdExportTest);

@@ -123,6 +124,7 @@ public:
    CPPUNIT_TEST(testTextRotation);
    CPPUNIT_TEST(testTdf115394PPT);
    CPPUNIT_TEST(testBulletsAsImage);
    CPPUNIT_TEST(testTdf113822);

    CPPUNIT_TEST_SUITE_END();

@@ -1065,6 +1067,20 @@ void SdExportTest::testBulletsAsImage()
    }
}

void SdExportTest::testTdf113822()
{
    utl::TempFile tempFile;
    sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf113822underline.pptx"), PPTX);

    xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);

    xmlDocPtr pXmlDoc = parseExport(tempFile, "content.xml");
    assertXPath(pXmlDoc, "//anim:set[1]", "to", "solid");

    xDocShRef->DoClose();
}


CPPUNIT_TEST_SUITE_REGISTRATION(SdExportTest);

CPPUNIT_PLUGIN_IMPLEMENT();