1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sdext.hxx"
26 
27 #include "PresenterPaneAnimator.hxx"
28 
29 #include "PresenterAnimation.hxx"
30 #include "PresenterAnimator.hxx"
31 #include "PresenterCanvasHelper.hxx"
32 #include "PresenterController.hxx"
33 #include "PresenterGeometryHelper.hxx"
34 #include "PresenterPaintManager.hxx"
35 #include "PresenterPaneContainer.hxx"
36 #include "PresenterPaneFactory.hxx"
37 #include "PresenterSprite.hxx"
38 #include "PresenterSpritePane.hxx"
39 #include "PresenterWindowManager.hxx"
40 
41 #include <com/sun/star/awt/PosSize.hpp>
42 #include <com/sun/star/awt/XWindowPeer.hpp>
43 #include <com/sun/star/rendering/CompositeOperation.hpp>
44 #include <boost/bind.hpp>
45 #include <boost/bind/protect.hpp>
46 #include <boost/enable_shared_from_this.hpp>
47 
48 using namespace ::com::sun::star;
49 using namespace ::com::sun::star::uno;
50 using namespace ::com::sun::star::drawing::framework;
51 using ::rtl::OUString;
52 using ::std::vector;
53 
54 namespace sdext { namespace presenter {
55 
56 namespace {
57 
58     class PaneGroup;
59 
60     class PresenterPaneAnimatorBase
61         : public ::boost::enable_shared_from_this<PresenterPaneAnimatorBase>,
62           public PresenterPaneAnimator
63     {
64     public:
65         PresenterPaneAnimatorBase (
66             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
67             const ::rtl::Reference<PresenterController>& rpPresenterController,
68             const bool bAnimate,
69             const EndActions& rShowEndActions,
70             const EndActions& rEndEndActions);
71         virtual ~PresenterPaneAnimatorBase (void);
72 
73         typedef ::std::vector< ::boost::function<void()> > EndOperators;
74 
75         void ActivatePanes (void);
76         void ActivatePane (
77             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId);
78         void RestoreFrozenWindows (void);
79         void FreezePanes (const Reference<rendering::XSpriteCanvas>& rxCanvas);
80 
81     protected:
82         ::rtl::Reference<PresenterController> mpPresenterController;
83         ::rtl::Reference<PresenterPaneContainer> mpPaneContainer;
84         ::rtl::Reference<PresenterWindowManager> mpWindowManager;
85         ::std::vector< ::boost::shared_ptr<PaneGroup> > maPaneGroups;
86         css::uno::Reference<css::drawing::framework::XResourceId> mxCenterPaneId;
87         bool mbDoAnimation;
88         EndActions maShowEndActions;
89         EndActions maHideEndActions;
90 
91         void DeactivatePanes (void);
92         void ResizePane (
93             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
94             const geometry::RealRectangle2D& rBox);
95         void DeactivatePane (
96             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId);
97     };
98 
99 
100     class UnfoldInCenterAnimator : public PresenterPaneAnimatorBase
101     {
102     public:
103         UnfoldInCenterAnimator (
104             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
105             const ::rtl::Reference<PresenterController>& rpPresenterController,
106             const bool bAnimate,
107             const EndActions& rShowEndActions,
108             const EndActions& rEndEndActions);
109 
110         virtual ~UnfoldInCenterAnimator (void);
111 
112         virtual void ShowPane (void);
113 
114         virtual void HidePane (void);
115 
116     private:
117         geometry::RealRectangle2D maCenterPaneBox;
118 
119         void SetupPaneGroups (void);
120         geometry::RealRectangle2D MovePanesAway (
121             const css::geometry::RealRectangle2D& rFreeCenterArea);
122     };
123 
124 
125     class MoveInFromBottomAnimator : public PresenterPaneAnimatorBase
126     {
127     public:
128         MoveInFromBottomAnimator(
129             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
130             const ::rtl::Reference<PresenterController>& rpPresenterController,
131             const bool bAnimate,
132             const EndActions& rShowEndActions,
133             const EndActions& rEndEndActions);
134         virtual ~MoveInFromBottomAnimator (void);
135 
136         virtual void ShowPane (void);
137         virtual void HidePane (void);
138 
139     private:
140         ::boost::shared_ptr<PresenterSprite> maNewPaneSprite;
141         geometry::RealRectangle2D maCenterPaneBox;
142 
143         void CreateShowAnimation (
144             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
145             const EndOperators& rpEndOperators,
146             const css::uno::Reference<css::rendering::XSpriteCanvas>& rxSpriteCanvas,
147             const bool bAnimate,
148             const css::geometry::RealPoint2D& rStartLocation,
149             const css::geometry::RealPoint2D& rEndLocation);
150     };
151 
152 
153     class TransparentOverlayAnimator : public PresenterPaneAnimatorBase
154     {
155     public:
156         TransparentOverlayAnimator(
157             const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
158             const ::rtl::Reference<PresenterController>& rpPresenterController,
159             const bool bAnimate,
160             const EndActions& rShowEndActions,
161             const EndActions& rEndEndActions);
162         virtual ~TransparentOverlayAnimator (void);
163 
164         virtual void ShowPane (void);
165         virtual void HidePane (void);
166 
167     private:
168         PresenterSprite maBackgroundSprite;
169         void CreateBackgroundSprite (void);
170     };
171 
172 
173     class PaneDescriptor
174     {
175     public:
176         PresenterPaneContainer::SharedPaneDescriptor mpPaneDescriptor;
177 
178         PaneDescriptor (const PresenterPaneContainer::SharedPaneDescriptor& rpDescriptor);
179         void Restore (void) const;
180     private:
181         double mnLeft;
182         double mnTop;
183         double mnRight;
184         double mnBottom;
185     };
186 
187     class MultiAnimation : public PresenterAnimation
188     {
189     public:
190         typedef ::boost::function<void(double)> Animation;
191         MultiAnimation (const sal_uInt32 nDuration);
192         void AddAnimation (const Animation& rAnimation);
193         virtual void Run (const double nProgress, const sal_uInt64 nCurrentTime);
194     private:
195         vector<Animation> maAnimations;
196     };
197 
198 
199     class PaneGroup
200     {
201     public:
202         PaneGroup (void);
203         ~PaneGroup (void);
204         void AddPane (const PresenterPaneContainer::SharedPaneDescriptor& rpPane);
205         void CreateSubstitution (const Reference<rendering::XSpriteCanvas>& rxCanvas);
206         void ThawPanes (void);
207         void Restore (void);
208         ::boost::shared_ptr<PresenterSprite> GetSubstitution (void);
209         css::geometry::RealRectangle2D GetOriginalBoundingBox (void) const;
210         css::geometry::RealRectangle2D GetCurrentBoundingBox (void) const;
211         void MovePanes (
212             const double nXOffset,
213             const double nYOffset,
214             const ::rtl::Reference<PresenterWindowManager>& rpWindowManager);
215         void ActivatePanes (void);
216         void DeactivatePanes (void);
217         void HidePanes (void);
218         void ShowPanes (void);
219 
220     private:
221         vector<PaneDescriptor> maPanes;
222         awt::Rectangle maOriginalBoundingBox;
223         css::geometry::RealRectangle2D maCurrentBoundingBox;
224         ::boost::shared_ptr<PresenterSprite> mpSubstitution;
225 
226     };
227     typedef ::boost::shared_ptr<PaneGroup> SharedPaneGroup;
228 
229     void InterpolatePosition (
230         const ::boost::function<void(geometry::RealPoint2D)>& rSetter,
231         double nP,
232         const geometry::RealPoint2D rInitialBox,
233         const geometry::RealPoint2D rFinalBox);
234 
235     template<typename T>
236     void InterpolateValue (
237         const ::boost::function<void(T)>& rSetter,
238         double nP,
239         const T aInitialValue,
240         const T aFinalValue);
241 
242     void SpriteTransform(
243         const rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
244         const Reference<XResourceId>& rxPaneId,
245         const Reference<awt::XWindow>& rxSpriteOwnerWindow,
246         const ::boost::shared_ptr<PresenterPaintManager>& rpPaintManager,
247         const bool bAppear,
248         const double nX,
249         const double nInitialTop,
250         const double nFinalTop,
251         const double nP);
252 
253     void SpritePaneMove (
254         const rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
255         const Reference<XResourceId>& rxPaneId,
256         const geometry::RealPoint2D& rLocation);
257 
258     geometry::RealPoint2D GetLocation (const geometry::RealRectangle2D& rBox);
259     geometry::RealSize2D GetSize (const geometry::RealRectangle2D& rBox);
260 
261 
262 } // end of anonymous namespace
263 
264 
265 
266 
267 //=============================================================================
268 
269 
CreateUnfoldInCenterAnimator(const css::uno::Reference<css::drawing::framework::XResourceId> & rxPaneId,const::rtl::Reference<PresenterController> & rpPresenterController,const bool bAnimate,const EndActions & rShowEndActions,const EndActions & rEndEndActions)270 ::boost::shared_ptr<PresenterPaneAnimator> CreateUnfoldInCenterAnimator (
271     const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
272     const ::rtl::Reference<PresenterController>& rpPresenterController,
273     const bool bAnimate,
274     const EndActions& rShowEndActions,
275     const EndActions& rEndEndActions)
276 {
277     return ::boost::shared_ptr<PresenterPaneAnimator>(
278         new UnfoldInCenterAnimator(rxPaneId, rpPresenterController, bAnimate,
279             rShowEndActions, rEndEndActions));
280 }
281 
282 
283 
284 
CreateMoveInFromBottomAnimator(const css::uno::Reference<css::drawing::framework::XResourceId> & rxPaneId,const::rtl::Reference<PresenterController> & rpPresenterController,const bool bAnimate,const EndActions & rShowEndActions,const EndActions & rEndEndActions)285 ::boost::shared_ptr<PresenterPaneAnimator> CreateMoveInFromBottomAnimator (
286         const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
287         const ::rtl::Reference<PresenterController>& rpPresenterController,
288         const bool bAnimate,
289         const EndActions& rShowEndActions,
290         const EndActions& rEndEndActions)
291 {
292     return ::boost::shared_ptr<PresenterPaneAnimator>(
293         new MoveInFromBottomAnimator(rxPaneId, rpPresenterController, bAnimate,
294             rShowEndActions, rEndEndActions));
295 }
296 
297 
298 
299 
CreateTransparentOverlay(const css::uno::Reference<css::drawing::framework::XResourceId> & rxPaneId,const::rtl::Reference<PresenterController> & rpPresenterController,const bool bAnimate,const EndActions & rShowEndActions,const EndActions & rEndEndActions)300 ::boost::shared_ptr<PresenterPaneAnimator> CreateTransparentOverlay (
301         const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
302         const ::rtl::Reference<PresenterController>& rpPresenterController,
303         const bool bAnimate,
304         const EndActions& rShowEndActions,
305         const EndActions& rEndEndActions)
306 {
307     return ::boost::shared_ptr<PresenterPaneAnimator>(
308         new TransparentOverlayAnimator(rxPaneId, rpPresenterController, bAnimate,
309             rShowEndActions, rEndEndActions));
310 }
311 
312 
313 
314 
315 //===== PresenterPaneAnimator =================================================
316 
317 namespace {
318 
PresenterPaneAnimatorBase(const css::uno::Reference<css::drawing::framework::XResourceId> & rxPaneId,const::rtl::Reference<PresenterController> & rpPresenterController,const bool bAnimate,const EndActions & rShowEndActions,const EndActions & rHideEndActions)319 PresenterPaneAnimatorBase::PresenterPaneAnimatorBase (
320     const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
321     const ::rtl::Reference<PresenterController>& rpPresenterController,
322     const bool bAnimate,
323     const EndActions& rShowEndActions,
324     const EndActions& rHideEndActions)
325     : mpPresenterController(rpPresenterController),
326       mpPaneContainer(rpPresenterController->GetPaneContainer()),
327       mpWindowManager(rpPresenterController->GetWindowManager()),
328       maPaneGroups(),
329       mxCenterPaneId(rxPaneId),
330       mbDoAnimation(bAnimate),
331       maShowEndActions(rShowEndActions),
332       maHideEndActions(rHideEndActions)
333 {
334 }
335 
336 
337 
338 
~PresenterPaneAnimatorBase(void)339 PresenterPaneAnimatorBase::~PresenterPaneAnimatorBase (void)
340 {
341 }
342 
343 
344 
345 
FreezePanes(const Reference<rendering::XSpriteCanvas> & rxCanvas)346 void PresenterPaneAnimatorBase::FreezePanes (const Reference<rendering::XSpriteCanvas>& rxCanvas)
347 {
348     ::std::vector<SharedPaneGroup>::const_iterator iGroup;
349     for (iGroup=maPaneGroups.begin(); iGroup!=maPaneGroups.end(); ++iGroup)
350     {
351         (*iGroup)->CreateSubstitution(rxCanvas);
352         (*iGroup)->GetSubstitution()->MoveTo(GetLocation((*iGroup)->GetOriginalBoundingBox()));
353     }
354 }
355 
356 
357 
358 
ActivatePanes(void)359 void PresenterPaneAnimatorBase::ActivatePanes (void)
360 {
361     ActivatePane(mxCenterPaneId);
362 
363     ::std::vector<SharedPaneGroup>::const_iterator iGroup;
364     for (iGroup=maPaneGroups.begin(); iGroup!=maPaneGroups.end(); ++iGroup)
365     {
366         (*iGroup)->ShowPanes();
367         (*iGroup)->ActivatePanes();
368         (*iGroup)->GetSubstitution()->Hide();
369     }
370 
371     mpWindowManager->Update();
372 }
373 
374 
375 
376 
DeactivatePanes(void)377 void PresenterPaneAnimatorBase::DeactivatePanes (void)
378 {
379     ::std::vector<SharedPaneGroup>::const_iterator iGroup;
380     for (iGroup=maPaneGroups.begin(); iGroup!=maPaneGroups.end(); ++iGroup)
381     {
382         (*iGroup)->GetSubstitution()->Show();
383         (*iGroup)->DeactivatePanes();
384         (*iGroup)->HidePanes();
385     }
386 
387     mpWindowManager->Update();
388 }
389 
390 
391 
392 
ResizePane(const Reference<drawing::framework::XResourceId> & rxPaneId,const geometry::RealRectangle2D & rBox)393 void PresenterPaneAnimatorBase::ResizePane (
394     const Reference<drawing::framework::XResourceId>& rxPaneId,
395     const geometry::RealRectangle2D& rBox)
396 {
397     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
398         mpPaneContainer->FindPaneId(rxPaneId));
399     if (pDescriptor.get() != NULL)
400     {
401         mpWindowManager->SetPanePosSizeAbsolute (
402             rxPaneId->getResourceURL(),
403             rBox.X1,
404             rBox.Y1,
405             rBox.X2-rBox.X1,
406             rBox.Y2-rBox.Y1);
407         mpWindowManager->Layout();
408         if ( ! pDescriptor->maSpriteProvider.empty())
409         {
410             pDescriptor->maSpriteProvider()->Resize(GetSize(rBox));
411         }
412     }
413 }
414 
415 
416 
417 
RestoreFrozenWindows(void)418 void PresenterPaneAnimatorBase::RestoreFrozenWindows (void)
419 {
420     ::std::vector<SharedPaneGroup>::const_iterator iGroup;
421     for (iGroup=maPaneGroups.begin(); iGroup!=maPaneGroups.end(); ++iGroup)
422     {
423         (*iGroup)->Restore();
424         (*iGroup)->ShowPanes();
425         (*iGroup)->ActivatePanes();
426         (*iGroup)->GetSubstitution()->Hide();
427     }
428     maPaneGroups.clear();
429 
430     ActivatePane(mxCenterPaneId);
431 
432     mpWindowManager->Update();
433 }
434 
435 
436 
437 
ActivatePane(const Reference<drawing::framework::XResourceId> & rxPaneId)438 void PresenterPaneAnimatorBase::ActivatePane (
439     const Reference<drawing::framework::XResourceId>& rxPaneId)
440 {
441     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
442         mpPaneContainer->FindPaneId(rxPaneId));
443     if (pDescriptor.get() != NULL)
444         pDescriptor->SetActivationState(true);
445 }
446 
447 
448 
449 
DeactivatePane(const Reference<drawing::framework::XResourceId> & rxPaneId)450 void PresenterPaneAnimatorBase::DeactivatePane (
451     const Reference<drawing::framework::XResourceId>& rxPaneId)
452 {
453     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
454         mpPaneContainer->FindPaneId(rxPaneId));
455     if (pDescriptor.get() != NULL)
456         pDescriptor->SetActivationState(false);
457 }
458 
459 
460 
461 
462 //===== UnfoldInCenterAnimator ================================================
463 
UnfoldInCenterAnimator(const css::uno::Reference<css::drawing::framework::XResourceId> & rxPaneId,const::rtl::Reference<PresenterController> & rpPresenterController,const bool bAnimate,const EndActions & rShowEndActions,const EndActions & rEndEndActions)464 UnfoldInCenterAnimator::UnfoldInCenterAnimator (
465     const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
466     const ::rtl::Reference<PresenterController>& rpPresenterController,
467     const bool bAnimate,
468     const EndActions& rShowEndActions,
469     const EndActions& rEndEndActions)
470     : PresenterPaneAnimatorBase(rxPaneId, rpPresenterController, bAnimate,
471         rShowEndActions, rEndEndActions)
472 {
473 }
474 
475 
476 
477 
~UnfoldInCenterAnimator(void)478 UnfoldInCenterAnimator::~UnfoldInCenterAnimator (void)
479 {
480 }
481 
482 
483 
484 
ShowPane(void)485 void UnfoldInCenterAnimator::ShowPane (void)
486 {
487     OSL_ASSERT(mpWindowManager.get()!=NULL);
488 
489     Reference<awt::XWindow> xParentWindow (mpWindowManager->GetParentWindow(), UNO_QUERY);
490     if ( ! xParentWindow.is())
491         return;
492 
493     Reference<rendering::XSpriteCanvas> xCanvas (mpWindowManager->GetParentCanvas(), UNO_QUERY);
494     if ( ! xCanvas.is())
495         return;
496 
497     Reference<rendering::XBitmap> xParentBitmap (xCanvas, UNO_QUERY);
498     if ( ! xParentBitmap.is())
499         return;
500 
501     Reference<rendering::XGraphicDevice> xDevice(xCanvas->getDevice());
502     if ( ! xDevice.is())
503         return;
504 
505     awt::Rectangle aWindowBox (xParentWindow->getPosSize());
506 
507     // Create two pane groups that will be moved together.  One contains the
508     // notes view, the other group contains all other panes.
509     SetupPaneGroups();
510 
511     // Setup the places where the two pane groups are moved to.
512     maCenterPaneBox
513         = MovePanesAway(geometry::RealRectangle2D(0,200,aWindowBox.Width, aWindowBox.Height-200));
514 
515     // Setup the final size of the new pane so that it fits into the space
516     // between the two pane groups.
517     ResizePane(mxCenterPaneId, maCenterPaneBox);
518 
519     // Avoid that the center pane updates its previews while being animated.
520     DeactivatePane(mxCenterPaneId);
521 
522     // Replace the pane groups with sprites that look like the panes but can
523     // be moved around much faster.
524     FreezePanes(xCanvas);
525 
526     // The vertical center of the new pane.
527     const double nY0 ((maPaneGroups[0]->GetOriginalBoundingBox().Y2
528             + maPaneGroups[1]->GetOriginalBoundingBox().Y1) / 2);
529 
530     // Make sure that the new pane is painted once before the animation starts.
531     SpriteTransform(
532         mpPaneContainer,
533         mxCenterPaneId,
534         xParentWindow,
535         mpPresenterController->GetPaintManager(),
536         true,
537         maCenterPaneBox.X1,
538         nY0,
539         maCenterPaneBox.Y1,
540         0);
541     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
542         mpPaneContainer->FindPaneId(mxCenterPaneId));
543     if (pDescriptor.get() != NULL)
544     {
545         mpPresenterController->GetPaintManager()->Invalidate(
546             pDescriptor->mxBorderWindow,
547             true);
548     }
549 
550     // Animate the upper and lower window bitmaps.
551     ::boost::shared_ptr<MultiAnimation> pMultiAnimation (
552         new MultiAnimation(mbDoAnimation ? 500 : 0));
553 
554     // Animate the pane group sprites to be moved up or down.
555     vector<SharedPaneGroup>::const_iterator iGroup;
556     for (iGroup=maPaneGroups.begin(); iGroup!=maPaneGroups.end(); ++iGroup)
557     {
558         pMultiAnimation->AddAnimation(
559             ::boost::bind(
560                 InterpolatePosition,
561                 ::boost::protect(::boost::bind(
562                     &PresenterSprite::MoveTo, (*iGroup)->GetSubstitution(), _1)),
563                 _1,
564                 GetLocation((*iGroup)->GetOriginalBoundingBox()),
565                 GetLocation((*iGroup)->GetCurrentBoundingBox())));
566     }
567 
568     // Animate the new center pane to expand.
569     pMultiAnimation->AddAnimation(
570         ::boost::bind(
571             SpriteTransform,
572             mpPaneContainer,
573             mxCenterPaneId,
574             xParentWindow,
575             mpPresenterController->GetPaintManager(),
576             true,
577             maCenterPaneBox.X1,
578             nY0,
579             maCenterPaneBox.Y1,
580             _1));
581 
582     // Call updateScreen after each animation step.
583     if (xCanvas.is())
584         pMultiAnimation->AddAnimation(
585             ::boost::bind(&rendering::XSpriteCanvas::updateScreen, xCanvas, sal_False));
586 
587     // Activate the panes when the animation is over.
588     pMultiAnimation->AddEndCallback(
589         ::boost::bind(&PresenterPaneAnimatorBase::ActivatePanes, shared_from_this()));
590     EndActions::const_iterator iAction;
591     for (iAction=maShowEndActions.begin(); iAction!=maShowEndActions.end(); ++iAction)
592         pMultiAnimation->AddEndCallback(*iAction);
593 
594     // Start the animation.
595     ::boost::shared_ptr<PresenterAnimator> pAnimator (mpPresenterController->GetAnimator());
596     OSL_ASSERT(pAnimator.get()!=NULL);
597     pAnimator->AddAnimation(SharedPresenterAnimation(pMultiAnimation));
598 
599     mpWindowManager->Update();
600 }
601 
602 
603 
604 
HidePane(void)605 void UnfoldInCenterAnimator::HidePane (void)
606 {
607     OSL_ASSERT(mpWindowManager.get()!=NULL);
608 
609     Reference<awt::XWindow> xParentWindow (mpWindowManager->GetParentWindow(), UNO_QUERY);
610     if ( ! xParentWindow.is())
611         return;
612 
613     DeactivatePanes();
614     DeactivatePane(mxCenterPaneId);
615 
616     ::boost::shared_ptr<PresenterAnimator> pAnimator (mpPresenterController->GetAnimator());
617     const awt::Rectangle aWindowBox (xParentWindow->getPosSize());
618     const rendering::ViewState aViewState (
619         geometry::AffineMatrix2D(1,0,0, 0,1,0),
620         NULL);
621     const rendering::RenderState aRenderState (
622         geometry::AffineMatrix2D(1,0,0, 0,1,0),
623         NULL,
624         Sequence<double>(4),
625         rendering::CompositeOperation::SOURCE);
626 
627     // Animate the uppder and lower window bitmaps.
628     Reference<rendering::XSpriteCanvas> xSpriteCanvas (mpWindowManager->GetParentCanvas(), UNO_QUERY);
629     ::boost::shared_ptr<MultiAnimation> pMultiAnimation (new MultiAnimation(mbDoAnimation ? 500 : 1));
630 
631     vector<SharedPaneGroup>::const_iterator iGroup;
632     for (iGroup=maPaneGroups.begin(); iGroup!=maPaneGroups.end(); ++iGroup)
633     {
634         pMultiAnimation->AddAnimation(
635             ::boost::bind(
636                 InterpolatePosition,
637                 ::boost::protect(::boost::bind(
638                     &PresenterSprite::MoveTo, (*iGroup)->GetSubstitution(), _1)),
639                 _1,
640                 GetLocation((*iGroup)->GetCurrentBoundingBox()),
641                 GetLocation((*iGroup)->GetOriginalBoundingBox())));
642     }
643 
644     // Animate the new center pane to collapse.
645     const double nY0 ((maPaneGroups[0]->GetOriginalBoundingBox().Y2
646             + maPaneGroups[1]->GetOriginalBoundingBox().Y1) / 2);
647     pMultiAnimation->AddAnimation(
648         ::boost::bind(
649             SpriteTransform,
650             mpPaneContainer,
651             mxCenterPaneId,
652             xParentWindow,
653             mpPresenterController->GetPaintManager(),
654             false,
655             maCenterPaneBox.X1,
656             nY0,
657             maCenterPaneBox.Y1,
658             _1));
659 
660     if (mbDoAnimation)
661     {
662         pMultiAnimation->AddAnimation(
663             ::boost::bind(&rendering::XSpriteCanvas::updateScreen, xSpriteCanvas, sal_False));
664     }
665     pMultiAnimation->AddEndCallback(
666         ::boost::bind(&PresenterPaneAnimatorBase::RestoreFrozenWindows, shared_from_this()));
667     EndActions::const_iterator iAction;
668     for (iAction=maHideEndActions.begin(); iAction!=maHideEndActions.end(); ++iAction)
669         pMultiAnimation->AddEndCallback(*iAction);
670 
671     pAnimator->AddAnimation(SharedPresenterAnimation(pMultiAnimation));
672 }
673 
674 
675 
676 
SetupPaneGroups(void)677 void UnfoldInCenterAnimator::SetupPaneGroups (void)
678 {
679     maPaneGroups.clear();
680 
681     // Setup the upper pane group.
682     SharedPaneGroup pUpperPanes (new PaneGroup());
683     pUpperPanes->AddPane(mpPaneContainer->FindPaneURL(
684         PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
685     pUpperPanes->AddPane(mpPaneContainer->FindPaneURL(
686         PresenterPaneFactory::msNextSlidePreviewPaneURL));
687     pUpperPanes->AddPane(mpPaneContainer->FindPaneURL(
688         PresenterPaneFactory::msToolBarPaneURL));
689     pUpperPanes->AddPane(mpPaneContainer->FindPaneURL(
690         PresenterPaneFactory::msHelpPaneURL));
691     maPaneGroups.push_back(pUpperPanes);
692 
693     // Setup the lower pane group.
694     SharedPaneGroup pLowerPanes (new PaneGroup());
695     pLowerPanes->AddPane(mpPaneContainer->FindPaneURL(
696         PresenterPaneFactory::msNotesPaneURL));
697     maPaneGroups.push_back(pLowerPanes);
698 }
699 
700 
701 
702 
MovePanesAway(const geometry::RealRectangle2D & rFreeCenterArea)703 geometry::RealRectangle2D UnfoldInCenterAnimator::MovePanesAway (
704     const geometry::RealRectangle2D& rFreeCenterArea)
705 {
706     SharedPaneGroup aUpperPanes = maPaneGroups[0];
707     SharedPaneGroup aLowerPanes = maPaneGroups[1];
708 
709     // Move upper pane group out of the way.
710     const double nTop (rFreeCenterArea.Y1);
711     const double nUpperVerticalOffset (nTop - aUpperPanes->GetOriginalBoundingBox().Y2);
712     aUpperPanes->MovePanes(0, nUpperVerticalOffset, mpWindowManager);
713 
714     // Move lower pane group out of the way.
715     const double nBottom (rFreeCenterArea.Y2);
716     const double nLowerVerticalOffset (nBottom - aLowerPanes->GetOriginalBoundingBox().Y1);
717     aLowerPanes->MovePanes(0, nLowerVerticalOffset, mpWindowManager);
718 
719     return geometry::RealRectangle2D(
720         ::std::min(
721             aUpperPanes->GetOriginalBoundingBox().X1,
722             aLowerPanes->GetOriginalBoundingBox().X1),
723         nTop+20,
724         ::std::max(
725             aUpperPanes->GetOriginalBoundingBox().X2,
726             aLowerPanes->GetOriginalBoundingBox().X2),
727         nBottom-20);
728 }
729 
730 
731 
732 
733 //===== MoveInFromBottomAnimator ==============================================
734 
MoveInFromBottomAnimator(const css::uno::Reference<css::drawing::framework::XResourceId> & rxPaneId,const::rtl::Reference<PresenterController> & rpPresenterController,const bool bAnimate,const EndActions & rShowEndActions,const EndActions & rEndEndActions)735 MoveInFromBottomAnimator::MoveInFromBottomAnimator (
736     const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
737     const ::rtl::Reference<PresenterController>& rpPresenterController,
738     const bool bAnimate,
739     const EndActions& rShowEndActions,
740     const EndActions& rEndEndActions)
741     : PresenterPaneAnimatorBase(rxPaneId, rpPresenterController, bAnimate,
742         rShowEndActions, rEndEndActions),
743       maNewPaneSprite()
744 {
745 }
746 
747 
748 
749 
~MoveInFromBottomAnimator(void)750 MoveInFromBottomAnimator::~MoveInFromBottomAnimator (void)
751 {
752 }
753 
754 
755 
756 
ShowPane(void)757 void MoveInFromBottomAnimator::ShowPane (void)
758 {
759     OSL_ASSERT(mpWindowManager.get()!=NULL);
760 
761     Reference<awt::XWindow> xParentWindow (mpWindowManager->GetParentWindow(), UNO_QUERY);
762     if ( ! xParentWindow.is())
763         return;
764 
765     Reference<rendering::XSpriteCanvas> xCanvas (mpWindowManager->GetParentCanvas(), UNO_QUERY);
766     if ( ! xCanvas.is())
767         return;
768 
769     Reference<rendering::XBitmap> xParentBitmap (xCanvas, UNO_QUERY);
770     if ( ! xParentBitmap.is())
771         return;
772 
773     Reference<rendering::XGraphicDevice> xDevice(xCanvas->getDevice());
774     if ( ! xDevice.is())
775         return;
776 
777     awt::Rectangle aWindowBox (xParentWindow->getPosSize());
778 
779     // Create a pane group that just contains the notes view.
780     SharedPaneGroup pLowerPanes (new PaneGroup());
781     pLowerPanes->AddPane(mpPaneContainer->FindPaneURL(
782         PresenterPaneFactory::msNotesPaneURL));
783     maPaneGroups.push_back(pLowerPanes);
784 
785     // Deactivate the panes that will take place in the animation.
786     pLowerPanes->DeactivatePanes();
787     DeactivatePane(mxCenterPaneId);
788 
789     // Set the size of the new pane.
790     maCenterPaneBox = pLowerPanes->GetOriginalBoundingBox();
791     ResizePane(mxCenterPaneId, maCenterPaneBox);
792 
793     geometry::RealPoint2D aStartLocation (maCenterPaneBox.X1, aWindowBox.Height);
794     geometry::RealPoint2D aEndLocation (maCenterPaneBox.X1, maCenterPaneBox.Y1);
795 
796     // Get the sprite of the new pane, make it visible and move it to the
797     // start location.
798     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
799         mpPaneContainer->FindPaneId(mxCenterPaneId));
800     if (pDescriptor.get() != NULL)
801     {
802         if (pDescriptor->mxBorderWindow.is())
803             pDescriptor->mxBorderWindow->setVisible(sal_True);
804 
805         maNewPaneSprite = pDescriptor->maSpriteProvider();
806         if (maNewPaneSprite.get() != NULL)
807         {
808             maNewPaneSprite->MoveTo(aStartLocation);
809             maNewPaneSprite->Show();
810         }
811         xCanvas->updateScreen(sal_False);
812     }
813 
814     CreateShowAnimation(
815         mxCenterPaneId,
816         maShowEndActions,
817         xCanvas,
818         mbDoAnimation,
819         aStartLocation,
820         aEndLocation);
821 
822     mpWindowManager->Update();
823 }
824 
825 
826 
827 
HidePane(void)828 void MoveInFromBottomAnimator::HidePane (void)
829 {
830     OSL_ASSERT(mpWindowManager.get()!=NULL);
831 
832     Reference<awt::XWindow> xParentWindow (mpWindowManager->GetParentWindow(), UNO_QUERY);
833     if ( ! xParentWindow.is())
834         return;
835 
836     Reference<rendering::XSpriteCanvas> xCanvas (mpWindowManager->GetParentCanvas(), UNO_QUERY);
837     if ( ! xCanvas.is())
838         return;
839 
840     DeactivatePanes();
841     DeactivatePane(mxCenterPaneId);
842 
843     SharedPaneGroup aPanes (maPaneGroups[0]);
844 
845     aPanes->ShowPanes();
846 
847     ::boost::shared_ptr<MultiAnimation> pMultiAnimation (
848         new MultiAnimation(mbDoAnimation ? 500 : 0));
849     awt::Rectangle aWindowBox (xParentWindow->getPosSize());
850 
851     // Animate the new center pane to collapse.
852     pMultiAnimation->AddAnimation(
853         ::boost::bind(
854             InterpolatePosition,
855             ::boost::protect(::boost::bind(&SpritePaneMove, mpPaneContainer, mxCenterPaneId, _1)),
856             _1,
857             geometry::RealPoint2D(maCenterPaneBox.X1, maCenterPaneBox.Y1),
858             geometry::RealPoint2D(maCenterPaneBox.X1, aWindowBox.Height)));
859 
860     if (mbDoAnimation)
861     {
862         pMultiAnimation->AddAnimation(
863             ::boost::bind(&rendering::XSpriteCanvas::updateScreen, xCanvas, sal_False));
864     }
865     pMultiAnimation->AddEndCallback(
866         ::boost::bind(&PresenterPaneAnimatorBase::RestoreFrozenWindows, shared_from_this()));
867     EndActions::const_iterator iAction;
868     for (iAction=maHideEndActions.begin(); iAction!=maHideEndActions.end(); ++iAction)
869         pMultiAnimation->AddEndCallback(*iAction);
870 
871     ::boost::shared_ptr<PresenterAnimator> pAnimator (mpPresenterController->GetAnimator());
872     pAnimator->AddAnimation(SharedPresenterAnimation(pMultiAnimation));
873 }
874 
875 
876 
877 
CreateShowAnimation(const Reference<drawing::framework::XResourceId> & rxPaneId,const EndOperators & rEndOperators,const Reference<rendering::XSpriteCanvas> & rxSpriteCanvas,const bool bAnimate,const geometry::RealPoint2D & rStartLocation,const geometry::RealPoint2D & rEndLocation)878 void MoveInFromBottomAnimator::CreateShowAnimation (
879     const Reference<drawing::framework::XResourceId>& rxPaneId,
880     const EndOperators& rEndOperators,
881     const Reference<rendering::XSpriteCanvas>& rxSpriteCanvas,
882     const bool bAnimate,
883     const geometry::RealPoint2D& rStartLocation,
884     const geometry::RealPoint2D& rEndLocation)
885 {
886     // Animate the uppder and lower window bitmaps.
887     ::boost::shared_ptr<MultiAnimation> pMultiAnimation (new MultiAnimation(bAnimate ? 500 : 0));
888 
889     // Animate new pane to move in from the buttom.
890     pMultiAnimation->AddAnimation(
891         ::boost::bind(
892             InterpolatePosition,
893             ::boost::protect(::boost::bind(&SpritePaneMove, mpPaneContainer, rxPaneId, _1)),
894             _1,
895             rStartLocation,
896             rEndLocation));
897 
898     // Call updateScreen after each animation step.
899     if (rxSpriteCanvas.is())
900         pMultiAnimation->AddAnimation(
901             ::boost::bind(&rendering::XSpriteCanvas::updateScreen, rxSpriteCanvas, sal_False));
902 
903     // Activate the panes when the animation is over.
904     pMultiAnimation->AddEndCallback(
905         ::boost::bind(&PaneGroup::HidePanes, maPaneGroups[0]));
906     pMultiAnimation->AddEndCallback(
907         ::boost::bind(&PresenterPaneAnimatorBase::ActivatePane, shared_from_this(), mxCenterPaneId));
908     EndActions::const_iterator iAction;
909     for (iAction=rEndOperators.begin(); iAction!=rEndOperators.end(); ++iAction)
910         pMultiAnimation->AddEndCallback(*iAction);
911 
912     // Start the animation.
913     ::boost::shared_ptr<PresenterAnimator> pAnimator (mpPresenterController->GetAnimator());
914     OSL_ASSERT(pAnimator.get()!=NULL);
915     pAnimator->AddAnimation(SharedPresenterAnimation(pMultiAnimation));
916 }
917 
918 
919 
920 
921 
922 //===== TransparentOverlayAnimator ============================================
923 
TransparentOverlayAnimator(const css::uno::Reference<css::drawing::framework::XResourceId> & rxPaneId,const::rtl::Reference<PresenterController> & rpPresenterController,const bool bAnimate,const EndActions & rShowEndActions,const EndActions & rEndEndActions)924 TransparentOverlayAnimator::TransparentOverlayAnimator (
925     const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
926     const ::rtl::Reference<PresenterController>& rpPresenterController,
927     const bool bAnimate,
928     const EndActions& rShowEndActions,
929     const EndActions& rEndEndActions)
930     : PresenterPaneAnimatorBase(
931         rxPaneId,
932         rpPresenterController,
933         bAnimate,
934         rShowEndActions,
935         rEndEndActions),
936       maBackgroundSprite()
937 {
938 }
939 
940 
941 
942 
~TransparentOverlayAnimator(void)943 TransparentOverlayAnimator::~TransparentOverlayAnimator (void)
944 {
945 }
946 
947 
948 
949 
ShowPane(void)950 void TransparentOverlayAnimator::ShowPane (void)
951 {
952     EndActions::const_iterator iAction;
953     for (iAction=maShowEndActions.begin(); iAction!=maShowEndActions.end(); ++iAction)
954         (*iAction)();
955 
956     CreateBackgroundSprite();
957 
958     Reference<awt::XWindow> xParentWindow (mpWindowManager->GetParentWindow(), UNO_QUERY);
959     if (xParentWindow.is())
960     {
961         const awt::Rectangle aWindowBox (xParentWindow->getPosSize());
962         SharedPaneGroup pAllPanes (new PaneGroup());
963         pAllPanes->AddPane(mpPaneContainer->FindPaneURL(
964             PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
965         pAllPanes->AddPane(mpPaneContainer->FindPaneURL(
966             PresenterPaneFactory::msNextSlidePreviewPaneURL));
967         pAllPanes->AddPane(mpPaneContainer->FindPaneURL(
968             PresenterPaneFactory::msToolBarPaneURL));
969         pAllPanes->AddPane(mpPaneContainer->FindPaneURL(
970             PresenterPaneFactory::msHelpPaneURL));
971         pAllPanes->AddPane(mpPaneContainer->FindPaneURL(
972             PresenterPaneFactory::msNotesPaneURL));
973         maPaneGroups.push_back(pAllPanes);
974         pAllPanes->DeactivatePanes();
975         mpWindowManager->Update();
976     }
977 
978     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
979         mpPaneContainer->FindPaneId(mxCenterPaneId));
980     if (pDescriptor.get() != NULL)
981     {
982         PresenterSpritePane* pPane = dynamic_cast<PresenterSpritePane*>(
983             pDescriptor->mxPane.get());
984         if (pPane != NULL)
985             pPane->ShowTransparentBorder();
986 
987         pDescriptor->SetActivationState(true);
988         if (pDescriptor->mxBorderWindow.is())
989             pDescriptor->mxBorderWindow->setVisible(sal_True);
990     }
991 }
992 
993 
994 
995 
HidePane(void)996 void TransparentOverlayAnimator::HidePane (void)
997 {
998     maPaneGroups[0]->ActivatePanes();
999     EndActions::const_iterator iAction;
1000     for (iAction=maHideEndActions.begin(); iAction!=maHideEndActions.end(); ++iAction)
1001         (*iAction)();
1002     mpWindowManager->Update();
1003 }
1004 
1005 
1006 
1007 
CreateBackgroundSprite(void)1008 void TransparentOverlayAnimator::CreateBackgroundSprite (void)
1009 {
1010     Reference<awt::XWindow> xParentWindow (mpWindowManager->GetParentWindow(), UNO_QUERY);
1011     Reference<rendering::XSpriteCanvas> xParentCanvas (mpWindowManager->GetParentCanvas(), UNO_QUERY);
1012     if (xParentWindow.is() && xParentCanvas.is())
1013     {
1014         const awt::Rectangle aWindowBox (xParentWindow->getPosSize());
1015         maBackgroundSprite.SetFactory(xParentCanvas);
1016         maBackgroundSprite.Resize(
1017             geometry::RealSize2D(aWindowBox.Width, aWindowBox.Height));
1018         maBackgroundSprite.MoveTo(
1019             geometry::RealPoint2D(aWindowBox.X, aWindowBox.Y));
1020         maBackgroundSprite.SetAlpha(0.5);
1021         maBackgroundSprite.Show();
1022 
1023         Reference<rendering::XCanvas> xCanvas (maBackgroundSprite.GetCanvas());
1024 
1025         if (xCanvas.is())
1026         {
1027             rendering::ViewState aViewState(
1028                 geometry::AffineMatrix2D(1,0,0, 0,1,0),
1029                 NULL);
1030 
1031             rendering::RenderState aRenderState(
1032                 geometry::AffineMatrix2D(1,0,0, 0,1,0),
1033                 NULL,
1034                 Sequence<double>(4),
1035                 rendering::CompositeOperation::SOURCE);
1036             PresenterCanvasHelper::SetDeviceColor(aRenderState, util::Color(0x80808080));
1037 
1038             Reference<rendering::XPolyPolygon2D> xPolygon (
1039                 PresenterGeometryHelper::CreatePolygon(aWindowBox, xCanvas->getDevice()));
1040             if (xPolygon.is())
1041                 xCanvas->fillPolyPolygon(
1042                     xPolygon,
1043                     aViewState,
1044                     aRenderState);
1045         }
1046     }
1047 }
1048 
1049 
1050 
1051 
1052 //===== PaneGroup =============================================================
1053 
PaneGroup(void)1054 PaneGroup::PaneGroup (void)
1055     : maPanes(),
1056       maOriginalBoundingBox(),
1057       maCurrentBoundingBox(),
1058       mpSubstitution(new PresenterSprite())
1059 {
1060 }
1061 
1062 
1063 
1064 
~PaneGroup(void)1065 PaneGroup::~PaneGroup (void)
1066 {
1067     mpSubstitution.reset();
1068 }
1069 
1070 
1071 
1072 
AddPane(const PresenterPaneContainer::SharedPaneDescriptor & rpPane)1073 void PaneGroup::AddPane (const PresenterPaneContainer::SharedPaneDescriptor& rpPane)
1074 {
1075     OSL_ASSERT(rpPane.get() != NULL);
1076 
1077     if (rpPane->mxBorderWindow.is())
1078     {
1079         PaneDescriptor aDescriptor (rpPane);
1080         maPanes.push_back(aDescriptor);
1081         maOriginalBoundingBox = PresenterGeometryHelper::Union(
1082             maOriginalBoundingBox,
1083             rpPane->mxBorderWindow->getPosSize());
1084     }
1085 }
1086 
1087 
1088 
1089 
CreateSubstitution(const Reference<rendering::XSpriteCanvas> & rxCanvas)1090 void PaneGroup::CreateSubstitution (const Reference<rendering::XSpriteCanvas>& rxCanvas)
1091 {
1092     // Get the bitmap of the background.
1093     Reference<rendering::XBitmap> xBackgroundBitmap (rxCanvas, UNO_QUERY);
1094     if ( ! xBackgroundBitmap.is())
1095         return;
1096 
1097     // Create the sprite.
1098     mpSubstitution->SetFactory(rxCanvas);
1099     mpSubstitution->Resize(
1100         geometry::RealSize2D(maOriginalBoundingBox.Width, maOriginalBoundingBox.Height));
1101 
1102     // Fill it with the background inside the bounding box.
1103     const rendering::ViewState aViewState (
1104         geometry::AffineMatrix2D(1,0,0, 0,1,0),
1105         NULL);
1106     const rendering::RenderState aRenderState (
1107         geometry::AffineMatrix2D(1,0,-maOriginalBoundingBox.X, 0,1,-maOriginalBoundingBox.Y),
1108         NULL,
1109         Sequence<double>(4),
1110         rendering::CompositeOperation::SOURCE);
1111 
1112     Reference<rendering::XCanvas> xSpriteCanvas (mpSubstitution->GetCanvas());
1113     if (xSpriteCanvas.is())
1114         xSpriteCanvas->drawBitmap(xBackgroundBitmap, aViewState, aRenderState);
1115 }
1116 
1117 
1118 
1119 
Restore(void)1120 void PaneGroup::Restore (void)
1121 {
1122     vector<PaneDescriptor>::iterator iPane;
1123     for (iPane=maPanes.begin(); iPane!=maPanes.end(); ++iPane)
1124     {
1125         iPane->Restore();
1126     }
1127 }
1128 
1129 
1130 
1131 
GetSubstitution(void)1132 ::boost::shared_ptr<PresenterSprite> PaneGroup::GetSubstitution (void)
1133 {
1134     return mpSubstitution;
1135 }
1136 
1137 
1138 
1139 
GetOriginalBoundingBox(void) const1140 geometry::RealRectangle2D PaneGroup::GetOriginalBoundingBox (void) const
1141 {
1142     return geometry::RealRectangle2D(
1143         maOriginalBoundingBox.X,
1144         maOriginalBoundingBox.Y,
1145         maOriginalBoundingBox.X + maOriginalBoundingBox.Width,
1146         maOriginalBoundingBox.Y + maOriginalBoundingBox.Height);
1147 }
1148 
1149 
1150 
1151 
GetCurrentBoundingBox(void) const1152 geometry::RealRectangle2D PaneGroup::GetCurrentBoundingBox (void) const
1153 {
1154     return maCurrentBoundingBox;
1155 }
1156 
1157 
1158 
1159 
MovePanes(const double nXOffset,const double nYOffset,const::rtl::Reference<PresenterWindowManager> & rpWindowManager)1160 void PaneGroup::MovePanes (
1161     const double nXOffset,
1162     const double nYOffset,
1163     const ::rtl::Reference<PresenterWindowManager>& rpWindowManager
1164     )
1165 {
1166     awt::Rectangle aBBox;
1167     vector<PaneDescriptor>::iterator iPane;
1168     for (iPane=maPanes.begin(); iPane!=maPanes.end(); ++iPane)
1169     {
1170         awt::Rectangle aBox (iPane->mpPaneDescriptor->mxBorderWindow->getPosSize());
1171         aBox.X += sal_Int32(nXOffset);
1172         aBox.Y += sal_Int32(nYOffset);
1173         rpWindowManager->SetPanePosSizeAbsolute(
1174             iPane->mpPaneDescriptor->mxPaneId->getResourceURL(),
1175             aBox.X,
1176             aBox.Y,
1177             aBox.Width,
1178             aBox.Height);
1179         aBBox = PresenterGeometryHelper::Union(aBBox, aBox);
1180     }
1181     maCurrentBoundingBox = geometry::RealRectangle2D(
1182         aBBox.X, aBBox.Y, aBBox.X+aBBox.Width, aBBox.Y+aBBox.Height);
1183 }
1184 
1185 
1186 
1187 
ActivatePanes(void)1188 void PaneGroup::ActivatePanes (void)
1189 {
1190     vector<PaneDescriptor>::iterator iPane;
1191     for (iPane=maPanes.begin(); iPane!=maPanes.end(); ++iPane)
1192     {
1193         iPane->mpPaneDescriptor->SetActivationState(true);
1194     }
1195 }
1196 
1197 
1198 
1199 
DeactivatePanes(void)1200 void PaneGroup::DeactivatePanes (void)
1201 {
1202     vector<PaneDescriptor>::iterator iPane;
1203     for (iPane=maPanes.begin(); iPane!=maPanes.end(); ++iPane)
1204     {
1205         iPane->mpPaneDescriptor->SetActivationState(false);
1206     }
1207 }
1208 
1209 
1210 
1211 
ShowPanes(void)1212 void PaneGroup::ShowPanes (void)
1213 {
1214     vector<PaneDescriptor>::iterator iPane;
1215     for (iPane=maPanes.begin(); iPane!=maPanes.end(); ++iPane)
1216     {
1217         iPane->mpPaneDescriptor->mxBorderWindow->setVisible(sal_True);
1218         iPane->mpPaneDescriptor->mxContentWindow->setVisible(sal_True);
1219     }
1220 }
1221 
1222 
1223 
1224 
HidePanes(void)1225 void PaneGroup::HidePanes (void)
1226 {
1227     vector<PaneDescriptor>::iterator iPane;
1228     for (iPane=maPanes.begin(); iPane!=maPanes.end(); ++iPane)
1229     {
1230         iPane->mpPaneDescriptor->mxBorderWindow->setVisible(sal_False);
1231         iPane->mpPaneDescriptor->mxContentWindow->setVisible(sal_False);
1232     }
1233 }
1234 
1235 
1236 
1237 
1238 //===== PaneDescriptor ========================================================
1239 
PaneDescriptor(const PresenterPaneContainer::SharedPaneDescriptor & rpDescriptor)1240 PaneDescriptor::PaneDescriptor (const PresenterPaneContainer::SharedPaneDescriptor& rpDescriptor)
1241     : mpPaneDescriptor(rpDescriptor),
1242       mnLeft(rpDescriptor->mnLeft),
1243       mnTop(rpDescriptor->mnTop),
1244       mnRight(rpDescriptor->mnRight),
1245       mnBottom(rpDescriptor->mnBottom)
1246 {
1247 }
1248 
1249 
1250 
1251 
Restore(void) const1252 void PaneDescriptor::Restore (void) const
1253 {
1254     mpPaneDescriptor->mnLeft = mnLeft;
1255     mpPaneDescriptor->mnTop = mnTop;
1256     mpPaneDescriptor->mnRight = mnRight;
1257     mpPaneDescriptor->mnBottom = mnBottom;
1258 }
1259 
1260 
1261 
1262 
1263 //===== MultiAnimation ========================================================
1264 
MultiAnimation(const sal_uInt32 nDuration)1265 MultiAnimation::MultiAnimation (const sal_uInt32 nDuration)
1266     : PresenterAnimation(0, nDuration, 1000/50),
1267       maAnimations()
1268 {
1269 }
1270 
1271 
1272 
1273 
AddAnimation(const Animation & rAnimation)1274 void MultiAnimation::AddAnimation (const Animation& rAnimation)
1275 {
1276     maAnimations.push_back(rAnimation);
1277 }
1278 
1279 
1280 
1281 
Run(const double nProgress,const sal_uInt64 nCurrentTime)1282 void MultiAnimation::Run (const double nProgress, const sal_uInt64 nCurrentTime)
1283 {
1284     (void)nCurrentTime;
1285     vector<Animation>::const_iterator iAnimation (maAnimations.begin());
1286     vector<Animation>::const_iterator iEnd (maAnimations.end());
1287     for ( ; iAnimation!=iEnd; ++iAnimation)
1288         (*iAnimation)(nProgress);
1289 }
1290 
1291 
1292 
1293 
1294 //===== functors ==============================================================
1295 
InterpolatePosition(const::boost::function<void (geometry::RealPoint2D)> & rSetter,double nP,const geometry::RealPoint2D rInitialBox,const geometry::RealPoint2D rFinalBox)1296 void InterpolatePosition (
1297     const ::boost::function<void(geometry::RealPoint2D)>& rSetter,
1298     double nP,
1299     const geometry::RealPoint2D rInitialBox,
1300     const geometry::RealPoint2D rFinalBox)
1301 {
1302     const double nQ (1 - nP);
1303 
1304     OSL_TRACE("InterpolatePosition %f\n", nP);
1305     rSetter(
1306         geometry::RealPoint2D(
1307             nQ * rInitialBox.X + nP * rFinalBox.X,
1308             nQ * rInitialBox.Y + nP * rFinalBox.Y));
1309 }
1310 
1311 
1312 
1313 
1314 template<typename T>
InterpolateValue(const::boost::function<void (T)> & rSetter,double nP,const T aInitialValue,const T aFinalValue)1315     void InterpolateValue (
1316         const ::boost::function<void(T)>& rSetter,
1317         double nP,
1318         const T aInitialValue,
1319         const T aFinalValue)
1320 {
1321     const double nQ (1 - nP);
1322 
1323     rSetter(T(nQ * aInitialValue + nP * aFinalValue));
1324 }
1325 
1326 
1327 
1328 
SpriteTransform(const rtl::Reference<PresenterPaneContainer> & rpPaneContainer,const Reference<XResourceId> & rxPaneId,const Reference<awt::XWindow> & rxSpriteOwnerWindow,const::boost::shared_ptr<PresenterPaintManager> & rpPaintManager,const bool bAppear,const double nX,const double nInitialTop,const double nFinalTop,const double nP)1329 void SpriteTransform(
1330     const rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
1331     const Reference<XResourceId>& rxPaneId,
1332     const Reference<awt::XWindow>& rxSpriteOwnerWindow,
1333     const ::boost::shared_ptr<PresenterPaintManager>& rpPaintManager,
1334     const bool bAppear,
1335     const double nX,
1336     const double nInitialTop,
1337     const double nFinalTop,
1338     const double nP)
1339 {
1340     OSL_ASSERT(rpPaintManager.get()!=NULL);
1341 
1342     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
1343         rpPaneContainer->FindPaneId(rxPaneId));
1344     if (pDescriptor.get() != NULL
1345         && ! pDescriptor->maSpriteProvider.empty()
1346         && pDescriptor->mxBorderWindow.is())
1347     {
1348         ::boost::shared_ptr<PresenterSprite> pSprite (pDescriptor->maSpriteProvider());
1349         if (pSprite.get())
1350         {
1351             // There seems to be a problem with sprites not correctly
1352             // invalidating the background when being transformed.  As a
1353             // workaround invalidate the background in the bounding box of
1354             // the sprite before the transformation.
1355             rpPaintManager->Invalidate(
1356                 rxSpriteOwnerWindow,
1357                 awt::Rectangle(
1358                     sal::static_int_cast<sal_Int32>(pSprite->GetLocation().X),
1359                     sal::static_int_cast<sal_Int32>(pSprite->GetLocation().Y),
1360                     sal::static_int_cast<sal_Int32>(pSprite->GetSize().Width),
1361                     sal::static_int_cast<sal_Int32>(pSprite->GetSize().Height)));
1362 
1363             const double nYScale (bAppear ? nP : 1-nP);
1364             pSprite->Transform(geometry::AffineMatrix2D(
1365                 1, 0, 0,
1366                 0, nYScale, 0));
1367             pSprite->MoveTo(
1368                 geometry::RealPoint2D(nX, nYScale*nFinalTop + (1-nYScale)*nInitialTop));
1369             pSprite->Show();
1370 
1371             pDescriptor->mxBorderWindow->setVisible(sal_True);
1372         }
1373     }
1374 }
1375 
1376 
1377 
1378 
SpritePaneMove(const rtl::Reference<PresenterPaneContainer> & rpPaneContainer,const Reference<XResourceId> & rxPaneId,const geometry::RealPoint2D & rLocation)1379 void SpritePaneMove (
1380     const rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
1381     const Reference<XResourceId>& rxPaneId,
1382     const geometry::RealPoint2D& rLocation)
1383 {
1384     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
1385         rpPaneContainer->FindPaneId(rxPaneId));
1386     if (pDescriptor.get() != NULL
1387         && ! pDescriptor->maSpriteProvider.empty()
1388         && pDescriptor->mxBorderWindow.is())
1389     {
1390         ::boost::shared_ptr<PresenterSprite> pSprite (pDescriptor->maSpriteProvider());
1391         if (pSprite.get() != NULL)
1392         {
1393             pDescriptor->mxBorderWindow->setVisible(sal_True);
1394             pSprite->MoveTo(rLocation);
1395         }
1396     }
1397 }
1398 
1399 
1400 
1401 
GetLocation(const geometry::RealRectangle2D & rBox)1402 geometry::RealPoint2D GetLocation (const geometry::RealRectangle2D& rBox)
1403 {
1404     return geometry::RealPoint2D(rBox.X1, rBox.Y1);
1405 }
1406 
1407 
1408 
1409 
GetSize(const geometry::RealRectangle2D & rBox)1410 geometry::RealSize2D GetSize (const geometry::RealRectangle2D& rBox)
1411 {
1412     return geometry::RealSize2D(rBox.X2-rBox.X1, rBox.Y2-rBox.Y1);
1413 }
1414 
1415 } // end of anonymous namespace
1416 
1417 
1418 
1419 
1420 } } // end of namespace ::sdext::presenter
1421