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