Bump version to 24.04.3.4
[LibreOffice.git] / oox / source / ppt / animationspersist.cxx
blob450e3da0065f68cfaba22b98cb50314518be27ed
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <oox/ppt/animationspersist.hxx>
22 #include <rtl/ustring.hxx>
23 #include <sal/log.hxx>
24 #include <com/sun/star/uno/Any.hxx>
25 #include <com/sun/star/drawing/XShape.hpp>
26 #include <com/sun/star/text/XText.hpp>
27 #include <com/sun/star/presentation/ParagraphTarget.hpp>
28 #include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
29 #include <com/sun/star/animations/Event.hpp>
30 #include <com/sun/star/animations/XAnimationNode.hpp>
32 #include <oox/drawingml/shape.hxx>
33 #include <oox/helper/addtosequence.hxx>
34 #include <oox/token/namespaces.hxx>
35 #include <oox/token/tokens.hxx>
37 using namespace ::com::sun::star::uno;
38 using namespace ::com::sun::star::presentation;
39 using namespace ::com::sun::star::animations;
40 using namespace ::com::sun::star::drawing;
41 using namespace ::com::sun::star::text;
43 namespace oox
46 Any addToSequence( const Any& rOldValue, const Any& rNewValue )
48 if( !rNewValue.hasValue() )
50 return rOldValue;
52 else if( !rOldValue.hasValue() )
54 return rNewValue;
56 else
58 Sequence< Any > aNewSeq;
59 if( rOldValue >>= aNewSeq )
61 sal_Int32 nSize = aNewSeq.getLength();
62 aNewSeq.realloc(nSize+1);
63 aNewSeq.getArray()[nSize] = rNewValue;
65 else
67 aNewSeq = { rOldValue, rNewValue };
69 return Any( aNewSeq );
73 } // namespace oox
75 namespace oox::ppt {
77 void ShapeTargetElement::convert( css::uno::Any & rTarget, sal_Int16 & rSubType ) const
79 switch(mnType)
81 case XML_subSp:
82 rSubType = ShapeAnimationSubType::AS_WHOLE;
83 break;
84 case XML_bg:
85 rSubType = ShapeAnimationSubType::ONLY_BACKGROUND;
86 break;
87 case XML_txEl:
89 ParagraphTarget aParaTarget;
90 Reference< XShape > xShape;
91 rTarget >>= xShape;
92 aParaTarget.Shape = xShape;
93 rSubType = ShapeAnimationSubType::ONLY_TEXT;
95 Reference< XText > xText( xShape, UNO_QUERY );
96 if( xText.is() )
98 switch(mnRangeType)
100 case XML_charRg:
101 // TODO calculate the corresponding paragraph for the text range...
102 SAL_INFO("oox.ppt", "OOX: TODO calculate the corresponding paragraph for the text range..." );
103 break;
104 case XML_pRg:
105 aParaTarget.Paragraph = static_cast< sal_Int16 >( maRange.start );
106 // TODO what to do with more than one.
107 SAL_INFO("oox.ppt", "OOX: TODO what to do with more than one" );
108 break;
110 rTarget <<= aParaTarget;
112 break;
114 default:
115 break;
119 Any AnimTargetElement::convert(const SlidePersistPtr & pSlide, sal_Int16 & nSubType) const
121 Any aTarget;
122 // see sd/source/files/ppt/pptinanimations.cxx:3191 (in importTargetElementContainer())
123 switch(mnType)
125 case XML_inkTgt:
126 // TODO
127 SAL_INFO("oox.ppt", "OOX: TODO inkTgt" );
128 break;
129 case XML_sldTgt:
130 // TODO
131 SAL_INFO("oox.ppt", "OOX: TODO sldTgt" );
132 break;
133 case XML_sndTgt:
134 aTarget <<= msValue;
135 break;
136 case XML_spTgt:
138 OUString sShapeName = msValue;
140 // bnc#705982 - catch referenced diagram fallback shapes
141 if( maShapeTarget.mnType == XML_dgm )
142 sShapeName = maShapeTarget.msSubShapeId;
144 Any rTarget;
145 ::oox::drawingml::ShapePtr pShape = pSlide->getShape( sShapeName );
146 SAL_WARN_IF( !pShape, "oox.ppt", "failed to locate Shape" );
148 if( !pShape && maShapeTarget.mnType == XML_dgm )
150 pShape = pSlide->getShape( msValue );
153 if( pShape )
155 Reference< XShape > xShape( pShape->getXShape() );
156 SAL_WARN_IF( !xShape.is(), "oox.ppt", "fail to get XShape from shape" );
157 if( xShape.is() )
159 rTarget <<= xShape;
160 maShapeTarget.convert(rTarget, nSubType);
161 aTarget = rTarget;
164 break;
166 default:
167 break;
169 return aTarget;
172 // Convert a time node condition to XAnimation.Begin or XAnimation.End
173 Any AnimationCondition::convert(const SlidePersistPtr & pSlide) const
175 Any aAny;
176 Event aEvent;
177 if(mpTarget && (maValue >>= aEvent))
179 sal_Int16 nSubType;
180 aAny = mpTarget->convert( pSlide, nSubType );
181 aEvent.Source = aAny;
182 aAny <<= aEvent;
184 else if (mnType == PPT_TOKEN(tn) && (maValue >>= aEvent))
186 OUString sId;
187 aEvent.Source >>= sId;
188 css::uno::Reference<XAnimationNode> xNode = pSlide->getAnimationNode(sId);
189 if (xNode.is())
191 aEvent.Source <<= xNode;
193 else
194 aEvent.Source.clear();
195 aAny <<= aEvent;
197 else
199 aAny = maValue;
201 return aAny;
204 Any AnimationCondition::convertList(const SlidePersistPtr & pSlide, const AnimationConditionList & l)
206 Any aAny;
208 if (l.size() == 1)
209 return l[0].convert(pSlide);
211 for (auto const& elem : l)
213 aAny = addToSequence( aAny, elem.convert(pSlide) );
215 return aAny;
220 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */