summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2021-01-16 23:48:56 +0800
committerMark Hung <marklh9@gmail.com>2021-01-20 12:14:21 +0100
commit9b19bf0283b569a5c134de6b5cce1d72d8f37879 (patch)
tree127dcfc58c9db7a64e0d396a88f3f0476ffc56ec /oox
parent3ff95c8df6be9aa01aef5c663ee2ffa9881193d4 (diff)
tdf#128550 set sub item on the ancestor node.
The target of a animation node may resolved to a subitem. However it only has effect on a iterate container or animate node, not on any other containers. Subitem setting like background and paragraph got ignored, so everything were shown together. The patch find the ancestor node that is iterate container or animate, and set the subitem on it. Change-Id: Iaaa52aed3a34eb2d70b3b318b8336246e17e1e98 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109444 Tested-by: Jenkins Reviewed-by: Mark Hung <marklh9@gmail.com>
Diffstat (limited to 'oox')
-rw-r--r--oox/source/ppt/timenode.cxx57
1 files changed, 49 insertions, 8 deletions
diff --git a/oox/source/ppt/timenode.cxx b/oox/source/ppt/timenode.cxx
index 3e08a6716d74..132c54b79f4a 100644
--- a/oox/source/ppt/timenode.cxx
+++ b/oox/source/ppt/timenode.cxx
@@ -51,8 +51,37 @@ using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::animations;
using namespace ::com::sun::star::presentation;
-namespace oox::ppt {
+namespace {
+
+void lcl_setAncestorSubItem( const Reference<XAnimationNode>& xParent, sal_Int16 nSubItem )
+{
+
+ Reference<XAnimationNode> xNode = xParent;
+
+ while ( xNode.is() )
+ {
+ if ( xNode->getType() == AnimationNodeType::ANIMATE )
+ {
+ Reference<XAnimate> xAnimate( xNode, UNO_QUERY );
+ if ( xAnimate.is() )
+ xAnimate->setSubItem( nSubItem );
+ break;
+ }
+ else if ( xNode->getType() == AnimationNodeType::ITERATE )
+ {
+ Reference<XIterateContainer> xIterateContainer( xNode, UNO_QUERY );
+ if ( xIterateContainer.is() )
+ xIterateContainer->setSubItem( nSubItem );
+ break;
+ }
+
+ xNode.set( xNode->getParent(), UNO_QUERY );
+ }
+}
+
+}
+namespace oox::ppt {
OUString TimeNode::getServiceName( sal_Int16 nNodeType )
{
OUString sServiceName;
@@ -225,11 +254,17 @@ namespace oox::ppt {
if( mpTarget )
{
- sal_Int16 nSubType(0);
- maNodeProperties[ NP_TARGET ] = mpTarget->convert( pSlide, nSubType );
+ sal_Int16 nSubItem(0);
+ maNodeProperties[ NP_TARGET ] = mpTarget->convert( pSlide, nSubItem );
if( mpTarget->mnType == XML_spTgt )
{
- maNodeProperties[ NP_SUBITEM ] <<= nSubType;
+ if ( xNode->getType() == AnimationNodeType::ANIMATE ||
+ xNode->getType() == AnimationNodeType::ITERATE )
+ {
+ maNodeProperties[ NP_SUBITEM ] <<= nSubItem;
+ }
+ else
+ lcl_setAncestorSubItem( xParent, nSubItem );
}
}
@@ -320,15 +355,21 @@ namespace oox::ppt {
}
break;
case NP_SUBITEM:
- if( xAnimate.is() )
+ if( aValue >>= nInt16 )
{
- if( aValue >>= nInt16 )
+ if( xAnimate.is() )
+ {
xAnimate->setSubItem( nInt16 );
- else
+ }
+ else if ( xIterateContainer.is() )
{
- SAL_INFO("oox.ppt","any >>= failed " << __LINE__ );
+ xIterateContainer->setSubItem( nInt16 );
}
}
+ else
+ {
+ SAL_INFO("oox.ppt","any >>= failed " << __LINE__ );
+ }
break;
case NP_ATTRIBUTENAME:
if( xAnimate.is() )