summaryrefslogtreecommitdiff
path: root/sd/source/ui/slidesorter/controller/SlsAnimator.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/slidesorter/controller/SlsAnimator.cxx')
-rw-r--r--sd/source/ui/slidesorter/controller/SlsAnimator.cxx232
1 files changed, 232 insertions, 0 deletions
diff --git a/sd/source/ui/slidesorter/controller/SlsAnimator.cxx b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx
new file mode 100644
index 000000000000..56505d9756e6
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx
@@ -0,0 +1,232 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include "precompiled_sd.hxx"
+#include "controller/SlsAnimator.hxx"
+#include "view/SlideSorterView.hxx"
+#include "View.hxx"
+
+namespace sd { namespace slidesorter { namespace controller {
+
+namespace {
+ static const sal_Int32 gnResolution = 25;
+}
+/** Handle one animation function by using a timer for frequent calls to
+ the animations operator().
+*/
+class Animator::Animation
+{
+public:
+ Animation (
+ const Animator::AnimationFunction& rAnimation,
+ const double nDelta);
+ ~Animation (void);
+ bool Run (void);
+ bool IsExpired (void);
+ Animator::AnimationFunction maAnimation;
+ double mnValue;
+ double mnDelta;
+};
+
+
+
+
+class Animator::DrawLock
+{
+public:
+ DrawLock (View& rView);
+ ~DrawLock (void);
+
+private:
+ View& mrView;
+};
+
+
+
+
+Animator::Animator (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ maTimer(),
+ maAnimations(),
+ mpDrawLock()
+{
+ maTimer.SetTimeout(gnResolution);
+ maTimer.SetTimeoutHdl(LINK(this,Animator,TimeoutHandler));
+}
+
+
+
+
+Animator::~Animator (void)
+{
+ maTimer.Stop();
+ mpDrawLock.reset();
+}
+
+
+
+
+void Animator::AddAnimation (
+ const AnimationFunction& rAnimation,
+ const sal_Int32 nDuration)
+{
+ const double nDelta = double(gnResolution) / double(nDuration);
+ maAnimations.push_back(boost::shared_ptr<Animation>(new Animation(rAnimation, nDelta)));
+
+ // Prevent redraws except for the ones in TimeoutHandler.
+ // While the Animator is active it will schedule repaints regularly.
+ // Repaints in between would only lead to visual artifacts.
+ mpDrawLock.reset(new DrawLock(mrSlideSorter.GetView()));
+ maTimer.Start();
+}
+
+
+
+
+bool Animator::ServeAnimations (void)
+{
+ bool bExpired (false);
+
+ AnimationList aCopy (maAnimations);
+ AnimationList::const_iterator iAnimation;
+ for (iAnimation=aCopy.begin(); iAnimation!=aCopy.end(); ++iAnimation)
+ {
+ bExpired |= (*iAnimation)->Run();
+ }
+
+ return bExpired;
+}
+
+
+
+
+void Animator::CleanUpAnimationList (void)
+{
+ AnimationList aActiveAnimations;
+
+ AnimationList::const_iterator iAnimation;
+ for (iAnimation=maAnimations.begin(); iAnimation!=maAnimations.end(); ++iAnimation)
+ {
+ if ( ! (*iAnimation)->IsExpired())
+ aActiveAnimations.push_back(*iAnimation);
+ }
+
+ maAnimations.swap(aActiveAnimations);
+}
+
+
+
+
+IMPL_LINK(Animator, TimeoutHandler, Timer*, EMPTYARG)
+{
+ if (ServeAnimations())
+ CleanUpAnimationList();
+
+ // Unlock the draw lock. This should lead to a repaint.
+ mpDrawLock.reset();
+
+ if (maAnimations.size() > 0)
+ {
+ mpDrawLock.reset(new DrawLock(mrSlideSorter.GetView()));
+ maTimer.Start();
+ }
+
+ return 0;
+}
+
+
+
+
+//===== Animator::Animation ===================================================
+
+Animator::Animation::Animation (
+ const Animator::AnimationFunction& rAnimation,
+ const double nDelta)
+ : maAnimation(rAnimation),
+ mnValue(0),
+ mnDelta(nDelta)
+{
+
+ maAnimation(mnValue);
+ mnValue = mnDelta;
+
+}
+
+
+
+
+Animator::Animation::~Animation (void)
+{
+}
+
+
+
+
+bool Animator::Animation::Run (void)
+{
+ if (mnValue < 1.0)
+ {
+ maAnimation(mnValue);
+ mnValue += mnDelta;
+ return false;
+ }
+ else
+ {
+ maAnimation(1.0);
+ return true;
+ }
+}
+
+
+
+
+bool Animator::Animation::IsExpired (void)
+{
+ return mnValue >= 1.0;
+}
+
+
+
+
+//===== Animator::DrawLock ====================================================
+
+Animator::DrawLock::DrawLock (View& rView)
+ : mrView(rView)
+{
+ mrView.LockRedraw(TRUE);
+}
+
+
+
+
+Animator::DrawLock::~DrawLock (void)
+{
+ mrView.LockRedraw(FALSE);
+}
+
+
+} } } // end of namespace ::sd::slidesorter::controller