summaryrefslogtreecommitdiff
path: root/sd/source/filter/ppt/ppt97animations.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/filter/ppt/ppt97animations.cxx')
-rw-r--r--sd/source/filter/ppt/ppt97animations.cxx746
1 files changed, 746 insertions, 0 deletions
diff --git a/sd/source/filter/ppt/ppt97animations.cxx b/sd/source/filter/ppt/ppt97animations.cxx
new file mode 100644
index 000000000000..8836b1b4851d
--- /dev/null
+++ b/sd/source/filter/ppt/ppt97animations.cxx
@@ -0,0 +1,746 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+
+#include "ppt97animations.hxx"
+
+// header for class SdrObject
+#include <svx/svdobj.hxx>
+// header for class SdPage
+#include "sdpage.hxx"
+// header for define DBG_ERROR
+#include <tools/debug.hxx>
+// header for define GetXShapeForSdrObject
+#include <svx/unoapi.hxx>
+#include "EffectMigration.hxx"
+#include <CustomAnimationPreset.hxx>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
+
+using namespace ::com::sun::star;
+
+//---------------------------------------------------------------------------------------
+
+void Ppt97AnimationInfoAtom::ReadStream( SvStream& rIn )
+{
+ rIn >> nDimColor;
+ rIn >> nFlags;
+ rIn >> nSoundRef;
+ rIn >> nDelayTime;
+ rIn >> nOrderID;
+ rIn >> nSlideCount;
+ rIn >> nBuildType;
+ rIn >> nFlyMethod;
+ rIn >> nFlyDirection;
+ rIn >> nAfterEffect;
+ rIn >> nSubEffect;
+ rIn >> nOLEVerb;
+ rIn >> nUnknown1;
+ rIn >> nUnknown2;
+}
+
+//---------------------------------------------------------------------------------------
+
+#define MEMBER_CONSTRUCTOR_LIST() \
+ m_aAtom() \
+ , m_aSoundFileUrl() \
+ , m_bDirtyCache(true) \
+ , m_aPresetId() \
+ , m_aSubType() \
+ , m_bHasSpecialDuration(false) \
+ , m_fDurationInSeconds(0.001)
+
+Ppt97Animation::Ppt97Animation( SvStream& rInputStream )
+ : MEMBER_CONSTRUCTOR_LIST()
+{
+ m_aAtom.ReadStream( rInputStream );
+}
+
+Ppt97Animation::Ppt97Animation( const Ppt97Animation& rAnimation )
+ : MEMBER_CONSTRUCTOR_LIST()
+{
+ *this = rAnimation;
+}
+
+Ppt97Animation& Ppt97Animation::operator= ( const Ppt97Animation& rAnimation )
+{
+ m_aAtom = rAnimation.m_aAtom;
+ m_aSoundFileUrl = rAnimation.m_aSoundFileUrl;
+ m_bDirtyCache = rAnimation.m_bDirtyCache;
+ m_aPresetId = rAnimation.m_aPresetId;
+ m_aSubType = rAnimation.m_aSubType;
+ m_bHasSpecialDuration = rAnimation.m_bHasSpecialDuration;
+ m_fDurationInSeconds = rAnimation.m_fDurationInSeconds;
+
+ return *this;
+}
+
+Ppt97Animation::~Ppt97Animation()
+{
+}
+
+bool Ppt97Animation::operator < ( const Ppt97Animation& rAnimation ) const
+{
+ return m_aAtom.nOrderID < rAnimation.m_aAtom.nOrderID;
+}
+bool Ppt97Animation::operator > ( const Ppt97Animation& rAnimation ) const
+{
+ return m_aAtom.nOrderID > rAnimation.m_aAtom.nOrderID;
+}
+bool Ppt97Animation::HasEffect() const
+{
+ return m_aAtom.nBuildType != 0;
+}
+bool Ppt97Animation::HasParagraphEffect() const
+{
+ return m_aAtom.nBuildType > 1;
+}
+sal_Int32 Ppt97Animation::GetParagraphLevel() const
+{
+ sal_Int32 nParagraphLevel = 0;
+ if(m_aAtom.nBuildType>1)
+ nParagraphLevel = m_aAtom.nBuildType-1;
+ return nParagraphLevel;
+}
+bool Ppt97Animation::HasSoundEffect() const
+{
+ return m_aAtom.nSoundRef && m_aAtom.nFlags & 0x0010;
+}
+bool Ppt97Animation::HasStopPreviousSound() const
+{
+ return m_aAtom.nFlags & 0x0040;
+}
+bool Ppt97Animation::HasReverseOrder() const
+{
+ return m_aAtom.nFlags & 0x001;
+}
+bool Ppt97Animation::HasAnimateAssociatedShape() const
+{
+ return m_aAtom.nFlags & 0x004000;
+}
+bool Ppt97Animation::HasAfterEffect() const
+{
+ return m_aAtom.nAfterEffect != 0;
+}
+bool Ppt97Animation::HasAfterEffect_ChangeColor() const
+{
+ return m_aAtom.nAfterEffect == 1;
+}
+bool Ppt97Animation::HasAfterEffect_DimAtNextEffect() const
+{
+ return m_aAtom.nAfterEffect == 2;
+}
+#ifdef FUTURE
+bool Ppt97Animation::HasAfterEffect_DimAfterEffect() const
+{
+ return m_aAtom.nAfterEffect == 3;
+}
+#endif
+sal_uInt32 Ppt97Animation::GetSoundRef() const
+{
+ return m_aAtom.nSoundRef;
+}
+void Ppt97Animation::SetSoundFileUrl( const ::rtl::OUString& rSoundFileUrl )
+{
+ m_aSoundFileUrl = rSoundFileUrl;
+}
+
+double Ppt97Animation::GetDelayTimeInSeconds() const
+{
+ return m_aAtom.nDelayTime != 0X7FFFFFFF ? m_aAtom.nDelayTime/1000.0 : 0.0;
+}
+
+bool Ppt97Animation::GetSpecialDuration( double& rfDurationInSeconds ) const
+{
+ UpdateCacheData();
+ if( m_bHasSpecialDuration )
+ rfDurationInSeconds = m_fDurationInSeconds;
+ return m_bHasSpecialDuration;
+}
+
+bool Ppt97Animation::GetSpecialTextIterationDelay( double& rfTextIterationDelay ) const
+{
+ bool bRet = false;
+ switch(this->GetTextAnimationType())
+ {
+ case presentation::TextAnimationType::BY_LETTER:
+ rfTextIterationDelay = 0.075;
+ bRet = true;
+ break;
+ case presentation::TextAnimationType::BY_WORD:
+ rfTextIterationDelay = 0.3;
+ bRet = true;
+ break;
+ default:
+ break;
+ }
+ return bRet;
+}
+
+sal_Int32 Ppt97Animation::GetDimColor() const
+{
+ return static_cast<sal_Int32>(m_aAtom.nDimColor);
+}
+
+void Ppt97Animation::SetDimColor( sal_Int32 nDimColor )
+{
+ m_aAtom.nDimColor = nDimColor;
+}
+void Ppt97Animation::SetAnimateAssociatedShape( bool bAnimate )
+{
+ if( !bAnimate )
+ {
+ //the appear effect cannot be animated without text
+ if( this->GetPresetId().equals( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-appear")) ) )
+ return;
+ //the random effect may be the appear effect and than has the same problem
+ if( this->GetPresetId().equals( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-random")) ) )
+ {
+ //this case is not 100% correct -> feel free to complete
+ //i consider this case as seldom and not that problematic and a simple correct fix is not in sight
+ DBG_WARNING("you tried to deselect the animation of the form for random animation-> this has been refused");
+ return;
+ }
+
+ }
+
+ if(bAnimate)
+ m_aAtom.nFlags = m_aAtom.nFlags | 0x004000;
+ else if( HasAnimateAssociatedShape() )
+ {
+ m_aAtom.nFlags = m_aAtom.nFlags ^ 0x004000;
+ }
+}
+
+sal_Int16 Ppt97Animation::GetEffectNodeType() const //see com::sun::star::presentation::EffectNodeType
+{
+ sal_Int16 nRet = presentation::EffectNodeType::ON_CLICK;
+ if( m_aAtom.nFlags & 0x04 )
+ {
+ nRet = presentation::EffectNodeType::AFTER_PREVIOUS;
+ }
+ return nRet;
+}
+
+sal_Int16 Ppt97Animation::GetTextAnimationType() const
+{
+ sal_Int16 nRet = presentation::TextAnimationType::BY_PARAGRAPH;
+ switch( m_aAtom.nSubEffect )
+ {
+ case 0:
+ break;
+ case 2:
+ nRet = presentation::TextAnimationType::BY_LETTER;
+ break;
+ default:
+ nRet = presentation::TextAnimationType::BY_WORD;
+ break;
+ }
+ return nRet;
+}
+::rtl::OUString Ppt97Animation::GetPresetId() const
+{
+ UpdateCacheData();
+ return m_aPresetId;
+}
+::rtl::OUString Ppt97Animation::GetPresetSubType() const
+{
+ UpdateCacheData();
+ return m_aSubType;
+}
+
+void Ppt97Animation::ClearCacheData() const
+{
+ m_aPresetId = m_aSubType = rtl::OUString();
+ m_bHasSpecialDuration = false;
+ m_fDurationInSeconds = 0.001;
+}
+void Ppt97Animation::UpdateCacheData() const
+{
+ if( !m_bDirtyCache )
+ return;
+
+ ClearCacheData();
+
+ if( !HasEffect() )
+ {
+ m_bDirtyCache = false;
+ return;
+ }
+
+ switch( m_aAtom.nFlyMethod )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-appear")); // --- appear ---
+ break;
+ case 0x01:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-random")); // --- random ---
+ break;
+ case 0x02: // --- blinds effect ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-venetian-blinds"));
+ m_aSubType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("horizontal")); // horizontal
+ break;
+ case 0x1:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-venetian-blinds"));
+ m_aSubType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vertical")); // vertical
+ break;
+ }
+ }
+ break;
+ case 0x03: // --- (hor/ver) shifted appear ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-checkerboard"));
+ m_aSubType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("across")); // vertical ???
+ break;
+ case 0x1:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-checkerboard"));
+ m_aSubType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("downward")); // horizontal ???
+ break;
+ }
+ }
+ break;
+ case 0x05:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-dissolve-in"));
+ break;
+ case 0x08: // --- (hor/ver) lines ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-random-bars"));
+ m_aSubType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vertical")); // horizontal ???
+ break;
+ case 0x1:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-random-bars"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("horizontal")); // vertical ???
+ break;
+ }
+ }
+ break;
+ case 0x09: // --- diagonal ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x4:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-diagonal-squares"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("left-to-top")); // to left top
+ break;
+ case 0x5:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-diagonal-squares"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("right-to-top")); // to right top
+ break;
+ case 0x6:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-diagonal-squares"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("left-to-bottom")); // to left bottom
+ break;
+ case 0x7:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-diagonal-squares"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("right-to-bottom")); // to right bottom
+ break;
+ }
+ }
+ break;
+ case 0x0a: // --- roll/wipe ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-wipe"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-right")); // from right
+ break;
+ case 0x1:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-wipe"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-bottom")); // from bottom
+ break;
+ case 0x2:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-wipe"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-left")); // from left
+ break;
+ case 0x3:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-wipe"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-top")); // from top
+ break;
+ }
+ }
+ break;
+ case 0x0b: //--- fade in ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-box"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out")); // from center
+ break;
+ case 0x1:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-box"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("in")); // to center
+ break;
+ }
+ }
+ break;
+ case 0x0c: // --- text effects ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-left"));
+
+ break;
+ case 0x1:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-top"));
+ break;
+ case 0x2:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-right"));
+ break;
+ case 0x3:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-bottom"));
+ break;
+ case 0x4:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-top-left"));
+ break;
+ case 0x5:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-top-right"));
+ break;
+ case 0x6:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-bottom-left"));
+ break;
+ case 0x7:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-bottom-right"));
+ break;
+ case 0x8: // -- short text effects --
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-peek-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-left"));
+ break;
+ case 0x9:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-peek-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-bottom"));
+ break;
+ case 0xa:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-peek-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-right"));
+ break;
+ case 0xb:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-peek-in"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-top"));
+ break;
+ case 0xc: // -- slow text effects --
+ {
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in-slow"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-left"));
+ }
+ break;
+ case 0xd:
+ {
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in-slow"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-top"));
+ }
+ break;
+ case 0xe:
+ {
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in-slow"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-right"));
+ }
+ break;
+ case 0xf:
+ {
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-fly-in-slow"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-bottom"));
+ }
+ break;
+ case 0x10: // --- zoom ---
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-zoom"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("in"));
+ break;
+ case 0x11:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-zoom"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("in-slightly"));
+ break;
+ case 0x12:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-zoom"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out"));
+ break;
+ case 0x13:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-zoom"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out-slightly"));
+ break;
+ case 0x14:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-zoom"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("in-from-screen-center"));
+ break;
+ case 0x15:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-zoom"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out-from-screen-center"));
+ break;
+ case 0x16: // --- stretch ---
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-stretchy"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("across"));
+ break;
+ case 0x17:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-stretchy"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-left"));
+ break;
+ case 0x18:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-stretchy"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-top"));
+ break;
+ case 0x19:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-stretchy"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-right"));
+ break;
+ case 0x1a:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-stretchy"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("from-bottom"));
+ break;
+ case 0x1b: // --- rotate ---
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-swivel"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vertical"));
+ break;
+ case 0x1c: // --- spirale ---
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-spiral-in"));
+ break;
+ }
+ }
+ break;
+ case 0x0d: // --- open/close ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-split"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("horizontal-out")); //horizontal open
+ break;
+ case 0x1:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-split"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("horizontal-in")); //horizontal close
+ break;
+ case 0x2:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-split"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vertical-out")); // vertical open
+ break;
+ case 0x3:
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-split"));
+ m_aSubType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vertical-in")); // vertical close
+ break;
+ }
+ }
+ break;
+ case 0x0e: // --- blink ---
+ {
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-flash-once"));
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0: //fast
+ m_fDurationInSeconds = 0.075;
+ m_bHasSpecialDuration = true;
+ break;
+ case 0x1: //medium
+ m_fDurationInSeconds = 0.5;
+ m_bHasSpecialDuration = true;
+ break;
+ case 0x2: //slow
+ m_fDurationInSeconds = 1.0;
+ m_bHasSpecialDuration = true;
+ break;
+ }
+ }
+ break;
+ default:
+ {
+ m_aPresetId = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooo-entrance-appear"));
+ OSL_FAIL("no effect mapped");
+ }
+ break;
+ }
+ m_bDirtyCache = false;
+}
+
+void Ppt97Animation::createAndSetCustomAnimationEffect( SdrObject* pObj )
+{
+
+ if( !this->HasEffect() )
+ return;
+ if( !pObj || !pObj->GetPage() )
+ {
+ OSL_FAIL("no valid SdrObject or page found for ppt import");
+ return;
+ }
+
+ uno::Reference< drawing::XShape > xShape = GetXShapeForSdrObject( pObj );
+ if( !xShape.is() )
+ {
+ OSL_FAIL("no XShape interface found for ppt import");
+ return;
+ }
+ ::sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->GetPage())->getMainSequence();
+ if( !pMainSequence.get() )
+ {
+ OSL_FAIL("no MainSequence found for ppt import");
+ return;
+ }
+
+ const ::sd::CustomAnimationPresets& rPresets( ::sd::CustomAnimationPresets::getCustomAnimationPresets() );
+ ::sd::CustomAnimationPresetPtr pPreset( rPresets.getEffectDescriptor( this->GetPresetId() ) );
+ if( !pPreset.get() )
+ {
+ OSL_FAIL("no suiteable preset found for ppt import");
+ return;
+ }
+
+ //--------------start doing something
+
+ //1. ------ create an effect from the presets ------
+ ::sd::CustomAnimationEffectPtr pEffect( new ::sd::CustomAnimationEffect( pPreset->create( this->GetPresetSubType() ) ) );
+ if( !pEffect.get() )
+ {
+ DBG_ASSERT(pEffect.get(),"no suiteable effect found");
+ return;
+ }
+
+ //2. ------ adapt the created effect ------
+
+ // set the shape targeted by this effect
+ pEffect->setTarget( makeAny( xShape ) );
+
+ pEffect->setBegin( this->GetDelayTimeInSeconds() );
+
+ // some effects need a different duration than that of the mapped preset effect
+ double fDurationInSeconds = 1.0;//in secunden
+ if( this->GetSpecialDuration( fDurationInSeconds ) )
+ pEffect->setDuration( fDurationInSeconds );
+
+ // set after effect
+ if( this->HasAfterEffect() )
+ {
+ pEffect->setHasAfterEffect( sal_True );
+ if( this->HasAfterEffect_ChangeColor() )
+ pEffect->setDimColor( uno::makeAny( this->GetDimColor() ) );
+ else
+ pEffect->setAfterEffectOnNext( this->HasAfterEffect_DimAtNextEffect() );
+ }
+
+ // set sound effect
+ if( this->HasSoundEffect() )
+ pEffect->createAudio( uno::makeAny( m_aSoundFileUrl ) );
+
+ // text iteration
+ pEffect->setIterateType( this->GetTextAnimationType() );
+
+ // some effects need a different delay between text iteration than that of the mapped preset effect
+ double fTextIterationDelay = 1.0;
+ if( this->GetSpecialTextIterationDelay( fTextIterationDelay ) )
+ pEffect->setIterateInterval( fTextIterationDelay );
+
+ // is the effect started on click or after the last effect (Another possible value is EffectNodeType::WITH_PREVIOUS )
+ pEffect->setNodeType( this->GetEffectNodeType() );
+
+ //set stop sound effect
+ if( this->HasStopPreviousSound() )
+ pEffect->setStopAudio();
+
+ // append the effect to the main sequence
+ if( !this->HasParagraphEffect() )
+ {
+ if( this->HasAnimateAssociatedShape() )
+ pEffect->setTargetSubItem( presentation::ShapeAnimationSubType::AS_WHOLE );
+ else
+ pEffect->setTargetSubItem( presentation::ShapeAnimationSubType::AS_WHOLE ); //todo: set ONLY_TEXT again if that is fixed
+ //pEffect->setTargetSubItem( presentation::ShapeAnimationSubType::ONLY_TEXT );
+ }
+
+ //3. ------ put the created effect to the model and do some last changes fro paragraph effects ------
+ pMainSequence->append( pEffect );
+ if( this->HasParagraphEffect() )
+ {
+ sal_Int32 nParagraphLevel = this->GetParagraphLevel();
+ double fDelaySeconds = this->GetDelayTimeInSeconds();
+ sal_Bool bAnimateAssociatedShape = this->HasAnimateAssociatedShape();//or only text
+ sal_Bool bTextReverse = this->HasReverseOrder();
+
+ // now create effects for each paragraph
+ ::sd::CustomAnimationTextGroupPtr pGroup = pMainSequence->
+ createTextGroup( pEffect, nParagraphLevel, fDelaySeconds, bAnimateAssociatedShape, bTextReverse );
+
+ if( pGroup )
+ {
+ const ::sd::EffectSequence& rEffects = pGroup->getEffects();
+ ::sd::EffectSequence::const_iterator aIter = rEffects.begin();
+
+ ::sd::CustomAnimationEffectPtr pLastEffect;
+ sal_Int32 nIndex = 0;
+ for( ; aIter != rEffects.end(); aIter++ )
+ {
+ ::sd::CustomAnimationEffectPtr pGroupEffect(*aIter);
+
+ ////todo? if( nIndex > 1 && pLastEffect && this->HasSoundEffect() )
+ //// pLastEffect->setStopAudio();
+ if( nIndex < 2 )
+ {
+ pGroupEffect->setNodeType( this->GetEffectNodeType() );
+ }
+ else if( nIndex > 0 )
+ {
+ bool bAtParagraphBegin = false;
+ if(!bTextReverse)
+ bAtParagraphBegin = pGroupEffect->getParaDepth() < nParagraphLevel;
+ else
+ bAtParagraphBegin = !pLastEffect || pLastEffect->getParaDepth() < nParagraphLevel;
+ if( bAtParagraphBegin )
+ pGroupEffect->setNodeType( this->GetEffectNodeType() );
+ else if( this->GetTextAnimationType() == presentation::TextAnimationType::BY_PARAGRAPH )
+ pGroupEffect->setNodeType( presentation::EffectNodeType::WITH_PREVIOUS );
+ else
+ pGroupEffect->setNodeType( presentation::EffectNodeType::AFTER_PREVIOUS );
+ }
+ pLastEffect = pGroupEffect;
+ nIndex++;
+ }
+ }
+ }
+ pMainSequence->rebuild();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */