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