[Libreoffice-commits] core.git: Branch 'private/quwex/gsoc-box2d-experimental' - 5 commits - animations/source include/xmloff offapi/com offapi/UnoApi_offapi.mk officecfg/registry sd/inc sd/source sd/uiconfig sd/xml slideshow/Library_slideshow.mk slideshow/source xmloff/source

Sarper Akdemir (via logerrit) logerrit at kemper.freedesktop.org
Fri Jun 26 22:06:08 UTC 2020


Rebased ref, commits from common ancestor:
commit 7d9dfd4ba7a2c6022ff04c8c4995a003ca0de175
Author:     Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Thu Jun 25 20:33:05 2020 +0300
Commit:     Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Sat Jun 27 01:04:22 2020 +0300

    work-in-progress import export simulatedanimations
    
    Change-Id: I38b0511f973668655cff78becebe3f1e628d9083

diff --git a/animations/source/animcore/animcore.component b/animations/source/animcore/animcore.component
index 2f490aa0ae06..bcc7f58aaac3 100644
--- a/animations/source/animcore/animcore.component
+++ b/animations/source/animcore/animcore.component
@@ -30,6 +30,10 @@
   <implementation name="animcore::AnimateMotion"
       constructor="com_sun_star_animations_AnimateMotion_get_implementation">
     <service name="com.sun.star.animations.AnimateMotion"/>
+  </implementation>
+    <implementation name="animcore::AnimateSimulation"
+      constructor="com_sun_star_animations_AnimateSimulation_get_implementation">
+    <service name="com.sun.star.animations.AnimateSimulation"/>
   </implementation>
   <implementation name="animcore::AnimateSet"
       constructor="com_sun_star_animations_AnimateSet_get_implementation">
diff --git a/animations/source/animcore/animcore.cxx b/animations/source/animcore/animcore.cxx
index f3ffe8c4190a..e529ccfe6ba9 100644
--- a/animations/source/animcore/animcore.cxx
+++ b/animations/source/animcore/animcore.cxx
@@ -291,7 +291,7 @@ private:
     const sal_Int16 mnNodeType;
 
     // for XTypeProvider
-    static std::array<Sequence< Type >*, 12> mpTypes;
+    static std::array<Sequence< Type >*, 13> mpTypes;
 
     // attributes for the XAnimationNode interface implementation
     Any maBegin, maDuration, maEnd, maEndSync, maRepeatCount, maRepeatDuration;
@@ -394,7 +394,7 @@ Any SAL_CALL TimeContainerEnumeration::nextElement()
 }
 
 
-std::array<Sequence< Type >*, 12> AnimationNode::mpTypes = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
+std::array<Sequence< Type >*, 13> AnimationNode::mpTypes = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
 
 AnimationNode::AnimationNode( sal_Int16 nNodeType )
 :   maChangeListener(maMutex),
@@ -565,6 +565,16 @@ static OUString getImplementationName_ANIMATEMOTION()
     return "animcore::AnimateMotion";
 }
 
+static Sequence<OUString> getSupportedServiceNames_ANIMATESIMULATION()
+{
+    return { "com.sun.star.animations.AnimateSimulation" };
+}
+
+static OUString getImplementationName_ANIMATESIMULATION()
+{
+    return "animcore::AnimateSimulation";
+}
+
 static Sequence<OUString> getSupportedServiceNames_ANIMATETRANSFORM()
 {
     return { "com.sun.star.animations.AnimateTransform" };
@@ -658,6 +668,12 @@ Any SAL_CALL AnimationNode::queryInterface( const Type& aType )
                 static_cast< XAnimate * >( static_cast< XAnimateMotion * >(this) ),
                 static_cast< XAnimateMotion * >( this ) );
             break;
+        case AnimationNodeType::ANIMATESIMULATED:
+            aRet = ::cppu::queryInterface(
+                aType,
+                static_cast< XAnimate * >( static_cast< XAnimateMotion * >(this) ),
+                static_cast< XAnimateMotion * >( this ) );
+            break;
         case AnimationNodeType::ANIMATECOLOR:
             aRet = ::cppu::queryInterface(
                 aType,
@@ -717,6 +733,7 @@ void AnimationNode::initTypeProvider( sal_Int16 nNodeType ) throw()
         8, // TRANSITIONFILTER
         8, // AUDIO
         8, // COMMAND
+        8, // ANIMATESIMULATED
     };
 
     // collect types
@@ -749,6 +766,9 @@ void AnimationNode::initTypeProvider( sal_Int16 nNodeType ) throw()
     case AnimationNodeType::ANIMATEMOTION:
         pTypeAr[nPos++] = cppu::UnoType<XAnimateMotion>::get();
         break;
+    case AnimationNodeType::ANIMATESIMULATED:
+        pTypeAr[nPos++] = cppu::UnoType<XAnimateMotion>::get();
+        break;
     case AnimationNodeType::ANIMATECOLOR:
         pTypeAr[nPos++] = cppu::UnoType<XAnimateColor>::get();
         break;
@@ -817,6 +837,8 @@ OUString AnimationNode::getImplementationName()
         return getImplementationName_ANIMATECOLOR();
     case AnimationNodeType::ANIMATEMOTION:
         return getImplementationName_ANIMATEMOTION();
+    case AnimationNodeType::ANIMATESIMULATED:
+        return getImplementationName_ANIMATESIMULATION();
     case AnimationNodeType::TRANSITIONFILTER:
         return getImplementationName_TRANSITIONFILTER();
     case AnimationNodeType::ANIMATETRANSFORM:
@@ -854,6 +876,8 @@ Sequence< OUString > AnimationNode::getSupportedServiceNames()
         return getSupportedServiceNames_ANIMATECOLOR();
     case AnimationNodeType::ANIMATEMOTION:
         return getSupportedServiceNames_ANIMATEMOTION();
+    case AnimationNodeType::ANIMATESIMULATED:
+        return getSupportedServiceNames_ANIMATESIMULATION();
     case AnimationNodeType::TRANSITIONFILTER:
         return getSupportedServiceNames_TRANSITIONFILTER();
     case AnimationNodeType::ANIMATETRANSFORM:
@@ -2041,6 +2065,13 @@ com_sun_star_animations_AnimateMotion_get_implementation(css::uno::XComponentCon
     return cppu::acquire(new animcore::AnimationNode(ANIMATEMOTION));
 }
 
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_animations_AnimateSimulation_get_implementation(css::uno::XComponentContext*,
+                                                             css::uno::Sequence<css::uno::Any> const &)
+{
+    return cppu::acquire(new animcore::AnimationNode(ANIMATESIMULATED));
+}
+
 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
 com_sun_star_animations_AnimateTransform_get_implementation(css::uno::XComponentContext*,
                                                              css::uno::Sequence<css::uno::Any> const &)
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index 49178ebdc996..4e3a23dacffd 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -2791,6 +2791,7 @@ namespace xmloff::token {
         XML_MULTIPLY,
         XML_ANIMATE,
         XML_ANIMATEMOTION,
+        XML_ANIMATESIMULATION,
         XML_ANIMATETRANSFORM,
         XML_ANIMATECOLOR,
         XML_TRANSITIONFILTER,
@@ -2986,6 +2987,7 @@ namespace xmloff::token {
         XML_EXIT,
         XML_EMPHASIS,
         XML_MOTION_PATH,
+        XML_MOTION_SIMULATED,
         XML_OLE_ACTION,
         XML_MEDIA_CALL,
         XML_ON_CLICK,
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 68a493cfa6ac..cef77ecc02f8 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -29,6 +29,7 @@ $(eval $(call gb_UnoApi_use_api,offapi,\
 $(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/animations,\
 	AnimateColor \
 	AnimateMotion \
+	AnimateSimulation \
 	AnimateSet \
 	Audio \
 	Command \
diff --git a/offapi/com/sun/star/animations/AnimateSimulation.idl b/offapi/com/sun/star/animations/AnimateSimulation.idl
new file mode 100644
index 000000000000..e8ce028db7a4
--- /dev/null
+++ b/offapi/com/sun/star/animations/AnimateSimulation.idl
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#ifndef __com_sun_star_animations_AnimateSimulation_idl__
+#define __com_sun_star_animations_AnimateSimulation_idl__
+
+#include <com/sun/star/animations/XAnimationNode.idl>
+
+
+module com {  module sun {  module star {  module animations {
+
+
+service AnimateSimulation : com::sun::star::animations::XAnimationNode;
+
+
+}; }; }; };
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/presentation/EffectPresetClass.idl b/offapi/com/sun/star/presentation/EffectPresetClass.idl
index 9ff0e1201a63..50b08d0913fd 100644
--- a/offapi/com/sun/star/presentation/EffectPresetClass.idl
+++ b/offapi/com/sun/star/presentation/EffectPresetClass.idl
@@ -40,6 +40,7 @@ constants EffectPresetClass
     const short EXIT = 2;
     const short EMPHASIS = 3;
     const short MOTIONPATH = 4;
+    const short MOTIONSIMULATION = 7;
     const short OLEACTION = 5;
     const short MEDIACALL = 6;
 };
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Effects.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Effects.xcu
index 1f9267d958e1..fd0315913f1d 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Effects.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Effects.xcu
@@ -1035,6 +1035,11 @@
           <value xml:lang="en-US">Vertical Figure 8</value>
         </prop>
       </node>
+      <node oor:name="ooo-motionsimulated-basic" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Simulated Basic</value>
+        </prop>
+      </node>
       <node oor:name="ooo-media-start" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
           <value xml:lang="en-US">Start media</value>
@@ -2574,5 +2579,15 @@
         </prop>
       </node>
     </node>
+    <node oor:name="MotionSimulated">
+      <node oor:name="basic" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Basic</value>
+        </prop>
+        <prop oor:name="Effects" oor:type="oor:string-list">
+          <value oor:separator=";">ooo-motionsimulated-basic</value>
+        </prop>
+      </node>
+    </node>
   </node>
 </oor:component-data>
diff --git a/officecfg/registry/schema/org/openoffice/Office/UI/Effects.xcs b/officecfg/registry/schema/org/openoffice/Office/UI/Effects.xcs
index d57104e3d121..873f2facfcb8 100644
--- a/officecfg/registry/schema/org/openoffice/Office/UI/Effects.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/UI/Effects.xcs
@@ -143,6 +143,11 @@
           <desc>Contains all the categories that don't fit anywhere else."</desc>
         </info>
       </set>
+      <set oor:name="MotionSimulated" oor:node-type="PresetCategory">
+        <info>
+          <desc>Contains the categories for simulated animation effects."</desc>
+        </info>
+      </set>
     </group>
   </component>
 </oor:component-schema>
diff --git a/sd/inc/CustomAnimationPreset.hxx b/sd/inc/CustomAnimationPreset.hxx
index b05f1675c6a7..3d25010a0b4e 100644
--- a/sd/inc/CustomAnimationPreset.hxx
+++ b/sd/inc/CustomAnimationPreset.hxx
@@ -105,6 +105,7 @@ public:
     SAL_DLLPRIVATE const PresetCategoryList& getExitPresets() const { return maExitPresets; }
     SAL_DLLPRIVATE const PresetCategoryList& getMotionPathsPresets() const { return maMotionPathsPresets; }
     SAL_DLLPRIVATE const PresetCategoryList& getMiscPresets() const { return maMiscPresets; }
+    SAL_DLLPRIVATE const PresetCategoryList& getMotionSimulatedPresets() const { return maMotionSimulatedPresets; }
 
     SAL_DLLPRIVATE void changePresetSubType( const CustomAnimationEffectPtr& pEffect, const OUString& rPresetSubType ) const;
 
@@ -127,6 +128,7 @@ private:
     PresetCategoryList maExitPresets;
     PresetCategoryList maMotionPathsPresets;
     PresetCategoryList maMiscPresets;
+    PresetCategoryList maMotionSimulatedPresets;
 
     //! Maps per-language the animation presets.
     SAL_DLLPRIVATE static std::map<OUString, CustomAnimationPresets>  mPresetsMap;
diff --git a/sd/inc/strings.hrc b/sd/inc/strings.hrc
index 0e093d1da84b..b339def6569d 100644
--- a/sd/inc/strings.hrc
+++ b/sd/inc/strings.hrc
@@ -434,6 +434,7 @@
 #define STR_CUSTOMANIMATION_EMPHASIS                    NC_("STR_CUSTOMANIMATION_EMPHASIS", "Emphasis: %1")
 #define STR_CUSTOMANIMATION_EXIT                        NC_("STR_CUSTOMANIMATION_EXIT", "Exit: %1")
 #define STR_CUSTOMANIMATION_MOTION_PATHS                NC_("STR_CUSTOMANIMATION_MOTION_PATHS", "Motion Paths: %1")
+#define STR_CUSTOMANIMATION_MOTION_SIMULATION           NC_("STR_CUSTOMANIMATION_MOTION_SIMULATION", "Simulated Motion: %1")
 #define STR_CUSTOMANIMATION_MISC                        NC_("STR_CUSTOMANIMATION_MISC", "Misc: %1")
 #define STR_SLIDETRANSITION_NONE                        NC_("STR_SLIDETRANSITION_NONE", "None")
 
diff --git a/sd/source/core/CustomAnimationPreset.cxx b/sd/source/core/CustomAnimationPreset.cxx
index 3be4e76941f8..bec05fa14259 100644
--- a/sd/source/core/CustomAnimationPreset.cxx
+++ b/sd/source/core/CustomAnimationPreset.cxx
@@ -349,6 +349,8 @@ void CustomAnimationPresets::importResources()
         importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/MotionPaths", maMotionPathsPresets );
 
         importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/Misc", maMiscPresets );
+
+        importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/MotionSimulated", maMotionSimulatedPresets );
     }
     catch (const lang::WrappedTargetException&)
     {
@@ -502,6 +504,7 @@ Reference< XAnimationNode > CustomAnimationPresets::getRandomPreset( sal_Int16 n
     case EffectPresetClass::EXIT:       pCategoryList = &maExitPresets; break;
     case EffectPresetClass::EMPHASIS:   pCategoryList = &maEmphasisPresets; break;
     case EffectPresetClass::MOTIONPATH: pCategoryList = &maMotionPathsPresets; break;
+    case EffectPresetClass::MOTIONSIMULATION: pCategoryList = &maMotionSimulatedPresets; break;
     default:
         pCategoryList = nullptr;
     }
diff --git a/sd/source/ui/animations/CustomAnimationList.cxx b/sd/source/ui/animations/CustomAnimationList.cxx
index 0e2762ce762e..63fe7b391a97 100644
--- a/sd/source/ui/animations/CustomAnimationList.cxx
+++ b/sd/source/ui/animations/CustomAnimationList.cxx
@@ -252,6 +252,8 @@ CustomAnimationListEntryItem::CustomAnimationListEntryItem(const OUString& aDesc
         msEffectName = SdResId(STR_CUSTOMANIMATION_EMPHASIS); break;
     case EffectPresetClass::MOTIONPATH:
         msEffectName = SdResId(STR_CUSTOMANIMATION_MOTION_PATHS); break;
+    case EffectPresetClass::MOTIONSIMULATION:
+        msEffectName = SdResId(STR_CUSTOMANIMATION_MOTION_SIMULATION); break;
     default:
         msEffectName = SdResId(STR_CUSTOMANIMATION_MISC); break;
     }
@@ -371,6 +373,7 @@ void CustomAnimationListEntryItem::PaintEffect(vcl::RenderContext& rRenderContex
     case EffectPresetClass::EMPHASIS:
         sImage = BMP_CUSTOMANIMATION_EMPHASIS_EFFECT; break;
     case EffectPresetClass::MOTIONPATH:
+    case EffectPresetClass::MOTIONSIMULATION:
         sImage = BMP_CUSTOMANIMATION_MOTION_PATH; break;
     case EffectPresetClass::OLEACTION:
         sImage = BMP_CUSTOMANIMATION_OLE; break;
diff --git a/sd/source/ui/animations/CustomAnimationPane.cxx b/sd/source/ui/animations/CustomAnimationPane.cxx
index 45e44c0d8628..cdcc1cb97cc3 100644
--- a/sd/source/ui/animations/CustomAnimationPane.cxx
+++ b/sd/source/ui/animations/CustomAnimationPane.cxx
@@ -585,6 +585,7 @@ void CustomAnimationPane::updateControls()
             case EffectPresetClass::EMPHASIS: nCategoryPos = 1; break;
             case EffectPresetClass::EXIT: nCategoryPos = 2; break;
             case EffectPresetClass::MOTIONPATH: nCategoryPos = 3; break;
+            case EffectPresetClass::MOTIONSIMULATION: nCategoryPos = 5; break;
             default:
                 break;
         }
@@ -2186,6 +2187,7 @@ sal_Int32 CustomAnimationPane::fillAnimationLB( bool bHasText )
         case 2:rCategoryList = rPresets.getExitPresets();break;
         case 3:rCategoryList = rPresets.getMotionPathsPresets();break;
         case 4:rCategoryList = rPresets.getMiscPresets();break;
+        case 5:rCategoryList = rPresets.getMotionSimulatedPresets();break;
     }
 
     sal_Int32 nFirstEffect = -1;
diff --git a/sd/uiconfig/simpress/ui/customanimationspanel.ui b/sd/uiconfig/simpress/ui/customanimationspanel.ui
index 94184323a775..333cf74793ba 100644
--- a/sd/uiconfig/simpress/ui/customanimationspanel.ui
+++ b/sd/uiconfig/simpress/ui/customanimationspanel.ui
@@ -290,6 +290,7 @@
                   <item translatable="yes" context="customanimationspanel|categorylb">Exit</item>
                   <item translatable="yes" context="customanimationspanel|categorylb">Motion Paths</item>
                   <item translatable="yes" context="customanimationspanel|categorylb">Misc Effects</item>
+                  <item translatable="yes" context="customanimationspanel|categorylb">Simulated Motion</item>
                 </items>
               </object>
               <packing>
diff --git a/sd/xml/effects.xml b/sd/xml/effects.xml
index 393ad5d50263..94584fa329b0 100644
--- a/sd/xml/effects.xml
+++ b/sd/xml/effects.xml
@@ -2639,6 +2639,13 @@
             </anim:par>
         </anim:par>
     </anim:par>
+    <anim:par smil:begin="indefinite" smil:fill="hold">
+        <anim:par smil:begin="0" smil:fill="hold">
+            <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="motion-simulated" pres:preset-id="ooo-motionsimulated-basic">
+                <anim:animateSimulation smil:dur="2" smil:fill="hold"/>
+            </anim:par>
+        </anim:par>
+    </anim:par>
     <anim:par smil:begin="indefinite" smil:fill="hold">
         <anim:par smil:begin="0" smil:fill="hold">
             <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="media-call" pres:preset-id="ooo-media-start">
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index 8d9a70f5e082..d0528ca80e33 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -2792,6 +2792,7 @@ namespace xmloff::token {
         TOKEN( "multiply",                  XML_MULTIPLY ),
         TOKEN( "animate",                       XML_ANIMATE ),
         TOKEN( "animateMotion",             XML_ANIMATEMOTION ),
+        TOKEN( "animateSimulation",         XML_ANIMATESIMULATION ),
         TOKEN( "animateTransform",          XML_ANIMATETRANSFORM ),
         TOKEN( "animateColor",              XML_ANIMATECOLOR ),
         TOKEN( "transitionFilter",          XML_TRANSITIONFILTER ),
@@ -2987,6 +2988,7 @@ namespace xmloff::token {
         TOKEN( "exit",              XML_EXIT ),
         TOKEN( "emphasis",          XML_EMPHASIS ),
         TOKEN( "motion-path",           XML_MOTION_PATH ),
+        TOKEN( "motion-simulated",      XML_MOTION_SIMULATED ),
         TOKEN( "ole-action",            XML_OLE_ACTION ),
         TOKEN( "media-call",            XML_MEDIA_CALL ),
         TOKEN( "on-click",          XML_ON_CLICK ),
diff --git a/xmloff/source/draw/animationexport.cxx b/xmloff/source/draw/animationexport.cxx
index 7aa293e75716..25ff6357523f 100644
--- a/xmloff/source/draw/animationexport.cxx
+++ b/xmloff/source/draw/animationexport.cxx
@@ -357,6 +357,7 @@ const SvXMLEnumMapEntry<sal_Int16> aAnimations_EnumMap_EffectPresetClass[] =
     { XML_MOTION_PATH,  EffectPresetClass::MOTIONPATH },
     { XML_OLE_ACTION,   EffectPresetClass::OLEACTION },
     { XML_MEDIA_CALL,   EffectPresetClass::MEDIACALL },
+    { XML_MOTION_SIMULATED, EffectPresetClass::MOTIONSIMULATION },
     { XML_TOKEN_INVALID, 0 }
 };
 const SvXMLEnumMapEntry<sal_Int16> aAnimations_EnumMap_EffectNodeType[] =
@@ -697,6 +698,7 @@ void AnimationsExporterImpl::prepareNode( const Reference< XAnimationNode >& xNo
         case AnimationNodeType::ANIMATE:
         case AnimationNodeType::SET:
         case AnimationNodeType::ANIMATEMOTION:
+        case AnimationNodeType::ANIMATESIMULATED:
         case AnimationNodeType::ANIMATECOLOR:
         case AnimationNodeType::ANIMATETRANSFORM:
         case AnimationNodeType::TRANSITIONFILTER:
@@ -947,6 +949,7 @@ void AnimationsExporterImpl::exportNode( const Reference< XAnimationNode >& xNod
         case AnimationNodeType::ANIMATE:
         case AnimationNodeType::SET:
         case AnimationNodeType::ANIMATEMOTION:
+        case AnimationNodeType::ANIMATESIMULATED:
         case AnimationNodeType::ANIMATECOLOR:
         case AnimationNodeType::ANIMATETRANSFORM:
         case AnimationNodeType::TRANSITIONFILTER:
@@ -1089,6 +1092,10 @@ void AnimationsExporterImpl::exportAnimate( const Reference< XAnimate >& xAnimat
         {
             eAttributeName = XML_ANIMATEMOTION;
         }
+        else if( nNodeType == AnimationNodeType::ANIMATESIMULATED )
+        {
+            eAttributeName = XML_ANIMATESIMULATION;
+        }
         else
         {
             OUString sTemp( xAnimate->getAttributeName() );
@@ -1234,6 +1241,15 @@ void AnimationsExporterImpl::exportAnimate( const Reference< XAnimate >& xAnimat
         }
         break;
 
+        case AnimationNodeType::ANIMATESIMULATED:
+        {
+            eElementToken = XML_ANIMATESIMULATION;
+
+            Reference< XAnimateMotion > xAnimateMotion( xAnimate, UNO_QUERY_THROW );
+            aTemp = xAnimateMotion->getOrigin();
+        }
+        break;
+
         case AnimationNodeType::ANIMATECOLOR:
         {
             eElementToken = XML_ANIMATECOLOR;
@@ -1437,6 +1453,7 @@ void AnimationsExporterImpl::convertValue( XMLTokenEnum eAttributeName, OUString
         case XML_HEIGHT:
         case XML_ANIMATETRANSFORM:
         case XML_ANIMATEMOTION:
+        case XML_ANIMATESIMULATION:
         {
             if( auto aString = o3tl::tryAccess<OUString>(rValue) )
             {
diff --git a/xmloff/source/draw/animationimport.cxx b/xmloff/source/draw/animationimport.cxx
index ebccff3d1a22..0cddb5169f80 100644
--- a/xmloff/source/draw/animationimport.cxx
+++ b/xmloff/source/draw/animationimport.cxx
@@ -460,6 +460,8 @@ AnimationNodeContext::AnimationNodeContext(
                 pServiceName = "com.sun.star.animations.AnimateSet"; break;
             case XML_ANIMATEMOTION:
                 pServiceName = "com.sun.star.animations.AnimateMotion"; break;
+            case XML_ANIMATESIMULATION:
+                pServiceName = "com.sun.star.animations.AnimateSimulation"; break;
             case XML_ANIMATECOLOR:
                 pServiceName = "com.sun.star.animations.AnimateColor"; break;
             case XML_ANIMATETRANSFORM:
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index 34b9af91e03c..18f75351e199 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -2620,6 +2620,7 @@ additive
 multiply
 animate
 animateMotion
+animateSimulation
 animateTransform
 animateColor
 transitionFilter
@@ -2802,6 +2803,7 @@ entrance
 exit
 emphasis
 motion-path
+motion-simulated
 ole-action
 media-call
 on-click
commit aa473e98ad6acedd40442c9811a446bfcb3985e3
Author:     Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Thu Jun 11 19:29:38 2020 +0300
Commit:     Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Sat Jun 27 01:04:22 2020 +0300

    make simulated animations part of the animation engine
    
    Wiring up and creating required classes for simulated
    animations to be part of the animation engine.
    
    Creating a new animation node AnimationSimulationNode
    for simulated animations and SimulatedAnimation class
    that inherits from NumberAnimation in the animation
    factory.
    
    Also, this commit makes it possible to have two box2d
    animation effects in parallel with -with previous-
    option
    
    Change-Id: I1f125df5324673e9937b8164c0fc267c9683afa0

diff --git a/offapi/com/sun/star/animations/AnimationNodeType.idl b/offapi/com/sun/star/animations/AnimationNodeType.idl
index 31bed11ff728..770f148356ae 100644
--- a/offapi/com/sun/star/animations/AnimationNodeType.idl
+++ b/offapi/com/sun/star/animations/AnimationNodeType.idl
@@ -68,6 +68,9 @@ constants AnimationNodeType
     /** Defines a command effect. */
     const short COMMAND = 11;
 
+    /** Defines a simulated animation */
+    const short ANIMATESIMULATED = 12;
+
 };
 
 
diff --git a/slideshow/Library_slideshow.mk b/slideshow/Library_slideshow.mk
index 53324ea25dcc..398f82bd1f51 100644
--- a/slideshow/Library_slideshow.mk
+++ b/slideshow/Library_slideshow.mk
@@ -75,6 +75,7 @@ $(eval $(call gb_Library_add_exception_objects,slideshow,\
     slideshow/source/engine/animationnodes/animationnodefactory \
     slideshow/source/engine/animationnodes/animationpathmotionnode \
     slideshow/source/engine/animationnodes/animationsetnode \
+    slideshow/source/engine/animationnodes/animationsimulatednode \
     slideshow/source/engine/animationnodes/animationtransformnode \
     slideshow/source/engine/animationnodes/animationtransitionfilternode \
     slideshow/source/engine/animationnodes/basecontainernode \
diff --git a/slideshow/source/engine/animationfactory.cxx b/slideshow/source/engine/animationfactory.cxx
index f81c37b77df3..7c06a32c388a 100644
--- a/slideshow/source/engine/animationfactory.cxx
+++ b/slideshow/source/engine/animationfactory.cxx
@@ -35,6 +35,7 @@
 #include <basegfx/polygon/b2dpolygontools.hxx>
 #include <basegfx/polygon/b2dpolypolygontools.hxx>
 
+#include <box2dtools.hxx>
 
 using namespace ::com::sun::star;
 
@@ -341,6 +342,174 @@ namespace slideshow::internal
                 sal_Int16                          mnAdditive;
             };
 
+            class SimulatedAnimation : public NumberAnimation
+            {
+            public:
+                SimulatedAnimation( const ::box2d::utils::Box2DWorldSharedPtr pBox2DWorld,
+                                    const double                 fDuration,
+                                    sal_Int16                    nAdditive,
+                                    const ShapeManagerSharedPtr& rShapeManager,
+                                    const ::basegfx::B2DVector&  rSlideSize,
+                                    int                          nFlags ) :
+                    mpShape(),
+                    mpAttrLayer(),
+                    mpShapeManager( rShapeManager ),
+                    maPageSize( rSlideSize ),
+                    maShapeOrig(),
+                    mnFlags( nFlags ),
+                    mbAnimationStarted( false ),
+                    mnAdditive( nAdditive ),
+                    mpBox2DBody(),
+                    mpBox2DWorld( pBox2DWorld ),
+                    mfDuration(fDuration),
+                    mfPreviousElapsedTime(0.00f),
+                    mbIsBox2dWorldStepper(false)
+                {
+                    ENSURE_OR_THROW( rShapeManager,
+                                     "SimulatedAnimation::SimulatedAnimation(): Invalid ShapeManager" );
+                }
+
+                virtual ~SimulatedAnimation() override
+                {
+                    end_();
+                }
+
+                // Animation interface
+
+                virtual void prefetch() override
+                {}
+
+                virtual void start( const AnimatableShapeSharedPtr&     rShape,
+                                    const ShapeAttributeLayerSharedPtr& rAttrLayer ) override
+                {
+                    OSL_ENSURE( !mpShape,
+                                "PathAnimation::start(): Shape already set" );
+                    OSL_ENSURE( !mpAttrLayer,
+                                "PathAnimation::start(): Attribute layer already set" );
+
+                    mpShape = rShape;
+                    mpAttrLayer = rAttrLayer;
+
+                    if( !(mpBox2DWorld->getShapesInitialized()) )
+                        mpBox2DWorld->initateAllShapesAsStaticBodies( mpShapeManager );
+
+                    mpBox2DBody = mpBox2DWorld->makeShapeDynamic( rShape );
+
+                    ENSURE_OR_THROW( rShape,
+                                      "SimulatedAnimation::start(): Invalid shape" );
+                    ENSURE_OR_THROW( rAttrLayer,
+                                      "SimulatedAnimation::(): Invalid attribute layer" );
+
+                    // TODO(F1): Check whether _shape_ bounds are correct here.
+                    // Theoretically, our AttrLayer is way down the stack, and
+                    // we only have to consider _that_ value, not the one from
+                    // the top of the stack as returned by Shape::getBounds()
+                    if( mnAdditive == animations::AnimationAdditiveMode::SUM )
+                        maShapeOrig = mpShape->getBounds().getCenter();
+                    else
+                        maShapeOrig = mpShape->getDomBounds().getCenter();
+
+                    if( !mbAnimationStarted )
+                    {
+                        mbAnimationStarted = true;
+
+                        if( !(mnFlags & AnimationFactory::FLAG_NO_SPRITE) )
+                            mpShapeManager->enterAnimationMode( mpShape );
+                    }
+                }
+
+                virtual void end() override { end_(); }
+                void end_()
+                {
+                    if( mbIsBox2dWorldStepper )
+                    {
+                        mbIsBox2dWorldStepper = false;
+                        mpBox2DWorld->setHasWorldStepper(false);
+                    }
+
+                    if( mbAnimationStarted )
+                    {
+                        mbAnimationStarted = false;
+
+                        // Animation have ended for this body, make it static
+                        mpBox2DWorld->makeBodyStatic( mpBox2DBody );
+
+                        if( !(mnFlags & AnimationFactory::FLAG_NO_SPRITE) )
+                            mpShapeManager->leaveAnimationMode( mpShape );
+
+                        if( mpShape->isContentChanged() )
+                            mpShapeManager->notifyShapeUpdate( mpShape );
+                    }
+                }
+
+                // NumberAnimation interface
+
+
+                virtual bool operator()( double nValue ) override
+                {
+                    ENSURE_OR_RETURN_FALSE( mpAttrLayer && mpShape,
+                                       "SimulatedAnimation::operator(): Invalid ShapeAttributeLayer" );
+
+                    // if there are multiple simulated animations going in parallel
+                    // like "with previous" option. Only one of them should step
+                    // the box2d world
+                    if( !mpBox2DWorld->hasWorldStepper() )
+                    {
+                        mbIsBox2dWorldStepper = true;
+                        mpBox2DWorld->setHasWorldStepper(true);
+                    }
+
+                    if( mbIsBox2dWorldStepper )
+                    {
+                        double fPassedTime = (mfDuration * nValue) - mfPreviousElapsedTime;
+
+                        double fTimeStep = 1.0f/60.0f;
+
+                        for( ; fPassedTime - fTimeStep >= 0; fPassedTime -= fTimeStep )
+                        {
+                            mpBox2DWorld->step( fTimeStep );
+                            mfPreviousElapsedTime += fTimeStep;
+                        }
+                    }
+
+                    ::basegfx::B2DPoint rOutPos = mpBox2DBody->getPosition( maPageSize );
+                    mpAttrLayer->setPosition( rOutPos );
+
+                    double fAngle = mpBox2DBody->getAngle();
+                    mpAttrLayer->setRotationAngle( fAngle );
+
+                    if( mpShape->isContentChanged() )
+                        mpShapeManager->notifyShapeUpdate( mpShape );
+
+                    return true;
+                }
+
+                virtual double getUnderlyingValue() const override
+                {
+                    ENSURE_OR_THROW( mpAttrLayer,
+                                      "SimulatedAnimation::getUnderlyingValue(): Invalid ShapeAttributeLayer" );
+
+                    return 0.0; // though this should be used in concert with
+                                // ActivitiesFactory::createSimpleActivity, better
+                                // explicitly name our start value.
+                                // Permissible range for operator() above is [0,1]
+                }
+
+            private:
+                AnimatableShapeSharedPtr           mpShape;
+                ShapeAttributeLayerSharedPtr       mpAttrLayer;
+                ShapeManagerSharedPtr              mpShapeManager;
+                const ::basegfx::B2DSize           maPageSize;
+                ::basegfx::B2DPoint                maShapeOrig;
+                const int                          mnFlags;
+                bool                               mbAnimationStarted;
+                sal_Int16                          mnAdditive;
+                box2d::utils::Box2DBodySharedPtr   mpBox2DBody;
+                box2d::utils::Box2DWorldSharedPtr  mpBox2DWorld;
+                double                             mfDuration;
+                double                             mfPreviousElapsedTime;
+                bool                               mbIsBox2dWorldStepper;
+            };
 
             /** GenericAnimation template
 
@@ -1228,6 +1397,20 @@ namespace slideshow::internal
                                    nFlags );
         }
 
+        NumberAnimationSharedPtr AnimationFactory::createSimulatedAnimation(  const box2d::utils::Box2DWorldSharedPtr pBox2DWorld,
+                                                                              const double                      fDuration,
+                                                                              sal_Int16                         nAdditive,
+                                                                              const AnimatableShapeSharedPtr&   /*rShape*/,
+                                                                              const ShapeManagerSharedPtr&      rShapeManager,
+                                                                              const ::basegfx::B2DVector&       rSlideSize,
+                                                                              int                               nFlags )
+        {
+            return std::make_shared<SimulatedAnimation>( pBox2DWorld, fDuration, nAdditive,
+                                   rShapeManager,
+                                   rSlideSize,
+                                   nFlags );
+        }
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/engine/animationnodes/animationnodefactory.cxx b/slideshow/source/engine/animationnodes/animationnodefactory.cxx
index f9fa01b2f1fd..a88c3a8ab7e0 100644
--- a/slideshow/source/engine/animationnodes/animationnodefactory.cxx
+++ b/slideshow/source/engine/animationnodes/animationnodefactory.cxx
@@ -33,6 +33,7 @@
 #include "propertyanimationnode.hxx"
 #include "animationsetnode.hxx"
 #include "animationpathmotionnode.hxx"
+#include "animationsimulatednode.hxx"
 #include "animationcolornode.hxx"
 #include "animationtransformnode.hxx"
 #include "animationtransitionfilternode.hxx"
@@ -493,6 +494,11 @@ BaseNodeSharedPtr implCreateAnimationNode(
                                 xNode, rParent, rContext );
         break;
 
+    case animations::AnimationNodeType::ANIMATESIMULATED:
+        pCreatedNode = std::make_shared<AnimationSimulatedNode>(
+                                xNode, rParent, rContext );
+        break;
+
     case animations::AnimationNodeType::TRANSITIONFILTER:
         pCreatedNode = std::make_shared<AnimationTransitionFilterNode>(
                                 xNode, rParent, rContext );
diff --git a/slideshow/source/engine/animationnodes/animationsimulatednode.cxx b/slideshow/source/engine/animationnodes/animationsimulatednode.cxx
new file mode 100644
index 000000000000..aef5192c0be5
--- /dev/null
+++ b/slideshow/source/engine/animationnodes/animationsimulatednode.cxx
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include "animationsimulatednode.hxx"
+#include <animationfactory.hxx>
+
+namespace slideshow::internal
+{
+void AnimationSimulatedNode::dispose()
+{
+    mxSimulatedMotionNode.clear();
+    AnimationBaseNode::dispose();
+}
+
+AnimationActivitySharedPtr AnimationSimulatedNode::createActivity() const
+{
+    double fDuration;
+    ENSURE_OR_THROW((mxSimulatedMotionNode->getDuration() >>= fDuration),
+                    "Couldn't get the animation duration.");
+
+    ActivitiesFactory::CommonParameters const aParms(fillCommonParameters());
+    return ActivitiesFactory::createSimpleActivity(
+        aParms,
+        AnimationFactory::createSimulatedAnimation(
+            getContext().mpBox2DWorld, fDuration, mxSimulatedMotionNode->getAdditive(), getShape(),
+            getContext().mpSubsettableShapeManager, getSlideSize(), 0),
+        true);
+}
+
+} // namespace slideshow::internal
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/engine/animationnodes/animationsimulatednode.hxx b/slideshow/source/engine/animationnodes/animationsimulatednode.hxx
new file mode 100644
index 000000000000..82fa764c805d
--- /dev/null
+++ b/slideshow/source/engine/animationnodes/animationsimulatednode.hxx
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#pragma once
+
+#include "animationbasenode.hxx"
+#include <com/sun/star/animations/XAnimateMotion.hpp>
+
+namespace slideshow
+{
+namespace internal
+{
+class AnimationSimulatedNode : public AnimationBaseNode
+{
+public:
+    AnimationSimulatedNode(const css::uno::Reference<css::animations::XAnimationNode>& xNode,
+                           const BaseContainerNodeSharedPtr& rParent, const NodeContext& rContext)
+        : AnimationBaseNode(xNode, rParent, rContext)
+        , mxSimulatedMotionNode(xNode, css::uno::UNO_QUERY_THROW)
+    {
+    }
+
+#if defined(DBG_UTIL)
+    virtual const char* getDescription() const override { return "AnimationSimulationNode"; }
+#endif
+
+protected:
+    virtual void dispose() override;
+
+private:
+    virtual AnimationActivitySharedPtr createActivity() const override;
+
+    css::uno::Reference<css::animations::XAnimateMotion> mxSimulatedMotionNode;
+};
+
+} // namespace internal
+} // namespace slideshow
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/engine/slide/slideimpl.cxx b/slideshow/source/engine/slide/slideimpl.cxx
index a9120c6da829..a300c946e52a 100644
--- a/slideshow/source/engine/slide/slideimpl.cxx
+++ b/slideshow/source/engine/slide/slideimpl.cxx
@@ -47,6 +47,7 @@
 #include "userpaintoverlay.hxx"
 #include "targetpropertiescreator.hxx"
 #include <tools.hxx>
+#include <box2dtools.hxx>
 
 using namespace ::com::sun::star;
 
@@ -193,6 +194,7 @@ private:
     LayerManagerSharedPtr                               mpLayerManager;
     std::shared_ptr<ShapeManagerImpl>                 mpShapeManager;
     std::shared_ptr<SubsettableShapeManager>          mpSubsettableShapeManager;
+    box2d::utils::Box2DWorldSharedPtr                   mpBox2DWorld;
 
     /// Contains common objects needed throughout the slideshow
     SlideShowContext                                    maContext;
@@ -316,6 +318,8 @@ SlideImpl::SlideImpl( const uno::Reference< drawing::XDrawPage >&           xDra
                         rShapeCursorMap,
                         xDrawPage)),
     mpSubsettableShapeManager( mpShapeManager ),
+    mpBox2DWorld( std::make_shared<box2d::utils::box2DWorld>(
+                        basegfx::B2DSize( getSlideSizeImpl() ) ) ),
     maContext( mpSubsettableShapeManager,
                rEventQueue,
                rEventMultiplexer,
@@ -325,7 +329,8 @@ SlideImpl::SlideImpl( const uno::Reference< drawing::XDrawPage >&           xDra
                *this,
                rMediaFileManager,
                rViewContainer,
-               xComponentContext ),
+               xComponentContext,
+               mpBox2DWorld ),
     mrCursorManager( rCursorManager ),
     maAnimations( maContext,
                   basegfx::B2DSize( getSlideSizeImpl() ) ),
diff --git a/slideshow/source/engine/slideshowcontext.cxx b/slideshow/source/engine/slideshowcontext.cxx
index 8c0811e9ecf7..3ea5ab50393b 100644
--- a/slideshow/source/engine/slideshowcontext.cxx
+++ b/slideshow/source/engine/slideshowcontext.cxx
@@ -45,7 +45,8 @@ SlideShowContext::SlideShowContext( SubsettableShapeManagerSharedPtr& rSubsettab
                                     MediaFileManager&                    rMediaFileManager,
                                     const UnoViewContainer&           rViewContainer,
                                     const uno::Reference<
-                                          uno::XComponentContext>&    rComponentContext ) :
+                                          uno::XComponentContext>&    rComponentContext,
+                                    box2d::utils::Box2DWorldSharedPtr rBox2DWorldPtr ) :
         mpSubsettableShapeManager( rSubsettableShapeManager ),
         mrEventQueue( rEventQueue ),
         mrEventMultiplexer( rEventMultiplexer ),
@@ -55,7 +56,8 @@ SlideShowContext::SlideShowContext( SubsettableShapeManagerSharedPtr& rSubsettab
         mrCursorManager( rCursorManager ),
         mrMediaFileManager( rMediaFileManager ),
         mrViewContainer( rViewContainer ),
-        mxComponentContext( rComponentContext )
+        mxComponentContext( rComponentContext ),
+        mpBox2DWorld( rBox2DWorldPtr )
     {}
 
 void SlideShowContext::dispose()
diff --git a/slideshow/source/engine/slideshowimpl.cxx b/slideshow/source/engine/slideshowimpl.cxx
index 9fd3d536dbce..afac7a392763 100644
--- a/slideshow/source/engine/slideshowimpl.cxx
+++ b/slideshow/source/engine/slideshowimpl.cxx
@@ -84,6 +84,9 @@
 using namespace com::sun::star;
 using namespace ::slideshow::internal;
 
+namespace box2d::utils { class box2DWorld;
+                         typedef ::std::shared_ptr< box2DWorld > Box2DWorldSharedPtr; }
+
 namespace {
 
 /** During animations the update() method tells its caller to call it as
@@ -416,6 +419,7 @@ private:
     ActivitiesQueue                         maActivitiesQueue;
     UserEventQueue                          maUserEventQueue;
     SubsettableShapeManagerSharedPtr        mpDummyPtr;
+    box2d::utils::Box2DWorldSharedPtr       mpBox2DDummyPtr;
 
     std::shared_ptr<SeparateListenerImpl> mpListener;
 
@@ -544,6 +548,7 @@ SlideShowImpl::SlideShowImpl(
                         maEventQueue,
                         *this ),
       mpDummyPtr(),
+      mpBox2DDummyPtr(),
       mpListener(),
       mpRehearseTimingsActivity(),
       mpWaitSymbol(),
@@ -1673,7 +1678,8 @@ sal_Bool SlideShowImpl::setProperty( beans::PropertyValue const& rProperty )
                     *this,
                     *this,
                     maViewContainer,
-                    mxComponentContext) );
+                    mxComponentContext,
+                    mpBox2DDummyPtr ) );
         }
         else if (mpRehearseTimingsActivity)
         {
diff --git a/slideshow/source/inc/animationfactory.hxx b/slideshow/source/inc/animationfactory.hxx
index 7d2f205c63a5..caff30684563 100644
--- a/slideshow/source/inc/animationfactory.hxx
+++ b/slideshow/source/inc/animationfactory.hxx
@@ -30,6 +30,9 @@
 
 #include "shapemanager.hxx"
 
+namespace box2d::utils { class box2DWorld;
+                         typedef ::std::shared_ptr< box2DWorld > Box2DWorldSharedPtr; }
+
 /* Definition of AnimationFactory class */
 
 namespace slideshow
@@ -126,6 +129,14 @@ namespace slideshow
                                                                        const ShapeManagerSharedPtr&             rShapeManager,
                                                                        const ::basegfx::B2DVector&              rSlideSize,
                                                                        int                                      nFlags);
+
+            NumberAnimationSharedPtr createSimulatedAnimation( const box2d::utils::Box2DWorldSharedPtr pBox2DWorld,
+                                                               const double                      fDuration,
+                                                               sal_Int16                         nAdditive,
+                                                               const AnimatableShapeSharedPtr&   /*rShape*/,
+                                                               const ShapeManagerSharedPtr&      rShapeManager,
+                                                               const ::basegfx::B2DVector&       rSlideSize,
+                                                               int                               nFlags );
         }
     }
 }
diff --git a/slideshow/source/inc/slideshowcontext.hxx b/slideshow/source/inc/slideshowcontext.hxx
index 6d14fb34b1b2..3d2918674112 100644
--- a/slideshow/source/inc/slideshowcontext.hxx
+++ b/slideshow/source/inc/slideshowcontext.hxx
@@ -24,6 +24,9 @@
 #include <memory>
 
 namespace com::sun::star::uno { class XComponentContext; }
+namespace box2d::utils { class box2DWorld;
+                         typedef ::std::shared_ptr< box2DWorld > Box2DWorldSharedPtr; }
+
 
 
 namespace slideshow
@@ -41,7 +44,6 @@ namespace slideshow
         class MediaFileManager;
         class SubsettableShapeManager;
         typedef ::std::shared_ptr< SubsettableShapeManager > SubsettableShapeManagerSharedPtr;
-
         /** Common arguments for slideshow objects.
 
             This struct combines a number of object references
@@ -92,7 +94,8 @@ namespace slideshow
                               CursorManager&                                    rCursorManager,
                               MediaFileManager&                                 rMediaFileManager,
                               const UnoViewContainer&                           rViewContainer,
-                              const css::uno::Reference< css::uno::XComponentContext>&    rComponentContext );
+                              const css::uno::Reference< css::uno::XComponentContext>&    rComponentContext,
+                              box2d::utils::Box2DWorldSharedPtr                 rBox2DWorldPtr );
             void dispose();
 
             std::shared_ptr<SubsettableShapeManager>&     mpSubsettableShapeManager;
@@ -105,6 +108,7 @@ namespace slideshow
             MediaFileManager&                               mrMediaFileManager;
             const UnoViewContainer&                         mrViewContainer;
             css::uno::Reference< css::uno::XComponentContext>   mxComponentContext;
+            box2d::utils::Box2DWorldSharedPtr               mpBox2DWorld;
         };
     }
 }
commit 5495b9468faa3b1ab90e52a74f0875b151c3355c
Author:     Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Fri Jun 5 20:23:21 2020 +0300
Commit:     Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Sat Jun 27 01:04:21 2020 +0300

    box2d tools: initial work for physics based animation effects
    
    Two new classes for managing box2d bodies(b2Body) and box2d worlds(b2World)
    
    ::box2d::utils::Box2DBody :
    Since b2Body has a private constructor, it is forbidden to make a shared_ptr
    out of it.
    When there are multiple parallel physics based animation effects going on,
    it will be useful to share b2Body pointers around.
    This class will help with that and also has get methods that return LO types
    instead of box2d ones.
    
    ::box2d::utils::Box2DWorld :
    A class that manages b2World with convenient functions that will be needed
    during animation effects.
    
    Change-Id: Id02fefe937347029daddde043da2b8e8dba3acaf

diff --git a/slideshow/Library_slideshow.mk b/slideshow/Library_slideshow.mk
index 55c531a86f43..53324ea25dcc 100644
--- a/slideshow/Library_slideshow.mk
+++ b/slideshow/Library_slideshow.mk
@@ -24,6 +24,7 @@ $(eval $(call gb_Library_set_precompiled_header,slideshow,slideshow/inc/pch/prec
 
 $(eval $(call gb_Library_use_externals,slideshow,\
 	boost_headers \
+	box2d \
 ))
 ifeq ($(DISABLE_GUI),)
 $(eval $(call gb_Library_use_externals,slideshow,\
@@ -84,6 +85,7 @@ $(eval $(call gb_Library_add_exception_objects,slideshow,\
     slideshow/source/engine/animationnodes/propertyanimationnode \
     slideshow/source/engine/animationnodes/sequentialtimecontainer \
     slideshow/source/engine/attributemap \
+    slideshow/source/engine/box2dtools \
     slideshow/source/engine/color \
     slideshow/source/engine/delayevent \
     slideshow/source/engine/effectrewinder \
diff --git a/slideshow/source/engine/box2dtools.cxx b/slideshow/source/engine/box2dtools.cxx
new file mode 100644
index 000000000000..ea6063d5ce4c
--- /dev/null
+++ b/slideshow/source/engine/box2dtools.cxx
@@ -0,0 +1,251 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <Box2D/Box2D.h>
+#include <box2dtools.hxx>
+#include <basegfx/numeric/ftools.hxx>
+#include <animatableshape.hxx>
+#include <shapeattributelayer.hxx>
+#include <sal/log.hxx>
+#include <shapemanager.hxx>
+
+namespace box2d::utils
+{
+double calculateScaleFactor(const ::basegfx::B2DVector& rSlideSize)
+{
+    double fWidth = rSlideSize.getX();
+    double fHeight = rSlideSize.getY();
+
+    if (fWidth > fHeight)
+        return BOX2D_SLIDE_SIZE_IN_METERS / fWidth;
+    else
+        return BOX2D_SLIDE_SIZE_IN_METERS / fHeight;
+}
+
+box2DWorld::box2DWorld(const ::basegfx::B2DVector& rSlideSize, const float fGravityX,
+                       const float fGravityY)
+    : maBox2DWorld(b2Vec2(fGravityX, fGravityY))
+    , mfScaleFactor(calculateScaleFactor(rSlideSize))
+    , mbShapesInitialized(false)
+    , mbHasWorldStepper(false)
+    , mnDynamicShapeCount(0)
+    , maXShapeToBodyMapPtr()
+{
+    createStaticFrameAroundSlide(rSlideSize);
+}
+
+b2Body* box2DWorld::createStaticFrameAroundSlide(const ::basegfx::B2DVector& rSlideSize)
+{
+    float fWidth = static_cast<float>(rSlideSize.getX() * mfScaleFactor);
+    float fHeight = static_cast<float>(rSlideSize.getY() * mfScaleFactor);
+
+    // static body for creating the frame made out of four walls
+    b2BodyDef aBodyDef;
+    aBodyDef.type = b2_staticBody;
+    aBodyDef.position.Set(0, 0);
+    b2Body* pStaticBody = maBox2DWorld.CreateBody(&aBodyDef);
+
+    b2PolygonShape aPolygonShape;
+
+    b2FixtureDef aFixtureDef;
+    aFixtureDef.shape = &aPolygonShape;
+
+    //add four walls to the static body
+    aPolygonShape.SetAsBox(fWidth / 2.0f, 1.0f / 10.0f, // ground wall
+                           b2Vec2(fWidth / 2, -fHeight - 1.0f / 10.0f), 0);
+    pStaticBody->CreateFixture(&aFixtureDef);
+
+    aPolygonShape.SetAsBox(fWidth / 2.0f, 1.0f / 10.0f, // ceiling wall
+                           b2Vec2(fWidth / 2, 1.0f / 10.0f), 0);
+    pStaticBody->CreateFixture(&aFixtureDef);
+
+    aPolygonShape.SetAsBox(1.0f / 10.0f, fHeight / 2, // left wall
+                           b2Vec2(-1.0f / 10.0f, -fHeight / 2), 0);
+    pStaticBody->CreateFixture(&aFixtureDef);
+
+    aPolygonShape.SetAsBox(1.0f / 10.0f, fHeight / 2.0f, // right wall
+                           b2Vec2(fWidth + 1.0f / 10.0f, -fHeight / 2), 0);
+    pStaticBody->CreateFixture(&aFixtureDef);
+
+    return pStaticBody;
+}
+
+void box2DWorld::initateAllShapesAsStaticBodies(
+    const slideshow::internal::ShapeManagerSharedPtr pShapeManager)
+{
+    mbShapesInitialized = true;
+    auto aXShapeToShapeMap = pShapeManager->getXShapeToShapeMap();
+
+    // iterate over shapes in the current slide
+    for (auto aIt = aXShapeToShapeMap.begin(); aIt != aXShapeToShapeMap.end(); aIt++)
+    {
+        slideshow::internal::ShapeSharedPtr pShape = aIt->second;
+        if (pShape->isVisible() && pShape->isForeground())
+        {
+            Box2DBodySharedPtr pBox2DBody = createStaticBodyFromBoundingBox(pShape);
+            maXShapeToBodyMapPtr.insert(std::make_pair(pShape->getXShape(), pBox2DBody));
+        }
+    }
+}
+
+bool box2DWorld::hasWorldStepper() { return mbHasWorldStepper; }
+
+void box2DWorld::setHasWorldStepper(bool bHasWorldStepper) { mbHasWorldStepper = bHasWorldStepper; }
+
+void box2DWorld::step(const float fTimeStep, const int nVelocityIterations,
+                      const int nPositionIterations)
+{
+    maBox2DWorld.Step(fTimeStep, nVelocityIterations, nPositionIterations);
+}
+
+bool box2DWorld::getShapesInitialized() { return mbShapesInitialized; }
+
+Box2DBodySharedPtr box2DWorld::makeShapeDynamic(const slideshow::internal::ShapeSharedPtr pShape)
+{
+    Box2DBodySharedPtr pBox2DBody = maXShapeToBodyMapPtr.find(pShape->getXShape())->second;
+    if (pBox2DBody->getType() != b2_dynamicBody)
+    {
+        pBox2DBody->setType(b2_dynamicBody);
+        mnDynamicShapeCount++;
+    }
+    return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::makeBodyDynamic(const Box2DBodySharedPtr pBox2DBody)
+{
+    if (pBox2DBody->getType() != b2_dynamicBody)
+    {
+        pBox2DBody->setType(b2_dynamicBody);
+        mnDynamicShapeCount++;
+    }
+    return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::makeShapeStatic(const slideshow::internal::ShapeSharedPtr pShape)
+{
+    Box2DBodySharedPtr pBox2DBody = maXShapeToBodyMapPtr.find(pShape->getXShape())->second;
+    if (pBox2DBody->getType() != b2_staticBody)
+    {
+        pBox2DBody->setType(b2_staticBody);
+        mnDynamicShapeCount--;
+    }
+    return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::makeBodyStatic(const Box2DBodySharedPtr pBox2DBody)
+{
+    if (pBox2DBody->getType() != b2_staticBody)
+    {
+        pBox2DBody->setType(b2_staticBody);
+        mnDynamicShapeCount--;
+    }
+    return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::createDynamicBodyFromBoundingBox(
+    const slideshow::internal::ShapeSharedPtr& rShape,
+    const slideshow::internal::ShapeAttributeLayerSharedPtr& rAttrLayer, const float fDensity,
+    const float fFriction)
+{
+    ::basegfx::B2DRectangle aShapeBounds = rShape->getBounds();
+    double fShapeWidth = aShapeBounds.getWidth() * mfScaleFactor;
+    double fShapeHeight = aShapeBounds.getHeight() * mfScaleFactor;
+
+    double fRotationAngle = ::basegfx::deg2rad(-rAttrLayer->getRotationAngle());
+
+    ::basegfx::B2DPoint aShapePosition = aShapeBounds.getCenter();
+    float fBodyPosX = aShapePosition.getX() * mfScaleFactor;
+    float fBodyPosY = aShapePosition.getY() * -mfScaleFactor;
+
+    b2BodyDef aBodyDef;
+    aBodyDef.type = b2_dynamicBody;
+    aBodyDef.position.Set(fBodyPosX, fBodyPosY);
+    aBodyDef.angle = static_cast<float>(fRotationAngle);
+
+    b2Body* pBody = maBox2DWorld.CreateBody(&aBodyDef);
+
+    b2PolygonShape aDynamicBox;
+    aDynamicBox.SetAsBox(static_cast<float>(fShapeWidth / 2), static_cast<float>(fShapeHeight / 2));
+
+    b2FixtureDef aFixtureDef;
+    aFixtureDef.shape = &aDynamicBox;
+    aFixtureDef.density = fDensity;
+    aFixtureDef.friction = fFriction;
+
+    pBody->CreateFixture(&aFixtureDef);
+    return std::make_shared<box2DBody>(pBody);
+}
+
+Box2DBodySharedPtr
+box2DWorld::createStaticBodyFromBoundingBox(const slideshow::internal::ShapeSharedPtr& rShape,
+                                            const float fDensity, const float fFriction)
+{
+    ::basegfx::B2DRectangle aShapeBounds = rShape->getBounds();
+    double fShapeWidth = aShapeBounds.getWidth() * mfScaleFactor;
+    double fShapeHeight = aShapeBounds.getHeight() * mfScaleFactor;
+
+    ::basegfx::B2DPoint aShapePosition = aShapeBounds.getCenter();
+    float fBodyPosX = aShapePosition.getX() * mfScaleFactor;
+    float fBodyPosY = aShapePosition.getY() * -mfScaleFactor;
+
+    b2BodyDef aBodyDef;
+    aBodyDef.type = b2_staticBody;
+    aBodyDef.position.Set(fBodyPosX, fBodyPosY);
+
+    b2Body* pBody = maBox2DWorld.CreateBody(&aBodyDef);
+
+    b2PolygonShape aDynamicBox;
+    aDynamicBox.SetAsBox(static_cast<float>(fShapeWidth / 2), static_cast<float>(fShapeHeight / 2));
+
+    b2FixtureDef aFixtureDef;
+    aFixtureDef.shape = &aDynamicBox;
+    aFixtureDef.density = fDensity;
+    aFixtureDef.friction = fFriction;
+
+    pBody->CreateFixture(&aFixtureDef);
+    return std::make_shared<box2DBody>(pBody);
+}
+
+box2DBody::box2DBody(b2Body* pBox2DBody /*, Box2DWorldSharedPtr pBox2DWorldSharedPtr*/)
+    : mpBox2DBody(pBox2DBody)
+    /* , mpBox2DWorldSharedPtr(pBox2DWorldSharedPtr)*/ {};
+
+box2DBody::~box2DBody() { mpBox2DBody->GetWorld()->DestroyBody(mpBox2DBody); }
+
+::basegfx::B2DPoint box2DBody::getPosition(const ::basegfx::B2DVector& rSlideSize)
+{
+    double fScaleFactor = calculateScaleFactor(rSlideSize);
+    b2Vec2 aPosition = mpBox2DBody->GetPosition();
+    double fX = static_cast<double>(aPosition.x) / fScaleFactor;
+    double fY = static_cast<double>(aPosition.y) / -fScaleFactor;
+    return ::basegfx::B2DPoint(fX, fY);
+}
+
+double box2DBody::getAngle()
+{
+    double fAngle = static_cast<double>(mpBox2DBody->GetAngle());
+    return ::basegfx::rad2deg(-fAngle);
+}
+
+void box2DBody::setType(b2BodyType aType) { mpBox2DBody->SetType(aType); }
+
+b2BodyType box2DBody::getType() { return mpBox2DBody->GetType(); }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/inc/box2dtools.hxx b/slideshow/source/inc/box2dtools.hxx
new file mode 100644
index 000000000000..7035b2f75d50
--- /dev/null
+++ b/slideshow/source/inc/box2dtools.hxx
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <Box2D/Dynamics/b2Body.h>
+#include <Box2D/Dynamics/b2World.h>
+#include "animatableshape.hxx"
+#include "shapeattributelayer.hxx"
+#include <unordered_map>
+
+#define BOX2D_SLIDE_SIZE_IN_METERS 100.00f
+
+namespace slideshow::internal
+{
+class ShapeManager;
+typedef std::shared_ptr<ShapeManager> ShapeManagerSharedPtr;
+}
+
+namespace box2d::utils
+{
+class box2DBody;
+class box2DWorld;
+typedef std::shared_ptr<box2DWorld> Box2DWorldSharedPtr;
+typedef std::shared_ptr<box2DBody> Box2DBodySharedPtr;
+typedef std::unordered_map<css::uno::Reference<css::drawing::XShape>, Box2DBodySharedPtr>
+    XShapeToBox2DBodyPtrMap;
+typedef std::shared_ptr<XShapeToBox2DBodyPtrMap> XShapeToBox2DBodyPtrMapSharedPtr;
+
+double calculateScaleFactor(const ::basegfx::B2DVector& rSlideSize);
+
+class box2DWorld
+{
+private:
+    b2World maBox2DWorld;
+    double mfScaleFactor;
+    bool mbShapesInitialized;
+    bool mbHasWorldStepper;
+    int mnDynamicShapeCount;
+    XShapeToBox2DBodyPtrMap maXShapeToBodyMapPtr;
+
+    b2Body* createStaticFrameAroundSlide(const ::basegfx::B2DVector& rSlideSize);
+
+public:
+    box2DWorld(const ::basegfx::B2DVector& rSlideSize, const float fGravityX = 0.0f,
+               const float fGravityY = -30.0f);
+
+    void step(const float fTimeStep = 1.0f / 60.0f, const int nVelocityIterations = 6,
+              const int nPositionIterations = 2);
+
+    bool getShapesInitialized();
+
+    Box2DBodySharedPtr makeShapeDynamic(const slideshow::internal::ShapeSharedPtr pShape);
+    Box2DBodySharedPtr makeBodyDynamic(const Box2DBodySharedPtr pBox2DBody);
+    Box2DBodySharedPtr makeShapeStatic(const slideshow::internal::ShapeSharedPtr pShape);
+    Box2DBodySharedPtr makeBodyStatic(const Box2DBodySharedPtr pBox2DBody);
+
+    Box2DBodySharedPtr createDynamicBodyFromBoundingBox(
+        const slideshow::internal::ShapeSharedPtr& rShape,
+        const slideshow::internal::ShapeAttributeLayerSharedPtr& rAttrLayer,
+        const float fDensity = 1.0f, const float fFriction = 0.3f);
+
+    Box2DBodySharedPtr
+    createStaticBodyFromBoundingBox(const slideshow::internal::ShapeSharedPtr& rShape,
+                                    const float fDensity = 1.0f, const float fFriction = 0.3f);
+
+    void
+    initateAllShapesAsStaticBodies(const slideshow::internal::ShapeManagerSharedPtr pShapeManager);
+
+    bool hasWorldStepper();
+    void setHasWorldStepper(bool bHasWorldStepper);
+};
+
+class box2DBody
+{
+private:
+    b2Body* mpBox2DBody;
+    //    Box2DWorldSharedPtr mpBox2DWorldSharedPtr;
+
+public:
+    box2DBody(b2Body* pBox2DBody /*, Box2DWorldSharedPtr pBox2DWorldSharedPtr*/);
+
+    ~box2DBody();
+
+    ::basegfx::B2DPoint getPosition(const ::basegfx::B2DVector& rSlideSize);
+    double getAngle();
+
+    void setType(b2BodyType aType);
+    b2BodyType getType();
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 57630350ec91659ca173ec9ea0d36bca00c28bdf
Author:     Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Wed Jun 10 02:33:22 2020 +0300
Commit:     Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Sat Jun 27 01:04:21 2020 +0300

    Add Shape mbIsForeground flag and getters and setters for it
    
    mbIsForeground is a flag that is set false if a shape is known to
    not belong to the foreground.
    
    It is set to false while shapes are being imported and the shape
    belongs to the master slide or is a group shape, right now.
    
    Change-Id: Id9738fc943f32a1e1a6e1888d179e69fd60bd022

diff --git a/slideshow/source/engine/shapes/backgroundshape.cxx b/slideshow/source/engine/shapes/backgroundshape.cxx
index 88d48b7e72e9..093502815eaf 100644
--- a/slideshow/source/engine/shapes/backgroundshape.cxx
+++ b/slideshow/source/engine/shapes/backgroundshape.cxx
@@ -83,6 +83,7 @@ namespace slideshow::internal
             virtual ::basegfx::B2DRectangle getUpdateArea() const override;
             virtual bool isVisible() const override;
             virtual double getPriority() const override;
+            virtual bool isForeground() const override { return false; }
             virtual bool isBackgroundDetached() const override;
 
 
diff --git a/slideshow/source/engine/shapes/shapeimporter.cxx b/slideshow/source/engine/shapes/shapeimporter.cxx
index b1b1b3417269..8f2abded678d 100644
--- a/slideshow/source/engine/shapes/shapeimporter.cxx
+++ b/slideshow/source/engine/shapes/shapeimporter.cxx
@@ -495,6 +495,7 @@ ShapeSharedPtr ShapeImporter::importShape() // throw (ShapeLoadFailedException)
         }
         if( bIsGroupShape && pRet )
         {
+            pRet->setIsForeground(false);
             // push new group on the stack: group traversal
             maShapesStack.push( XShapesEntry( pRet ) );
         }
diff --git a/slideshow/source/engine/slide/slideimpl.cxx b/slideshow/source/engine/slide/slideimpl.cxx
index 0805d084e9fa..a9120c6da829 100644
--- a/slideshow/source/engine/slide/slideimpl.cxx
+++ b/slideshow/source/engine/slide/slideimpl.cxx
@@ -981,7 +981,10 @@ bool SlideImpl::loadShapes()
                     ShapeSharedPtr const& rShape(
                         aMPShapesFunctor.importShape() );
                     if( rShape )
+                    {
+                        rShape->setIsForeground(false);
                         mpLayerManager->addShape( rShape );
+                    }
                 }
                 addPolygons(aMPShapesFunctor.getPolygons());
 
diff --git a/slideshow/source/inc/shape.hxx b/slideshow/source/inc/shape.hxx
index 9b6099462ab6..1638e87c08a7 100644
--- a/slideshow/source/inc/shape.hxx
+++ b/slideshow/source/inc/shape.hxx
@@ -52,7 +52,7 @@ namespace slideshow
         class Shape
         {
         public:
-            Shape() = default;
+            Shape() : mbIsForeground(true) {}
             virtual ~Shape() {}
             Shape(const Shape&) = delete;
             Shape& operator=(const Shape&) = delete;
@@ -204,6 +204,24 @@ namespace slideshow
              */
             virtual bool isBackgroundDetached() const = 0;
 
+            /** Check whether the shape belongs to the foreground
+
+                For instance, if the shape is in the master slide
+                it does not belong to the foreground.
+
+               @return true if the shape is on the foreground
+             */
+            virtual bool isForeground() const { return mbIsForeground; };
+
+            /**
+               Set the flag that holds wheter the shape is
+               in the foreground or not
+
+               @param bIsForeground
+               Shape is on the foreground
+             */
+            virtual void setIsForeground( const bool bIsForeground ) { mbIsForeground = bIsForeground; };
+
             // Misc
 
 
@@ -247,6 +265,14 @@ namespace slideshow
                 }
 
             };
+
+        private:
+            /** Flag to check whether the shape belongs to the foreground.
+
+                For instance, it is false if the shape belongs to the master slide or
+                a group shape.
+             */
+            bool mbIsForeground;
         };
 
         /** A set which contains all shapes in an ordered fashion.
commit c21823767f3e5e6759babb2aa7475c77211c98a0
Author:     Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Wed Jun 10 02:11:36 2020 +0300
Commit:     Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Sat Jun 27 01:04:21 2020 +0300

    adding XShapeToShapeMapSharedPtr getter to ShapeManager
    
    Refactoring XShapeHash in layermanager as XShapeToShapeMap
    and XShapeHash in targetpropertiescreator as XShapeToNamedValuesMap.
    This refactoring describes what the types are more clearly and
    stops violating one define rule in the desired implementation.
    
    In layer manager getting XShapeToShapeMap ready to be passed around
    changing it to be a shared pointer.
    
    And adding getter getXShapeToShapeMap to ShapeManager to enable
    Animation::start() to access Shapes and XShapes of the current
    slide.
    
    Change-Id: I78d510ae43888fd6cf0f037e224b24f91b263b00

diff --git a/slideshow/source/engine/slide/layermanager.cxx b/slideshow/source/engine/slide/layermanager.cxx
index 2ec37ee2c6ff..ca0b7f65b2c8 100644
--- a/slideshow/source/engine/slide/layermanager.cxx
+++ b/slideshow/source/engine/slide/layermanager.cxx
@@ -302,7 +302,7 @@ namespace slideshow::internal
         {
             ENSURE_OR_THROW( xShape.is(), "LayerManager::lookupShape(): invalid Shape" );
 
-            const XShapeHash::const_iterator aIter( maXShapeHash.find( xShape ));
+            const XShapeToShapeMap::const_iterator aIter( maXShapeHash.find( xShape ));
             if( aIter == maXShapeHash.end() )
                 return ShapeSharedPtr(); // not found
 
@@ -341,6 +341,11 @@ namespace slideshow::internal
             return pSubset;
         }
 
+        const XShapeToShapeMap& LayerManager::getXShapeToShapeMap() const
+        {
+            return maXShapeHash;
+        }
+
         void LayerManager::revokeSubset( const AttributableShapeSharedPtr& rOrigShape,
                                          const AttributableShapeSharedPtr& rSubsetShape )
         {
diff --git a/slideshow/source/engine/slide/layermanager.hxx b/slideshow/source/engine/slide/layermanager.hxx
index 0f2844ced967..ec95e08f364c 100644
--- a/slideshow/source/engine/slide/layermanager.hxx
+++ b/slideshow/source/engine/slide/layermanager.hxx
@@ -38,6 +38,16 @@ namespace slideshow
 {
     namespace internal
     {
+        /** A hash map which maps the XShape to the corresponding Shape object.
+
+            Provides quicker lookup than ShapeSet for simple mappings
+         */
+        typedef std::unordered_map<
+              css::uno::Reference< css::drawing::XShape >,
+              ShapeSharedPtr,
+              hash< css::uno::Reference< css::drawing::XShape > >
+            > XShapeToShapeMap;
+
         /* Definition of Layermanager class */
 
         /** This class manages all of a slide's layers (and shapes)
@@ -132,6 +142,13 @@ namespace slideshow
             AttributableShapeSharedPtr getSubsetShape( const AttributableShapeSharedPtr&    rOrigShape,
                                                        const DocTreeNode&                   rTreeNode );
 
+            /** Get a map that maps all Shapes with their XShape reference as the key
+             *
+             * @return an unordered map that contains all shapes in the
+             * current page with their XShape reference as the key
+             */
+            const XShapeToShapeMap& getXShapeToShapeMap() const;
+
             /** Revoke a previously queried subset shape.
 
                 With this method, a previously requested subset shape
@@ -219,15 +236,6 @@ namespace slideshow
             bool renderTo( const ::cppcanvas::CanvasSharedPtr& rTargetCanvas ) const;
 
         private:
-            /** A hash map which maps the XShape to the corresponding Shape object.
-
-                Provides quicker lookup than ShapeSet for simple mappings
-             */
-            typedef std::unordered_map<
-                  css::uno::Reference< css::drawing::XShape >,
-                  ShapeSharedPtr,
-                  hash< css::uno::Reference< css::drawing::XShape > >
-                > XShapeHash;
 
             class ShapeComparator
             {
@@ -311,7 +319,7 @@ namespace slideshow
 
             /** Contains all shapes with their XShape reference as the key
              */
-            XShapeHash               maXShapeHash;
+            XShapeToShapeMap         maXShapeHash;
 
             /** Set of shapes this LayerManager own
 
diff --git a/slideshow/source/engine/slide/shapemanagerimpl.cxx b/slideshow/source/engine/slide/shapemanagerimpl.cxx
index 7863f7e7412b..17f21926ac2f 100644
--- a/slideshow/source/engine/slide/shapemanagerimpl.cxx
+++ b/slideshow/source/engine/slide/shapemanagerimpl.cxx
@@ -267,6 +267,12 @@ ShapeSharedPtr ShapeManagerImpl::lookupShape( uno::Reference< drawing::XShape >
     return ShapeSharedPtr();
 }
 
+const XShapeToShapeMap& ShapeManagerImpl::getXShapeToShapeMap() const
+{
+    assert( mpLayerManager );
+    return mpLayerManager->getXShapeToShapeMap();
+}
+
 void ShapeManagerImpl::addHyperlinkArea( const HyperlinkAreaSharedPtr& rArea )
 {
     maHyperlinkShapes.insert(rArea);
diff --git a/slideshow/source/engine/slide/shapemanagerimpl.hxx b/slideshow/source/engine/slide/shapemanagerimpl.hxx
index 9730975630b0..f084320cac99 100644
--- a/slideshow/source/engine/slide/shapemanagerimpl.hxx
+++ b/slideshow/source/engine/slide/shapemanagerimpl.hxx
@@ -120,6 +120,7 @@ private:
     virtual void notifyShapeUpdate( const ShapeSharedPtr& rShape ) override;
     virtual ShapeSharedPtr lookupShape(
         css::uno::Reference< css::drawing::XShape > const & xShape ) const override;
+    virtual const XShapeToShapeMap& getXShapeToShapeMap() const override;
     virtual void addHyperlinkArea( const HyperlinkAreaSharedPtr& rArea ) override;
 
 
diff --git a/slideshow/source/engine/slide/targetpropertiescreator.cxx b/slideshow/source/engine/slide/targetpropertiescreator.cxx
index 7a70b8b63352..b159bc6c2778 100644
--- a/slideshow/source/engine/slide/targetpropertiescreator.cxx
+++ b/slideshow/source/engine/slide/targetpropertiescreator.cxx
@@ -85,14 +85,14 @@ namespace slideshow::internal
         };
 
         // A hash map which maps a XShape to the corresponding vector of initial properties
-        typedef std::unordered_map< ShapeHashKey, VectorOfNamedValues, ShapeKeyHasher > XShapeHash;
+        typedef std::unordered_map< ShapeHashKey, VectorOfNamedValues, ShapeKeyHasher > XShapeToNamedValuesMap;
 
 
         class NodeFunctor
         {
         public:
             explicit NodeFunctor(
-                XShapeHash& rShapeHash,
+                XShapeToNamedValuesMap& rShapeHash,
                 bool bInitial )
             :   mrShapeHash( rShapeHash ),
                 mxTargetShape(),
@@ -101,7 +101,7 @@ namespace slideshow::internal
             {
             }
 
-            NodeFunctor( XShapeHash&                                rShapeHash,
+            NodeFunctor( XShapeToNamedValuesMap&                    rShapeHash,
                          const uno::Reference< drawing::XShape >&   rTargetShape,
                          sal_Int16                                  nParagraphIndex,
                          bool                                       bInitial) :
@@ -307,7 +307,7 @@ namespace slideshow::internal
             }
 
         private:
-            XShapeHash&                         mrShapeHash;
+            XShapeToNamedValuesMap&             mrShapeHash;
             uno::Reference< drawing::XShape >   mxTargetShape;
             sal_Int16                           mnParagraphIndex;
 
@@ -324,7 +324,7 @@ namespace slideshow::internal
     {
         // scan all nodes for visibility changes, and record first
         // 'visibility=true' for each shape
-        XShapeHash aShapeHash( 101 );
+        XShapeToNamedValuesMap aShapeHash( 101 );
 
         NodeFunctor aFunctor(
             aShapeHash,
diff --git a/slideshow/source/inc/shapemanager.hxx b/slideshow/source/inc/shapemanager.hxx
index ef2e40de6466..db7febb110b7 100644
--- a/slideshow/source/inc/shapemanager.hxx
+++ b/slideshow/source/inc/shapemanager.hxx
@@ -23,6 +23,8 @@
 #include "disposable.hxx"
 #include <com/sun/star/uno/Reference.hxx>
 #include <memory>
+#include <unordered_map>
+#include "tools.hxx"
 
 namespace com::sun::star::drawing { class XShape; }
 
@@ -35,6 +37,11 @@ namespace slideshow
         class HyperlinkArea;
         class AnimatableShape;
         class Shape;
+        typedef std::unordered_map<
+              css::uno::Reference< css::drawing::XShape >,
+              ShapeSharedPtr,
+              hash< css::uno::Reference< css::drawing::XShape > >
+            > XShapeToShapeMap;
         typedef ::std::shared_ptr< AnimatableShape > AnimatableShapeSharedPtr;
         typedef ::std::shared_ptr< Shape > ShapeSharedPtr;
         typedef std::shared_ptr< HyperlinkArea > HyperlinkAreaSharedPtr;
@@ -92,6 +99,13 @@ namespace slideshow
             virtual ShapeSharedPtr lookupShape(
                 css::uno::Reference< css::drawing::XShape > const & xShape ) const = 0;
 
+            /** Get a map that maps all Shapes with their XShape reference as the key
+             *
+             *  @return an unordered map that contains all shapes in the
+             *  current page with their XShape reference as the key
+             */
+            virtual const XShapeToShapeMap& getXShapeToShapeMap() const = 0;
+
             /** Register given shape as a hyperlink target
 
                 @param rArea


More information about the Libreoffice-commits mailing list