xref: /trunk/main/sd/source/ui/slideshow/slideshowimpl.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _SD_SlideShowImpl_HXX_
29 #define _SD_SlideShowImpl_HXX_
30 
31 #include "sal/config.h"
32 #include "com/sun/star/uno/XComponentContext.hpp"
33 #include "cppuhelper/compbase1.hxx"
34 #include "cppuhelper/compbase2.hxx"
35 #include "cppuhelper/basemutex.hxx"
36 #include "cppuhelper/propertysetmixin.hxx"
37 #include <com/sun/star/awt/XActivateListener.hpp>
38 #include <com/sun/star/presentation/XSlideShow.hpp>
39 #include <com/sun/star/presentation/XSlideShowView.hpp>
40 #include <com/sun/star/presentation/XSlideShowListener.hpp>
41 #include <com/sun/star/presentation/XSlideShowController.hpp>
42 #include "com/sun/star/presentation/XShapeEventListener.hpp"
43 #include <com/sun/star/awt/WindowEvent.hpp>
44 #include <com/sun/star/awt/XWindowListener.hpp>
45 #include <com/sun/star/awt/XWindow.hpp>
46 #include <com/sun/star/awt/XWindowPeer.hpp>
47 #include <com/sun/star/util/XModifyListener.hpp>
48 #include <com/sun/star/awt/XPaintListener.hpp>
49 #include <com/sun/star/awt/XPointer.hpp>
50 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
51 #include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
52 #include <com/sun/star/presentation/ClickAction.hpp>
53 #include <com/sun/star/media/XManager.hpp>
54 #include <com/sun/star/media/XPlayer.hpp>
55 
56 #include <toolkit/helper/vclunohelper.hxx>
57 
58 #include <basegfx/matrix/b2dhommatrix.hxx>
59 #include <basegfx/tools/canvastools.hxx>
60 #include <vcl/help.hxx>
61 #include <tools/urlobj.hxx>
62 #include <unotools/pathoptions.hxx>
63 #include <unotools/saveopt.hxx>
64 #include <sfx2/bindings.hxx>
65 #include <sfx2/dispatch.hxx>
66 #include <sfx2/viewfrm.hxx>
67 #include <basic/sbstar.hxx>
68 #include <svx/svdpagv.hxx>
69 #include <svx/fmshell.hxx>
70 
71 #ifndef _SVX_SVXIDS_HRC
72 #include <svx/svxids.hrc>
73 #endif
74 #include "sdmod.hxx"
75 #include "cusshow.hxx"
76 #include "ViewShellBase.hxx"
77 #include "PresentationViewShell.hxx"
78 #include "ViewShell.hxx"
79 #include "drawview.hxx"
80 #include "drawdoc.hxx"
81 
82 #include "showwindow.hxx"
83 
84 #include "optsitem.hxx"
85 #include "FrameView.hxx"
86 #include "DrawDocShell.hxx"
87 
88 #ifndef _SD_APP_HRC_
89 #include "app.hrc"
90 #endif
91 
92 #include "slideshow.hxx"
93 
94 class SfxViewFrame;
95 class SfxRequest;
96 
97 namespace css = ::com::sun::star;
98 
99 namespace sd
100 {
101 class SlideShowView;
102 class AnimationSlideController;
103 class PaneHider;
104 
105 // --------------------------------------------------------------------
106 
107 struct PresentationSettingsEx : public PresentationSettings
108 {
109     sal_Bool mbRehearseTimings;
110     sal_Bool mbPreview;
111     ::Window* mpParentWindow;
112     css::uno::Reference< css::drawing::XDrawPage > mxStartPage;
113     css::uno::Reference< css::animations::XAnimationNode > mxAnimationNode;
114 
115     PresentationSettingsEx( const PresentationSettingsEx& );
116     PresentationSettingsEx( PresentationSettings& );
117 
118     void SetArguments( const css::uno::Sequence< css::beans::PropertyValue >& rArguments ) throw (css::lang::IllegalArgumentException);
119 
120     void SetPropertyValue( const ::rtl::OUString& rProperty, const css::uno::Any& rValue ) throw (css::lang::IllegalArgumentException);
121 };
122 
123 // --------------------------------------------------------------------
124 
125 struct WrappedShapeEventImpl
126 {
127     css::presentation::ClickAction meClickAction;
128     sal_Int32 mnVerb;
129     ::rtl::OUString maStrBookmark;
130     WrappedShapeEventImpl() : meClickAction( css::presentation::ClickAction_NONE ), mnVerb( 0 ) {};
131 };
132 
133 typedef boost::shared_ptr< WrappedShapeEventImpl > WrappedShapeEventImplPtr;
134 typedef std::map< css::uno::Reference< css::drawing::XShape >, WrappedShapeEventImplPtr > WrappedShapeEventImplMap;
135 
136 // --------------------------------------------------------------------
137 
138 class SlideShowListenerProxy : private ::cppu::BaseMutex,
139         public ::cppu::WeakImplHelper2< css::presentation::XSlideShowListener, css::presentation::XShapeEventListener >
140 {
141 public:
142     SlideShowListenerProxy( const rtl::Reference< SlideshowImpl >& xController, const css::uno::Reference< css::presentation::XSlideShow >& xSlideShow );
143     virtual ~SlideShowListenerProxy();
144 
145     void addAsSlideShowListener();
146     void removeAsSlideShowListener();
147 
148     void addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener );
149     void removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener );
150 
151     void addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape );
152     void removeShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape );
153 
154     // css::animations::XAnimationListener
155     virtual void SAL_CALL beginEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) throw (css::uno::RuntimeException);
156     virtual void SAL_CALL endEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) throw (css::uno::RuntimeException);
157     virtual void SAL_CALL repeat( const css::uno::Reference< css::animations::XAnimationNode >& Node, ::sal_Int32 Repeat ) throw (css::uno::RuntimeException);
158 
159     // css::presentation::XSlideShowListener:
160     virtual void SAL_CALL paused() throw (css::uno::RuntimeException);
161     virtual void SAL_CALL resumed() throw (css::uno::RuntimeException);
162     virtual void SAL_CALL slideTransitionStarted() throw (css::uno::RuntimeException);
163     virtual void SAL_CALL slideTransitionEnded() throw (css::uno::RuntimeException);
164     virtual void SAL_CALL slideAnimationsEnded() throw (css::uno::RuntimeException);
165     virtual void SAL_CALL slideEnded(sal_Bool bReverse) throw (css::uno::RuntimeException);
166     virtual void SAL_CALL hyperLinkClicked(const ::rtl::OUString & hyperLink) throw (css::uno::RuntimeException);
167 
168     // css::lang::XEventListener:
169     virtual void SAL_CALL disposing(const css::lang::EventObject & Source) throw (css::uno::RuntimeException);
170 
171     // css::presentation::XShapeEventListener:
172     virtual void SAL_CALL click(const css::uno::Reference< css::drawing::XShape > & xShape, const css::awt::MouseEvent & aOriginalEvent) throw (css::uno::RuntimeException);
173 
174     ::cppu::OInterfaceContainerHelper maListeners;
175 
176     rtl::Reference< SlideshowImpl > mxController;
177     css::uno::Reference< css::presentation::XSlideShow > mxSlideShow;
178 };
179 
180 // --------------------------------------------------------------------
181 
182 typedef ::cppu::WeakComponentImplHelper2< css::presentation::XSlideShowController, css::container::XIndexAccess > SlideshowImplBase;
183 
184 class SlideshowImpl : private ::cppu::BaseMutex, public SlideshowImplBase
185 {
186 friend class SlideShow;
187 friend class SlideShowView;
188 
189 public:
190     explicit SlideshowImpl( const css::uno::Reference< css::presentation::XPresentation2 >& xPresentation, ViewShell* pViewSh, ::sd::View* pView, SdDrawDocument* pDoc, ::Window* pParentWindow);
191 
192     // css::presentation::XSlideShowController:
193     virtual ::sal_Bool SAL_CALL getAlwaysOnTop() throw (css::uno::RuntimeException);
194     virtual void SAL_CALL setAlwaysOnTop( ::sal_Bool _alwaysontop ) throw (css::uno::RuntimeException);
195     virtual ::sal_Bool SAL_CALL getMouseVisible() throw (css::uno::RuntimeException);
196     virtual void SAL_CALL setMouseVisible( ::sal_Bool _mousevisible ) throw (css::uno::RuntimeException);
197     virtual ::sal_Bool SAL_CALL getUsePen() throw (css::uno::RuntimeException);
198     virtual void SAL_CALL setUsePen( ::sal_Bool _usepen ) throw (css::uno::RuntimeException);
199     virtual ::sal_Int32 SAL_CALL getPenColor() throw (css::uno::RuntimeException);
200     virtual void SAL_CALL setPenColor( ::sal_Int32 _pencolor ) throw (css::uno::RuntimeException);
201     virtual void SAL_CALL setUseEraser( ::sal_Bool _usepen ) throw (css::uno::RuntimeException);
202     virtual double SAL_CALL getPenWidth() throw (css::uno::RuntimeException);
203     virtual void SAL_CALL setPenWidth( double dStrokeWidth ) throw (css::uno::RuntimeException);
204     virtual void SAL_CALL setEraseAllInk( bool bEraseAllInk ) throw (css::uno::RuntimeException);
205     virtual void SAL_CALL setEraseInk( sal_Int32 nEraseInkSize ) throw (css::uno::RuntimeException);
206     virtual void SAL_CALL setPenMode( bool bSwitchPenMode) throw (css::uno::RuntimeException);
207     virtual void SAL_CALL setEraserMode( bool bSwitchEraserMode ) throw (css::uno::RuntimeException);
208     virtual ::sal_Bool SAL_CALL isRunning(  ) throw (css::uno::RuntimeException);
209     virtual ::sal_Int32 SAL_CALL getSlideCount(  ) throw (css::uno::RuntimeException);
210     virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getSlideByIndex( ::sal_Int32 Index ) throw (css::lang::IndexOutOfBoundsException, css::uno::RuntimeException);
211     virtual void SAL_CALL addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) throw (css::uno::RuntimeException);
212     virtual void SAL_CALL removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) throw (css::uno::RuntimeException);
213     virtual void SAL_CALL gotoNextEffect(  ) throw (css::uno::RuntimeException);
214     virtual void SAL_CALL gotoPreviousEffect(  ) throw (css::uno::RuntimeException);
215     virtual void SAL_CALL gotoFirstSlide(  ) throw (css::uno::RuntimeException);
216     virtual void SAL_CALL gotoNextSlide(  ) throw (css::uno::RuntimeException);
217     virtual void SAL_CALL gotoPreviousSlide(  ) throw (css::uno::RuntimeException);
218     virtual void SAL_CALL gotoLastSlide(  ) throw (css::uno::RuntimeException);
219     virtual void SAL_CALL gotoBookmark( const ::rtl::OUString& Bookmark ) throw (css::uno::RuntimeException);
220     virtual void SAL_CALL gotoSlide( const css::uno::Reference< css::drawing::XDrawPage >& Page ) throw (css::lang::IllegalArgumentException, css::uno::RuntimeException);
221     virtual void SAL_CALL gotoSlideIndex( ::sal_Int32 Index ) throw (css::uno::RuntimeException);
222     virtual void SAL_CALL stopSound(  ) throw (css::uno::RuntimeException);
223     virtual void SAL_CALL pause(  ) throw (css::uno::RuntimeException);
224     virtual void SAL_CALL resume(  ) throw (css::uno::RuntimeException);
225     virtual ::sal_Bool SAL_CALL isPaused(  ) throw (css::uno::RuntimeException);
226     virtual void SAL_CALL blankScreen( ::sal_Int32 Color ) throw (css::uno::RuntimeException);
227     virtual void SAL_CALL activate(  ) throw (css::uno::RuntimeException);
228     virtual void SAL_CALL deactivate(  ) throw (css::uno::RuntimeException);
229     virtual ::sal_Bool SAL_CALL isActive(  ) throw (css::uno::RuntimeException);
230     virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getCurrentSlide(  ) throw (css::uno::RuntimeException);
231     virtual ::sal_Int32 SAL_CALL getCurrentSlideIndex(  ) throw (css::uno::RuntimeException);
232     virtual ::sal_Int32 SAL_CALL getNextSlideIndex(  ) throw (css::uno::RuntimeException);
233     virtual ::sal_Bool SAL_CALL isEndless(  ) throw (css::uno::RuntimeException);
234     virtual ::sal_Bool SAL_CALL isFullScreen(  ) throw (css::uno::RuntimeException);
235     virtual css::uno::Reference< css::presentation::XSlideShow > SAL_CALL getSlideShow(  ) throw (css::uno::RuntimeException);
236 
237     // XIndexAccess
238     virtual ::sal_Int32 SAL_CALL getCount(  ) throw (::com::sun::star::uno::RuntimeException);
239     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
240     virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw (::com::sun::star::uno::RuntimeException);
241     virtual ::sal_Bool SAL_CALL hasElements(  ) throw (::com::sun::star::uno::RuntimeException);
242 
243     // will be called from the SlideShowListenerProxy when this event is fired from the XSlideShow
244     void slideEnded(const bool bReverse);
245     void hyperLinkClicked(const ::rtl::OUString & hyperLink) throw (css::uno::RuntimeException);
246     void click(const css::uno::Reference< css::drawing::XShape > & xShape, const css::awt::MouseEvent & aOriginalEvent);
247 
248     /// ends the presentation async
249     void endPresentation();
250 
251     ViewShell* getViewShell() const { return mpViewShell; }
252 
253     void paint( const Rectangle& rRect );
254     bool keyInput(const KeyEvent& rKEvt);
255     void mouseButtonUp(const MouseEvent& rMEvt);
256 
257 private:
258     SlideshowImpl(SlideshowImpl &); // not defined
259     void operator =(SlideshowImpl &); // not defined
260 
261     virtual ~SlideshowImpl();
262 
263     // overload WeakComponentImplHelperBase::disposing()
264     // This function is called upon disposing the component,
265     // if your component needs special work when it becomes
266     // disposed, do it here.
267     virtual void SAL_CALL disposing();
268 
269     // internal
270     bool startShow( PresentationSettingsEx* pPresSettings );
271     bool startPreview(
272         const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage,
273         const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode,
274         ::Window* pParent );
275 
276     ShowWindow* getShowWindow() const { return mpShowWindow; }
277 
278         /** forces an async call to update in the main thread */
279     void startUpdateTimer();
280 
281     double update();
282 
283     void createSlideList( bool bAll, bool bStartWithActualSlide, const String& rPresSlide );
284 
285     void displayCurrentSlide (const bool bSkipAllMainSequenceEffects = false);
286 
287     void displaySlideNumber( sal_Int32 nSlide );
288     void displaySlideIndex( sal_Int32 nIndex );
289     sal_Int32 getCurrentSlideNumber();
290     sal_Int32 getFirstSlideNumber();
291     sal_Int32 getLastSlideNumber();
292     inline bool isInputFreezed() const { return mbInputFreeze; }
293 
294     void jumpToBookmark( const String& sBookmark );
295 
296     void hideChildWindows();
297     void showChildWindows();
298 
299     void resize( const Size& rSize );
300 
301     void setActiveXToolbarsVisible( sal_Bool bVisible );
302 
303     DECL_LINK( updateHdl, Timer* );
304     DECL_LINK( PostYieldListener, void* );
305     DECL_LINK( ReadyForNextInputHdl, Timer* );
306     DECL_LINK( endPresentationHdl, void* );
307     DECL_LINK( ContextMenuSelectHdl, Menu * );
308     DECL_LINK( ContextMenuHdl, void* );
309     DECL_LINK( deactivateHdl, Timer* );
310     DECL_LINK( EventListenerHdl, VclSimpleEvent* );
311 
312     // helper
313     void receiveRequest(SfxRequest& rReq);
314 
315     /** called only by the slideshow view when the first paint event occurs.
316         This actually starts the slideshow. */
317     void onFirstPaint();
318 
319     long getRestoreSlide() const { return mnRestoreSlide; }
320 
321 private:
322     bool startShowImpl(
323         const css::uno::Sequence< css::beans::PropertyValue >& aProperties );
324 
325     SfxViewFrame* getViewFrame() const;
326     SfxDispatcher* getDispatcher() const;
327     SfxBindings* getBindings() const;
328 
329     sal_Int32 getSlideNumberForBookmark( const rtl::OUString& rStrBookmark );
330 
331     void removeShapeEvents();
332     void registerShapeEvents( sal_Int32 nSlideNumber );
333     void registerShapeEvents( css::uno::Reference< css::drawing::XShapes >& xShapes ) throw (css::uno::Exception);
334 
335     css::uno::Reference< css::presentation::XSlideShow > createSlideShow() const;
336 
337     void setAutoSaveState( bool bOn );
338     void gotoPreviousSlide (const bool bSkipAllMainSequenceEffects);
339 
340     /** Called by PostYieldListener and updateHdl handlers this method is
341         responsible to call the slideshow update() method and, depending on
342         its return value, wait for a certain amount of time before another
343         call to update() is scheduled.
344     */
345     sal_Int32 updateSlideShow (void);
346 
347     css::uno::Reference< css::presentation::XSlideShow > mxShow;
348     comphelper::ImplementationReference< ::sd::SlideShowView, css::presentation::XSlideShowView > mxView;
349     css::uno::Reference< css::frame::XModel > mxModel;
350 
351     Timer maUpdateTimer;
352     Timer maInputFreezeTimer;
353     Timer maDeactivateTimer;
354 
355     ::sd::View* mpView;
356     ViewShell* mpViewShell;
357     DrawDocShell* mpDocSh;
358     SdDrawDocument* mpDoc;
359 
360     SfxItemSet*     mpNewAttr;
361     ::Window*       mpParentWindow;
362     ShowWindow*     mpShowWindow;
363     PushButton*     mpTimeButton;
364 
365     boost::shared_ptr< AnimationSlideController > mpSlideController;
366 
367     long            mnRestoreSlide;
368     Point           maSlideOrigin;
369     Point           maPopupMousePos;
370     Size            maSlideSize;
371     Size            maPresSize;
372     AnimationMode   meAnimationMode;
373     String          maCharBuffer;
374     Pointer         maOldPointer;
375     Pointer         maPencil;
376     std::vector< ::sd::Window* > maDrawModeWindows;
377     ::sd::Window*   mpOldActiveWindow;
378     Link            maStarBASICGlobalErrorHdl;
379     unsigned long   mnChildMask;
380     bool            mbGridVisible;
381     bool            mbBordVisible;
382     bool            mbSlideBorderVisible;
383     bool            mbSetOnlineSpelling;
384     bool            mbDisposed;
385     bool            mbMouseIsDrawing;
386     bool            mbAutoSaveWasOn;
387     bool            mbRehearseTimings;
388     bool            mbDesignMode;
389     bool            mbIsPaused;
390     bool            mbWasPaused;        // used to cache pause state during context menu
391     bool            mbInputFreeze;
392     sal_Bool        mbActive;
393 
394     PresentationSettings maPresSettings;
395     sal_Int32       mnUserPaintColor;
396 
397     bool            mbUsePen;
398     double          mdUserPaintStrokeWidth;
399 
400     /// used in updateHdl to prevent recursive calls
401     sal_Int32       mnEntryCounter;
402 
403     sal_Int32       mnLastSlideNumber;
404     WrappedShapeEventImplMap    maShapeEventMap;
405 
406     ::rtl::OUString msOnClick;
407     ::rtl::OUString msBookmark;
408     ::rtl::OUString msVerb;
409 
410     css::uno::Reference< css::drawing::XDrawPage > mxPreviewDrawPage;
411     css::uno::Reference< css::animations::XAnimationNode > mxPreviewAnimationNode;
412 
413     css::uno::Reference< css::media::XPlayer > mxPlayer;
414 
415     ::std::auto_ptr<PaneHider> mpPaneHider;
416 
417     sal_uLong   mnEndShowEvent;
418     sal_uLong   mnContextMenuEvent;
419     sal_Int32 mnUpdateEvent;
420 
421     css::uno::Reference< css::presentation::XPresentation2 > mxPresentation;
422     ::rtl::Reference< SlideShowListenerProxy > mxListenerProxy;
423 };
424 
425 } // namespace ::sd
426 
427 #endif
428