LCOV - code coverage report
Current view: top level - xmloff/source/draw - animationimport.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 159 558 28.5 %
Date: 2012-08-25 Functions: 21 40 52.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 148 1265 11.7 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : 
      30                 :            : #include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
      31                 :            : #include <com/sun/star/lang/XServiceInfo.hpp>
      32                 :            : #include <com/sun/star/lang/XInitialization.hpp>
      33                 :            : #include <com/sun/star/animations/AnimationTransformType.hpp>
      34                 :            : #include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
      35                 :            : #include <com/sun/star/presentation/AnimationEffect.hpp>
      36                 :            : #include <com/sun/star/presentation/AnimationSpeed.hpp>
      37                 :            : #include <com/sun/star/animations/AnimationNodeType.hpp>
      38                 :            : #include <com/sun/star/animations/XIterateContainer.hpp>
      39                 :            : #include <com/sun/star/animations/XAnimateMotion.hpp>
      40                 :            : #include <com/sun/star/animations/XAnimateColor.hpp>
      41                 :            : #include <com/sun/star/animations/XAnimateTransform.hpp>
      42                 :            : #include <com/sun/star/animations/XTransitionFilter.hpp>
      43                 :            : #include <com/sun/star/animations/XCommand.hpp>
      44                 :            : #include <com/sun/star/animations/XAudio.hpp>
      45                 :            : #include <com/sun/star/animations/ValuePair.hpp>
      46                 :            : #include <com/sun/star/animations/AnimationColorSpace.hpp>
      47                 :            : #include <com/sun/star/presentation/EffectPresetClass.hpp>
      48                 :            : #include <com/sun/star/animations/Timing.hpp>
      49                 :            : #include <com/sun/star/animations/Event.hpp>
      50                 :            : #include <com/sun/star/beans/XPropertySet.hpp>
      51                 :            : #include <com/sun/star/xml/sax/XAttributeList.hpp>
      52                 :            : #include <com/sun/star/text/XTextCursor.hpp>
      53                 :            : #include <com/sun/star/text/XTextRangeCompare.hpp>
      54                 :            : #include <com/sun/star/presentation/ParagraphTarget.hpp>
      55                 :            : #include <com/sun/star/container/XEnumerationAccess.hpp>
      56                 :            : #include <com/sun/star/animations/EventTrigger.hpp>
      57                 :            : #include <com/sun/star/presentation/EffectCommands.hpp>
      58                 :            : #include <com/sun/star/util/Duration.hpp>
      59                 :            : #include <comphelper/processfactory.hxx>
      60                 :            : #include <cppuhelper/implbase1.hxx>
      61                 :            : 
      62                 :            : #include <sax/tools/converter.hxx>
      63                 :            : 
      64                 :            : #include <list>
      65                 :            : #include <xmloff/xmltypes.hxx>
      66                 :            : #include "sdpropls.hxx"
      67                 :            : #include <xmloff/xmltoken.hxx>
      68                 :            : #include <xmloff/xmlimp.hxx>
      69                 :            : #include "xmloff/xmlnmspe.hxx"
      70                 :            : #include <xmloff/xmluconv.hxx>
      71                 :            : #include <osl/mutex.hxx>
      72                 :            : #include <xmloff/nmspmap.hxx>
      73                 :            : #include "anim.hxx"
      74                 :            : 
      75                 :            : #include "animations.hxx"
      76                 :            : #include "animationimport.hxx"
      77                 :            : 
      78                 :            : using ::rtl::OUString;
      79                 :            : using ::rtl::OUStringBuffer;
      80                 :            : 
      81                 :            : using namespace ::std;
      82                 :            : using namespace ::cppu;
      83                 :            : using namespace ::com::sun::star::beans;
      84                 :            : using namespace ::com::sun::star::animations;
      85                 :            : using namespace ::com::sun::star::presentation;
      86                 :            : using namespace ::com::sun::star::drawing;
      87                 :            : using namespace ::xmloff::token;
      88                 :            : 
      89                 :            : using ::com::sun::star::xml::sax::XAttributeList;
      90                 :            : using ::com::sun::star::uno::Any;
      91                 :            : using ::com::sun::star::uno::makeAny;
      92                 :            : using ::com::sun::star::uno::UNO_QUERY;
      93                 :            : using ::com::sun::star::uno::UNO_QUERY_THROW;
      94                 :            : using ::com::sun::star::uno::Reference;
      95                 :            : using ::com::sun::star::uno::Sequence;
      96                 :            : using ::com::sun::star::uno::RuntimeException;
      97                 :            : using ::com::sun::star::uno::Exception;
      98                 :            : using ::com::sun::star::uno::XInterface;
      99                 :            : using ::com::sun::star::uno::Type;
     100                 :            : using ::com::sun::star::beans::NamedValue;
     101                 :            : using ::com::sun::star::text::XTextRange;
     102                 :            : using ::com::sun::star::text::XTextCursor;
     103                 :            : using ::com::sun::star::text::XTextRangeCompare;
     104                 :            : using ::com::sun::star::container::XEnumerationAccess;
     105                 :            : using ::com::sun::star::container::XEnumeration;
     106                 :            : using ::com::sun::star::lang::XMultiServiceFactory;
     107                 :            : using ::com::sun::star::lang::XInitialization;
     108                 :            : 
     109                 :            : namespace xmloff
     110                 :            : {
     111                 :            : 
     112                 :            : ///////////////////////////////////////////////////////////////////////
     113                 :            : 
     114                 :            : 
     115                 :            : 
     116                 :            : ///////////////////////////////////////////////////////////////////////
     117                 :            : 
     118                 :            : 
     119                 :            : ///////////////////////////////////////////////////////////////////////
     120                 :            : 
     121                 :            : class AnimationsImportHelperImpl
     122                 :            : {
     123                 :            : private:
     124                 :            :     SvXMLImport& mrImport;
     125                 :            : 
     126                 :            :     SvXMLTokenMap* mpAnimationNodeTokenMap;
     127                 :            :     SvXMLTokenMap* mpAnimationNodeAttributeTokenMap;
     128                 :            : 
     129                 :            : public:
     130                 :            :     AnimationsImportHelperImpl( SvXMLImport& rImport );
     131                 :            :     ~AnimationsImportHelperImpl();
     132                 :            : 
     133                 :            :     const SvXMLTokenMap& getAnimationNodeTokenMap();
     134                 :            :     const SvXMLTokenMap& getAnimationNodeAttributeTokenMap();
     135                 :            : 
     136                 :            :     Any convertValue( XMLTokenEnum eAttributeName, const OUString& rValue );
     137                 :            :     Sequence< Any > convertValueSequence( XMLTokenEnum eAttributeName, const OUString& rValue );
     138                 :            : 
     139                 :            :     Any convertTarget( const OUString& rValue );
     140                 :            :     Any convertPath( const OUString& rValue );
     141                 :            :     Any convertTiming( const OUString& rValue );
     142                 :            :     Sequence< double > convertKeyTimes( const OUString& rValue );
     143                 :            :     Sequence< TimeFilterPair > convertTimeFilter( const OUString& rValue );
     144                 :            : 
     145                 :            :     bool convertAnimationValue( XMLTokenEnum eAttributeName, Any& rValue );
     146                 :            :     const OUString mastrHSL;
     147                 :            : };
     148                 :            : 
     149                 :          4 : AnimationsImportHelperImpl::AnimationsImportHelperImpl( SvXMLImport& rImport )
     150                 :            : :   mrImport( rImport ),
     151                 :            :     mpAnimationNodeTokenMap( NULL ),
     152                 :            :     mpAnimationNodeAttributeTokenMap( NULL ),
     153                 :          4 :     mastrHSL( RTL_CONSTASCII_USTRINGPARAM( "hsl" ) )
     154                 :            : {
     155                 :          4 : }
     156                 :            : 
     157                 :          4 : AnimationsImportHelperImpl::~AnimationsImportHelperImpl()
     158                 :            : {
     159 [ +  - ][ +  - ]:          4 :     delete mpAnimationNodeTokenMap;
     160 [ +  - ][ +  - ]:          4 :     delete mpAnimationNodeAttributeTokenMap;
     161                 :          4 : }
     162                 :            : 
     163                 :        324 : const SvXMLTokenMap& AnimationsImportHelperImpl::getAnimationNodeTokenMap()
     164                 :            : {
     165         [ +  + ]:        324 :     if( mpAnimationNodeTokenMap == NULL )
     166                 :            :     {
     167                 :            :         static SvXMLTokenMapEntry aAnimationNodeTokenMap[] =
     168                 :            :         {
     169                 :            :             { XML_NAMESPACE_ANIMATION,  XML_PAR,                (sal_uInt16)AnimationNodeType::PAR },
     170                 :            :             { XML_NAMESPACE_ANIMATION,  XML_SEQ,                (sal_uInt16)AnimationNodeType::SEQ },
     171                 :            :             { XML_NAMESPACE_ANIMATION,  XML_ITERATE,            (sal_uInt16)AnimationNodeType::ITERATE },
     172                 :            :             { XML_NAMESPACE_ANIMATION,  XML_ANIMATE,            (sal_uInt16)AnimationNodeType::ANIMATE },
     173                 :            :             { XML_NAMESPACE_ANIMATION,  XML_SET,                (sal_uInt16)AnimationNodeType::SET },
     174                 :            :             { XML_NAMESPACE_ANIMATION,  XML_ANIMATEMOTION,      (sal_uInt16)AnimationNodeType::ANIMATEMOTION },
     175                 :            :             { XML_NAMESPACE_ANIMATION,  XML_ANIMATECOLOR,       (sal_uInt16)AnimationNodeType::ANIMATECOLOR },
     176                 :            :             { XML_NAMESPACE_ANIMATION,  XML_ANIMATETRANSFORM,   (sal_uInt16)AnimationNodeType::ANIMATETRANSFORM },
     177                 :            :             { XML_NAMESPACE_ANIMATION,  XML_TRANSITIONFILTER,   (sal_uInt16)AnimationNodeType::TRANSITIONFILTER },
     178                 :            :             { XML_NAMESPACE_ANIMATION,  XML_AUDIO,              (sal_uInt16)AnimationNodeType::AUDIO },
     179                 :            :             { XML_NAMESPACE_ANIMATION,  XML_COMMAND,            (sal_uInt16)AnimationNodeType::COMMAND },
     180                 :            :             XML_TOKEN_MAP_END
     181                 :            :         };
     182                 :            : 
     183         [ +  - ]:          4 :         mpAnimationNodeTokenMap = new SvXMLTokenMap( aAnimationNodeTokenMap );
     184                 :            :     }
     185                 :            : 
     186                 :        324 :     return *mpAnimationNodeTokenMap;
     187                 :            : }
     188                 :            : 
     189                 :            : enum AnimationNodeAttributes
     190                 :            : {
     191                 :            :     ANA_Begin,
     192                 :            :     ANA_Dur,
     193                 :            :     ANA_End,
     194                 :            :     ANA_Fill,
     195                 :            :     ANA_FillDefault,
     196                 :            :     ANA_Restart,
     197                 :            :     ANA_RestartDefault,
     198                 :            :     ANA_Accelerate,
     199                 :            :     ANA_Decelerate,
     200                 :            :     ANA_AutoReverse,
     201                 :            :     ANA_RepeatCount,
     202                 :            :     ANA_RepeatDur,
     203                 :            :     ANA_EndSync,
     204                 :            :     ANA_Node_Type,
     205                 :            :     ANA_Preset_ID,
     206                 :            :     ANA_Preset_Sub_Type,
     207                 :            :     ANA_Preset_Class,
     208                 :            :     ANA_After_Effect,
     209                 :            :     ANA_Target,
     210                 :            :     ANA_XLink,
     211                 :            :     ANA_MasterElement,
     212                 :            :     ANA_SubItem,
     213                 :            :     ANA_AttributeName,
     214                 :            :     ANA_Values,
     215                 :            :     ANA_From,
     216                 :            :     ANA_By,
     217                 :            :     ANA_To,
     218                 :            :     ANA_KeyTimes,
     219                 :            :     ANA_CalcMode,
     220                 :            :     ANA_Accumulate,
     221                 :            :     ANA_AdditiveMode,
     222                 :            :     ANA_KeySplines,
     223                 :            :     ANA_Path,
     224                 :            :     ANA_ColorSpace,
     225                 :            :     ANA_ColorDirection,
     226                 :            :     ANA_TransformType,
     227                 :            :     ANA_TransitionType,
     228                 :            :     ANA_TransitionSubType,
     229                 :            :     ANA_Mode,
     230                 :            :     ANA_Direction,
     231                 :            :     ANA_FadeColor,
     232                 :            :     ANA_IterateType,
     233                 :            :     ANA_IterateInterval,
     234                 :            :     ANA_Formula,
     235                 :            :     ANA_ANIMID,
     236                 :            :     ANA_XMLID,
     237                 :            :     ANA_Group_Id,
     238                 :            :     ANA_Command,
     239                 :            :     ANA_Volume
     240                 :            : };
     241                 :            : 
     242                 :        528 : const SvXMLTokenMap& AnimationsImportHelperImpl::getAnimationNodeAttributeTokenMap()
     243                 :            : {
     244         [ +  + ]:        528 :     if( mpAnimationNodeAttributeTokenMap == NULL )
     245                 :            :     {
     246                 :            :         static SvXMLTokenMapEntry aAnimationNodeAttributeTokenMap[] =
     247                 :            :         {
     248                 :            :             { XML_NAMESPACE_SMIL, XML_BEGIN,                    (sal_uInt16)ANA_Begin },
     249                 :            :             { XML_NAMESPACE_SMIL, XML_DUR,                      (sal_uInt16)ANA_Dur },
     250                 :            :             { XML_NAMESPACE_SMIL, XML_END,                      (sal_uInt16)ANA_End },
     251                 :            :             { XML_NAMESPACE_SMIL, XML_FILL,                     (sal_uInt16)ANA_Fill },
     252                 :            :             { XML_NAMESPACE_SMIL, XML_FILLDEFAULT,              (sal_uInt16)ANA_FillDefault },
     253                 :            :             { XML_NAMESPACE_SMIL, XML_RESTART,                  (sal_uInt16)ANA_Restart },
     254                 :            :             { XML_NAMESPACE_SMIL, XML_RESTARTDEFAULT,           (sal_uInt16)ANA_RestartDefault },
     255                 :            :             { XML_NAMESPACE_SMIL, XML_ACCELERATE,               (sal_uInt16)ANA_Accelerate },
     256                 :            :             { XML_NAMESPACE_SMIL, XML_DECELERATE,               (sal_uInt16)ANA_Decelerate },
     257                 :            :             { XML_NAMESPACE_SMIL, XML_AUTOREVERSE,              (sal_uInt16)ANA_AutoReverse },
     258                 :            :             { XML_NAMESPACE_SMIL, XML_REPEATCOUNT,              (sal_uInt16)ANA_RepeatCount },
     259                 :            :             { XML_NAMESPACE_SMIL, XML_REPEATDUR,                (sal_uInt16)ANA_RepeatDur },
     260                 :            :             { XML_NAMESPACE_SMIL, XML_ENDSYNC,                  (sal_uInt16)ANA_EndSync },
     261                 :            :             { XML_NAMESPACE_PRESENTATION, XML_NODE_TYPE,        (sal_uInt16)ANA_Node_Type },
     262                 :            :             { XML_NAMESPACE_PRESENTATION, XML_PRESET_ID,        (sal_uInt16)ANA_Preset_ID },
     263                 :            :             { XML_NAMESPACE_PRESENTATION, XML_PRESET_SUB_TYPE,  (sal_uInt16)ANA_Preset_Sub_Type },
     264                 :            :             { XML_NAMESPACE_PRESENTATION, XML_PRESET_CLASS,     (sal_uInt16)ANA_Preset_Class },
     265                 :            :             { XML_NAMESPACE_PRESENTATION, XML_AFTER_EFFECT,     (sal_uInt16)ANA_After_Effect },
     266                 :            :             { XML_NAMESPACE_SMIL, XML_TARGETELEMENT,            (sal_uInt16)ANA_Target },
     267                 :            :             { XML_NAMESPACE_XLINK, XML_HREF,                    (sal_uInt16)ANA_XLink },
     268                 :            :             { XML_NAMESPACE_PRESENTATION, XML_MASTER_ELEMENT,   (sal_uInt16)ANA_MasterElement },
     269                 :            :             { XML_NAMESPACE_ANIMATION, XML_SUB_ITEM,            (sal_uInt16)ANA_SubItem },
     270                 :            :             { XML_NAMESPACE_SMIL, XML_ATTRIBUTENAME,            (sal_uInt16)ANA_AttributeName },
     271                 :            :             { XML_NAMESPACE_SMIL, XML_VALUES,                   (sal_uInt16)ANA_Values },
     272                 :            :             { XML_NAMESPACE_SMIL, XML_FROM,                     (sal_uInt16)ANA_From },
     273                 :            :             { XML_NAMESPACE_SMIL, XML_BY,                       (sal_uInt16)ANA_By },
     274                 :            :             { XML_NAMESPACE_SMIL, XML_TO,                       (sal_uInt16)ANA_To },
     275                 :            :             { XML_NAMESPACE_SMIL, XML_KEYTIMES,                 (sal_uInt16)ANA_KeyTimes },
     276                 :            :             { XML_NAMESPACE_SMIL, XML_CALCMODE,                 (sal_uInt16)ANA_CalcMode },
     277                 :            :             { XML_NAMESPACE_SMIL, XML_ACCUMULATE,               (sal_uInt16)ANA_Accumulate },
     278                 :            :             { XML_NAMESPACE_PRESENTATION, XML_ADDITIVE,         (sal_uInt16)ANA_AdditiveMode },
     279                 :            :             { XML_NAMESPACE_SMIL, XML_ADDITIVE,                 (sal_uInt16)ANA_AdditiveMode },
     280                 :            :             { XML_NAMESPACE_SMIL, XML_KEYSPLINES,               (sal_uInt16)ANA_KeySplines },
     281                 :            :             { XML_NAMESPACE_SVG, XML_PATH,                      (sal_uInt16)ANA_Path },
     282                 :            :             { XML_NAMESPACE_ANIMATION, XML_COLOR_INTERPOLATION, (sal_uInt16)ANA_ColorSpace },
     283                 :            :             { XML_NAMESPACE_ANIMATION, XML_COLOR_INTERPOLATION_DIRECTION,       (sal_uInt16)ANA_ColorDirection },
     284                 :            :             { XML_NAMESPACE_SVG, XML_TYPE,                      (sal_uInt16)ANA_TransformType },
     285                 :            :             { XML_NAMESPACE_SMIL, XML_TYPE,                     (sal_uInt16)ANA_TransitionType },
     286                 :            :             { XML_NAMESPACE_SMIL, XML_SUBTYPE,                  (sal_uInt16)ANA_TransitionSubType },
     287                 :            :             { XML_NAMESPACE_SMIL, XML_MODE,                     (sal_uInt16)ANA_Mode },
     288                 :            :             { XML_NAMESPACE_SMIL, XML_DIRECTION,                (sal_uInt16)ANA_Direction },
     289                 :            :             { XML_NAMESPACE_SMIL, XML_FADECOLOR,                (sal_uInt16)ANA_FadeColor },
     290                 :            :             { XML_NAMESPACE_ANIMATION, XML_ITERATE_TYPE,        (sal_uInt16)ANA_IterateType },
     291                 :            :             { XML_NAMESPACE_ANIMATION, XML_ITERATE_INTERVAL,    (sal_uInt16)ANA_IterateInterval },
     292                 :            :             { XML_NAMESPACE_ANIMATION, XML_FORMULA,             (sal_uInt16)ANA_Formula },
     293                 :            :             { XML_NAMESPACE_ANIMATION, XML_ID,                  (sal_uInt16)ANA_ANIMID },
     294                 :            :             { XML_NAMESPACE_XML, XML_ID,                        (sal_uInt16)ANA_XMLID },
     295                 :            :             { XML_NAMESPACE_PRESENTATION, XML_GROUP_ID,         (sal_uInt16)ANA_Group_Id },
     296                 :            :             { XML_NAMESPACE_ANIMATION, XML_AUDIO_LEVEL,         (sal_uInt16)ANA_Volume },
     297                 :            :             { XML_NAMESPACE_ANIMATION, XML_COMMAND,             (sal_uInt16)ANA_Command },
     298                 :            : 
     299                 :            :             XML_TOKEN_MAP_END
     300                 :            :         };
     301                 :            : 
     302         [ +  - ]:          4 :         mpAnimationNodeAttributeTokenMap = new SvXMLTokenMap( aAnimationNodeAttributeTokenMap );
     303                 :            :     }
     304                 :            : 
     305                 :        528 :     return *mpAnimationNodeAttributeTokenMap;
     306                 :            : }
     307                 :            : 
     308                 :          0 : static bool isDouble( const OUString& rValue )
     309                 :            : {
     310                 :          0 :     sal_Int32 nLength = rValue.getLength();
     311                 :          0 :     const sal_Unicode * pStr = rValue.getStr();
     312         [ #  # ]:          0 :     while( nLength )
     313                 :            :     {
     314 [ #  # ][ #  # ]:          0 :         if( (*pStr >= '0' && *pStr <= '9') || *pStr == '-' || *pStr == '.' || *pStr == '+' || *pStr == 'e' || *pStr == 'E' )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     315                 :            :         {
     316                 :          0 :             pStr++;
     317                 :          0 :             nLength--;
     318                 :            :         }
     319                 :            :         else
     320                 :            :         {
     321                 :          0 :             return false;
     322                 :            :         }
     323                 :            :     }
     324                 :            : 
     325                 :          0 :     return true;
     326                 :            : }
     327                 :            : 
     328                 :          0 : static bool isTime( const OUString& rValue )
     329                 :            : {
     330                 :          0 :     sal_Int32 nLength = rValue.getLength();
     331                 :            :     const sal_Unicode * pStr;
     332         [ #  # ]:          0 :     for( pStr = rValue.getStr(); nLength; pStr++, nLength-- )
     333                 :            :     {
     334 [ #  # ][ #  # ]:          0 :         if( !( (*pStr >= '0' && *pStr <= '9') || *pStr == '-' || *pStr == '.' || *pStr == '+' || *pStr == 'e' || *pStr == 'E' ) )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     335                 :          0 :             break;
     336                 :            :     }
     337                 :            : 
     338                 :            :     // return true if this is a double (if someone forgot the 's' we silently ignore it)
     339                 :            :     // or if its a double that ends with a 's' or 'S'
     340 [ #  # ][ #  # ]:          0 :     return (nLength == 0) || ((*pStr == 's' || *pStr == 'S') && (nLength == 1));
         [ #  # ][ #  # ]
     341                 :            : }
     342                 :            : 
     343                 :          0 : static sal_Int32 count_codes( const OUString& rString, sal_Unicode nCode )
     344                 :            : {
     345                 :          0 :     sal_Int32 nCount = 0;
     346                 :          0 :     sal_Int32 fromIndex = 0;
     347                 :            : 
     348                 :          0 :     while(true)
     349                 :            :     {
     350                 :          0 :         fromIndex = rString.indexOf( nCode, fromIndex );
     351         [ #  # ]:          0 :         if( fromIndex == -1 )
     352                 :          0 :             break;
     353                 :            : 
     354                 :          0 :         fromIndex++;
     355                 :          0 :         nCount++;
     356                 :            :     }
     357                 :            : 
     358                 :          0 :     return nCount;
     359                 :            : }
     360                 :            : 
     361                 :          0 : Any AnimationsImportHelperImpl::convertTarget( const OUString& rValue )
     362                 :            : {
     363                 :            :     try
     364                 :            :     {
     365 [ #  # ][ #  # ]:          0 :         Reference< XInterface > xRef( mrImport.getInterfaceToIdentifierMapper().getReference( rValue ) );
     366                 :            : 
     367         [ #  # ]:          0 :         Reference< XShape > _xShape( xRef, UNO_QUERY );
     368         [ #  # ]:          0 :         if( _xShape.is() )
     369         [ #  # ]:          0 :             return makeAny( _xShape );
     370                 :            : 
     371         [ #  # ]:          0 :         Reference< XTextCursor > xTextCursor( xRef, UNO_QUERY );
     372         [ #  # ]:          0 :         if( xTextCursor.is() )
     373                 :            :         {
     374 [ #  # ][ #  # ]:          0 :             Reference< XTextRange > xStart( xTextCursor->getStart() ), xRange;
     375 [ #  # ][ #  # ]:          0 :             Reference< XShape > xShape( xTextCursor->getText(), UNO_QUERY_THROW );
                 [ #  # ]
     376         [ #  # ]:          0 :             Reference< XTextRangeCompare > xTextRangeCompare( xShape, UNO_QUERY_THROW );
     377                 :            : 
     378         [ #  # ]:          0 :             Reference< XEnumerationAccess > xParaEnumAccess( xShape, UNO_QUERY_THROW );
     379 [ #  # ][ #  # ]:          0 :             Reference< XEnumeration > xEnumeration( xParaEnumAccess->createEnumeration(), UNO_QUERY_THROW );
                 [ #  # ]
     380                 :          0 :             sal_Int16 nParagraph = 0;
     381                 :            : 
     382 [ #  # ][ #  # ]:          0 :             while( xEnumeration->hasMoreElements() )
                 [ #  # ]
     383                 :            :             {
     384 [ #  # ][ #  # ]:          0 :                 xEnumeration->nextElement() >>= xRange;
                 [ #  # ]
     385                 :            : 
     386                 :            :                 // break if start of selection is prior to end of current paragraph
     387 [ #  # ][ #  # ]:          0 :                 if( xRange.is() && (xTextRangeCompare->compareRegionEnds( xStart, xRange ) >= 0 ) )
         [ #  # ][ #  # ]
                 [ #  # ]
     388                 :            :                 {
     389 [ #  # ][ #  # ]:          0 :                     return makeAny( ParagraphTarget( xShape, nParagraph ) );
                 [ #  # ]
     390                 :            :                 }
     391                 :            : 
     392                 :          0 :                 nParagraph++;
     393 [ #  # ][ #  # ]:          0 :             }
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     394 [ #  # ][ #  # ]:          0 :         }
         [ #  # ][ #  # ]
     395                 :            :     }
     396         [ #  # ]:          0 :     catch (const RuntimeException&)
     397                 :            :     {
     398                 :            :         OSL_FAIL( "xmloff::AnimationsImportImpl::convertTarget(), RuntimeException caught!" );
     399                 :            :     }
     400                 :            : 
     401                 :          0 :     Any aAny;
     402                 :          0 :     return aAny;
     403                 :            : }
     404                 :            : 
     405                 :          0 : Any AnimationsImportHelperImpl::convertValue( XMLTokenEnum eAttributeName, const OUString& rValue )
     406                 :            : {
     407                 :          0 :     sal_Int32 nCommaPos = -1, nPos;
     408                 :          0 :     sal_Int32 nOpenBrakets = 0;
     409 [ #  # ][ #  # ]:          0 :     for( nPos = 0; (nPos < rValue.getLength()) && (nCommaPos == -1); nPos++ )
                 [ #  # ]
     410                 :            :     {
     411   [ #  #  #  # ]:          0 :         switch( rValue[nPos] )
     412                 :            :         {
     413                 :            :         case ',':
     414         [ #  # ]:          0 :             if( nOpenBrakets == 0 )
     415                 :          0 :                 nCommaPos = nPos;
     416                 :          0 :             break;
     417                 :            :         case '(':
     418                 :            :         case '[':
     419                 :            :         case '{':
     420                 :          0 :             nOpenBrakets++;
     421                 :          0 :             break;
     422                 :            :         case ')':
     423                 :            :         case ']':
     424                 :            :         case '}':
     425                 :          0 :             nOpenBrakets--;
     426                 :          0 :             break;
     427                 :            :         }
     428                 :            :     }
     429                 :            : 
     430         [ #  # ]:          0 :     if( nCommaPos >= 0 )
     431                 :            :     {
     432                 :          0 :         ValuePair aPair;
     433         [ #  # ]:          0 :         aPair.First = convertValue( eAttributeName, rValue.copy( 0, nCommaPos ) );
     434         [ #  # ]:          0 :         aPair.Second = convertValue( eAttributeName, rValue.copy( nCommaPos+1, rValue.getLength() - nCommaPos - 1 ) );
     435         [ #  # ]:          0 :         return makeAny( aPair );
     436                 :            :     }
     437                 :            :     else
     438                 :            :     {
     439                 :          0 :         Any aAny;
     440                 :          0 :         sal_Int32 nType = XML_TYPE_STRING;
     441                 :            : 
     442   [ #  #  #  #  :          0 :         if( rValue.getLength() ) switch( eAttributeName )
          #  #  #  #  #  
                #  #  # ]
                 [ #  # ]
     443                 :            :         {
     444                 :            :         case XML_X:
     445                 :            :         case XML_Y:
     446                 :            :         case XML_WIDTH:
     447                 :            :         case XML_HEIGHT:
     448                 :            :         case XML_TRANSLATE:
     449                 :            :         {
     450         [ #  # ]:          0 :             return makeAny( rValue );
     451                 :            :         }
     452                 :            : 
     453                 :            :         case XML_SCALE:
     454                 :            :         case XML_SKEWY:
     455                 :            :         case XML_SKEWX:
     456                 :            :         case XML_OPACITY:
     457                 :          0 :         case XML_ROTATE:            nType = XML_TYPE_DOUBLE;                    break;
     458                 :          0 :         case XML_TEXT_ROTATION_ANGLE:nType = XML_TYPE_TEXT_ROTATION_ANGLE;      break;
     459                 :            :         case XML_FILL_COLOR:
     460                 :            :         case XML_STROKE_COLOR:
     461                 :            :         case XML_DIM:
     462                 :          0 :         case XML_COLOR:             nType = XML_TYPE_COLOR;                     break;
     463                 :          0 :         case XML_FILL:              nType = XML_SD_TYPE_FILLSTYLE;              break;
     464                 :          0 :         case XML_STROKE:            nType = XML_SD_TYPE_STROKE;                 break;
     465                 :          0 :         case XML_FONT_WEIGHT:       nType = XML_TYPE_TEXT_WEIGHT;               break;
     466                 :          0 :         case XML_FONT_STYLE:        nType = XML_TYPE_TEXT_POSTURE;              break;
     467                 :          0 :         case XML_TEXT_UNDERLINE:    nType = XML_TYPE_TEXT_UNDERLINE_STYLE;      break;
     468                 :          0 :         case XML_FONT_SIZE:         nType = XML_TYPE_DOUBLE_PERCENT;            break;
     469                 :          0 :         case XML_VISIBILITY:        nType = XML_SD_TYPE_PRESPAGE_VISIBILITY;    break;
     470                 :            : 
     471                 :            :         default:
     472         [ #  # ]:          0 :             if( !rValue.isEmpty() )
     473         [ #  # ]:          0 :                 aAny <<= rValue;
     474                 :          0 :             return aAny;
     475                 :            :         }
     476                 :            : 
     477 [ #  # ][ #  # ]:          0 :         const XMLPropertyHandler* pHandler = mrImport.GetShapeImport()->GetSdPropHdlFactory()->GetPropertyHandler( nType );
         [ #  # ][ #  # ]
     478         [ #  # ]:          0 :         if( pHandler )
     479         [ #  # ]:          0 :             pHandler->importXML( rValue, aAny, mrImport.GetMM100UnitConverter() );
     480                 :            : 
     481                 :          0 :         return aAny;
     482                 :            :     }
     483                 :            : }
     484                 :            : 
     485                 :          0 : Sequence< Any > AnimationsImportHelperImpl::convertValueSequence( XMLTokenEnum eAttributeName, const OUString& rValue )
     486                 :            : {
     487                 :          0 :     Sequence< Any > aValues;
     488                 :            : 
     489                 :            :     // do we have any value at all?
     490         [ #  # ]:          0 :     if( !rValue.isEmpty() )
     491                 :            :     {
     492                 :          0 :         sal_Int32 nElements = count_codes( rValue, (sal_Unicode)';') + 1; // a non empty string has at least one value
     493                 :            : 
     494                 :            :         // prepare the sequence
     495         [ #  # ]:          0 :         aValues.realloc( nElements );
     496                 :            : 
     497                 :            :         // fill the sequence
     498         [ #  # ]:          0 :         Any* pValues = aValues.getArray();
     499                 :            :         sal_Int32 nIndex;
     500 [ #  # ][ #  # ]:          0 :         for( nIndex = 0; nElements && (nIndex >= 0); nElements-- )
                 [ #  # ]
     501                 :            :         {
     502         [ #  # ]:          0 :             *pValues++ = convertValue( eAttributeName, rValue.getToken( 0, ';', nIndex ) );
     503                 :            :         }
     504                 :            :     }
     505                 :            : 
     506                 :          0 :     return aValues;
     507                 :            : }
     508                 :            : 
     509                 :          0 : Any AnimationsImportHelperImpl::convertTiming( const OUString& rValue )
     510                 :            : {
     511                 :          0 :     Any aAny;
     512                 :            : 
     513                 :            :     // do we have any value at all?
     514         [ #  # ]:          0 :     if( !rValue.isEmpty() )
     515                 :            :     {
     516                 :            :         // count the values
     517                 :          0 :         sal_Int32 nElements = count_codes( rValue, (sal_Unicode)';' ) + 1; // a non empty string has at least one value
     518                 :            : 
     519         [ #  # ]:          0 :         if( nElements == 1 )
     520                 :            :         {
     521 [ #  # ][ #  # ]:          0 :             if( IsXMLToken( rValue, XML_MEDIA ) )
     522                 :            :             {
     523         [ #  # ]:          0 :                 aAny <<= Timing_MEDIA;
     524                 :            :             }
     525 [ #  # ][ #  # ]:          0 :             else if( IsXMLToken( rValue, XML_INDEFINITE ) )
     526                 :            :             {
     527         [ #  # ]:          0 :                 aAny <<= Timing_INDEFINITE;
     528                 :            :             }
     529         [ #  # ]:          0 :             else if( isTime( rValue ) )
     530                 :            :             {
     531         [ #  # ]:          0 :                 aAny <<= rValue.toDouble();
     532                 :            :             }
     533                 :            :             else
     534                 :            :             {
     535                 :          0 :                 Event aEvent;
     536                 :          0 :                 aEvent.Repeat = 0;
     537                 :          0 :                 aEvent.Trigger = 0;
     538                 :            : 
     539                 :          0 :                 OUString aEventTrigger;
     540                 :            : 
     541                 :          0 :                 sal_Int32 nPos = rValue.indexOf( (sal_Unicode)'+' );
     542         [ #  # ]:          0 :                 if( nPos == -1 )
     543                 :            :                 {
     544                 :          0 :                     aEventTrigger = rValue;
     545                 :            :                 }
     546                 :            :                 else
     547                 :            :                 {
     548                 :          0 :                     aEventTrigger = rValue.copy( 0, nPos );
     549                 :            : 
     550                 :            :                     // convert offset
     551 [ #  # ][ #  # ]:          0 :                     aEvent.Offset <<= convertTiming( rValue.copy( nPos + 1 ) );
     552                 :            :                 }
     553                 :            : 
     554                 :          0 :                 nPos = aEventTrigger.indexOf( (sal_Unicode)'.' );
     555         [ #  # ]:          0 :                 if( nPos != -1 )
     556                 :            :                 {
     557 [ #  # ][ #  # ]:          0 :                     aEvent.Source <<= mrImport.getInterfaceToIdentifierMapper().getReference( aEventTrigger.copy( 0, nPos ) );
                 [ #  # ]
     558                 :          0 :                     aEventTrigger = aEventTrigger.copy( nPos + 1 );
     559                 :            :                 }
     560                 :            : 
     561                 :            :                 sal_uInt16 nEnum;
     562 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, aEventTrigger, getAnimationsEnumMap(Animations_EnumMap_EventTrigger) ) )
                 [ #  # ]
     563                 :            :                 {
     564                 :          0 :                     aEvent.Trigger = (sal_Int16)nEnum;
     565                 :            :                 }
     566                 :            :                 else
     567                 :            :                 {
     568                 :            :                     OSL_FAIL("AnimationsImportHelperImpl::convertTiming(), unknown event trigger!");
     569                 :            :                 }
     570                 :            : 
     571         [ #  # ]:          0 :                 aAny <<= aEvent;
     572                 :            :             }
     573                 :            :         }
     574                 :            :         else
     575                 :            :         {
     576                 :            :             // fill the sequence
     577         [ #  # ]:          0 :             Sequence< Any > aValues( nElements );
     578         [ #  # ]:          0 :             Any* pValues = aValues.getArray();
     579                 :          0 :             sal_Int32 nIndex = 0;
     580 [ #  # ][ #  # ]:          0 :             while( (nElements--) && (nIndex >= 0) )
                 [ #  # ]
     581         [ #  # ]:          0 :                 *pValues++ = convertTiming( rValue.getToken( 0, ';', nIndex ) );
     582                 :            : 
     583 [ #  # ][ #  # ]:          0 :             aAny <<= aValues;
     584                 :            :         }
     585                 :            :     }
     586                 :          0 :     return aAny;
     587                 :            : }
     588                 :            : 
     589                 :          0 : Sequence< double > AnimationsImportHelperImpl::convertKeyTimes( const OUString& rValue )
     590                 :            : {
     591                 :          0 :     sal_Int32 nElements = 0;
     592                 :            : 
     593         [ #  # ]:          0 :     if( !rValue.isEmpty() )
     594                 :          0 :         nElements = count_codes( rValue, (sal_Unicode)';' ) + 1; // a non empty string has at least one value
     595                 :            : 
     596                 :          0 :     Sequence< double > aKeyTimes( nElements );
     597                 :            : 
     598         [ #  # ]:          0 :     if( nElements )
     599                 :            :     {
     600         [ #  # ]:          0 :         double* pValues = aKeyTimes.getArray();
     601                 :          0 :         sal_Int32 nIndex = 0;
     602 [ #  # ][ #  # ]:          0 :         while( (nElements--) && (nIndex >= 0) )
                 [ #  # ]
     603                 :          0 :             *pValues++ = rValue.getToken( 0, ';', nIndex ).toDouble();
     604                 :            :     }
     605                 :            : 
     606                 :          0 :     return aKeyTimes;
     607                 :            : }
     608                 :            : 
     609                 :          0 : Sequence< TimeFilterPair > AnimationsImportHelperImpl::convertTimeFilter( const OUString& rValue )
     610                 :            : {
     611                 :          0 :     sal_Int32 nElements = 0;
     612                 :            : 
     613         [ #  # ]:          0 :     if( !rValue.isEmpty() )
     614                 :          0 :         nElements = count_codes( rValue, (sal_Unicode)';' ) + 1; // a non empty string has at least one value
     615                 :            : 
     616                 :          0 :     Sequence< TimeFilterPair > aTimeFilter( nElements );
     617                 :            : 
     618         [ #  # ]:          0 :     if( nElements )
     619                 :            :     {
     620         [ #  # ]:          0 :         TimeFilterPair* pValues = aTimeFilter.getArray();
     621                 :          0 :         sal_Int32 nIndex = 0;
     622 [ #  # ][ #  # ]:          0 :         while( (nElements--) && (nIndex >= 0) )
                 [ #  # ]
     623                 :            :         {
     624                 :          0 :             const OUString aToken( rValue.getToken( 0, ';', nIndex ) );
     625                 :            : 
     626                 :          0 :             sal_Int32 nPos = aToken.indexOf( ',' );
     627         [ #  # ]:          0 :             if( nPos >= 0 )
     628                 :            :             {
     629                 :          0 :                 pValues->Time = aToken.copy( 0, nPos ).toDouble();
     630                 :          0 :                 pValues->Progress = aToken.copy( nPos+1, aToken.getLength() - nPos - 1 ).toDouble();
     631                 :            :             }
     632                 :          0 :             pValues++;
     633                 :          0 :         }
     634                 :            :     }
     635                 :            : 
     636                 :          0 :     return aTimeFilter;
     637                 :            : }
     638                 :            : 
     639                 :          0 : Any AnimationsImportHelperImpl::convertPath( const OUString& rValue )
     640                 :            : {
     641                 :          0 :     return makeAny( rValue );
     642                 :            : }
     643                 :            : 
     644                 :            : ///////////////////////////////////////////////////////////////////////
     645                 :            : 
     646 [ #  # ][ #  # ]:          0 : TYPEINIT1( AnimationNodeContext, SvXMLImportContext );
     647                 :            : 
     648                 :        328 : AnimationNodeContext::AnimationNodeContext(
     649                 :            :         const Reference< XAnimationNode >& xParentNode,
     650                 :            :         SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName,
     651                 :            :         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
     652                 :            :         AnimationsImportHelperImpl* pHelper /* = NULL */ )
     653                 :            : :   SvXMLImportContext(rImport, nPrfx, rLocalName),
     654                 :            :     mpHelper( pHelper ),
     655                 :        328 :     mbRootContext( pHelper == NULL )
     656                 :            : {
     657                 :            :     try
     658                 :            :     {
     659         [ +  + ]:        328 :         if( mbRootContext )
     660                 :            :         {
     661 [ +  - ][ +  - ]:          4 :             mpHelper = new AnimationsImportHelperImpl( rImport );
     662         [ +  - ]:          4 :             mxNode = xParentNode;
     663                 :            :         }
     664                 :            :         else
     665                 :            :         {
     666         [ +  - ]:        324 :             Reference< XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
     667                 :            : 
     668                 :        324 :             sal_Int16 nPresetClass = EffectPresetClass::CUSTOM;
     669                 :            : 
     670                 :        324 :             const sal_Char* pServiceName = 0;
     671                 :            : 
     672 [ +  - ][ +  - ]:        324 :             sal_Int16 nNodeType = (sal_Int16)mpHelper->getAnimationNodeTokenMap().Get( nPrfx, rLocalName );
     673   [ -  -  -  -  :        324 :             switch( nNodeType )
          -  -  -  +  -  
                -  +  - ]
     674                 :            :             {
     675                 :          0 :             case AnimationNodeType::SEQ:                pServiceName = "com.sun.star.animations.SequenceTimeContainer"; break;
     676                 :          0 :             case AnimationNodeType::ITERATE:            pServiceName = "com.sun.star.animations.IterateContainer"; break;
     677                 :          0 :             case AnimationNodeType::ANIMATE:            pServiceName = "com.sun.star.animations.Animate"; break;
     678                 :          0 :             case AnimationNodeType::SET:                pServiceName = "com.sun.star.animations.AnimateSet"; break;
     679                 :          0 :             case AnimationNodeType::ANIMATEMOTION:      pServiceName = "com.sun.star.animations.AnimateMotion"; break;
     680                 :          0 :             case AnimationNodeType::ANIMATECOLOR:       pServiceName = "com.sun.star.animations.AnimateColor"; break;
     681                 :          0 :             case AnimationNodeType::ANIMATETRANSFORM:   pServiceName = "com.sun.star.animations.AnimateTransform"; break;
     682                 :        162 :             case AnimationNodeType::TRANSITIONFILTER:   pServiceName = "com.sun.star.animations.TransitionFilter"; break;
     683                 :          0 :             case AnimationNodeType::AUDIO:              pServiceName = "com.sun.star.animations.Audio"; break;
     684                 :          0 :             case AnimationNodeType::COMMAND:            pServiceName = "com.sun.star.animations.Command"; break;
     685                 :            :             case AnimationNodeType::PAR:
     686                 :            :                 {
     687 [ +  - ][ +  - ]:        162 :                     const sal_Int16 nCount = xAttrList.is() ? xAttrList->getLength() : 0;
                 [ +  - ]
     688                 :            :                     sal_Int16 nAttribute;
     689         [ +  + ]:        324 :                     for( nAttribute = 0; nAttribute < nCount; nAttribute++ )
     690                 :            :                     {
     691                 :        162 :                         OUString aLocalName;
     692 [ +  - ][ +  - ]:        162 :                         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( nAttribute ), &aLocalName );
                 [ +  - ]
     693 [ +  - ][ +  - ]:        162 :                         if( (nPrefix == XML_NAMESPACE_PRESENTATION) && IsXMLToken( aLocalName, XML_PRESET_ID ) )
         [ +  - ][ +  - ]
     694                 :            :                         {
     695 [ +  - ][ +  - ]:        162 :                             const OUString& rValue = xAttrList->getValueByIndex( nAttribute );
     696         [ -  + ]:        162 :                             if ( rValue == "ooo-entrance-random" )
     697                 :            :                             {
     698                 :          0 :                                 nPresetClass = EffectPresetClass::ENTRANCE;
     699                 :            :                             }
     700         [ -  + ]:        162 :                             else if ( rValue == "ooo-exit-random" )
     701                 :            :                             {
     702                 :          0 :                                 nPresetClass = EffectPresetClass::EXIT;
     703                 :            :                             }
     704                 :            : 
     705         [ -  + ]:        162 :                             if( nPresetClass != EffectPresetClass::CUSTOM )
     706                 :            :                             {
     707                 :        162 :                                 pServiceName = "com.sun.star.comp.sd.RandomAnimationNode";
     708                 :            :                                 break;
     709         [ -  + ]:        162 :                             }
     710                 :            :                         }
     711         [ +  - ]:        162 :                     }
     712         [ +  - ]:        162 :                     if( !pServiceName )
     713                 :        162 :                         pServiceName = "com.sun.star.animations.ParallelTimeContainer";
     714                 :            :                 }
     715                 :        162 :                 break;
     716                 :            :             default:
     717                 :          0 :                 pServiceName = 0;
     718                 :            :             }
     719                 :            : 
     720 [ +  - ][ +  - ]:        324 :             if( pServiceName && xFactory.is() )
                 [ +  - ]
     721                 :            :             {
     722         [ +  - ]:        324 :                 mxNode = Reference< XAnimationNode >( xFactory->createInstance(
     723 [ +  - ][ +  - ]:        324 :                     OUString::createFromAscii(pServiceName) ), UNO_QUERY_THROW );
                 [ +  - ]
     724                 :            : 
     725         [ -  + ]:        324 :                 if( nPresetClass != EffectPresetClass::CUSTOM )
     726                 :            :                 {
     727         [ #  # ]:          0 :                     Reference< XInitialization > xInit( mxNode, UNO_QUERY_THROW );
     728         [ #  # ]:          0 :                     const Any aAny( makeAny( nPresetClass ) );
     729         [ #  # ]:          0 :                     Sequence< Any > aArgs( &aAny, 1 ) ;
     730 [ #  # ][ #  # ]:          0 :                     xInit->initialize( aArgs );
                 [ #  # ]
     731                 :            :                 }
     732                 :            : 
     733         [ +  - ]:        324 :                 init_node( xAttrList );
     734                 :            : 
     735         [ +  - ]:        324 :                 Reference< XTimeContainer > xParentContainer( xParentNode, UNO_QUERY_THROW );
     736 [ +  - ][ +  - ]:        324 :                 xParentContainer->appendChild( mxNode );
     737         [ #  # ]:        324 :             }
     738                 :            :         }
     739                 :            :     }
     740         [ #  # ]:          0 :     catch (const RuntimeException&)
     741                 :            :     {
     742                 :            :         OSL_FAIL( "xmloff::AnimationsImportImpl::AnimationsImportImpl(), RuntimeException caught!" );
     743                 :            :     }
     744                 :        328 : }
     745                 :            : 
     746                 :        328 : AnimationNodeContext::~AnimationNodeContext()
     747                 :            : {
     748         [ +  + ]:        328 :     if( mbRootContext )
     749 [ +  - ][ +  - ]:          4 :         delete mpHelper;
     750         [ -  + ]:        656 : }
     751                 :            : 
     752                 :        328 : void AnimationNodeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
     753                 :            : {
     754                 :            :     // code of StartElement is moved to init_node that is now called
     755                 :            :     // in c'tor before appending this node to its parent.
     756                 :            :     // This is needed for random nodes that need the correct target
     757                 :            :     // set when child nodes are appended.
     758                 :        328 : }
     759                 :            : 
     760                 :        324 : void AnimationNodeContext::init_node(  const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
     761                 :            : {
     762         [ +  - ]:        324 :     if( mxNode.is() ) try
     763                 :            :     {
     764 [ +  - ][ +  - ]:        324 :         const sal_Int16 nNodeType = mxNode->getType();
     765                 :            : 
     766                 :            :         // query for optional interfaces that are often used later
     767         [ +  - ]:        324 :         Reference< XAnimate > xAnimate( mxNode, UNO_QUERY );
     768         [ +  - ]:        324 :         Reference< XCommand > xCommand( mxNode, UNO_QUERY );
     769         [ +  - ]:        324 :         Reference< XTransitionFilter > xTransitionFilter( mxNode, UNO_QUERY );
     770         [ +  - ]:        324 :         Reference< XIterateContainer > xIter( mxNode, UNO_QUERY );
     771                 :            : 
     772         [ +  - ]:        324 :         std::list< NamedValue > aUserData;
     773                 :        324 :         XMLTokenEnum meAttributeName = XML_TOKEN_INVALID;
     774                 :        324 :         OUString aFrom, aBy, aTo, aValues;
     775                 :        324 :         bool bHaveXmlId( false );
     776                 :        324 :         OUString sXmlId;
     777                 :            : 
     778 [ +  - ][ +  - ]:        324 :         const sal_Int16 nCount = xAttrList.is() ? xAttrList->getLength() : 0;
                 [ +  - ]
     779                 :            :         sal_uInt16 nEnum;
     780                 :            :         sal_Int16 nAttribute;
     781         [ +  + ]:        852 :         for( nAttribute = 0; nAttribute < nCount; nAttribute++ )
     782                 :            :         {
     783 [ +  - ][ +  - ]:        528 :             const OUString& rAttrName = xAttrList->getNameByIndex( nAttribute );
     784 [ +  - ][ +  - ]:        528 :             const OUString& rValue = xAttrList->getValueByIndex( nAttribute );
     785                 :            : 
     786                 :        528 :             OUString aLocalName;
     787         [ +  - ]:        528 :             sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
     788 [ +  - ][ +  - ]:        528 :             switch( mpHelper->getAnimationNodeAttributeTokenMap().Get( nPrefix, aLocalName ) )
           [ -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  +  -  +  
          +  -  -  -  -  
                      - ]
     789                 :            :             {
     790                 :            :             case ANA_Begin:
     791                 :            :             {
     792 [ #  # ][ #  # ]:          0 :                 mxNode->setBegin( mpHelper->convertTiming( rValue ) );
                 [ #  # ]
     793                 :            :             }
     794                 :          0 :             break;
     795                 :            :             case ANA_Dur:
     796                 :            :             {
     797 [ #  # ][ #  # ]:          0 :                 mxNode->setDuration( mpHelper->convertTiming( rValue ) );
                 [ #  # ]
     798                 :            :             }
     799                 :          0 :             break;
     800                 :            :             case ANA_End:
     801                 :            :             {
     802 [ #  # ][ #  # ]:          0 :                 mxNode->setEnd( mpHelper->convertTiming( rValue ) );
                 [ #  # ]
     803                 :            :             }
     804                 :          0 :             break;
     805                 :            :             case ANA_Fill:
     806                 :            :             {
     807 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Fill) ) )
                 [ #  # ]
     808 [ #  # ][ #  # ]:          0 :                     mxNode->setFill( (sal_Int16)nEnum );
     809                 :            :             }
     810                 :          0 :             break;
     811                 :            :             case ANA_FillDefault:
     812                 :            :             {
     813 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_FillDefault) ) )
                 [ #  # ]
     814 [ #  # ][ #  # ]:          0 :                     mxNode->setFillDefault( (sal_Int16)nEnum );
     815                 :            :             }
     816                 :          0 :             break;
     817                 :            :             case ANA_Restart:
     818                 :            :             {
     819 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Restart) ) )
                 [ #  # ]
     820 [ #  # ][ #  # ]:          0 :                     mxNode->setRestart( (sal_Int16)nEnum );
     821                 :            :             }
     822                 :          0 :             break;
     823                 :            :             case ANA_RestartDefault:
     824                 :            :             {
     825 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_RestartDefault) ) )
                 [ #  # ]
     826 [ #  # ][ #  # ]:          0 :                     mxNode->setRestartDefault( (sal_Int16)nEnum );
     827                 :            :             }
     828                 :          0 :             break;
     829                 :            :             case ANA_Accelerate:
     830                 :            :             {
     831         [ #  # ]:          0 :                 if( isDouble( rValue ) )
     832 [ #  # ][ #  # ]:          0 :                     mxNode->setAcceleration( rValue.toDouble() );
     833                 :            :             }
     834                 :          0 :             break;
     835                 :            :             case ANA_Decelerate:
     836                 :            :             {
     837         [ #  # ]:          0 :                 if( isDouble( rValue ) )
     838 [ #  # ][ #  # ]:          0 :                     mxNode->setDecelerate( rValue.toDouble() );
     839                 :            :             }
     840                 :          0 :             break;
     841                 :            :             case ANA_AutoReverse:
     842                 :            :             {
     843                 :            :                 bool bTemp;
     844 [ #  # ][ #  # ]:          0 :                 if (::sax::Converter::convertBool( bTemp, rValue ))
     845 [ #  # ][ #  # ]:          0 :                     mxNode->setAutoReverse( bTemp  );
     846                 :            :             }
     847                 :          0 :             break;
     848                 :            :             case ANA_RepeatCount:
     849                 :            :             {
     850 [ #  # ][ #  # ]:          0 :                 mxNode->setRepeatCount( mpHelper->convertTiming( rValue ) );
                 [ #  # ]
     851                 :            :             }
     852                 :          0 :             break;
     853                 :            :             case ANA_RepeatDur:
     854                 :            :             {
     855 [ #  # ][ #  # ]:          0 :                 mxNode->setRepeatDuration( mpHelper->convertTiming( rValue ) );
                 [ #  # ]
     856                 :            :             }
     857                 :          0 :             break;
     858                 :            :             case ANA_EndSync:
     859                 :            :             {
     860 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Endsync) ) )
                 [ #  # ]
     861 [ #  # ][ #  # ]:          0 :                     mxNode->setEndSync( makeAny( (sal_Int16)nEnum ) );
                 [ #  # ]
     862                 :            :             }
     863                 :          0 :             break;
     864                 :            :             case ANA_Node_Type:
     865                 :            :             {
     866 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_EffectNodeType) ) )
                 [ #  # ]
     867 [ #  # ][ #  # ]:          0 :                     aUserData.push_back( NamedValue( GetXMLToken( XML_NODE_TYPE ), makeAny( (sal_Int16)nEnum ) ) );
                 [ #  # ]
     868                 :            :             }
     869                 :          0 :             break;
     870                 :            :             case ANA_Preset_ID:
     871                 :            :             {
     872 [ +  - ][ +  - ]:        162 :                 aUserData.push_back( NamedValue( GetXMLToken( XML_PRESET_ID ), makeAny( rValue ) ) );
                 [ +  - ]
     873                 :            :             }
     874                 :        162 :             break;
     875                 :            :             case ANA_Preset_Sub_Type:
     876                 :            :             {
     877 [ #  # ][ #  # ]:          0 :                 aUserData.push_back( NamedValue( GetXMLToken( XML_PRESET_SUB_TYPE ), makeAny( rValue ) ) );
                 [ #  # ]
     878                 :            :             }
     879                 :          0 :             break;
     880                 :            :             case ANA_Preset_Class:
     881                 :            :             {
     882 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_EffectPresetClass) ) )
                 [ #  # ]
     883 [ #  # ][ #  # ]:          0 :                     aUserData.push_back( NamedValue( GetXMLToken( XML_PRESET_CLASS ), makeAny( (sal_Int16)nEnum ) ) );
                 [ #  # ]
     884                 :            :             }
     885                 :          0 :             break;
     886                 :            :             case ANA_After_Effect:
     887                 :            :             {
     888                 :            :                 bool bTemp;
     889 [ #  # ][ #  # ]:          0 :                 if (::sax::Converter::convertBool( bTemp, rValue ))
     890 [ #  # ][ #  # ]:          0 :                     aUserData.push_back( NamedValue( GetXMLToken( XML_AFTER_EFFECT ), makeAny( bTemp ) ) );
                 [ #  # ]
     891                 :            :             }
     892                 :          0 :             break;
     893                 :            :             case ANA_XLink:
     894                 :            :             {
     895         [ #  # ]:          0 :                 if( nNodeType == AnimationNodeType::AUDIO )
     896                 :            :                 {
     897         [ #  # ]:          0 :                     Reference< XAudio > xAudio( mxNode, UNO_QUERY_THROW );
     898 [ #  # ][ #  # ]:          0 :                     xAudio->setSource( makeAny( GetImport().GetAbsoluteReference( rValue ) ) );
         [ #  # ][ #  # ]
     899                 :          0 :                     break;
     900                 :            :                 }
     901                 :            : 
     902                 :            :             }
     903                 :            :             // fall through intented!
     904                 :            :             case ANA_Target:
     905                 :            :             {
     906                 :            :                 {
     907         [ #  # ]:          0 :                     Any aTarget( mpHelper->convertTarget( rValue ) );
     908                 :            : 
     909         [ #  # ]:          0 :                     if( xAnimate.is() )
     910                 :            :                     {
     911 [ #  # ][ #  # ]:          0 :                         xAnimate->setTarget( aTarget );
     912                 :            :                     }
     913         [ #  # ]:          0 :                     else if( xIter.is() )
     914                 :            :                     {
     915 [ #  # ][ #  # ]:          0 :                         xIter->setTarget( aTarget );
     916                 :            :                     }
     917         [ #  # ]:          0 :                     else if( xCommand.is() )
     918                 :            :                     {
     919 [ #  # ][ #  # ]:          0 :                         xCommand->setTarget( aTarget );
     920                 :          0 :                     }
     921                 :            :                 }
     922                 :            :             }
     923                 :          0 :             break;
     924                 :            : 
     925                 :            :             case ANA_Volume:
     926                 :            :             {
     927         [ #  # ]:          0 :                 if( nNodeType == AnimationNodeType::AUDIO )
     928                 :            :                 {
     929         [ #  # ]:          0 :                     if( isDouble( rValue ) )
     930                 :            :                     {
     931         [ #  # ]:          0 :                         Reference< XAudio > xAudio( mxNode, UNO_QUERY_THROW );
     932 [ #  # ][ #  # ]:          0 :                         xAudio->setVolume( rValue.toDouble() );
     933                 :            :                     }
     934                 :            :                 }
     935                 :            :             }
     936                 :          0 :             break;
     937                 :            : 
     938                 :            :             case ANA_MasterElement:
     939                 :            :             {
     940 [ #  # ][ #  # ]:          0 :                 Reference< XAnimationNode > xMaster( GetImport().getInterfaceToIdentifierMapper().getReference( rValue ), UNO_QUERY );
                 [ #  # ]
     941 [ #  # ][ #  # ]:          0 :                 aUserData.push_back( NamedValue( GetXMLToken( XML_MASTER_ELEMENT ), makeAny( xMaster ) ) );
                 [ #  # ]
     942                 :            :             }
     943                 :          0 :             break;
     944                 :            : 
     945                 :            :             case ANA_SubItem:
     946                 :            :             {
     947 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_SubItem) ) )
                 [ #  # ]
     948                 :            :                 {
     949         [ #  # ]:          0 :                     if( xAnimate.is() )
     950                 :            :                     {
     951 [ #  # ][ #  # ]:          0 :                         xAnimate->setSubItem( (sal_Int16)nEnum );
     952                 :            :                     }
     953         [ #  # ]:          0 :                     else if( xIter.is() )
     954                 :            :                     {
     955 [ #  # ][ #  # ]:          0 :                         xIter->setSubItem( (sal_Int16)nEnum );
     956                 :            :                     }
     957                 :            :                 }
     958                 :            :             }
     959                 :          0 :             break;
     960                 :            : 
     961                 :            :             case ANA_AttributeName:
     962                 :            :             {
     963         [ #  # ]:          0 :                 if( xAnimate.is() )
     964                 :            :                 {
     965                 :          0 :                     OUString aName( rValue );
     966                 :            : 
     967         [ #  # ]:          0 :                     ImplAttributeNameConversion* p = getAnimationAttributeNamesConversionList();
     968         [ #  # ]:          0 :                     while( p->mpAPIName )
     969                 :            :                     {
     970 [ #  # ][ #  # ]:          0 :                         if( IsXMLToken( aName, p->meXMLToken ) )
     971                 :            :                         {
     972                 :          0 :                             aName = OUString::createFromAscii( p->mpAPIName );
     973                 :          0 :                             meAttributeName = p->meXMLToken;
     974                 :          0 :                             break;
     975                 :            :                         }
     976                 :            : 
     977                 :          0 :                         p++;
     978                 :            :                     }
     979                 :            : 
     980 [ #  # ][ #  # ]:          0 :                     xAnimate->setAttributeName( aName );
     981                 :            :                 }
     982                 :            :             }
     983                 :          0 :             break;
     984                 :            : 
     985                 :            :             case ANA_Values:
     986                 :            :             {
     987                 :          0 :                 aValues = rValue;
     988                 :            :             }
     989                 :          0 :             break;
     990                 :            : 
     991                 :            :             case ANA_From:
     992                 :            :             {
     993                 :          0 :                 aFrom = rValue;
     994                 :            :             }
     995                 :          0 :             break;
     996                 :            : 
     997                 :            :             case ANA_By:
     998                 :            :             {
     999                 :          0 :                 aBy = rValue;
    1000                 :            :             }
    1001                 :          0 :             break;
    1002                 :            : 
    1003                 :            :             case ANA_To:
    1004                 :            :             {
    1005                 :          0 :                 aTo = rValue;
    1006                 :            :             }
    1007                 :          0 :             break;
    1008                 :            : 
    1009                 :            :             case ANA_KeyTimes:
    1010                 :            :             {
    1011         [ #  # ]:          0 :                 if( xAnimate.is() )
    1012 [ #  # ][ #  # ]:          0 :                     xAnimate->setKeyTimes( mpHelper->convertKeyTimes( rValue ) );
         [ #  # ][ #  # ]
    1013                 :            :             }
    1014                 :          0 :             break;
    1015                 :            : 
    1016                 :            :             case ANA_Formula:
    1017                 :            :             {
    1018         [ #  # ]:          0 :                 if( xAnimate.is() )
    1019 [ #  # ][ #  # ]:          0 :                     xAnimate->setFormula( rValue );
    1020                 :            :             }
    1021                 :          0 :             break;
    1022                 :            : 
    1023                 :            :             case ANA_ANIMID:
    1024                 :            :             {
    1025         [ #  # ]:          0 :                 if (!bHaveXmlId) { sXmlId = rValue; }
    1026                 :            :             }
    1027                 :          0 :             break;
    1028                 :            :             case ANA_XMLID:
    1029                 :            :             {
    1030                 :          0 :                 sXmlId = rValue;
    1031                 :          0 :                 bHaveXmlId = true;
    1032                 :            :             }
    1033                 :          0 :             break;
    1034                 :            : 
    1035                 :            :             case ANA_CalcMode:
    1036                 :            :             {
    1037         [ #  # ]:          0 :                 if( xAnimate.is() )
    1038                 :            :                 {
    1039 [ #  # ][ #  # ]:          0 :                     if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_CalcMode) ) )
                 [ #  # ]
    1040 [ #  # ][ #  # ]:          0 :                         xAnimate->setCalcMode( (sal_Int16)nEnum );
    1041                 :            :                 }
    1042                 :            :             }
    1043                 :          0 :             break;
    1044                 :            : 
    1045                 :            :             case ANA_Accumulate:
    1046                 :            :             {
    1047         [ #  # ]:          0 :                 if( xAnimate.is() )
    1048 [ #  # ][ #  # ]:          0 :                     xAnimate->setAccumulate( IsXMLToken( rValue, XML_SUM ) );
                 [ #  # ]
    1049                 :            :             }
    1050                 :          0 :             break;
    1051                 :            : 
    1052                 :            :             case ANA_AdditiveMode:
    1053                 :            :             {
    1054         [ #  # ]:          0 :                 if( xAnimate.is() )
    1055                 :            :                 {
    1056 [ #  # ][ #  # ]:          0 :                     if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_AdditiveMode) ) )
                 [ #  # ]
    1057 [ #  # ][ #  # ]:          0 :                         xAnimate->setAdditive( (sal_Int16)nEnum );
    1058                 :            :                 }
    1059                 :            :             }
    1060                 :          0 :             break;
    1061                 :            : 
    1062                 :            :             case ANA_KeySplines:
    1063                 :            :             {
    1064         [ #  # ]:          0 :                 if( xAnimate.is() )
    1065 [ #  # ][ #  # ]:          0 :                     xAnimate->setTimeFilter( mpHelper->convertTimeFilter( rValue ) );
         [ #  # ][ #  # ]
    1066                 :            :             }
    1067                 :          0 :             break;
    1068                 :            : 
    1069                 :            :             case ANA_Path:
    1070                 :            :             {
    1071         [ #  # ]:          0 :                 Reference< XAnimateMotion > xAnimateMotion( mxNode, UNO_QUERY );
    1072         [ #  # ]:          0 :                 if( xAnimateMotion.is() )
    1073 [ #  # ][ #  # ]:          0 :                     xAnimateMotion->setPath( mpHelper->convertPath( rValue ) );
                 [ #  # ]
    1074                 :            :             }
    1075                 :          0 :             break;
    1076                 :            : 
    1077                 :            :             case ANA_ColorSpace:
    1078                 :            :             {
    1079         [ #  # ]:          0 :                 Reference< XAnimateColor > xAnimateColor( mxNode, UNO_QUERY );
    1080         [ #  # ]:          0 :                 if( xAnimateColor.is() )
    1081 [ #  # ][ #  # ]:          0 :                     xAnimateColor->setColorInterpolation( IsXMLToken( rValue, XML_HSL ) ? AnimationColorSpace::HSL : AnimationColorSpace::RGB );
         [ #  # ][ #  # ]
    1082                 :            :             }
    1083                 :          0 :             break;
    1084                 :            : 
    1085                 :            :             case ANA_ColorDirection:
    1086                 :            :             {
    1087         [ #  # ]:          0 :                 Reference< XAnimateColor > xAnimateColor( mxNode, UNO_QUERY );
    1088         [ #  # ]:          0 :                 if( xAnimateColor.is() )
    1089 [ #  # ][ #  # ]:          0 :                     xAnimateColor->setDirection( IsXMLToken( rValue, XML_CLOCKWISE ) );
                 [ #  # ]
    1090                 :            :             }
    1091                 :          0 :             break;
    1092                 :            : 
    1093                 :            :             case ANA_TransformType:
    1094                 :            :             {
    1095         [ #  # ]:          0 :                 Reference< XAnimateTransform > xTransform( mxNode, UNO_QUERY );
    1096         [ #  # ]:          0 :                 if( xTransform.is() )
    1097                 :            :                 {
    1098 [ #  # ][ #  # ]:          0 :                     if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_TransformType) ) )
                 [ #  # ]
    1099                 :            :                     {
    1100 [ #  # ][ #  # ]:          0 :                         xTransform->setTransformType( (sal_Int16)nEnum );
    1101   [ #  #  #  #  :          0 :                         switch( nEnum )
                      # ]
    1102                 :            :                         {
    1103                 :          0 :                         case AnimationTransformType::SCALE: meAttributeName = XML_SCALE; break;
    1104                 :          0 :                         case AnimationTransformType::ROTATE: meAttributeName = XML_ROTATE; break;
    1105                 :          0 :                         case AnimationTransformType::SKEWX: meAttributeName = XML_SKEWX; break;
    1106                 :          0 :                         case AnimationTransformType::SKEWY: meAttributeName = XML_SKEWY; break;
    1107                 :            :                         //case AnimationTransformType::TRANSLATE:
    1108                 :            :                         default:
    1109                 :          0 :                             meAttributeName = XML_TRANSLATE; break;
    1110                 :            :                         }
    1111                 :            :                     }
    1112                 :          0 :                 }
    1113                 :            :             }
    1114                 :          0 :             break;
    1115                 :            : 
    1116                 :            :             case ANA_TransitionType:
    1117                 :            :             {
    1118         [ +  - ]:        162 :                 if( xTransitionFilter.is() )
    1119                 :            :                 {
    1120 [ +  - ][ +  - ]:        162 :                     if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_TransitionType) ) )
                 [ +  - ]
    1121 [ +  - ][ +  - ]:        162 :                         xTransitionFilter->setTransition( (sal_Int16)nEnum );
    1122                 :            :                 }
    1123                 :            :             }
    1124                 :        162 :             break;
    1125                 :            : 
    1126                 :            :             case ANA_TransitionSubType:
    1127                 :            :             {
    1128         [ +  - ]:        160 :                 if( xTransitionFilter.is() )
    1129                 :            :                 {
    1130 [ +  - ][ +  - ]:        160 :                     if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_TransitionSubType) ) )
                 [ +  - ]
    1131 [ +  - ][ +  - ]:        160 :                         xTransitionFilter->setSubtype( (sal_Int16)nEnum );
    1132                 :            :                 }
    1133                 :            :             }
    1134                 :        160 :             break;
    1135                 :            : 
    1136                 :            :             case ANA_Mode:
    1137                 :            :             {
    1138         [ #  # ]:          0 :                 if( xTransitionFilter.is() )
    1139 [ #  # ][ #  # ]:          0 :                     xTransitionFilter->setMode( IsXMLToken( rValue, XML_IN ) );
                 [ #  # ]
    1140                 :            :             }
    1141                 :          0 :             break;
    1142                 :            : 
    1143                 :            :             case ANA_Direction:
    1144                 :            :             {
    1145         [ +  - ]:         40 :                 if( xTransitionFilter.is() )
    1146 [ +  - ][ +  - ]:         40 :                     xTransitionFilter->setDirection( IsXMLToken( rValue, XML_FORWARD ) );
                 [ +  - ]
    1147                 :            :             }
    1148                 :         40 :             break;
    1149                 :            : 
    1150                 :            :             case ANA_FadeColor:
    1151                 :            :             {
    1152         [ +  - ]:          4 :                 if( xTransitionFilter.is() )
    1153                 :            :                 {
    1154                 :          4 :                     sal_Int32 nColor(0);
    1155         [ +  - ]:          4 :                     ::sax::Converter::convertColor(nColor, rValue);
    1156 [ +  - ][ +  - ]:          4 :                     xTransitionFilter->setFadeColor(nColor);
    1157                 :            :                 }
    1158                 :            :             }
    1159                 :          4 :             break;
    1160                 :            : 
    1161                 :            :             case ANA_IterateType:
    1162                 :            :             {
    1163 [ #  # ][ #  # ]:          0 :                 if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_IterateType) ) )
                 [ #  # ]
    1164                 :            :                 {
    1165         [ #  # ]:          0 :                     if( xIter.is() )
    1166 [ #  # ][ #  # ]:          0 :                         xIter->setIterateType( (sal_Int16)nEnum );
    1167                 :            :                 }
    1168                 :            :             }
    1169                 :          0 :             break;
    1170                 :            : 
    1171                 :            :             case ANA_IterateInterval:
    1172                 :            :             {
    1173         [ #  # ]:          0 :                 if( xIter.is() )
    1174                 :            :                 {
    1175                 :          0 :                     double fInterval = 0.0;
    1176         [ #  # ]:          0 :                     if( rValue.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("P")) )
    1177                 :            :                     {
    1178                 :          0 :                         ::com::sun::star::util::Duration aDuration;
    1179 [ #  # ][ #  # ]:          0 :                         if (::sax::Converter::convertDuration(aDuration, rValue))
    1180                 :            :                         {
    1181                 :            :                             fInterval = ((((aDuration.Hours * 60)
    1182                 :            :                                 + aDuration.Minutes) * 60) + aDuration.Seconds)
    1183                 :          0 :                               + (aDuration.MilliSeconds / 1000.0);
    1184                 :            :                         }
    1185                 :            :                     }
    1186                 :            :                     else
    1187                 :            :                     {
    1188                 :          0 :                         fInterval = rValue.toDouble();
    1189                 :            :                     }
    1190                 :            : 
    1191 [ #  # ][ #  # ]:          0 :                     xIter->setIterateInterval( fInterval );
    1192                 :            :                 }
    1193                 :            :             }
    1194                 :          0 :             break;
    1195                 :            : 
    1196                 :            :             case ANA_Group_Id:
    1197                 :            :             {
    1198 [ #  # ][ #  # ]:          0 :                 aUserData.push_back( NamedValue( aLocalName, makeAny( rValue.toInt32() ) ) );
    1199                 :            :             }
    1200                 :          0 :             break;
    1201                 :            : 
    1202                 :            :             case ANA_Command:
    1203                 :            :             {
    1204 [ #  # ][ #  # ]:          0 :                 if( xCommand.is() && nNodeType == AnimationNodeType::COMMAND )
                 [ #  # ]
    1205                 :            :                 {
    1206 [ #  # ][ #  # ]:          0 :                     if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Command) ) )
                 [ #  # ]
    1207                 :            :                     {
    1208 [ #  # ][ #  # ]:          0 :                         xCommand->setCommand( (sal_Int16)nEnum );
    1209                 :            :                     }
    1210                 :            :                 }
    1211                 :            :             }
    1212                 :          0 :             break;
    1213                 :            : 
    1214                 :            :             default:
    1215                 :            :                 // push all unknown attributes within the presentation namespace as user data
    1216         [ #  # ]:          0 :                 if( nPrefix == XML_NAMESPACE_PRESENTATION )
    1217                 :            :                 {
    1218 [ #  # ][ #  # ]:          0 :                     aUserData.push_back( NamedValue( aLocalName, makeAny( rValue ) ) );
    1219                 :            :                 }
    1220                 :            :             }
    1221                 :        528 :         }
    1222                 :            : 
    1223         [ -  + ]:        324 :         if (!sXmlId.isEmpty())
    1224                 :            :         {
    1225         [ #  # ]:          0 :             Reference< XInterface > const xRef( mxNode, UNO_QUERY );
    1226         [ #  # ]:          0 :             GetImport().getInterfaceToIdentifierMapper().registerReference(
    1227         [ #  # ]:          0 :                 sXmlId, xRef );
    1228                 :            :         }
    1229                 :            : 
    1230                 :        324 :         sal_Int32 nUserDataCount = aUserData.size();
    1231         [ +  + ]:        324 :         if( nUserDataCount )
    1232                 :            :         {
    1233         [ +  - ]:        162 :             Sequence< NamedValue > aUnoUserData( nUserDataCount );
    1234         [ +  - ]:        162 :             NamedValue* pData = aUnoUserData.getArray();
    1235                 :        162 :             std::list< NamedValue >::iterator aIter( aUserData.begin() );
    1236                 :        162 :             const std::list< NamedValue >::iterator aEnd( aUserData.end() );
    1237         [ +  + ]:        324 :             while( aIter != aEnd )
    1238                 :        162 :                 *pData++ = (*aIter++);
    1239                 :            : 
    1240 [ +  - ][ +  - ]:        162 :             mxNode->setUserData( aUnoUserData );
                 [ +  - ]
    1241                 :            :         }
    1242                 :            : 
    1243                 :            :         // convert values
    1244         [ +  + ]:        324 :         if( xAnimate.is() )
    1245                 :            :         {
    1246         [ -  + ]:        162 :             if( !aFrom.isEmpty() )
    1247 [ #  # ][ #  # ]:          0 :                 xAnimate->setFrom( mpHelper->convertValue( meAttributeName, aFrom ) );
                 [ #  # ]
    1248                 :            : 
    1249         [ -  + ]:        162 :             if( !aBy.isEmpty() )
    1250 [ #  # ][ #  # ]:          0 :                 xAnimate->setBy( mpHelper->convertValue( meAttributeName, aBy ) );
                 [ #  # ]
    1251                 :            : 
    1252         [ -  + ]:        162 :             if( !aTo.isEmpty() )
    1253 [ #  # ][ #  # ]:          0 :                 xAnimate->setTo( mpHelper->convertValue( meAttributeName, aTo ) );
                 [ #  # ]
    1254                 :            : 
    1255         [ -  + ]:        162 :             if( !aValues.isEmpty() )
    1256 [ #  # ][ #  # ]:          0 :                 xAnimate->setValues( mpHelper->convertValueSequence( meAttributeName, aValues ) );
         [ #  # ][ #  # ]
    1257         [ #  # ]:        324 :         }
    1258                 :            :     }
    1259                 :          0 :     catch (const RuntimeException&)
    1260                 :            :     {
    1261                 :            :         OSL_FAIL( "xmloff::AnimationNodeContext::StartElement(), RuntimeException caught!" );
    1262                 :            :     }
    1263                 :        324 : }
    1264                 :            : 
    1265                 :        324 : SvXMLImportContext * AnimationNodeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
    1266                 :            :         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
    1267                 :            : {
    1268         [ +  - ]:        324 :     if( mxNode.is())
    1269         [ +  - ]:        324 :         return new AnimationNodeContext( mxNode, GetImport(), nPrefix, rLocalName, xAttrList, mpHelper );
    1270                 :            :     else
    1271         [ #  # ]:        324 :         return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
    1272                 :            : }
    1273                 :            : 
    1274                 :            : // --------------------------------------------------------------------
    1275                 :            : 
    1276                 :            : class AnimationsImport: public SvXMLImport, public XAnimationNodeSupplier
    1277                 :            : {
    1278                 :            : public:
    1279                 :            :     AnimationsImport( const Reference< XMultiServiceFactory > & rSMgr );
    1280                 :            :     ~AnimationsImport() throw ();
    1281                 :            : 
    1282                 :            :     SvXMLImportContext* CreateContext(sal_uInt16 nPrefix, const OUString& rLocalName,   const Reference<XAttributeList>& xAttrList);
    1283                 :            : 
    1284                 :            :     // XInterface
    1285                 :            :     virtual Any SAL_CALL queryInterface( const Type& aType ) throw (RuntimeException);
    1286                 :            :     virtual void SAL_CALL acquire() throw ();
    1287                 :            :     virtual void SAL_CALL release() throw ();
    1288                 :            : 
    1289                 :            :     // XAnimationNodeSupplier
    1290                 :            :     Reference< XAnimationNode > SAL_CALL getAnimationNode() throw (RuntimeException);
    1291                 :            : 
    1292                 :            :     // XServiceInfo
    1293                 :            :     virtual OUString SAL_CALL getImplementationName() throw(RuntimeException);
    1294                 :            :     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException);
    1295                 :            :     virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(RuntimeException);
    1296                 :            : 
    1297                 :            : private:
    1298                 :            :     Reference< XAnimationNode > mxRootNode;
    1299                 :            : };
    1300                 :            : 
    1301                 :          4 : AnimationsImport::AnimationsImport( const Reference< XMultiServiceFactory > & rSMgr )
    1302                 :          4 : : SvXMLImport( rSMgr, true )
    1303                 :            : {
    1304                 :            :     // add namespaces
    1305                 :          4 :     GetNamespaceMap().Add(
    1306         [ +  - ]:          4 :         GetXMLToken(XML_NP_PRESENTATION),
    1307         [ +  - ]:          4 :         GetXMLToken(XML_N_PRESENTATION),
    1308         [ +  - ]:          4 :         XML_NAMESPACE_PRESENTATION);
    1309                 :            : 
    1310                 :          4 :     GetNamespaceMap().Add(
    1311         [ +  - ]:          4 :         GetXMLToken(XML_NP_SMIL),
    1312         [ +  - ]:          4 :         GetXMLToken(XML_N_SMIL),
    1313         [ +  - ]:          4 :         XML_NAMESPACE_SMIL);
    1314                 :            : 
    1315                 :          4 :     GetNamespaceMap().Add(
    1316         [ +  - ]:          4 :         GetXMLToken(XML_NP_ANIMATION),
    1317         [ +  - ]:          4 :         GetXMLToken(XML_N_ANIMATION),
    1318         [ +  - ]:          4 :         XML_NAMESPACE_ANIMATION);
    1319                 :            : 
    1320         [ +  - ]:          4 :     mxRootNode = Reference< XAnimationNode >::query(rSMgr->createInstance(
    1321 [ +  - ][ +  - ]:          4 :         OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.animations.SequenceTimeContainer"))));
         [ +  - ][ +  - ]
    1322                 :          4 : }
    1323                 :            : 
    1324                 :          4 : AnimationsImport::~AnimationsImport() throw ()
    1325                 :            : {
    1326         [ -  + ]:          8 : }
    1327                 :            : 
    1328                 :            : // XInterface
    1329                 :         12 : Any SAL_CALL AnimationsImport::queryInterface( const Type& aType ) throw (RuntimeException)
    1330                 :            : {
    1331         [ +  + ]:         12 :     if ( aType == ::getCppuType((Reference<XAnimationNodeSupplier> *)0) )
    1332                 :            :     {
    1333         [ +  - ]:          4 :         return makeAny( Reference<XAnimationNodeSupplier>( this ) );
    1334                 :            :     }
    1335                 :            :     else
    1336                 :            :     {
    1337                 :         12 :         return SvXMLImport::queryInterface( aType );
    1338                 :            :     }
    1339                 :            : }
    1340                 :            : 
    1341                 :         28 : void SAL_CALL AnimationsImport::acquire() throw ()
    1342                 :            : {
    1343                 :         28 :     SvXMLImport::acquire();
    1344                 :         28 : }
    1345                 :            : 
    1346                 :         28 : void SAL_CALL AnimationsImport::release() throw ()
    1347                 :            : {
    1348                 :         28 :     SvXMLImport::release();
    1349                 :         28 : }
    1350                 :            : 
    1351                 :          4 : SvXMLImportContext *AnimationsImport::CreateContext(sal_uInt16 nPrefix, const OUString& rLocalName, const Reference<XAttributeList>& xAttrList)
    1352                 :            : {
    1353                 :          4 :     SvXMLImportContext* pContext = 0;
    1354                 :            : 
    1355 [ +  - ][ +  - ]:          4 :     if( (XML_NAMESPACE_ANIMATION == nPrefix) && IsXMLToken( rLocalName, XML_SEQ ) )
                 [ +  - ]
    1356                 :            :     {
    1357         [ +  - ]:          4 :          pContext = new AnimationNodeContext( mxRootNode, *this, nPrefix, rLocalName, xAttrList );
    1358                 :            :     }
    1359                 :            :     else
    1360                 :            :     {
    1361                 :          0 :         pContext = SvXMLImport::CreateContext(nPrefix, rLocalName, xAttrList);
    1362                 :            :     }
    1363                 :            : 
    1364                 :          4 :     return pContext;
    1365                 :            : }
    1366                 :            : 
    1367                 :            : // XAnimationNodeSupplier
    1368                 :          4 : Reference< XAnimationNode > SAL_CALL AnimationsImport::getAnimationNode() throw (RuntimeException)
    1369                 :            : {
    1370                 :          4 :     return mxRootNode;
    1371                 :            : }
    1372                 :            : 
    1373                 :          0 : void AnimationNodeContext::postProcessRootNode( SvXMLImport& /*rImport*/, const Reference< XAnimationNode >& xRootNode, Reference< XPropertySet >& xPageProps )
    1374                 :            : {
    1375 [ #  # ][ #  # ]:          0 :     if( xRootNode.is() && xPageProps.is() ) try
                 [ #  # ]
    1376                 :            :     {
    1377         [ #  # ]:          0 :         Reference< XEnumerationAccess > xEnumerationAccess( xRootNode, UNO_QUERY_THROW );
    1378 [ #  # ][ #  # ]:          0 :         Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_QUERY_THROW );
                 [ #  # ]
    1379 [ #  # ][ #  # ]:          0 :         if( xEnumeration->hasMoreElements() )
                 [ #  # ]
    1380                 :            :         {
    1381 [ #  # ][ #  # ]:          0 :             Reference< XAnimationNode > xNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
                 [ #  # ]
    1382 [ #  # ][ #  # ]:          0 :             if( xNode->getType() == AnimationNodeType::PAR )
                 [ #  # ]
    1383                 :            :             {
    1384                 :          0 :                 Event aEvent;
    1385 [ #  # ][ #  # ]:          0 :                 if( (xNode->getBegin() >>= aEvent) && (aEvent.Trigger == EventTrigger::BEGIN_EVENT) )
         [ #  # ][ #  # ]
                 [ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
    1386                 :            :                 {
    1387                 :            :                     // found transition node
    1388         [ #  # ]:          0 :                     Reference< XEnumerationAccess > xChildEnumerationAccess( xNode, UNO_QUERY_THROW );
    1389 [ #  # ][ #  # ]:          0 :                     Reference< XEnumeration > xChildEnumeration( xChildEnumerationAccess->createEnumeration(), UNO_QUERY_THROW );
                 [ #  # ]
    1390 [ #  # ][ #  # ]:          0 :                     while( xChildEnumeration->hasMoreElements() )
                 [ #  # ]
    1391                 :            :                     {
    1392 [ #  # ][ #  # ]:          0 :                         Reference< XAnimationNode > xChildNode( xChildEnumeration->nextElement(), UNO_QUERY_THROW );
                 [ #  # ]
    1393         [ #  # ]:          0 :                         switch( xChildNode->getType() )
           [ #  #  #  # ]
                 [ #  # ]
    1394                 :            :                         {
    1395                 :            :                         case AnimationNodeType::TRANSITIONFILTER:
    1396                 :            :                         {
    1397         [ #  # ]:          0 :                             Reference< XTransitionFilter > xTransFilter( xChildNode, UNO_QUERY_THROW );
    1398                 :            : 
    1399                 :            : 
    1400 [ #  # ][ #  # ]:          0 :                             xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionType" ) ), Any( xTransFilter->getTransition() ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1401 [ #  # ][ #  # ]:          0 :                             xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionSubtype" ) ), Any( xTransFilter->getSubtype() ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1402 [ #  # ][ #  # ]:          0 :                             xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionDirection" ) ), Any( xTransFilter->getDirection() ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1403 [ #  # ][ #  # ]:          0 :                             xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionFadeColor" ) ), Any( xTransFilter->getFadeColor() ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1404                 :            : 
    1405                 :            :                             double fDuration;
    1406 [ #  # ][ #  # ]:          0 :                             if( xTransFilter->getDuration() >>= fDuration )
                 [ #  # ]
    1407 [ #  # ][ #  # ]:          0 :                                 xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionDuration" ) ), Any( fDuration ) );
         [ #  # ][ #  # ]
    1408                 :            : 
    1409                 :            :                         }
    1410                 :          0 :                         break;
    1411                 :            : 
    1412                 :            :                         case AnimationNodeType::COMMAND:
    1413                 :            :                         {
    1414         [ #  # ]:          0 :                             Reference< XCommand > xCommand( xChildNode, UNO_QUERY_THROW );
    1415 [ #  # ][ #  # ]:          0 :                             if( xCommand->getCommand() == EffectCommands::STOPAUDIO )
                 [ #  # ]
    1416                 :            :                             {
    1417 [ #  # ][ #  # ]:          0 :                                 xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Sound" ) ), Any(sal_True) );
         [ #  # ][ #  # ]
    1418                 :          0 :                             }
    1419                 :            :                         }
    1420                 :          0 :                         break;
    1421                 :            : 
    1422                 :            :                         case AnimationNodeType::AUDIO:
    1423                 :            :                         {
    1424         [ #  # ]:          0 :                             Reference< XAudio > xAudio( xChildNode, UNO_QUERY_THROW );
    1425                 :          0 :                             OUString sSoundURL;
    1426 [ #  # ][ #  # ]:          0 :                             if( (xAudio->getSource() >>= sSoundURL) && !sSoundURL.isEmpty() )
         [ #  # ][ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
    1427                 :            :                             {
    1428 [ #  # ][ #  # ]:          0 :                                 xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Sound" ) ), Any(sSoundURL) );
         [ #  # ][ #  # ]
    1429                 :            : 
    1430                 :            :                                 Timing eTiming;
    1431 [ #  # ][ #  # ]:          0 :                                 if( (xAudio->getRepeatCount() >>= eTiming) && (eTiming == Timing_INDEFINITE) )
         [ #  # ][ #  # ]
                 [ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
    1432 [ #  # ][ #  # ]:          0 :                                     xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "LoopSound" ) ), Any( sal_True ) );
         [ #  # ][ #  # ]
    1433                 :          0 :                             }
    1434                 :            :                         }
    1435                 :          0 :                         break;
    1436                 :            : 
    1437                 :            :                         }
    1438                 :          0 :                     }
    1439                 :            : 
    1440         [ #  # ]:          0 :                     Reference< XTimeContainer > xRootContainer( xRootNode, UNO_QUERY_THROW );
    1441 [ #  # ][ #  # ]:          0 :                     xRootContainer->removeChild( xNode );
    1442                 :          0 :                 }
    1443                 :          0 :             }
    1444         [ #  # ]:          0 :         }
    1445                 :            :     }
    1446                 :          0 :     catch (const Exception&)
    1447                 :            :     {
    1448                 :            :         OSL_FAIL("xmloff::AnimationsImport::postProcessRootNode(), exception caught!");
    1449                 :            :     }
    1450                 :          0 : }
    1451                 :            : 
    1452                 :            : } // namespace xmloff
    1453                 :            : 
    1454                 :          2 : Sequence< OUString > SAL_CALL AnimationsImport_getSupportedServiceNames() throw()
    1455                 :            : {
    1456         [ +  - ]:          2 :     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Xmloff.AnimationsImport" ) );
    1457         [ +  - ]:          2 :     const Sequence< OUString > aSeq( &aServiceName, 1 );
    1458                 :          2 :     return aSeq;
    1459                 :            : }
    1460                 :            : 
    1461                 :         93 : OUString SAL_CALL AnimationsImport_getImplementationName() throw()
    1462                 :            : {
    1463                 :         93 :     return OUString( RTL_CONSTASCII_USTRINGPARAM( "xmloff::AnimationsImport" ) );
    1464                 :            : }
    1465                 :            : 
    1466                 :          4 : Reference< XInterface > SAL_CALL AnimationsImport_createInstance(const Reference< XMultiServiceFactory > & rSMgr) throw( Exception )
    1467                 :            : {
    1468         [ +  - ]:          4 :     return (cppu::OWeakObject*)new xmloff::AnimationsImport( rSMgr );
    1469                 :            : 
    1470                 :            : }
    1471                 :            : 
    1472                 :            : namespace xmloff
    1473                 :            : {
    1474                 :            : 
    1475                 :          0 : OUString SAL_CALL AnimationsImport::getImplementationName() throw(RuntimeException)
    1476                 :            : {
    1477                 :          0 :     return AnimationsImport_getImplementationName();
    1478                 :            : }
    1479                 :            : 
    1480                 :          0 : sal_Bool SAL_CALL AnimationsImport::supportsService( const OUString& ServiceName ) throw(RuntimeException)
    1481                 :            : {
    1482                 :          0 :     return ServiceName == "com.sun.star.comp.Xmloff.AnimationsImport";
    1483                 :            : }
    1484                 :            : 
    1485                 :          0 : Sequence< OUString > SAL_CALL AnimationsImport::getSupportedServiceNames() throw(RuntimeException)
    1486                 :            : {
    1487                 :          0 :     return AnimationsImport_getSupportedServiceNames();
    1488                 :            : }
    1489                 :            : 
    1490                 :            : } // namespace xmloff
    1491                 :            : 
    1492                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10