23#include <com/sun/star/animations/AnimationNodeType.hpp>
24#include <com/sun/star/animations/AnimateColor.hpp>
25#include <com/sun/star/animations/AnimateMotion.hpp>
26#include <com/sun/star/animations/AnimateSet.hpp>
27#include <com/sun/star/animations/AnimationFill.hpp>
28#include <com/sun/star/animations/Audio.hpp>
29#include <com/sun/star/animations/Command.hpp>
30#include <com/sun/star/animations/Event.hpp>
31#include <com/sun/star/animations/EventTrigger.hpp>
32#include <com/sun/star/animations/IterateContainer.hpp>
33#include <com/sun/star/animations/ParallelTimeContainer.hpp>
34#include <com/sun/star/animations/SequenceTimeContainer.hpp>
35#include <com/sun/star/animations/XCommand.hpp>
36#include <com/sun/star/animations/XIterateContainer.hpp>
37#include <com/sun/star/animations/XAnimateTransform.hpp>
38#include <com/sun/star/animations/XAnimateMotion.hpp>
39#include <com/sun/star/animations/XAnimate.hpp>
40#include <com/sun/star/animations/AnimationRestart.hpp>
41#include <com/sun/star/beans/NamedValue.hpp>
42#include <com/sun/star/beans/XPropertySet.hpp>
43#include <com/sun/star/container/XEnumerationAccess.hpp>
44#include <com/sun/star/lang/XInitialization.hpp>
45#include <com/sun/star/presentation/EffectNodeType.hpp>
46#include <com/sun/star/presentation/EffectCommands.hpp>
47#include <com/sun/star/presentation/EffectPresetClass.hpp>
48#include <com/sun/star/presentation/ParagraphTarget.hpp>
49#include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
50#include <com/sun/star/text/XText.hpp>
51#include <com/sun/star/util/XCloneable.hpp>
52#include <com/sun/star/util/XChangesNotifier.hpp>
55#include <com/sun/star/lang/Locale.hpp>
56#include <com/sun/star/i18n/BreakIterator.hpp>
57#include <com/sun/star/i18n/CharacterIteratorMode.hpp>
58#include <com/sun/star/i18n/WordType.hpp>
59#include <com/sun/star/presentation/TextAnimationType.hpp>
79#include <animations.hxx>
87using ::com::sun::star::container::XEnumerationAccess;
88using ::com::sun::star::container::XEnumeration;
89using ::com::sun::star::beans::NamedValue;
90using ::com::sun::star::container::XChild;
91using ::com::sun::star::drawing::XShape;
92using ::com::sun::star::lang::XInitialization;
93using ::com::sun::star::text::XText;
94using ::com::sun::star::text::XTextRange;
95using ::com::sun::star::beans::XPropertySet;
96using ::com::sun::star::util::XCloneable;
97using ::com::sun::star::lang::Locale;
98using ::com::sun::star::util::XChangesNotifier;
99using ::com::sun::star::util::XChangesListener;
134 mnFill(AnimationFill::HOLD),
137 mfAbsoluteDuration(-1.0),
148 mpEffectSequence( nullptr ),
149 mbHasAfterEffect(false),
150 mbAfterEffectOnNextEffect(false)
161 const Sequence< NamedValue > aUserData(
mxNode->getUserData() );
163 for(
const NamedValue& rProp : aUserData )
165 if ( rProp.Name ==
"node-type" )
169 else if ( rProp.Name ==
"preset-id" )
173 else if ( rProp.Name ==
"preset-sub-type" )
177 else if ( rProp.Name ==
"preset-class" )
181 else if ( rProp.Name ==
"preset-property" )
185 else if ( rProp.Name ==
"group-id" )
201 Reference< XIterateContainer > xIter(
mxNode, UNO_QUERY );
216 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
217 if( xEnumerationAccess.is() )
219 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
220 if( xEnumeration.is() )
222 while( xEnumeration->hasMoreElements() )
224 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
225 if( !xChildNode.is() )
228 if( xChildNode->getType() == AnimationNodeType::AUDIO )
230 mxAudio.set( xChildNode, UNO_QUERY );
232 else if( xChildNode->getType() == AnimationNodeType::COMMAND )
234 Reference< XCommand > xCommand( xChildNode, UNO_QUERY );
245 double fDuration = 0.0;
246 xChildNode->getBegin() >>= fBegin;
247 xChildNode->getDuration() >>= fDuration;
257 Reference< XAnimate > xAnimate( xChildNode, UNO_QUERY );
270 double fRepeatCount = 1.0;
271 if( (
mxNode->getRepeatCount()) >>= fRepeatCount )
279 sal_Int32 nSubItems = 0;
284 sal_Int32 nOnlyPara = -1;
286 Reference< XText > xShape;
290 ParagraphTarget aParaTarget;
291 if( aTarget >>= aParaTarget )
293 xShape.set( aParaTarget.Shape, UNO_QUERY );
294 nOnlyPara = aParaTarget.Paragraph;
304 Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
305 Reference < i18n::XBreakIterator > xBI = i18n::BreakIterator::create(xContext);
307 Reference< XEnumerationAccess > xEA( xShape, UNO_QUERY_THROW );
308 Reference< XEnumeration > xEnumeration( xEA->createEnumeration(), UNO_SET_THROW );
309 css::lang::Locale aLocale;
310 static constexpr OUStringLiteral aStrLocaleName(
u"CharLocale" );
311 Reference< XTextRange > xParagraph;
314 while( xEnumeration->hasMoreElements() )
316 xEnumeration->nextElement() >>= xParagraph;
319 if( (nOnlyPara != -1) && (nOnlyPara != nPara ) )
322 if( nIterateType == TextAnimationType::BY_PARAGRAPH )
328 const OUString aText( xParagraph->getString() );
329 Reference< XPropertySet > xSet( xParagraph, UNO_QUERY_THROW );
330 xSet->getPropertyValue( aStrLocaleName ) >>= aLocale;
333 const sal_Int32 nEndPos = aText.getLength();
335 if( nIterateType == TextAnimationType::BY_WORD )
339 nPos = xBI->getWordBoundary(aText,
nPos, aLocale, i18n::WordType::ANY_WORD,
true).endPos;
349 nPos = xBI->nextCharacters(aText,
nPos, aLocale, i18n::CharacterIteratorMode::SKIPCELL, 0, nDone);
355 if( nPara == nOnlyPara )
365 TOOLS_WARN_EXCEPTION(
"sd",
"sd::CustomAnimationEffect::getNumberOfSubitems(), exception caught!" );
377 Reference< XCloneable > xCloneable(
mxNode, UNO_QUERY_THROW );
378 Reference< XAnimationNode > xNode( xCloneable->createClone(), UNO_QUERY_THROW );
386 sal_Int16 nNodeType = -1;
390 const Sequence< NamedValue > aUserData( xNode->getUserData() );
391 if( aUserData.hasElements() )
393 const NamedValue* pProp = std::find_if(aUserData.begin(), aUserData.end(),
394 [](
const NamedValue& rProp) { return rProp.Name ==
"node-type"; });
395 if (pProp != aUserData.end())
396 pProp->Value >>= nNodeType;
415 Sequence< NamedValue > aUserData(
mxNode->getUserData() );
416 sal_Int32
nLength = aUserData.getLength();
417 bool bFoundPresetClass =
false;
418 bool bFoundPresetId =
false;
421 auto [
begin,
end] = asNonConstRange(aUserData);
422 NamedValue* pProp = std::find_if(
begin,
end,
423 [](
const NamedValue& rProp) {
return rProp.Name ==
"preset-class"; });
427 bFoundPresetClass =
true;
431 [](
const NamedValue& rProp) {
return rProp.Name ==
"preset-id"; });
435 bFoundPresetId =
true;
440 if( !bFoundPresetClass )
442 aUserData.realloc(
nLength + 1);
443 auto& el = aUserData.getArray()[
nLength];
444 el.Name =
"preset-class";
449 if( !bFoundPresetId &&
maPresetId.getLength() > 0 )
451 aUserData.realloc(
nLength + 1);
452 auto& el = aUserData.getArray()[
nLength];
453 el.Name =
"preset-id";
457 mxNode->setUserData( aUserData );
471 Sequence< NamedValue > aUserData(
mxNode->getUserData() );
472 sal_Int32
nLength = aUserData.getLength();
476 auto [
begin,
end] = asNonConstRange(aUserData);
477 NamedValue* pProp = std::find_if(
begin,
end,
478 [](
const NamedValue& rProp) {
return rProp.Name ==
"node-type"; });
489 aUserData.realloc(
nLength + 1);
490 auto& el = aUserData.getArray()[
nLength];
491 el.Name =
"node-type";
495 mxNode->setUserData( aUserData );
506 Sequence< NamedValue > aUserData(
mxNode->getUserData() );
507 sal_Int32
nLength = aUserData.getLength();
511 auto [
begin,
end] = asNonConstRange(aUserData);
512 NamedValue* pProp = std::find_if(
begin,
end,
513 [](
const NamedValue& rProp) {
return rProp.Name ==
"group-id"; });
524 aUserData.realloc(
nLength + 1);
525 auto& el = aUserData.getArray()[
nLength];
526 el.Name =
"group-id";
530 mxNode->setUserData( aUserData );
538 bool bChange =
false;
540 Reference< XText > xText;
545 ParagraphTarget aParaTarget;
548 xText.set( aParaTarget.Shape, UNO_QUERY );
553 sal_Int32 nPara = aParaTarget.Paragraph;
555 bool bHasText =
false;
556 sal_Int32 nParaDepth = 0;
558 if ( paragraphNumberingLevel )
560 bHasText = !paragraphNumberingLevel->empty();
562 nParaDepth = paragraphNumberingLevel->at(nPara);
566 Reference< XEnumerationAccess > xEA( xText, UNO_QUERY );
569 Reference< XEnumeration > xEnumeration = xEA->createEnumeration();
570 if( xEnumeration.is() )
572 bHasText = xEnumeration->hasMoreElements();
574 while( xEnumeration->hasMoreElements() && nPara-- )
575 xEnumeration->nextElement();
577 if( xEnumeration->hasMoreElements() )
579 Reference< XPropertySet > xParaSet;
580 xEnumeration->nextElement() >>= xParaSet;
583 xParaSet->getPropertyValue(
"NumberingLevel" ) >>= nParaDepth;
603 bool bHasText = xText.is() && !xText->getString().isEmpty();
614 bool bChange =
false;
620 Reference< XIterateContainer > xIter(
mxNode, UNO_QUERY );
639 fDuration += fSubEffectDuration;
655 Reference< XInitialization > xInit(
mxNode, UNO_QUERY );
658 const Sequence< Any > aArgs( &
maTarget, 1 );
659 xInit->initialize( aArgs );
663 Reference< XIterateContainer > xIter(
mxNode, UNO_QUERY );
670 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
671 if( xEnumerationAccess.is() )
673 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
674 if( xEnumeration.is() )
676 while( xEnumeration->hasMoreElements() )
678 const Any aElem( xEnumeration->nextElement() );
679 Reference< XAnimate > xAnimate( aElem, UNO_QUERY );
681 xAnimate->setTarget(
rTarget );
684 Reference< XCommand > xCommand( aElem, UNO_QUERY );
686 xCommand->setTarget(
rTarget );
707 Reference< XIterateContainer > xIter(
mxNode, UNO_QUERY );
714 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
715 if( xEnumerationAccess.is() )
717 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
718 if( xEnumeration.is() )
720 while( xEnumeration->hasMoreElements() )
722 Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
745 double fRepeatCount = 1.0;
750 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
751 if( xEnumerationAccess.is() )
753 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
754 if( xEnumeration.is() )
756 while( xEnumeration->hasMoreElements() )
758 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
759 if( !xChildNode.is() )
762 double fChildBegin = 0.0;
763 xChildNode->getBegin() >>= fChildBegin;
764 if( fChildBegin != 0.0 )
766 fChildBegin *= fScale;
767 xChildNode->setBegin(
Any( fChildBegin ) );
770 double fChildDuration = 0.0;
771 xChildNode->getDuration() >>= fChildDuration;
772 if( fChildDuration != 0.0 )
774 fChildDuration *= fScale;
775 xChildNode->setDuration(
Any( fChildDuration ) );
806 mxNode->setAcceleration( fAcceleration );
819 mxNode->setDecelerate( fDecelerate );
832 mxNode->setAutoReverse( bAutoReverse );
851 Reference< XAudio > xAudio(
mxAudio );
879 Reference< XShape > xShape;
883 ParagraphTarget aParaTarget;
885 xShape = aParaTarget.Shape;
895 return mxNode->getRepeatCount();
921 mxNode->setRepeatCount( rRepeatCount );
922 double fRepeatCount = 1.0;
923 rRepeatCount >>= fRepeatCount;
947 Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
949 Reference< XAnimate > xAnimate;
951 xAnimate = AnimateColor::create( xContext );
953 xAnimate = AnimateSet::create( xContext );
956 OUString aAttributeName;
961 aAttributeName =
"DimColor";
966 aAttributeName =
"Visibility";
975 aEvent.Trigger = EventTrigger::END_EVENT;
985 xAnimate->setBegin( aBegin );
986 xAnimate->setTo(
aTo );
987 xAnimate->setAttributeName( aAttributeName );
989 xAnimate->setDuration(
Any( 0.001 ) );
990 xAnimate->setFill( AnimationFill::HOLD );
1008 Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
1009 Reference< XTimeContainer > xNewContainer;
1012 xNewContainer.set( IterateContainer::create( xContext ) );
1015 xNewContainer.set( ParallelTimeContainer::create( xContext ), UNO_QUERY_THROW );
1017 Reference< XTimeContainer > xOldContainer(
mxNode, UNO_QUERY_THROW );
1018 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY_THROW );
1019 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
1020 while( xEnumeration->hasMoreElements() )
1022 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
1023 xOldContainer->removeChild( xChildNode );
1024 xNewContainer->appendChild( xChildNode );
1027 xNewContainer->setBegin(
mxNode->getBegin() );
1028 xNewContainer->setDuration(
mxNode->getDuration() );
1029 xNewContainer->setEnd(
mxNode->getEnd() );
1030 xNewContainer->setEndSync(
mxNode->getEndSync() );
1031 xNewContainer->setRepeatCount(
mxNode->getRepeatCount() );
1032 xNewContainer->setFill(
mxNode->getFill() );
1033 xNewContainer->setFillDefault(
mxNode->getFillDefault() );
1034 xNewContainer->setRestart(
mxNode->getRestart() );
1035 xNewContainer->setRestartDefault(
mxNode->getRestartDefault() );
1036 xNewContainer->setAcceleration(
mxNode->getAcceleration() );
1037 xNewContainer->setDecelerate(
mxNode->getDecelerate() );
1038 xNewContainer->setAutoReverse(
mxNode->getAutoReverse() );
1039 xNewContainer->setRepeatDuration(
mxNode->getRepeatDuration() );
1040 xNewContainer->setEndSync(
mxNode->getEndSync() );
1041 xNewContainer->setRepeatCount(
mxNode->getRepeatCount() );
1042 xNewContainer->setUserData(
mxNode->getUserData() );
1049 Reference< XIterateContainer > xIter(
mxNode, UNO_QUERY_THROW );
1051 xIter->setSubItem( nTargetSubItem );
1058 Reference< XEnumerationAccess > xEA(
mxNode, UNO_QUERY_THROW );
1059 Reference< XEnumeration > xE( xEA->createEnumeration(), UNO_SET_THROW );
1060 while( xE->hasMoreElements() )
1062 Reference< XAnimate > xAnimate( xE->nextElement(), UNO_QUERY );
1065 xAnimate->setTarget( aTarget );
1066 xAnimate->setSubItem( nTargetSubItem );
1076 Reference< XIterateContainer > xIter(
mxNode, UNO_QUERY_THROW );
1077 xIter->setIterateType( nIterateType );
1093 Reference< XIterateContainer > xIter(
mxNode, UNO_QUERY );
1095 DBG_ASSERT( xIter.is(),
"sd::CustomAnimationEffect::setIterateInterval(), not an iteration node" );
1099 xIter->setIterateInterval( fIterateInterval );
1111 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY_THROW );
1112 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
1113 while( xEnumeration->hasMoreElements() )
1115 Reference< XAnimateMotion > xMotion( xEnumeration->nextElement(), UNO_QUERY );
1118 xMotion->getPath() >>= aPath;
1138 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY_THROW );
1139 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
1140 while( xEnumeration->hasMoreElements() )
1142 Reference< XAnimateMotion > xMotion( xEnumeration->nextElement(), UNO_QUERY );
1147 xMotion->setPath(
Any( rPath ) );
1163 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
1164 if( xEnumerationAccess.is() )
1166 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
1167 if( xEnumeration.is() )
1169 while( xEnumeration->hasMoreElements() && !aProperty.hasValue() )
1171 Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
1172 if( !xAnimate.is() )
1175 if( xAnimate->getType() == nNodeType )
1177 if( xAnimate->getAttributeName() == rAttributeName )
1181 case EValue::To: aProperty = xAnimate->getTo();
break;
1182 case EValue::By: aProperty = xAnimate->getBy();
break;
1200 bool bChanged =
false;
1203 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
1204 if( xEnumerationAccess.is() )
1206 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
1207 if( xEnumeration.is() )
1209 while( xEnumeration->hasMoreElements() )
1211 Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
1212 if( !xAnimate.is() )
1215 if( xAnimate->getType() == nNodeType )
1217 if( xAnimate->getAttributeName() == rAttributeName )
1222 if( xAnimate->getTo() != rValue )
1224 xAnimate->setTo( rValue );
1229 if( xAnimate->getTo() != rValue )
1231 xAnimate->setBy( rValue );
1252 return rAttributeName ==
u"FillColor" || rAttributeName ==
u"LineColor" || rAttributeName ==
u"CharColor";
1260 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
1261 if( xEnumerationAccess.is() )
1263 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
1264 if( xEnumeration.is() )
1266 while( xEnumeration->hasMoreElements() && !aColor.hasValue() )
1268 Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
1269 if( !xAnimate.is() )
1272 switch( xAnimate->getType() )
1274 case AnimationNodeType::SET:
1275 case AnimationNodeType::ANIMATE:
1279 case AnimationNodeType::ANIMATECOLOR:
1280 Sequence<Any> aValues( xAnimate->getValues() );
1281 if( aValues.hasElements() )
1283 if( aValues.getLength() >
nIndex )
1284 aColor = aValues[
nIndex];
1287 aColor = xAnimate->getFrom();
1289 aColor = xAnimate->getTo();
1310 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
1311 if( xEnumerationAccess.is() )
1313 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
1314 if( xEnumeration.is() )
1316 while( xEnumeration->hasMoreElements() )
1318 Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
1319 if( !xAnimate.is() )
1322 switch( xAnimate->getType() )
1324 case AnimationNodeType::SET:
1325 case AnimationNodeType::ANIMATE:
1329 case AnimationNodeType::ANIMATECOLOR:
1331 Sequence<Any> aValues( xAnimate->getValues() );
1332 if( aValues.hasElements() )
1334 if( aValues.getLength() >
nIndex )
1336 aValues.getArray()[
nIndex] = rColor;
1337 xAnimate->setValues( aValues );
1340 else if( (
nIndex == 0) && xAnimate->getFrom().hasValue() )
1341 xAnimate->setFrom(rColor);
1342 else if( (
nIndex == 1) && xAnimate->getTo().hasValue() )
1343 xAnimate->setTo(rColor);
1363 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
1364 if( xEnumerationAccess.is() )
1366 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
1367 if( xEnumeration.is() )
1369 while( xEnumeration->hasMoreElements() && !aProperty.hasValue() )
1371 Reference< XAnimateTransform > xTransform( xEnumeration->nextElement(), UNO_QUERY );
1372 if( !xTransform.is() )
1375 if( xTransform->getTransformType() == nTransformType )
1379 case EValue::To: aProperty = xTransform->getTo();
break;
1380 case EValue::By: aProperty = xTransform->getBy();
break;
1397 bool bChanged =
false;
1400 Reference< XEnumerationAccess > xEnumerationAccess(
mxNode, UNO_QUERY );
1401 if( xEnumerationAccess.is() )
1403 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
1404 if( xEnumeration.is() )
1406 while( xEnumeration->hasMoreElements() )
1408 Reference< XAnimateTransform > xTransform( xEnumeration->nextElement(), UNO_QUERY );
1409 if( !xTransform.is() )
1412 if( xTransform->getTransformType() == nTransformType )
1417 if( xTransform->getTo() != rValue )
1419 xTransform->setTo( rValue );
1424 if( xTransform->getBy() != rValue )
1426 xTransform->setBy( rValue );
1446 DBG_ASSERT( !
mxAudio.is(),
"sd::CustomAnimationEffect::createAudio(), node already has an audio!" );
1453 Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
1454 Reference< XAudio > xAudio( Audio::create( xContext ) );
1455 xAudio->setSource( rSource );
1456 xAudio->setVolume( 1.0 );
1465static Reference< XCommand >
findCommandNode(
const Reference< XAnimationNode >& xRootNode )
1467 Reference< XCommand > xCommand;
1469 if( xRootNode.is() )
try
1471 Reference< XEnumerationAccess > xEnumerationAccess( xRootNode, UNO_QUERY_THROW );
1472 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
1473 while( !xCommand.is() && xEnumeration->hasMoreElements() )
1475 Reference< XAnimationNode > xNode( xEnumeration->nextElement(), UNO_QUERY );
1476 if( xNode.is() && (xNode->getType() == AnimationNodeType::COMMAND) )
1477 xCommand.set( xNode, UNO_QUERY_THROW );
1492 Reference< XAnimationNode > xChild;
1499 else if(
mnCommand == EffectCommands::STOPAUDIO )
1507 Reference< XTimeContainer > xContainer(
mxNode, UNO_QUERY );
1508 if( xContainer.is() )
1509 xContainer->removeChild( xChild );
1528 Reference< XTimeContainer > xContainer(
mxNode, UNO_QUERY );
1529 if( xContainer.is() &&
mxAudio.is() )
1530 xContainer->appendChild(
mxAudio );
1540 if(
mnCommand == EffectCommands::STOPAUDIO )
1548 Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
1549 Reference< XCommand > xCommand( Command::create( xContext ) );
1551 xCommand->setCommand( EffectCommands::STOPAUDIO );
1553 Reference< XTimeContainer > xContainer(
mxNode, UNO_QUERY_THROW );
1554 xContainer->appendChild( xCommand );
1566 return mnCommand == EffectCommands::STOPAUDIO;
1579 if( ::basegfx::utils::importFromSvgD( aPolyPoly,
getPath(),
true,
nullptr ) )
1592 const Point aCenter( aBoundRect.Center() );
1617 static_cast<sal_Int32
>(floor(aRange.
getMinX())),
static_cast<sal_Int32
>(floor(aRange.
getMinY())),
1618 static_cast<sal_Int32
>(ceil(aRange.
getMaxX())),
static_cast<sal_Int32
>(ceil(aRange.
getMaxY())));
1630 1.0 /
static_cast<double>(aPageSize.
Width()), 1.0 /
static_cast<double>(aPageSize.
Height())));
1634 setPath( ::basegfx::utils::exportToSvgD( aPolyPoly,
true,
true,
true) );
1638: mnSequenceType( EffectNodeType::
DEFAULT )
1643: mxSequenceRoot(
std::move( xSequenceRoot )), mnSequenceType( EffectNodeType::
DEFAULT )
1645 Reference< XAnimationNode > xNode(
mxSequenceRoot, UNO_QUERY_THROW );
1658 pEffect->setEffectSequence(
nullptr);
1670 pEffect->setEffectSequence(
this );
1681 Reference< XAnimationNode > xNode( pPreset->create(
"" ) );
1685 std::vector< NamedValue > aNewUserData;
1686 Sequence< NamedValue > aUserData( xNode->getUserData() );
1688 std::copy_if(std::cbegin(aUserData), std::cend(aUserData), std::back_inserter(aNewUserData),
1689 [](
const NamedValue& rProp) {
return rProp.Name !=
"text-only" && rProp.Name !=
"preset-property"; });
1691 if( !aNewUserData.empty() )
1693 aUserData = ::comphelper::containerToSequence( aNewUserData );
1694 xNode->setUserData( aUserData );
1698 sal_Int16 nSubItem = ShapeAnimationSubType::AS_WHOLE;
1702 nSubItem = ShapeAnimationSubType::ONLY_TEXT;
1704 else if( pPreset->isTextOnly() )
1706 Reference< XShape > xShape;
1712 nSubItem = ShapeAnimationSubType::ONLY_TEXT;
1717 pEffect = std::make_shared<CustomAnimationEffect>( xNode );
1718 pEffect->setEffectSequence(
this );
1719 pEffect->setTarget( rTarget );
1720 pEffect->setTargetSubItem( nSubItem );
1721 if( fDuration != -1.0 )
1722 pEffect->setDuration( fDuration );
1730 DBG_ASSERT( pEffect,
"sd::EffectSequenceHelper::append(), failed!" );
1738 if( fDuration <= 0.0 )
1743 Reference< XTimeContainer > xEffectContainer( ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ), UNO_QUERY_THROW );
1744 Reference< XAnimationNode > xAnimateMotion( AnimateMotion::create( ::comphelper::getProcessComponentContext() ) );
1746 xAnimateMotion->setDuration(
Any( fDuration ) );
1747 xAnimateMotion->setFill( AnimationFill::HOLD );
1748 xEffectContainer->appendChild( xAnimateMotion );
1750 sal_Int16 nSubItem = ShapeAnimationSubType::AS_WHOLE;
1753 nSubItem = ShapeAnimationSubType::ONLY_TEXT;
1755 pEffect = std::make_shared<CustomAnimationEffect>( xEffectContainer );
1756 pEffect->setEffectSequence(
this );
1757 pEffect->setTarget( rTarget );
1758 pEffect->setTargetSubItem( nSubItem );
1759 pEffect->setNodeType( css::presentation::EffectNodeType::ON_CLICK );
1760 pEffect->setPresetClassAndId( css::presentation::EffectPresetClass::MOTIONPATH, rPresetId );
1761 pEffect->setAcceleration( 0.5 );
1762 pEffect->setDecelerate( 0.5 );
1763 pEffect->setFill( AnimationFill::HOLD );
1764 pEffect->setBegin( 0.0 );
1765 pEffect->updatePathFromSdrPathObj( rPathObj );
1766 if( fDuration != -1.0 )
1767 pEffect->setDuration( fDuration );
1783 if( !(pEffect && pPreset) )
1788 Reference< XAnimationNode > xNewNode( pPreset->create( rPresetSubType ) );
1791 pEffect->replaceNode( xNewNode );
1792 if( fDuration != -1.0 )
1793 pEffect->setDuration( fDuration );
1806 replace( pEffect, pPreset,
"", fDuration );
1813 pEffect->setEffectSequence(
nullptr );
1825 EffectSequence::iterator aInsertIter(
find( pInsertBefore ) );
1828 maEffects.insert( aInsertIter, pEffect );
1844 Reference< XEnumerationAccess > xEnumerationAccess(
mxSequenceRoot, UNO_QUERY_THROW );
1845 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
1846 while( xEnumeration->hasMoreElements() )
1848 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
1849 Reference< XTimeContainer > xChildContainer( xChildNode, UNO_QUERY_THROW );
1851 Reference< XEnumerationAccess > xChildEnumerationAccess( xChildNode, UNO_QUERY_THROW );
1852 Reference< XEnumeration > xChildEnumeration( xChildEnumerationAccess->createEnumeration(), UNO_SET_THROW );
1853 while( xChildEnumeration->hasMoreElements() )
1855 Reference< XAnimationNode > xNode( xChildEnumeration->nextElement(), UNO_QUERY_THROW );
1856 xChildContainer->removeChild( xNode );
1863 EffectSequence::iterator aIter(
maEffects.begin() );
1864 EffectSequence::iterator aEnd(
maEffects.end() );
1867 std::vector< sd::AfterEffectNode > aAfterEffects;
1875 Reference< XTimeContainer > xOnClickContainer( ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ), UNO_QUERY_THROW );
1881 aEvent.Trigger = EventTrigger::ON_CLICK;
1885 aEvent.Trigger = EventTrigger::ON_NEXT;
1895 if( pEffect->getNodeType() != EffectNodeType::ON_CLICK )
1899 xOnClickContainer->setBegin( aBegin );
1903 double fBegin = 0.0;
1908 Reference< XTimeContainer > xWithContainer( ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ), UNO_QUERY_THROW );
1909 xWithContainer->setBegin(
Any( fBegin ) );
1910 xOnClickContainer->appendChild( xWithContainer );
1912 double fDuration = 0.0;
1915 Reference< XAnimationNode > xEffectNode( pEffect->getNode() );
1916 xWithContainer->appendChild( xEffectNode );
1918 if( pEffect->hasAfterEffect() )
1920 Reference< XAnimationNode > xAfterEffect( pEffect->createAfterEffectNode() );
1921 AfterEffectNode a( xAfterEffect, xEffectNode, pEffect->IsAfterEffectOnNext() );
1922 aAfterEffects.push_back(
a );
1925 double fTemp = pEffect->getBegin() + pEffect->getAbsoluteDuration();
1926 if( fTemp > fDuration )
1934 while( pEffect && (pEffect->getNodeType() == EffectNodeType::WITH_PREVIOUS) );
1936 fBegin += fDuration;
1938 while( pEffect && (pEffect->getNodeType() != EffectNodeType::ON_CLICK) );
1964: mxSearchNode( xSearchNode )
1974static bool implFindNextContainer( Reference< XTimeContainer >
const & xParent, Reference< XTimeContainer >
const & xCurrent, Reference< XTimeContainer >& xNext )
1976 Reference< XEnumerationAccess > xEnumerationAccess( xParent, UNO_QUERY_THROW );
1977 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration() );
1978 if( xEnumeration.is() )
1980 Reference< XInterface >
x;
1981 while( xEnumeration->hasMoreElements() && !xNext.is() )
1983 if( (xEnumeration->nextElement() >>=
x) && (
x == xCurrent) )
1985 if( xEnumeration->hasMoreElements() )
1986 xEnumeration->nextElement() >>= xNext;
2000 Reference< XAnimationNode > xMasterNode( rNode.
mxMaster, UNO_SET_THROW );
2001 Sequence< NamedValue > aUserData( rNode.
mxNode->getUserData() );
2002 sal_Int32 nSize = aUserData.getLength();
2003 aUserData.realloc(nSize+1);
2004 auto pUserData = aUserData.getArray();
2005 pUserData[nSize].Name =
"master-element";
2006 pUserData[nSize].Value <<= xMasterNode;
2007 rNode.
mxNode->setUserData( aUserData );
2010 Reference< XTimeContainer > xContainer( rNode.
mxMaster->getParent(), UNO_QUERY_THROW );
2019 Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
2022 Reference< XTimeContainer > xClickContainer( xContainer->getParent(), UNO_QUERY_THROW );
2023 Reference< XTimeContainer > xSequenceContainer( xClickContainer->getParent(), UNO_QUERY_THROW );
2025 Reference< XTimeContainer > xNextContainer;
2030 Reference< XTimeContainer > xNextClickContainer;
2034 Reference< XEnumerationAccess > xEnumerationAccess( xNextClickContainer, UNO_QUERY_THROW );
2035 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
2036 if( xEnumeration->hasMoreElements() )
2039 xEnumeration->nextElement() >>= xNextContainer;
2044 xNextContainer.set( ParallelTimeContainer::create(xContext), UNO_QUERY_THROW );
2046 xNextContainer->setBegin(
Any( 0.0 ) );
2047 xNextClickContainer->appendChild( xNextContainer );
2049 DBG_ASSERT( xNextContainer.is(),
"ppt::stl_process_after_effect_node_func::operator(), could not find/create container!" );
2054 if( !xNextContainer.is() )
2056 Reference< XTimeContainer > xNewClickContainer( ParallelTimeContainer::create( xContext ), UNO_QUERY_THROW );
2059 aEvent.Trigger = EventTrigger::ON_NEXT;
2061 xNewClickContainer->setBegin(
Any(
aEvent ) );
2063 xSequenceContainer->insertAfter( xNewClickContainer, xClickContainer );
2065 xNextContainer.set( ParallelTimeContainer::create( xContext ), UNO_QUERY_THROW );
2067 xNextContainer->setBegin(
Any( 0.0 ) );
2068 xNewClickContainer->appendChild( xNextContainer );
2071 if( xNextContainer.is() )
2074 Reference< XEnumerationAccess > xEnumerationAccess( xNextContainer, UNO_QUERY_THROW );
2075 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
2076 if( xEnumeration->hasMoreElements() )
2078 Reference< XAnimationNode > xChild;
2080 xEnumeration->nextElement() >>= xChild;
2083 Any aBegin( xChild->getBegin() );
2084 double fBegin = 0.0;
2085 if( (aBegin >>= fBegin) && (fBegin >= 0.0))
2086 rNode.
mxNode->setBegin( aBegin );
2090 xNextContainer->appendChild( rNode.
mxNode );
2110 EffectSequence::const_iterator aIter = std::find_if(
maEffects.begin(),
maEffects.end(),
2122 return static_cast<sal_Int32
>(std::distance(
maEffects.begin(), aIter));
2129 EffectSequence::const_iterator aIter(
maEffects.begin() );
2130 nOffset = std::min(nOffset,
static_cast<sal_Int32
>(
maEffects.size()));
2131 std::advance(aIter, nOffset);
2142 bool bChanges =
false;
2144 EffectSequence::iterator aIter(
maEffects.begin() );
2147 if( (*aIter)->getTargetShape() == xShape )
2149 (*aIter)->setEffectSequence(
nullptr );
2170 rParagraphNumberingLevel.clear();
2175 Reference< XText > xText( xShape, UNO_QUERY );
2178 Reference< XEnumerationAccess > xEA( xText, UNO_QUERY );
2181 Reference< XEnumeration > xEnumeration = xEA->createEnumeration();
2183 if( xEnumeration.is() )
2185 while( xEnumeration->hasMoreElements() )
2187 Reference< XPropertySet > xParaSet;
2188 xEnumeration->nextElement() >>= xParaSet;
2190 sal_Int32 nParaDepth = 0;
2193 xParaSet->getPropertyValue(
"NumberingLevel" ) >>= nParaDepth;
2196 rParagraphNumberingLevel.push_back( nParaDepth );
2207 ParagraphTarget aParaTarget;
2208 if( !(aTarget >>= aParaTarget ) )
2213 std::vector< sal_Int32 > paragraphNumberingLevel;
2214 std::vector< sal_Int32 >* paragraphNumberingLevelParam =
nullptr;
2216 paragraphNumberingLevelParam = ¶graphNumberingLevel;
2222 if (rxEffect->getTargetShape() == aParaTarget.Shape)
2223 bRes |= rxEffect->checkForText( paragraphNumberingLevelParam );
2234 Reference< XText > xText ( aParaTarget.Shape, UNO_QUERY );
2237 Reference< XEnumerationAccess > xEA( xText, UNO_QUERY );
2240 Reference< XEnumeration > xEnumeration = xEA->createEnumeration();
2241 if( xEnumeration.is() )
2244 sal_Int32 nPara = aParaTarget.Paragraph;
2245 while( xEnumeration->hasMoreElements() && nPara-- )
2246 xEnumeration->nextElement();
2249 if( xEnumeration->hasMoreElements() )
2251 Reference< XTextRange > xRange( xEnumeration->nextElement(), UNO_QUERY );
2254 OUString
text = xRange->getString();
2255 return text.isEmpty();
2266 ParagraphTarget aParaTarget;
2267 if( !(aTarget >>= aParaTarget ) )
2270 bool bChanges =
false;
2276 Any aIterTarget( pEffect->getTarget() );
2279 ParagraphTarget aIterParaTarget;
2280 if( (aIterTarget >>= aIterParaTarget) && (aIterParaTarget.Shape == aParaTarget.Shape) )
2282 aTargetParagraphEffects.push_back(pEffect);
2285 else if( pEffect->getTargetShape() == aParaTarget.Shape )
2287 bChanges |= pEffect->checkForText();
2293 ParagraphTarget aPreviousParagraph = aParaTarget;
2294 --aPreviousParagraph.Paragraph;
2296 sal_Int16 anParaNumToDelete = bIsPreviousParagraphEmpty ? aPreviousParagraph.Paragraph : aParaTarget.Paragraph;
2299 for(
const auto &pEffect : aTargetParagraphEffects )
2301 Any aIterTarget( pEffect->getTarget() );
2303 ParagraphTarget aIterParaTarget;
2304 aIterTarget >>= aIterParaTarget;
2307 if( aIterParaTarget.Paragraph == anParaNumToDelete )
2309 auto aItr =
find( pEffect );
2310 DBG_ASSERT( aItr !=
maEffects.end(),
"sd::EffectSequenceHelper::disposeTextRange(), Expected effect missing.");
2313 (*aItr)->setEffectSequence(
nullptr );
2320 if( aIterParaTarget.Paragraph > anParaNumToDelete )
2322 --aIterParaTarget.Paragraph;
2323 pEffect->setTarget(
Any( aIterParaTarget ) );
2336 mnGroupId( nGroupId )
2361 Any aTarget( pEffect->getTarget() );
2365 ParagraphTarget aParaTarget;
2366 aTarget >>= aParaTarget;
2373 const sal_Int32 nParaDepth = pEffect->getParaDepth();
2384 else if(
mnDepthFlags[nParaDepth] != pEffect->getNodeType() )
2389 if( pEffect->getNodeType() == EffectNodeType::AFTER_PREVIOUS )
2401 mbAnimateForm = pEffect->getTargetSubItem() != ShapeAnimationSubType::ONLY_TEXT;
2409 CustomAnimationTextGroupMap::iterator aIter(
maGroupMap.find( nGroupId ) );
2411 aPtr = (*aIter).second;
2423 const sal_Int32 nGroupId = pEffect->getGroupId();
2425 if( nGroupId == -1 )
2431 pGroup = std::make_shared<CustomAnimationTextGroup>( pEffect->getTargetShape(), nGroupId );
2435 pGroup->addEffect( pEffect );
2444 while(pGroup->mnTextGrouping > 0 && pGroup->mnDepthFlags[pGroup->mnTextGrouping - 1] == EffectNodeType::WITH_PREVIOUS)
2445 --pGroup->mnTextGrouping;
2451 sal_Int32 nTextGrouping,
double fTextGroupingAuto,
2452 bool bAnimateForm,
bool bTextReverse)
2455 sal_Int32 nGroupId = 0;
2457 CustomAnimationTextGroupMap::iterator aIter(
maGroupMap.begin() );
2458 const CustomAnimationTextGroupMap::iterator aEnd(
maGroupMap.end() );
2459 while( aIter != aEnd )
2461 if( (*aIter).first == nGroupId )
2472 Reference< XShape >
xTarget( pEffect->getTargetShape() );
2480 if( (nTextGrouping == 0) || bAnimateForm )
2483 if( nTextGrouping == 0)
2484 nSubItem = bAnimateForm ? ShapeAnimationSubType::AS_WHOLE : ShapeAnimationSubType::ONLY_TEXT;
2486 nSubItem = ShapeAnimationSubType::ONLY_BACKGROUND;
2489 pEffect->setTargetSubItem( nSubItem );
2490 pEffect->setEffectSequence(
this );
2491 pEffect->setGroupId( nGroupId );
2493 pTextGroup->addEffect( pEffect );
2497 pTextGroup->mnTextGrouping = nTextGrouping;
2498 pTextGroup->mfGroupingAuto = fTextGroupingAuto;
2499 pTextGroup->mbTextReverse = bTextReverse;
2511 Reference< XShape >
xTarget( pTextGroup->maTarget );
2513 sal_Int32 nTextGrouping = pTextGroup->mnTextGrouping;
2514 double fTextGroupingAuto = pTextGroup->mfGroupingAuto;
2515 bool bTextReverse = pTextGroup->mbTextReverse;
2518 if( nTextGrouping < 0 )
2523 EffectSequence::iterator aInsertIter(
find( pEffect ) );
2525 Reference< XEnumerationAccess > xText(
xTarget, UNO_QUERY_THROW );
2526 Reference< XEnumeration > xEnumeration( xText->createEnumeration(), UNO_SET_THROW );
2528 std::deque< sal_Int16 > aParaList;
2532 for( nPara = 0; xEnumeration->hasMoreElements(); nPara++ )
2534 Reference< XTextRange > xRange( xEnumeration->nextElement(), UNO_QUERY );
2535 if( xRange.is() && !xRange->getString().isEmpty() )
2538 aParaList.push_front( nPara );
2540 aParaList.push_back( nPara );
2544 ParagraphTarget aTarget;
2547 for(
const auto i : aParaList )
2549 aTarget.Paragraph =
i;
2555 pNewEffect = pEffect->clone();
2557 aInsertIter =
maEffects.insert( aInsertIter, pNewEffect );
2562 pNewEffect = pEffect;
2564 aInsertIter =
find( pNewEffect );
2568 pNewEffect->setTarget(
Any( aTarget ) );
2569 pNewEffect->setTargetSubItem( ShapeAnimationSubType::ONLY_TEXT );
2570 pNewEffect->setGroupId( pTextGroup->mnGroupId );
2571 pNewEffect->setEffectSequence(
this );
2574 if( pNewEffect->getParaDepth() < nTextGrouping )
2576 if( fTextGroupingAuto == -1.0 )
2578 pNewEffect->setNodeType( EffectNodeType::ON_CLICK );
2579 pNewEffect->setBegin( 0.0 );
2583 pNewEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
2584 pNewEffect->setBegin( fTextGroupingAuto );
2589 pNewEffect->setNodeType( EffectNodeType::WITH_PREVIOUS );
2590 pNewEffect->setBegin( 0.0 );
2593 pTextGroup->addEffect( pNewEffect );
2605 if( pTextGroup->mnTextGrouping == nTextGrouping )
2609 else if( (pTextGroup->mnTextGrouping == -1) && (nTextGrouping >= 0) )
2615 pTextGroup->mnTextGrouping = nTextGrouping;
2619 else if( (pTextGroup->mnTextGrouping >= 0) && (nTextGrouping == -1 ) )
2624 pTextGroup->reset();
2631 pTextGroup->addEffect( pEffect );
2638 double fTextGroupingAuto = pTextGroup->mfGroupingAuto;
2641 pTextGroup->reset();
2648 if( pEffect->getParaDepth() < nTextGrouping )
2650 if( fTextGroupingAuto == -1.0 )
2652 pEffect->setNodeType( EffectNodeType::ON_CLICK );
2653 pEffect->setBegin( 0.0 );
2657 pEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
2658 pEffect->setBegin( fTextGroupingAuto );
2663 pEffect->setNodeType( EffectNodeType::WITH_PREVIOUS );
2664 pEffect->setBegin( 0.0 );
2668 pTextGroup->addEffect( pEffect );
2677 if( pTextGroup->mbAnimateForm == bAnimateForm )
2684 pTextGroup->reset();
2686 SAL_WARN_IF(aEffects.empty(),
"sd",
"EffectSequenceHelper::setAnimateForm effects empty" );
2688 if (aEffects.empty())
2691 EffectSequence::iterator aIter( aEffects.begin() );
2692 const EffectSequence::iterator aEnd( aEffects.end() );
2697 EffectSequence::iterator aInsertIter(
find( *aIter ) );
2705 pEffect->setTargetSubItem( ShapeAnimationSubType::AS_WHOLE );
2709 pEffect = (*aIter)->clone();
2710 pEffect->setTarget(
Any( (*aIter)->getTargetShape() ) );
2711 pEffect->setTargetSubItem( ShapeAnimationSubType::ONLY_BACKGROUND );
2712 maEffects.insert( aInsertIter, pEffect );
2715 pTextGroup->addEffect( pEffect );
2718 if( !bAnimateForm && (aEffects.size() == 1) )
2721 pEffect->setTarget(
Any( (*aIter)->getTargetShape() ) );
2722 pEffect->setTargetSubItem( ShapeAnimationSubType::ONLY_TEXT );
2723 pTextGroup->addEffect( pEffect );
2728 while( aIter != aEnd )
2734 pTextGroup->addEffect( pEffect );
2738 DBG_ASSERT( !bAnimateForm,
"sd::EffectSequenceHelper::setAnimateForm(), something is wrong here!" );
2749 sal_Int32 nTextGrouping = pTextGroup->mnTextGrouping;
2752 pTextGroup->reset();
2759 if( pEffect->getParaDepth() < nTextGrouping )
2761 if( fTextGroupingAuto == -1.0 )
2763 pEffect->setNodeType( EffectNodeType::ON_CLICK );
2764 pEffect->setBegin( 0.0 );
2768 pEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
2769 pEffect->setBegin( fTextGroupingAuto );
2774 pEffect->setNodeType( EffectNodeType::WITH_PREVIOUS );
2775 pEffect->setBegin( 0.0 );
2779 pTextGroup->addEffect( pEffect );
2787struct ImplStlTextGroupSortHelper
2789 explicit ImplStlTextGroupSortHelper(
bool bReverse ) : mbReverse( bReverse ) {};
2799 const Any aTarget(p1->getTarget());
2802 ParagraphTarget aParaTarget;
2803 aTarget >>= aParaTarget;
2804 return aParaTarget.Paragraph;
2808 return mbReverse ? 0x7fffffff : -1;
2816 return getTargetParagraph( p2 ) < getTargetParagraph( p1 );
2820 return getTargetParagraph( p1 ) < getTargetParagraph( p2 );
2826 if( pTextGroup->mbTextReverse == bTextReverse )
2832 std::vector< CustomAnimationEffectPtr > aSortedVector( pTextGroup->maEffects.begin(), pTextGroup->maEffects.end() );
2833 ImplStlTextGroupSortHelper aSortHelper( bTextReverse );
2834 std::sort( aSortedVector.begin(), aSortedVector.end(), aSortHelper );
2836 pTextGroup->reset();
2838 std::vector< CustomAnimationEffectPtr >::iterator aIter( aSortedVector.begin() );
2839 const std::vector< CustomAnimationEffectPtr >::iterator aEnd( aSortedVector.end() );
2843 pTextGroup->addEffect( *aIter );
2844 EffectSequence::iterator aInsertIter(
find( *aIter++ ) );
2845 while( aIter != aEnd )
2849 aInsertIter =
maEffects.insert( ++aInsertIter, pEffect );
2850 pTextGroup->addEffect( pEffect );
2870struct stl_notify_listeners_func
2872 stl_notify_listeners_func() {}
2873 void operator()(ISequenceListener* pListener) { pListener->notify_change(); }
2880 stl_notify_listeners_func aFunc;
2886 DBG_ASSERT( xNode.is(),
"sd::EffectSequenceHelper::create(), illegal argument" );
2893 Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
2894 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
2895 while( xEnumeration->hasMoreElements() )
2897 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
2909 DBG_ASSERT( xNode.is(),
"sd::EffectSequenceHelper::createEffectsequence(), illegal argument" );
2916 Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
2917 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
2918 while( xEnumeration->hasMoreElements() )
2920 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
2933 DBG_ASSERT( xNode.is(),
"sd::EffectSequenceHelper::createEffects(), illegal argument" );
2940 Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
2941 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
2942 while( xEnumeration->hasMoreElements() )
2944 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
2946 switch( xChildNode->getType() )
2949 case AnimationNodeType::PAR:
2950 case AnimationNodeType::ITERATE:
2954 if( pEffect->mnNodeType != -1 )
2956 pEffect->setEffectSequence(
this );
2963 case AnimationNodeType::SET:
2964 case AnimationNodeType::ANIMATECOLOR:
2982 Reference< XAnimationNode > xMaster;
2984 const Sequence< NamedValue > aUserData( xNode->getUserData() );
2985 const NamedValue* pProp = std::find_if(aUserData.begin(), aUserData.end(),
2986 [](
const NamedValue& rProp) { return rProp.Name ==
"master-element"; });
2988 if (pProp != aUserData.end())
2989 pProp->Value >>= xMaster;
2998 EffectSequence::iterator aIter( std::find_if(
maEffects.begin(),
maEffects.end(), aSearchPredict ) );
3000 pMasterEffect = *aIter;
3004 pMasterEffect->setHasAfterEffect(
true );
3007 if( xNode->getType() == AnimationNodeType::ANIMATECOLOR )
3010 Reference< XAnimate > xAnimate( xNode, UNO_QUERY_THROW );
3011 pMasterEffect->setDimColor( xAnimate->getTo() );
3012 pMasterEffect->setAfterEffectOnNext(
true );
3017 pMasterEffect->setAfterEffectOnNext( xNode->getParent() != xMaster->getParent() );
3030class AnimationChangeListener :
public cppu::WeakImplHelper< XChangesListener >
3033 explicit AnimationChangeListener(
MainSequence* pMainSequence ) : mpMainSequence( pMainSequence ) {}
3035 virtual void SAL_CALL changesOccurred(
const css::util::ChangesEvent& Event )
override;
3036 virtual void SAL_CALL disposing(
const css::lang::EventObject& Source )
override;
3038 MainSequence* mpMainSequence;
3043void SAL_CALL AnimationChangeListener::changesOccurred(
const css::util::ChangesEvent& )
3045 if( mpMainSequence )
3046 mpMainSequence->startRecreateTimer();
3049void SAL_CALL AnimationChangeListener::disposing(
const css::lang::EventObject& )
3055 , maTimer(
"sd MainSequence maTimer")
3056 , mbTimerMode(false)
3057 , mbRebuilding( false )
3058 , mnRebuildLockGuard( 0 )
3059 , mbPendingRebuildRequest( false )
3060 , mbIgnoreChanges( 0 )
3064 Sequence< css::beans::NamedValue > aUserData
3065 { {
"node-type", css::uno::Any(css::presentation::EffectNodeType::MAIN_SEQUENCE) } };
3072 : mxTimingRootNode( xNode, UNO_QUERY )
3073 , maTimer(
"sd MainSequence maTimer")
3074 , mbTimerMode( false )
3075 , mbRebuilding( false )
3076 , mnRebuildLockGuard( 0 )
3077 , mbPendingRebuildRequest( false )
3078 , mbIgnoreChanges( 0 )
3127 Reference< XEnumerationAccess > xEnumerationAccess(
mxTimingRootNode, UNO_QUERY_THROW );
3128 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
3129 while( xEnumeration->hasMoreElements() )
3131 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
3133 if( nNodeType == EffectNodeType::MAIN_SEQUENCE )
3138 else if( nNodeType == EffectNodeType::INTERACTIVE_SEQUENCE )
3140 Reference< XTimeContainer > xInteractiveRoot( xChildNode, UNO_QUERY_THROW );
3142 pIS->addListener(
this );
3150 mxSequenceRoot = SequenceTimeContainer::create( ::comphelper::getProcessComponentContext() );
3152 uno::Sequence< css::beans::NamedValue > aUserData
3153 { {
"node-type", css::uno::Any(css::presentation::EffectNodeType::MAIN_SEQUENCE) } };
3161 Reference< XAnimationNode > xMainSequenceNode(
mxSequenceRoot, UNO_QUERY_THROW );
3170 if( xNotifier.is() )
3187 interactiveSequence->reset();
3193 if( xNotifier.is() )
3207 Reference< XTimeContainer > xISRoot = SequenceTimeContainer::create( ::comphelper::getProcessComponentContext() );
3209 uno::Sequence< css::beans::NamedValue > aUserData
3210 { {
"node-type", css::uno::Any(css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE) } };
3211 xISRoot->setUserData( aUserData );
3212 xISRoot->setRestart( css::animations::AnimationRestart::WHEN_NOT_ACTIVE );
3215 Reference< XTimeContainer > xParent( xChild->getParent(), UNO_QUERY_THROW );
3216 xParent->appendChild( xISRoot );
3218 pIS = std::make_shared<InteractiveSequence>( xISRoot,
this);
3219 pIS->setTriggerShape( xShape );
3220 pIS->addListener(
this );
3233 pEffect = interactiveSequence->findEffect( xNode );
3252 sal_Int32 nTemp = interactiveSequence->getOffsetFromEffect( pEffect );
3254 return nOffset + nTemp;
3256 nOffset += interactiveSequence->getCount();
3277 return (*aIter)->getEffectFromOffset( nOffset );
3290 bChanges |= iterativeSequence->disposeShape( xShape );
3306 if( iterativeSequence->getTriggerShape() == xShape )
3309 if( iterativeSequence->hasEffect( xShape ) )
3322 iterativeSequence->insertTextRange( aTarget );
3332 iterativeSequence->disposeTextRange( aTarget );
3343 iterativeSequence->onTextChanged( xShape );
3351 std::vector< sal_Int32 > paragraphNumberingLevel;
3352 std::vector< sal_Int32 >* paragraphNumberingLevelParam =
nullptr;
3354 paragraphNumberingLevelParam = ¶graphNumberingLevel;
3360 if (rxEffect->getTargetShape() == xShape)
3361 bRes |= rxEffect->checkForText( paragraphNumberingLevelParam );
3408 if( pIS->maEffects.empty() )
3414 Reference< XTimeContainer > xParent( xChild->getParent(), UNO_QUERY_THROW );
3415 Reference< XAnimationNode > xISNode( pIS->mxSequenceRoot, UNO_QUERY_THROW );
3416 xParent->removeChild( xISNode );
3439 if( xTriggerShape.is() )
3443 if( pIS->getTriggerShape() == xTriggerShape )
3445 pNewSequence = pIS.get();
3455 pNewSequence =
this;
3458 if( pOldSequence != pNewSequence )
3461 pOldSequence->
maEffects.remove( pEffect );
3463 pNewSequence->
maEffects.push_back( pEffect );
3464 pEffect->setEffectSequence( pNewSequence );
3483 createMainSequence();
3516 Reference< XEnumerationAccess > xEnumerationAccess(
mxSequenceRoot, UNO_QUERY_THROW );
3517 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
3518 while( !
mxEventSource.is() && xEnumeration->hasMoreElements() )
3520 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
3523 if( (xChildNode->getBegin() >>=
aEvent) && (
aEvent.Trigger == EventTrigger::ON_CLICK) )
3546: mpMainSequence(
std::move( pMainSequence ))
const sal_Int16 mnNodeType
constexpr tools::Long Y() const
constexpr tools::Long X() const
static SdrObject * getSdrObjectFromXShape(const css::uno::Reference< css::uno::XInterface > &xInt)
virtual const tools::Rectangle & GetCurrentBoundRect() const
sdr::contact::ViewContact & GetViewContact() const
SdrPage * getSdrPageFromSdrObject() const
void SetPathPoly(const basegfx::B2DPolyPolygon &rPathPoly)
const basegfx::B2DPolyPolygon & GetPathPoly() const
constexpr tools::Long Height() const
constexpr tools::Long Width() const
void SetTimeout(sal_uInt64 nTimeoutMs)
void SetInvokeHandler(const Link< Timer *, void > &rLink)
virtual void Start(bool bStartTimer=true) override
void transform(const basegfx::B2DHomMatrix &rMatrix)
basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D &aViewInformation) const
SAL_DLLPRIVATE css::uno::Any getColor(sal_Int32 nIndex)
SAL_DLLPRIVATE void replaceNode(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
SAL_DLLPRIVATE css::uno::Reference< css::animations::XAnimationNode > createAfterEffectNode() const
SAL_DLLPRIVATE void setEnd(const css::uno::Any &rEnd)
static SAL_DLLPRIVATE sal_Int32 getNumberOfSubitems(const css::uno::Any &aTarget, sal_Int16 nIterateType)
SAL_DLLPRIVATE void setColor(sal_Int32 nIndex, const css::uno::Any &rColor)
SAL_DLLPRIVATE css::uno::Any getTransformationProperty(sal_Int32 nTransformType, EValue eValue)
SAL_DLLPRIVATE void setGroupId(sal_Int32 nGroupId)
SAL_DLLPRIVATE OUString getPath() const
SAL_DLLPRIVATE bool checkForText(const std::vector< sal_Int32 > *paragraphNumberingLevel=nullptr)
checks if the text for this effect has changed and updates internal flags.
SAL_DLLPRIVATE void setFill(sal_Int16 nFill)
static SAL_DLLPRIVATE sal_Int32 get_node_type(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
SAL_DLLPRIVATE void setNode(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
SAL_DLLPRIVATE rtl::Reference< SdrPathObj > createSdrPathObjFromPath(SdrModel &rTargetModel)
void setTargetSubItem(sal_Int16 nSubItem)
css::uno::Reference< css::animations::XAudio > mxAudio
SAL_DLLPRIVATE CustomAnimationEffectPtr clone() const
SAL_DLLPRIVATE bool getStopAudio() const
SAL_DLLPRIVATE bool setTransformationProperty(sal_Int32 nTransformType, EValue eValue, const css::uno::Any &rValue)
css::uno::Reference< css::animations::XAnimationNode > mxNode
SAL_DLLPRIVATE const OUString & getProperty() const
SAL_DLLPRIVATE const css::uno::Reference< css::animations::XAnimationNode > & getNode() const
void setTarget(const css::uno::Any &rTarget)
SAL_DLLPRIVATE css::uno::Reference< css::drawing::XShape > getTargetShape() const
void setDuration(double fDuration)
SAL_DLLPRIVATE bool setProperty(sal_Int32 nNodeType, std::u16string_view rAttributeName, EValue eValue, const css::uno::Any &rValue)
SAL_DLLPRIVATE css::uno::Any getRepeatCount() const
void setBegin(double fBegin)
SAL_DLLPRIVATE void setAudio(const css::uno::Reference< css::animations::XAudio > &xAudio)
SAL_DLLPRIVATE void setAutoReverse(bool bAutoReverse)
void setIterateType(sal_Int16 nIterateType)
CustomAnimationEffect(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
void setNodeType(sal_Int16 nNodeType)
SAL_DLLPRIVATE css::uno::Any getEnd() const
double mfAbsoluteDuration
SAL_DLLPRIVATE void removeAudio()
sal_Int16 mnTargetSubItem
EffectSequenceHelper * mpEffectSequence
SAL_DLLPRIVATE EffectSequenceHelper * getEffectSequence() const
SAL_DLLPRIVATE void setPath(const OUString &rPath)
SAL_DLLPRIVATE void setRepeatCount(const css::uno::Any &rRepeatCount)
SAL_DLLPRIVATE void setPresetClassAndId(sal_Int16 nPresetClass, const OUString &rPresetId)
SAL_DLLPRIVATE void setAcceleration(double fAcceleration)
SAL_DLLPRIVATE void updatePathFromSdrPathObj(const SdrPathObj &rPathObj)
SAL_DLLPRIVATE void updateSdrPathObjFromPath(SdrPathObj &rPathObj)
void createAudio(const css::uno::Any &rSource)
SAL_DLLPRIVATE bool calculateIterateDuration()
void setIterateInterval(double fIterateInterval)
bool mbAfterEffectOnNextEffect
SAL_DLLPRIVATE void setDecelerate(double fDecelerate)
sal_Int8 mnDepthFlags[PARA_LEVELS]
CustomAnimationTextGroup(const css::uno::Reference< css::drawing::XShape > &rTarget, sal_Int32 nGroupId)
void addEffect(CustomAnimationEffectPtr const &pEffect)
SAL_DLLPRIVATE void setTextGroupingAuto(const CustomAnimationTextGroupPtr &pTextGroup, double fTextGroupingAuto)
virtual SAL_DLLPRIVATE CustomAnimationEffectPtr getEffectFromOffset(sal_Int32 nOffset) const
SAL_DLLPRIVATE void replace(const CustomAnimationEffectPtr &pEffect, const CustomAnimationPresetPtr &pDescriptor, double fDuration)
virtual SAL_DLLPRIVATE void insertTextRange(const css::uno::Any &aTarget)
virtual SAL_DLLPRIVATE bool disposeShape(const css::uno::Reference< css::drawing::XShape > &xShape)
virtual SAL_DLLPRIVATE bool hasEffect(const css::uno::Reference< css::drawing::XShape > &xShape)
SAL_DLLPRIVATE void setTextGrouping(const CustomAnimationTextGroupPtr &pTextGroup, sal_Int32 nTextGrouping)
SAL_DLLPRIVATE EffectSequence::iterator find(const CustomAnimationEffectPtr &pEffect)
SAL_DLLPRIVATE void createEffectsequence(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
SAL_DLLPRIVATE bool getParagraphNumberingLevels(const css::uno::Reference< css::drawing::XShape > &xShape, std::vector< sal_Int32 > &rParagraphNumberingLevel)
virtual SAL_DLLPRIVATE void onTextChanged(const css::uno::Reference< css::drawing::XShape > &xShape)
CustomAnimationTextGroupMap maGroupMap
SAL_DLLPRIVATE void moveToBeforeEffect(const CustomAnimationEffectPtr &pEffect, const CustomAnimationEffectPtr &pInsertBefore)
CustomAnimationTextGroupPtr createTextGroup(const CustomAnimationEffectPtr &pEffect, sal_Int32 nTextGrouping, double fTextGroupingAuto, bool bAnimateForm, bool bTextReverse)
css::uno::Reference< css::animations::XTimeContainer > mxSequenceRoot
SAL_DLLPRIVATE sal_Int32 getCount() const
virtual SAL_DLLPRIVATE void disposeTextRange(const css::uno::Any &aTarget)
virtual SAL_DLLPRIVATE void implRebuild()
SAL_DLLPRIVATE void setTextReverse(const CustomAnimationTextGroupPtr &pTextGroup, bool bAnimateForm)
SAL_DLLPRIVATE void createTextGroupParagraphEffects(const CustomAnimationTextGroupPtr &pTextGroup, const CustomAnimationEffectPtr &pEffect, bool bUsed)
virtual SAL_DLLPRIVATE sal_Int32 getOffsetFromEffect(const CustomAnimationEffectPtr &xEffect) const
SAL_DLLPRIVATE void notify_listeners()
virtual SAL_DLLPRIVATE css::uno::Reference< css::animations::XAnimationNode > getRootNode()
SAL_DLLPRIVATE void createEffects(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
SAL_DLLPRIVATE void removeListener(ISequenceListener *pListener)
SAL_DLLPRIVATE void processAfterEffect(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
SAL_DLLPRIVATE CustomAnimationEffectPtr append(const CustomAnimationPresetPtr &pDescriptor, const css::uno::Any &rTarget, double fDuration)
virtual SAL_DLLPRIVATE ~EffectSequenceHelper()
SAL_DLLPRIVATE EffectSequenceHelper()
SAL_DLLPRIVATE void create(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
SAL_DLLPRIVATE CustomAnimationTextGroupPtr findGroup(sal_Int32 nGroupId)
css::uno::Reference< css::drawing::XShape > mxEventSource
SAL_DLLPRIVATE void setAnimateForm(const CustomAnimationTextGroupPtr &pTextGroup, bool bAnimateForm)
std::list< ISequenceListener * > maListeners
virtual SAL_DLLPRIVATE void rebuild()
this method rebuilds the animation nodes
SAL_DLLPRIVATE void remove(const CustomAnimationEffectPtr &pEffect)
SAL_DLLPRIVATE void updateTextGroups()
virtual SAL_DLLPRIVATE CustomAnimationEffectPtr findEffect(const css::uno::Reference< css::animations::XAnimationNode > &xNode) const
SAL_DLLPRIVATE void addListener(ISequenceListener *pListener)
virtual SAL_DLLPRIVATE void reset()
this listener is implemented by UI components to track changes in the animation core
MainSequence * mpMainSequence
InteractiveSequence(const css::uno::Reference< css::animations::XTimeContainer > &xSequenceRoot, MainSequence *pMainSequence)
virtual void implRebuild() override
virtual void rebuild() override
this method rebuilds the animation nodes
~MainSequenceChangeGuard()
MainSequence * mpMainSequence
MainSequenceChangeGuard(EffectSequenceHelper *pSequence)
MainSequenceRebuildGuard(MainSequencePtr pMainSequence)
MainSequencePtr mpMainSequence
~MainSequenceRebuildGuard()
virtual ~MainSequence() override
bool setTrigger(const CustomAnimationEffectPtr &pEffect, const css::uno::Reference< css::drawing::XShape > &xTriggerShape)
void startRebuildTimer()
starts a timer that rebuilds the API core from the internal structure after 1 second
InteractiveSequencePtr createInteractiveSequence(const css::uno::Reference< css::drawing::XShape > &xShape)
sal_Int32 mbIgnoreChanges
virtual void rebuild() override
this method rebuilds the animation nodes
virtual bool hasEffect(const css::uno::Reference< css::drawing::XShape > &xShape) override
virtual void reset() override
virtual sal_Int32 getOffsetFromEffect(const CustomAnimationEffectPtr &xEffect) const override
::tools::Long mnRebuildLockGuard
virtual css::uno::Reference< css::animations::XAnimationNode > getRootNode() override
virtual bool disposeShape(const css::uno::Reference< css::drawing::XShape > &xShape) override
virtual void onTextChanged(const css::uno::Reference< css::drawing::XShape > &xShape) override
callback from the sd::View when an object just left text edit mode
virtual void disposeTextRange(const css::uno::Any &aTarget) override
bool mbPendingRebuildRequest
void createMainSequence()
virtual CustomAnimationEffectPtr getEffectFromOffset(sal_Int32 nOffset) const override
virtual void implRebuild() override
css::uno::Reference< css::animations::XTimeContainer > mxTimingRootNode
InteractiveSequenceVector maInteractiveSequenceVector
virtual void notify_change() override
void startRecreateTimer()
starts a timer that recreates the internal structure from the API core after 1 second
virtual CustomAnimationEffectPtr findEffect(const css::uno::Reference< css::animations::XAnimationNode > &xNode) const override
void lockRebuilds()
permits rebuilds until unlockRebuilds() is called.
css::uno::Reference< css::util::XChangesListener > mxChangesListener
virtual void insertTextRange(const css::uno::Any &aTarget) override
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
Reference< XInterface > xTarget
#define LINK(Instance, Class, Member)
#define SAL_WARN_IF(condition, area, stream)
B2DHomMatrix createScaleB2DHomMatrix(double fScaleX, double fScaleY)
B2DHomMatrix createTranslateB2DHomMatrix(double fTranslateX, double fTranslateY)
Reference< XComponentContext > getProcessComponentContext()
css::uno::Reference< css::deployment::XPackageRegistry > create(css::uno::Reference< css::deployment::XPackageRegistry > const &xRootRegistry, OUString const &context, OUString const &cachePath, css::uno::Reference< css::uno::XComponentContext > const &xComponentContext)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
enumrange< T >::Iterator begin(enumrange< T >)
std::list< CustomAnimationEffectPtr > EffectSequence
IMPL_LINK_NOARG(MainSequence, onTimerHdl, Timer *, void)
static bool implFindNextContainer(Reference< XTimeContainer > const &xParent, Reference< XTimeContainer > const &xCurrent, Reference< XTimeContainer > &xNext)
static bool isParagraphTargetTextEmpty(ParagraphTarget aParaTarget)
std::shared_ptr< MainSequence > MainSequencePtr
std::shared_ptr< CustomAnimationTextGroup > CustomAnimationTextGroupPtr
std::shared_ptr< InteractiveSequence > InteractiveSequencePtr
std::shared_ptr< CustomAnimationPreset > CustomAnimationPresetPtr
void stl_process_after_effect_node_func(AfterEffectNode const &rNode)
inserts the animation node in the given AfterEffectNode at the correct position in the timing hierarc...
static bool implIsColorAttribute(std::u16string_view rAttributeName)
std::shared_ptr< CustomAnimationEffect > CustomAnimationEffectPtr
static Reference< XCommand > findCommandNode(const Reference< XAnimationNode > &xRootNode)
stores the link between an after effect node and its master for later insertion into the timing hiera...
css::uno::Reference< css::animations::XAnimationNode > mxNode
css::uno::Reference< css::animations::XAnimationNode > mxMaster
stl_CustomAnimationEffect_search_node_predict(const css::uno::Reference< css::animations::XAnimationNode > &xSearchNode)
bool operator()(const CustomAnimationEffectPtr &pEffect) const
const css::uno::Reference< css::animations::XAnimationNode > & mxSearchNode