xref: /core/sd/source/ui/slideshow/slideshowimpl.cxx (revision 5e8c0e25)
180b08615SSebastian Spaeth /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2837e2808SMichael Meeks /*
3837e2808SMichael Meeks  * This file is part of the LibreOffice project.
40fefcd83SRüdiger Timm  *
5837e2808SMichael Meeks  * This Source Code Form is subject to the terms of the Mozilla Public
6837e2808SMichael Meeks  * License, v. 2.0. If a copy of the MPL was not distributed with this
7837e2808SMichael Meeks  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8487dfc49SRüdiger Timm  *
9837e2808SMichael Meeks  * This file incorporates work covered by the following license notice:
10487dfc49SRüdiger Timm  *
11837e2808SMichael Meeks  *   Licensed to the Apache Software Foundation (ASF) under one or more
12837e2808SMichael Meeks  *   contributor license agreements. See the NOTICE file distributed
13837e2808SMichael Meeks  *   with this work for additional information regarding copyright
14837e2808SMichael Meeks  *   ownership. The ASF licenses this file to you under the Apache
15837e2808SMichael Meeks  *   License, Version 2.0 (the "License"); you may not use this file
16837e2808SMichael Meeks  *   except in compliance with the License. You may obtain a copy of
17837e2808SMichael Meeks  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18837e2808SMichael Meeks  */
19089380a5SOliver Bolte 
2027cd397bSStephan Bergmann #include <sal/config.h>
2127cd397bSStephan Bergmann 
2227cd397bSStephan Bergmann #include <algorithm>
2327cd397bSStephan Bergmann 
249ecac387STor Lillqvist #include <config_features.h>
259ecac387STor Lillqvist 
26dd1c991bSMatúš Kukan #include <com/sun/star/frame/theAutoRecovery.hpp>
27754c6af4SGabor Kelemen #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
280fefcd83SRüdiger Timm #include <com/sun/star/document/XEventsSupplier.hpp>
29ddb02dbaSOliver Bolte #include <com/sun/star/drawing/XMasterPageTarget.hpp>
300fefcd83SRüdiger Timm #include <com/sun/star/beans/PropertyValue.hpp>
310fefcd83SRüdiger Timm #include <com/sun/star/beans/XPropertySetInfo.hpp>
3220549ebeSOliver Bolte #include <com/sun/star/beans/XPropertySet.hpp>
330fefcd83SRüdiger Timm #include <com/sun/star/awt/SystemPointer.hpp>
340fcd1a73SNoel Grandin #include <com/sun/star/util/URLTransformer.hpp>
35cfb3429dSOliver Bolte #include <com/sun/star/util/XURLTransformer.hpp>
36cfb3429dSOliver Bolte #include <com/sun/star/frame/XDispatch.hpp>
3720549ebeSOliver Bolte #include <com/sun/star/frame/XLayoutManager.hpp>
3823ef230fSNoel Grandin #include <com/sun/star/presentation/SlideShow.hpp>
39c4e04d6fSGabor Kelemen #include <com/sun/star/media/XPlayer.hpp>
404709cd82SGabor Kelemen #include <svl/stritem.hxx>
410cc66aafSMathias Bauer #include <svl/urihelper.hxx>
4272f55906SGabor Kelemen #include <unotools/saveopt.hxx>
4372f55906SGabor Kelemen #include <basic/sbstar.hxx>
440fefcd83SRüdiger Timm 
455cb2e310SThomas Arnhold #include <toolkit/helper/vclunohelper.hxx>
46183debd7SNoel Grandin #include <tools/diagnose_ex.h>
47808a70e2SKurt Zenker 
48c767f824SCédric Bosdonnat #include <sfx2/infobar.hxx>
4972f55906SGabor Kelemen #include <sfx2/dispatch.hxx>
50c8428842SChristian Lippka #include <sfx2/docfile.hxx>
51c8428842SChristian Lippka #include <sfx2/app.hxx>
524304226dSGabor Kelemen #include <sfx2/viewfrm.hxx>
530fefcd83SRüdiger Timm #include <svx/unoapi.hxx>
540fefcd83SRüdiger Timm #include <svx/svdoole2.hxx>
550fefcd83SRüdiger Timm #include <svx/f3dchild.hxx>
560fefcd83SRüdiger Timm #include <svx/imapdlg.hxx>
570fefcd83SRüdiger Timm #include <svx/fontwork.hxx>
5835aa48d8SArmin Le Grand #include <svx/SvxColorChildWindow.hxx>
590fefcd83SRüdiger Timm #include <svx/bmpmask.hxx>
600fefcd83SRüdiger Timm #include <svx/srchdlg.hxx>
610fefcd83SRüdiger Timm #include <svx/hyperdlg.hxx>
6272f55906SGabor Kelemen #include <svx/svxids.hrc>
633784e4d5SStephan Bergmann #include <AnimationChildWindow.hxx>
643784e4d5SStephan Bergmann #include <notifydocumentevent.hxx>
653784e4d5SStephan Bergmann #include "slideshowimpl.hxx"
663784e4d5SStephan Bergmann #include "slideshowviewimpl.hxx"
6705e5afdaSVladimir Glazounov #include "PaneHider.hxx"
680fefcd83SRüdiger Timm 
693784e4d5SStephan Bergmann #include <bitmaps.hlst>
70e872d77cSCaolán McNamara #include <strings.hrc>
71e872d77cSCaolán McNamara #include <sdresid.hxx>
726858d517SChris Sherlock #include <vcl/canvastools.hxx>
734a6dc219SGabor Kelemen #include <vcl/commandevent.hxx>
74fb698d5eSMaxim Monastirsky #include <vcl/commandinfoprovider.hxx>
75e872d77cSCaolán McNamara #include <vcl/weldutils.hxx>
764a6dc219SGabor Kelemen 
77a18a1a45STobias Lippert #include <vcl/settings.hxx>
783e009203SMiklos Vajna #include <vcl/scheduler.hxx>
794a6dc219SGabor Kelemen #include <vcl/svapp.hxx>
804a6dc219SGabor Kelemen #include <vcl/help.hxx>
81febe0fd1SGabor Kelemen #include <comphelper/processfactory.hxx>
823784e4d5SStephan Bergmann #include <rtl/ref.hxx>
833784e4d5SStephan Bergmann #include <avmedia/mediawindow.hxx>
843784e4d5SStephan Bergmann #include <svtools/colrdlg.hxx>
8572f55906SGabor Kelemen #include <DrawDocShell.hxx>
8672f55906SGabor Kelemen #include <ViewShellBase.hxx>
8772f55906SGabor Kelemen #include <PresentationViewShell.hxx>
883784e4d5SStephan Bergmann #include <RemoteServer.hxx>
893784e4d5SStephan Bergmann #include <customshowlist.hxx>
903784e4d5SStephan Bergmann #include <unopage.hxx>
915d7a28fdSGabor Kelemen #include <sdpage.hxx>
9272f55906SGabor Kelemen #include <sdmod.hxx>
9372f55906SGabor Kelemen #include <app.hrc>
9472f55906SGabor Kelemen #include <cusshow.hxx>
9572f55906SGabor Kelemen #include <optsitem.hxx>
96b10a5e4cSNoel Grandin 
97747a4f30SCaolán McNamara #define CM_SLIDES       21
98808a70e2SKurt Zenker 
99808a70e2SKurt Zenker using ::com::sun::star::animations::XAnimationNode;
100808a70e2SKurt Zenker using ::com::sun::star::animations::XAnimationListener;
101808a70e2SKurt Zenker using ::com::sun::star::awt::XWindow;
1020fefcd83SRüdiger Timm using namespace ::com::sun::star;
103808a70e2SKurt Zenker using namespace ::com::sun::star::lang;
104808a70e2SKurt Zenker using namespace ::com::sun::star::uno;
105808a70e2SKurt Zenker using namespace ::com::sun::star::drawing;
106808a70e2SKurt Zenker using namespace ::com::sun::star::container;
107808a70e2SKurt Zenker using namespace ::com::sun::star::document;
1080fefcd83SRüdiger Timm using namespace ::com::sun::star::presentation;
109808a70e2SKurt Zenker using namespace ::com::sun::star::beans;
1100fefcd83SRüdiger Timm 
1110fefcd83SRüdiger Timm namespace sd
1120fefcd83SRüdiger Timm {
113f4a37ca9SUrs Fässler /** Slots, which will be disabled in the slide show and are managed by Sfx.
114f4a37ca9SUrs Fässler     Have to be sorted in the order of the SIDs */
11572fcc08eSStephan Bergmann sal_uInt16 const pAllowed[] =
1160fefcd83SRüdiger Timm {
117f4a37ca9SUrs Fässler     SID_OPENDOC                             , //     5501   ///< that internally jumps work
1180fefcd83SRüdiger Timm     SID_JUMPTOMARK                          , //     5598
119c82c3e12SVladimir Glazounov     SID_OPENHYPERLINK                       , //     6676
1202503a1e9SBryan Quigley     SID_PRESENTATION_END                     //    27218
1210fefcd83SRüdiger Timm };
1220fefcd83SRüdiger Timm 
123089380a5SOliver Bolte class AnimationSlideController
1240fefcd83SRüdiger Timm {
1250fefcd83SRüdiger Timm public:
126089380a5SOliver Bolte     enum Mode { ALL, FROM, CUSTOM, PREVIEW };
1270fefcd83SRüdiger Timm 
128089380a5SOliver Bolte public:
129b46492d0SStephan Bergmann     AnimationSlideController( Reference< XIndexAccess > const & xSlides, Mode eMode );
1300fefcd83SRüdiger Timm 
131089380a5SOliver Bolte     void setStartSlideNumber( sal_Int32 nSlideNumber ) { mnStartSlideNumber = nSlideNumber; }
132089380a5SOliver Bolte     sal_Int32 getStartSlideIndex() const;
1330fefcd83SRüdiger Timm 
134089380a5SOliver Bolte     sal_Int32 getCurrentSlideNumber() const;
135089380a5SOliver Bolte     sal_Int32 getCurrentSlideIndex() const;
1360fefcd83SRüdiger Timm 
137089380a5SOliver Bolte     sal_Int32 getSlideIndexCount() const { return maSlideNumbers.size(); }
138089380a5SOliver Bolte     sal_Int32 getSlideNumberCount() const { return mnSlideCount; }
1390fefcd83SRüdiger Timm 
140089380a5SOliver Bolte     sal_Int32 getSlideNumber( sal_Int32 nSlideIndex ) const;
1410fefcd83SRüdiger Timm 
142089380a5SOliver Bolte     void insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible = true );
143089380a5SOliver Bolte     void setPreviewNode( const Reference< XAnimationNode >& xPreviewNode );
1440fefcd83SRüdiger Timm 
145089380a5SOliver Bolte     bool jumpToSlideIndex( sal_Int32 nNewSlideIndex );
146089380a5SOliver Bolte     bool jumpToSlideNumber( sal_Int32 nNewSlideIndex );
1470fefcd83SRüdiger Timm 
148089380a5SOliver Bolte     bool nextSlide();
149089380a5SOliver Bolte     bool previousSlide();
150089380a5SOliver Bolte 
1517dd531f8Sthb     void displayCurrentSlide( const Reference< XSlideShow >& xShow,
1527dd531f8Sthb                               const Reference< XDrawPagesSupplier>& xDrawPages,
15376c3d136SAndre Fischer                               const bool bSkipAllMainSequenceEffects );
1540fefcd83SRüdiger Timm 
155c9c9d428SOliver Bolte     sal_Int32 getNextSlideIndex() const;
156c9c9d428SOliver Bolte     sal_Int32 getPreviousSlideIndex() const;
157c9c9d428SOliver Bolte 
158c9c9d428SOliver Bolte     bool isVisibleSlideNumber( sal_Int32 nSlideNumber ) const;
159c9c9d428SOliver Bolte 
160808a70e2SKurt Zenker     Reference< XDrawPage > getSlideByNumber( sal_Int32 nSlideNumber ) const;
161808a70e2SKurt Zenker 
162808a70e2SKurt Zenker     sal_Int32 getNextSlideNumber() const;
163808a70e2SKurt Zenker 
1646ee44161SIvo Hinkelmann     bool hasSlides() const { return !maSlideNumbers.empty(); }
1656ee44161SIvo Hinkelmann 
1660fefcd83SRüdiger Timm private:
167089380a5SOliver Bolte     bool getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode );
168089380a5SOliver Bolte     sal_Int32 findSlideIndex( sal_Int32 nSlideNumber ) const;
169089380a5SOliver Bolte 
170abf7b941SStephan Bergmann     bool isValidIndex( sal_Int32 nIndex ) const { return (nIndex >= 0) && (nIndex < static_cast<sal_Int32>(maSlideNumbers.size())); }
171089380a5SOliver Bolte     bool isValidSlideNumber( sal_Int32 nSlideNumber ) const { return (nSlideNumber >= 0) && (nSlideNumber < mnSlideCount); }
172089380a5SOliver Bolte 
173089380a5SOliver Bolte private:
174638b6707SNoel Grandin     Mode meMode;
175089380a5SOliver Bolte     sal_Int32 mnStartSlideNumber;
176089380a5SOliver Bolte     std::vector< sal_Int32 > maSlideNumbers;
177089380a5SOliver Bolte     std::vector< bool > maSlideVisible;
178089380a5SOliver Bolte     std::vector< bool > maSlideVisited;
179089380a5SOliver Bolte     Reference< XAnimationNode > mxPreviewNode;
180089380a5SOliver Bolte     sal_Int32 mnSlideCount;
181089380a5SOliver Bolte     sal_Int32 mnCurrentSlideIndex;
182089380a5SOliver Bolte     sal_Int32 mnHiddenSlideNumber;
183089380a5SOliver Bolte     Reference< XIndexAccess > mxSlides;
1840fefcd83SRüdiger Timm };
1850fefcd83SRüdiger Timm 
186808a70e2SKurt Zenker Reference< XDrawPage > AnimationSlideController::getSlideByNumber( sal_Int32 nSlideNumber ) const
187808a70e2SKurt Zenker {
188808a70e2SKurt Zenker     Reference< XDrawPage > xSlide;
189808a70e2SKurt Zenker     if( mxSlides.is() && (nSlideNumber >= 0) && (nSlideNumber < mxSlides->getCount()) )
190808a70e2SKurt Zenker         mxSlides->getByIndex( nSlideNumber ) >>= xSlide;
191808a70e2SKurt Zenker     return xSlide;
192808a70e2SKurt Zenker }
193089380a5SOliver Bolte 
194c9c9d428SOliver Bolte bool AnimationSlideController::isVisibleSlideNumber( sal_Int32 nSlideNumber ) const
195c9c9d428SOliver Bolte {
196c9c9d428SOliver Bolte     sal_Int32 nIndex = findSlideIndex( nSlideNumber );
197c9c9d428SOliver Bolte 
198c9c9d428SOliver Bolte     if( nIndex != -1 )
199c9c9d428SOliver Bolte         return maSlideVisible[ nIndex ];
200c9c9d428SOliver Bolte     else
201c9c9d428SOliver Bolte         return false;
202c9c9d428SOliver Bolte }
203c9c9d428SOliver Bolte 
204089380a5SOliver Bolte void AnimationSlideController::setPreviewNode( const Reference< XAnimationNode >& xPreviewNode )
2050fefcd83SRüdiger Timm {
206089380a5SOliver Bolte     mxPreviewNode = xPreviewNode;
2070fefcd83SRüdiger Timm }
2080fefcd83SRüdiger Timm 
209b46492d0SStephan Bergmann AnimationSlideController::AnimationSlideController( Reference< XIndexAccess > const & xSlides, Mode eMode  )
210b9330a05SKurt Zenker :   meMode( eMode )
211b9330a05SKurt Zenker ,   mnStartSlideNumber(-1)
212b9330a05SKurt Zenker ,   mnSlideCount( 0 )
213b9330a05SKurt Zenker ,   mnCurrentSlideIndex(0)
214b9330a05SKurt Zenker ,   mnHiddenSlideNumber( -1 )
215b9330a05SKurt Zenker ,   mxSlides( xSlides )
2160fefcd83SRüdiger Timm {
217089380a5SOliver Bolte     if( mxSlides.is() )
218089380a5SOliver Bolte         mnSlideCount = xSlides->getCount();
219089380a5SOliver Bolte }
220089380a5SOliver Bolte 
221089380a5SOliver Bolte sal_Int32 AnimationSlideController::getStartSlideIndex() const
222089380a5SOliver Bolte {
223089380a5SOliver Bolte     if( mnStartSlideNumber >= 0 )
22489e5c418SVladimir Glazounov     {
2250fefcd83SRüdiger Timm         sal_Int32 nIndex;
226089380a5SOliver Bolte         const sal_Int32 nCount = maSlideNumbers.size();
2270fefcd83SRüdiger Timm 
2280fefcd83SRüdiger Timm         for( nIndex = 0; nIndex < nCount; nIndex++ )
2290fefcd83SRüdiger Timm         {
230089380a5SOliver Bolte             if( maSlideNumbers[nIndex] == mnStartSlideNumber )
2310fefcd83SRüdiger Timm                 return nIndex;
2320fefcd83SRüdiger Timm         }
23389e5c418SVladimir Glazounov     }
2340fefcd83SRüdiger Timm 
2350fefcd83SRüdiger Timm     return 0;
2360fefcd83SRüdiger Timm }
2370fefcd83SRüdiger Timm 
238089380a5SOliver Bolte sal_Int32 AnimationSlideController::getCurrentSlideNumber() const
2390fefcd83SRüdiger Timm {
240089380a5SOliver Bolte     if( mnHiddenSlideNumber != -1 )
241089380a5SOliver Bolte         return mnHiddenSlideNumber;
242376e5b46SJens-Heiner Rechtien     else if( !maSlideNumbers.empty() )
243089380a5SOliver Bolte         return maSlideNumbers[mnCurrentSlideIndex];
244376e5b46SJens-Heiner Rechtien     else
245376e5b46SJens-Heiner Rechtien         return 0;
246089380a5SOliver Bolte }
247089380a5SOliver Bolte 
248089380a5SOliver Bolte sal_Int32 AnimationSlideController::getCurrentSlideIndex() const
249089380a5SOliver Bolte {
250089380a5SOliver Bolte     if( mnHiddenSlideNumber != -1 )
251089380a5SOliver Bolte         return -1;
252089380a5SOliver Bolte     else
253089380a5SOliver Bolte         return mnCurrentSlideIndex;
254089380a5SOliver Bolte }
255089380a5SOliver Bolte 
256089380a5SOliver Bolte bool AnimationSlideController::jumpToSlideIndex( sal_Int32 nNewSlideIndex )
257089380a5SOliver Bolte {
258089380a5SOliver Bolte     if( isValidIndex( nNewSlideIndex ) )
259089380a5SOliver Bolte     {
260089380a5SOliver Bolte         mnCurrentSlideIndex = nNewSlideIndex;
261089380a5SOliver Bolte         mnHiddenSlideNumber = -1;
262089380a5SOliver Bolte         maSlideVisited[mnCurrentSlideIndex] = true;
263089380a5SOliver Bolte         return true;
264089380a5SOliver Bolte     }
265089380a5SOliver Bolte     else
266089380a5SOliver Bolte     {
267089380a5SOliver Bolte         return false;
268089380a5SOliver Bolte     }
269089380a5SOliver Bolte }
270089380a5SOliver Bolte 
271089380a5SOliver Bolte bool AnimationSlideController::jumpToSlideNumber( sal_Int32 nNewSlideNumber )
272089380a5SOliver Bolte {
273089380a5SOliver Bolte     sal_Int32 nIndex = findSlideIndex( nNewSlideNumber );
274089380a5SOliver Bolte     if( isValidIndex( nIndex ) )
275089380a5SOliver Bolte     {
276089380a5SOliver Bolte         return jumpToSlideIndex( nIndex );
277089380a5SOliver Bolte     }
278089380a5SOliver Bolte     else if( (nNewSlideNumber >= 0) && (nNewSlideNumber < mnSlideCount) )
279089380a5SOliver Bolte     {
280089380a5SOliver Bolte         // jump to a hidden slide
281089380a5SOliver Bolte         mnHiddenSlideNumber = nNewSlideNumber;
282089380a5SOliver Bolte         return true;
283089380a5SOliver Bolte     }
284089380a5SOliver Bolte     else
285089380a5SOliver Bolte     {
286089380a5SOliver Bolte         return false;
287089380a5SOliver Bolte     }
288089380a5SOliver Bolte }
289089380a5SOliver Bolte 
290089380a5SOliver Bolte sal_Int32 AnimationSlideController::getSlideNumber( sal_Int32 nSlideIndex ) const
291089380a5SOliver Bolte {
292089380a5SOliver Bolte     if( isValidIndex( nSlideIndex ) )
293089380a5SOliver Bolte         return maSlideNumbers[nSlideIndex];
2940fefcd83SRüdiger Timm     else
2950fefcd83SRüdiger Timm         return -1;
2960fefcd83SRüdiger Timm }
2970fefcd83SRüdiger Timm 
298089380a5SOliver Bolte void AnimationSlideController::insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible /* = true */ )
2990fefcd83SRüdiger Timm {
300089380a5SOliver Bolte     DBG_ASSERT( isValidSlideNumber( nSlideNumber ), "sd::AnimationSlideController::insertSlideNumber(), illegal index" );
301089380a5SOliver Bolte     if( isValidSlideNumber( nSlideNumber ) )
302089380a5SOliver Bolte     {
303089380a5SOliver Bolte         maSlideNumbers.push_back( nSlideNumber );
304089380a5SOliver Bolte         maSlideVisible.push_back( bVisible );
305089380a5SOliver Bolte         maSlideVisited.push_back( false );
306089380a5SOliver Bolte     }
3070fefcd83SRüdiger Timm }
3080fefcd83SRüdiger Timm 
309089380a5SOliver Bolte bool AnimationSlideController::getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode )
3100fefcd83SRüdiger Timm {
311089380a5SOliver Bolte     if( isValidSlideNumber( nSlideNumber ) ) try
312089380a5SOliver Bolte     {
3131d67ca08SNoel Grandin         xSlide.set( mxSlides->getByIndex(nSlideNumber), UNO_QUERY_THROW );
314089380a5SOliver Bolte 
315089380a5SOliver Bolte         if( meMode == PREVIEW )
316089380a5SOliver Bolte         {
317089380a5SOliver Bolte             xAnimNode = mxPreviewNode;
318089380a5SOliver Bolte         }
319089380a5SOliver Bolte         else
320089380a5SOliver Bolte         {
321089380a5SOliver Bolte             Reference< animations::XAnimationNodeSupplier > xAnimNodeSupplier( xSlide, UNO_QUERY_THROW );
322089380a5SOliver Bolte             xAnimNode = xAnimNodeSupplier->getAnimationNode();
3230fefcd83SRüdiger Timm         }
3240fefcd83SRüdiger Timm 
325089380a5SOliver Bolte         return true;
326089380a5SOliver Bolte     }
3278cc98837STakeshi Abe     catch( Exception& )
328089380a5SOliver Bolte     {
329889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::AnimationSlideController::getSlideAPI()" );
330089380a5SOliver Bolte     }
331089380a5SOliver Bolte 
332089380a5SOliver Bolte     return false;
333089380a5SOliver Bolte }
334089380a5SOliver Bolte 
335089380a5SOliver Bolte sal_Int32 AnimationSlideController::findSlideIndex( sal_Int32 nSlideNumber ) const
3360fefcd83SRüdiger Timm {
3370fefcd83SRüdiger Timm     sal_Int32 nIndex;
338089380a5SOliver Bolte     const sal_Int32 nCount = maSlideNumbers.size();
3390fefcd83SRüdiger Timm 
3400fefcd83SRüdiger Timm     for( nIndex = 0; nIndex < nCount; nIndex++ )
3410fefcd83SRüdiger Timm     {
342089380a5SOliver Bolte         if( maSlideNumbers[nIndex] == nSlideNumber )
3430fefcd83SRüdiger Timm             return nIndex;
3440fefcd83SRüdiger Timm     }
3450fefcd83SRüdiger Timm 
3460fefcd83SRüdiger Timm     return -1;
3470fefcd83SRüdiger Timm }
3480fefcd83SRüdiger Timm 
349089380a5SOliver Bolte sal_Int32 AnimationSlideController::getNextSlideIndex() const
3500fefcd83SRüdiger Timm {
351089380a5SOliver Bolte     switch( meMode )
3520fefcd83SRüdiger Timm     {
353089380a5SOliver Bolte     case ALL:
3540fefcd83SRüdiger Timm         {
355089380a5SOliver Bolte             sal_Int32 nNewSlideIndex = mnCurrentSlideIndex + 1;
356089380a5SOliver Bolte             if( isValidIndex( nNewSlideIndex ) )
357089380a5SOliver Bolte             {
358089380a5SOliver Bolte                 // if the current slide is not excluded, make sure the
359089380a5SOliver Bolte                 // next slide is also not excluded.
360089380a5SOliver Bolte                 // if the current slide is excluded, we want to go
361089380a5SOliver Bolte                 // to the next slide, even if this is also excluded.
362089380a5SOliver Bolte                 if( maSlideVisible[mnCurrentSlideIndex] )
363089380a5SOliver Bolte                 {
364089380a5SOliver Bolte                     while( isValidIndex( nNewSlideIndex ) )
365089380a5SOliver Bolte                     {
366089380a5SOliver Bolte                         if( maSlideVisible[nNewSlideIndex] )
367089380a5SOliver Bolte                             break;
3680fefcd83SRüdiger Timm 
369089380a5SOliver Bolte                         nNewSlideIndex++;
3700fefcd83SRüdiger Timm                     }
3710fefcd83SRüdiger Timm                 }
3720fefcd83SRüdiger Timm             }
373c9c9d428SOliver Bolte             return isValidIndex( nNewSlideIndex ) ? nNewSlideIndex : -1;
3740fefcd83SRüdiger Timm         }
3750fefcd83SRüdiger Timm 
376089380a5SOliver Bolte     case FROM:
377089380a5SOliver Bolte     case CUSTOM:
378089380a5SOliver Bolte         return mnHiddenSlideNumber == -1 ? mnCurrentSlideIndex + 1 : mnCurrentSlideIndex;
379089380a5SOliver Bolte 
380089380a5SOliver Bolte     default:
381089380a5SOliver Bolte     case PREVIEW:
382089380a5SOliver Bolte         return -1;
383089380a5SOliver Bolte 
384089380a5SOliver Bolte     }
385089380a5SOliver Bolte }
386089380a5SOliver Bolte 
387089380a5SOliver Bolte sal_Int32 AnimationSlideController::getNextSlideNumber() const
388089380a5SOliver Bolte {
389089380a5SOliver Bolte     sal_Int32 nNextSlideIndex = getNextSlideIndex();
390089380a5SOliver Bolte     if( isValidIndex( nNextSlideIndex ) )
391089380a5SOliver Bolte     {
392089380a5SOliver Bolte         return maSlideNumbers[nNextSlideIndex];
393089380a5SOliver Bolte     }
394089380a5SOliver Bolte     else
395089380a5SOliver Bolte     {
396089380a5SOliver Bolte         return -1;
397089380a5SOliver Bolte     }
398089380a5SOliver Bolte }
399089380a5SOliver Bolte 
400089380a5SOliver Bolte bool AnimationSlideController::nextSlide()
401089380a5SOliver Bolte {
402089380a5SOliver Bolte     return jumpToSlideIndex( getNextSlideIndex() );
403089380a5SOliver Bolte }
404089380a5SOliver Bolte 
405c9c9d428SOliver Bolte sal_Int32 AnimationSlideController::getPreviousSlideIndex() const
406089380a5SOliver Bolte {
407089380a5SOliver Bolte     sal_Int32 nNewSlideIndex = mnCurrentSlideIndex - 1;
408089380a5SOliver Bolte 
409089380a5SOliver Bolte     switch( meMode )
410089380a5SOliver Bolte     {
411089380a5SOliver Bolte         case ALL:
412089380a5SOliver Bolte         {
413089380a5SOliver Bolte             // make sure the previous slide is visible
414089380a5SOliver Bolte             // or was already visited
415089380a5SOliver Bolte             while( isValidIndex( nNewSlideIndex ) )
416089380a5SOliver Bolte             {
417089380a5SOliver Bolte                 if( maSlideVisible[nNewSlideIndex] || maSlideVisited[nNewSlideIndex] )
418089380a5SOliver Bolte                     break;
419089380a5SOliver Bolte 
420089380a5SOliver Bolte                 nNewSlideIndex--;
421089380a5SOliver Bolte             }
422089380a5SOliver Bolte 
423089380a5SOliver Bolte             break;
424089380a5SOliver Bolte         }
425089380a5SOliver Bolte 
426089380a5SOliver Bolte         case PREVIEW:
427c9c9d428SOliver Bolte             return -1;
428c9c9d428SOliver Bolte 
429c9c9d428SOliver Bolte         default:
430c9c9d428SOliver Bolte             break;
431089380a5SOliver Bolte     }
432089380a5SOliver Bolte 
433c9c9d428SOliver Bolte     return nNewSlideIndex;
434c9c9d428SOliver Bolte }
435c9c9d428SOliver Bolte 
436c9c9d428SOliver Bolte bool AnimationSlideController::previousSlide()
437c9c9d428SOliver Bolte {
438c9c9d428SOliver Bolte     return jumpToSlideIndex( getPreviousSlideIndex() );
439089380a5SOliver Bolte }
440089380a5SOliver Bolte 
4417dd531f8Sthb void AnimationSlideController::displayCurrentSlide( const Reference< XSlideShow >& xShow,
4427dd531f8Sthb                                                     const Reference< XDrawPagesSupplier>& xDrawPages,
44376c3d136SAndre Fischer                                                     const bool bSkipAllMainSequenceEffects )
444089380a5SOliver Bolte {
445089380a5SOliver Bolte     const sal_Int32 nCurrentSlideNumber = getCurrentSlideNumber();
446089380a5SOliver Bolte 
447b104e6e9SNoel Grandin     if( !(xShow.is() && (nCurrentSlideNumber != -1 )) )
448b104e6e9SNoel Grandin         return;
449b104e6e9SNoel Grandin 
450089380a5SOliver Bolte     Reference< XDrawPage > xSlide;
451089380a5SOliver Bolte     Reference< XAnimationNode > xAnimNode;
45276c3d136SAndre Fischer     ::std::vector<PropertyValue> aProperties;
453089380a5SOliver Bolte 
454089380a5SOliver Bolte     const sal_Int32 nNextSlideNumber = getNextSlideNumber();
455089380a5SOliver Bolte     if( getSlideAPI( nNextSlideNumber, xSlide, xAnimNode )  )
456089380a5SOliver Bolte     {
457089380a5SOliver Bolte         Sequence< Any > aValue(2);
458089380a5SOliver Bolte         aValue[0] <<= xSlide;
459089380a5SOliver Bolte         aValue[1] <<= xAnimNode;
460a185ea4eSNoel Grandin         aProperties.emplace_back( "Prefetch" ,
46176c3d136SAndre Fischer                 -1,
46276c3d136SAndre Fischer                 Any(aValue),
463a185ea4eSNoel Grandin                 PropertyState_DIRECT_VALUE);
46476c3d136SAndre Fischer     }
46576c3d136SAndre Fischer     if (bSkipAllMainSequenceEffects)
46676c3d136SAndre Fischer     {
46776c3d136SAndre Fischer         // Add one property that prevents the slide transition from being
46876c3d136SAndre Fischer         // shown (to speed up the transition to the previous slide) and
46976c3d136SAndre Fischer         // one to show all main sequence effects so that the user can
47076c3d136SAndre Fischer         // continue to undo effects.
471a185ea4eSNoel Grandin         aProperties.emplace_back( "SkipAllMainSequenceEffects",
47276c3d136SAndre Fischer                 -1,
4730003e99bSStephan Bergmann                 Any(true),
474a185ea4eSNoel Grandin                 PropertyState_DIRECT_VALUE);
475a185ea4eSNoel Grandin         aProperties.emplace_back("SkipSlideTransition",
47676c3d136SAndre Fischer                 -1,
4770003e99bSStephan Bergmann                 Any(true),
478a185ea4eSNoel Grandin                 PropertyState_DIRECT_VALUE);
479089380a5SOliver Bolte     }
480089380a5SOliver Bolte 
481089380a5SOliver Bolte     if( getSlideAPI( nCurrentSlideNumber, xSlide, xAnimNode ) )
4822554efabSNoel Grandin         xShow->displaySlide( xSlide, xDrawPages, xAnimNode, comphelper::containerToSequence(aProperties) );
483089380a5SOliver Bolte }
4840fefcd83SRüdiger Timm 
48533ecd0d5SStephan Bergmann constexpr OUStringLiteral gsOnClick( u"OnClick" );
48633ecd0d5SStephan Bergmann constexpr OUStringLiteral gsBookmark( u"Bookmark" );
48733ecd0d5SStephan Bergmann constexpr OUStringLiteral gsVerb( u"Verb" );
488453879cfSNoel Grandin 
489827c46e7SNoel Grandin SlideshowImpl::SlideshowImpl( const Reference< XPresentation2 >& xPresentation, ViewShell* pViewSh, ::sd::View* pView, SdDrawDocument* pDoc, vcl::Window* pParentWindow )
490808a70e2SKurt Zenker : SlideshowImplBase( m_aMutex )
491808a70e2SKurt Zenker , mxModel(pDoc->getUnoModel(),UNO_QUERY_THROW)
492808a70e2SKurt Zenker , mpView(pView)
493808a70e2SKurt Zenker , mpViewShell(pViewSh)
494808a70e2SKurt Zenker , mpDocSh(pDoc->GetDocSh())
495808a70e2SKurt Zenker , mpDoc(pDoc)
496808a70e2SKurt Zenker , mpParentWindow(pParentWindow)
49792c697c0SStephan Bergmann , mpShowWindow(nullptr)
498808a70e2SKurt Zenker , mnRestoreSlide(0)
499808a70e2SKurt Zenker , maPresSize( -1, -1 )
500808a70e2SKurt Zenker , meAnimationMode(ANIMATIONMODE_SHOW)
50192c697c0SStephan Bergmann , mpOldActiveWindow(nullptr)
502808a70e2SKurt Zenker , mnChildMask( 0 )
503808a70e2SKurt Zenker , mbDisposed(false)
504cf0eb5f7SCaolán McNamara , mbAutoSaveWasOn(false)
505808a70e2SKurt Zenker , mbRehearseTimings(false)
506808a70e2SKurt Zenker , mbIsPaused(false)
507d9568be3SCaolán McNamara , mbWasPaused(false)
508808a70e2SKurt Zenker , mbInputFreeze(false)
509b45a12c3SNoel Grandin , mbActive(false)
510808a70e2SKurt Zenker , maPresSettings( pDoc->getPresentationSettings() )
511ef238fc5SChristian Lippka ORACLE , mnUserPaintColor( 0x80ff0000L )
51203a5e096SChristian Lippka , mbUsePen(false)
513ef238fc5SChristian Lippka ORACLE , mdUserPaintStrokeWidth ( 150.0 )
51492c697c0SStephan Bergmann , mnEndShowEvent(nullptr)
51592c697c0SStephan Bergmann , mnContextMenuEvent(nullptr)
516808a70e2SKurt Zenker , mxPresentation( xPresentation )
5170fefcd83SRüdiger Timm {
5180fefcd83SRüdiger Timm     if( mpViewShell )
5190fefcd83SRüdiger Timm         mpOldActiveWindow = mpViewShell->GetActiveWindow();
5200fefcd83SRüdiger Timm 
521*5e8c0e25SLuboš Luňák     maUpdateTimer.SetDebugName("SlideShowImpl maUpdateTimer");
522bf110d40SJan-Marek Glogowski     maUpdateTimer.SetInvokeHandler(LINK(this, SlideshowImpl, updateHdl));
5233a906cedSMichael Meeks     // Priority must not be too high or we'll starve input handling etc.
524fdc61261SJan-Marek Glogowski     maUpdateTimer.SetPriority(TaskPriority::REPAINT);
52567aad3b7SRüdiger Timm 
526*5e8c0e25SLuboš Luňák     maDeactivateTimer.SetDebugName("SlideShowImpl maDeactivateTimer");
527bf110d40SJan-Marek Glogowski     maDeactivateTimer.SetInvokeHandler(LINK(this, SlideshowImpl, deactivateHdl));
528808a70e2SKurt Zenker     maDeactivateTimer.SetTimeout( 20 );
529808a70e2SKurt Zenker 
530*5e8c0e25SLuboš Luňák     maInputFreezeTimer.SetDebugName("SlideShowImpl maInputFreezeTimer");
531bf110d40SJan-Marek Glogowski     maInputFreezeTimer.SetInvokeHandler( LINK( this, SlideshowImpl, ReadyForNextInputHdl ) );
53267aad3b7SRüdiger Timm     maInputFreezeTimer.SetTimeout( 20 );
533cfb3429dSOliver Bolte 
534cfb3429dSOliver Bolte     SvtSaveOptions aOptions;
535cfb3429dSOliver Bolte 
536cfb3429dSOliver Bolte         // no autosave during show
537cfb3429dSOliver Bolte     if( aOptions.IsAutoSave() )
538cfb3429dSOliver Bolte         mbAutoSaveWasOn = true;
53981f4197bSRüdiger Timm 
54081f4197bSRüdiger Timm     Application::AddEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) );
54103a5e096SChristian Lippka 
54203a5e096SChristian Lippka     mbUsePen = maPresSettings.mbMouseAsPen;
54303a5e096SChristian Lippka 
544d58c604eSNoel Grandin     SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
54503a5e096SChristian Lippka     if( pOptions )
54603a5e096SChristian Lippka     {
54703a5e096SChristian Lippka         mnUserPaintColor = pOptions->GetPresentationPenColor();
54803a5e096SChristian Lippka         mdUserPaintStrokeWidth = pOptions->GetPresentationPenWidth();
54903a5e096SChristian Lippka     }
5500fefcd83SRüdiger Timm }
5510fefcd83SRüdiger Timm 
5520fefcd83SRüdiger Timm SlideshowImpl::~SlideshowImpl()
5530fefcd83SRüdiger Timm {
55424b867c1SCaolán McNamara     SdModule *pModule = SD_MOD();
55524b867c1SCaolán McNamara     //rhbz#806663 SlideshowImpl can outlive SdModule
55624b867c1SCaolán McNamara     SdOptions* pOptions = pModule ?
557d58c604eSNoel Grandin         pModule->GetSdOptions(DocumentType::Impress) : nullptr;
55803a5e096SChristian Lippka     if( pOptions )
55903a5e096SChristian Lippka     {
56003a5e096SChristian Lippka         pOptions->SetPresentationPenColor(mnUserPaintColor);
56103a5e096SChristian Lippka         pOptions->SetPresentationPenWidth(mdUserPaintStrokeWidth);
56203a5e096SChristian Lippka     }
56303a5e096SChristian Lippka 
56481f4197bSRüdiger Timm     Application::RemoveEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) );
56581f4197bSRüdiger Timm 
566808a70e2SKurt Zenker     maDeactivateTimer.Stop();
567808a70e2SKurt Zenker 
568808a70e2SKurt Zenker     if( !mbDisposed )
569808a70e2SKurt Zenker     {
570f4aaa487SThomas Arnhold         OSL_FAIL("SlideshowImpl::~SlideshowImpl(), component was not disposed!");
571808a70e2SKurt Zenker         disposing();
572808a70e2SKurt Zenker     }
573808a70e2SKurt Zenker }
574808a70e2SKurt Zenker 
575808a70e2SKurt Zenker void SAL_CALL SlideshowImpl::disposing()
576808a70e2SKurt Zenker {
5778f81eb2dSAndrzej J.R. Hunt #ifdef ENABLE_SDREMOTE
5784d14068cSAndrzej J.R. Hunt     RemoteServer::presentationStopped();
5798f81eb2dSAndrzej J.R. Hunt #endif
580808a70e2SKurt Zenker     if( mxShow.is() && mpDoc )
581e292ef25SArmin Le Grand         NotifyDocumentEvent(
582e292ef25SArmin Le Grand             *mpDoc,
583e292ef25SArmin Le Grand             "OnEndPresentation" );
584808a70e2SKurt Zenker 
585cfb3429dSOliver Bolte     if( mbAutoSaveWasOn )
586cfb3429dSOliver Bolte         setAutoSaveState( true );
587cfb3429dSOliver Bolte 
588285b99a1SKurt Zenker     if( mnEndShowEvent )
589285b99a1SKurt Zenker         Application::RemoveUserEvent( mnEndShowEvent );
590a9bec6a7SRüdiger Timm     if( mnContextMenuEvent )
591a9bec6a7SRüdiger Timm         Application::RemoveUserEvent( mnContextMenuEvent );
592808a70e2SKurt Zenker 
593808a70e2SKurt Zenker     maInputFreezeTimer.Stop();
594808a70e2SKurt Zenker 
595f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
596808a70e2SKurt Zenker 
597808a70e2SKurt Zenker     if( !mxShow.is() )
598808a70e2SKurt Zenker         return;
599808a70e2SKurt Zenker 
600808a70e2SKurt Zenker     if( mxPresentation.is() )
601808a70e2SKurt Zenker         mxPresentation->end();
602808a70e2SKurt Zenker 
603808a70e2SKurt Zenker     maUpdateTimer.Stop();
604d60a926fSRüdiger Timm 
605808a70e2SKurt Zenker     removeShapeEvents();
606285b99a1SKurt Zenker 
607808a70e2SKurt Zenker     if( mxListenerProxy.is() )
608808a70e2SKurt Zenker         mxListenerProxy->removeAsSlideShowListener();
6090fefcd83SRüdiger Timm 
610808a70e2SKurt Zenker     try
611808a70e2SKurt Zenker     {
612808a70e2SKurt Zenker         if( mxView.is() )
6130ae0b7ffSNoel             mxShow->removeView( mxView );
614808a70e2SKurt Zenker 
615808a70e2SKurt Zenker         Reference< XComponent > xComponent( mxShow, UNO_QUERY );
616808a70e2SKurt Zenker         if( xComponent.is() )
617808a70e2SKurt Zenker             xComponent->dispose();
618808a70e2SKurt Zenker 
619808a70e2SKurt Zenker         if( mxView.is() )
620808a70e2SKurt Zenker             mxView->dispose();
621808a70e2SKurt Zenker     }
6228cc98837STakeshi Abe     catch( Exception& )
623808a70e2SKurt Zenker     {
624889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::stop()" );
625808a70e2SKurt Zenker     }
626808a70e2SKurt Zenker 
627808a70e2SKurt Zenker     mxShow.clear();
628f66eec46SStephan Bergmann     mxView.clear();
629808a70e2SKurt Zenker     mxListenerProxy.clear();
630808a70e2SKurt Zenker     mpSlideController.reset();
631808a70e2SKurt Zenker 
632f4a37ca9SUrs Fässler     // take DrawView from presentation window, but give the old window back
633808a70e2SKurt Zenker     if( mpShowWindow && mpView )
634808a70e2SKurt Zenker         mpView->DeleteWindowFromPaintView( mpShowWindow );
635808a70e2SKurt Zenker 
636808a70e2SKurt Zenker     if( mpView )
637608953c4SStephan Bergmann         mpView->SetAnimationPause( false );
638808a70e2SKurt Zenker 
639808a70e2SKurt Zenker     if( mpViewShell )
640808a70e2SKurt Zenker     {
641808a70e2SKurt Zenker         mpViewShell->SetActiveWindow(mpOldActiveWindow);
64265090036SCaolán McNamara         if (mpShowWindow)
64392c697c0SStephan Bergmann             mpShowWindow->SetViewShell( nullptr );
644808a70e2SKurt Zenker     }
645808a70e2SKurt Zenker 
646808a70e2SKurt Zenker     if( mpView )
647808a70e2SKurt Zenker         mpView->InvalidateAllWin();
648808a70e2SKurt Zenker 
649808a70e2SKurt Zenker     if( maPresSettings.mbFullScreen )
650808a70e2SKurt Zenker     {
6519ecac387STor Lillqvist #if HAVE_FEATURE_SCRIPTING
652808a70e2SKurt Zenker         // restore StarBASICErrorHdl
653808a70e2SKurt Zenker         StarBASIC::SetGlobalErrorHdl(maStarBASICGlobalErrorHdl);
654ae451af8SNoel Grandin         maStarBASICGlobalErrorHdl = Link<StarBASIC*,bool>();
655b344c30aSTor Lillqvist #endif
656808a70e2SKurt Zenker     }
657808a70e2SKurt Zenker     else
658808a70e2SKurt Zenker     {
659808a70e2SKurt Zenker         if( mpShowWindow )
660808a70e2SKurt Zenker             mpShowWindow->Hide();
661808a70e2SKurt Zenker     }
662808a70e2SKurt Zenker 
663808a70e2SKurt Zenker     if( meAnimationMode == ANIMATIONMODE_SHOW )
664808a70e2SKurt Zenker     {
665808a70e2SKurt Zenker         mpDocSh->SetSlotFilter();
666808a70e2SKurt Zenker         mpDocSh->ApplySlotFilter();
667808a70e2SKurt Zenker 
668808a70e2SKurt Zenker         Help::EnableContextHelp();
669808a70e2SKurt Zenker         Help::EnableExtHelp();
670808a70e2SKurt Zenker 
671808a70e2SKurt Zenker         showChildWindows();
6722e8acde1SNoel Grandin         mnChildMask = 0;
673808a70e2SKurt Zenker     }
674808a70e2SKurt Zenker 
675f4a37ca9SUrs Fässler     // show current window again
67689d39bc1SOliver Specht     if( mpViewShell && dynamic_cast< PresentationViewShell *>( mpViewShell ) ==  nullptr)
677808a70e2SKurt Zenker     {
678808a70e2SKurt Zenker         if( meAnimationMode == ANIMATIONMODE_SHOW )
679808a70e2SKurt Zenker         {
680808a70e2SKurt Zenker             mpViewShell->GetViewShellBase().ShowUIControls (true);
681808a70e2SKurt Zenker             mpPaneHider.reset();
682808a70e2SKurt Zenker         }
683808a70e2SKurt Zenker         else if( meAnimationMode == ANIMATIONMODE_PREVIEW )
684808a70e2SKurt Zenker         {
6856c87b028SNoel Grandin             mpViewShell->ShowUIControls(true);
686808a70e2SKurt Zenker         }
687808a70e2SKurt Zenker     }
688808a70e2SKurt Zenker 
689808a70e2SKurt Zenker     if( mpShowWindow )
690808a70e2SKurt Zenker         mpShowWindow->Hide();
691c0a802b5SMichael Meeks     mpShowWindow.disposeAndClear();
692808a70e2SKurt Zenker 
693808a70e2SKurt Zenker     if ( mpViewShell )
694808a70e2SKurt Zenker     {
695808a70e2SKurt Zenker         if( meAnimationMode == ANIMATIONMODE_SHOW )
696808a70e2SKurt Zenker         {
697808a70e2SKurt Zenker             ::sd::Window* pActWin = mpViewShell->GetActiveWindow();
698808a70e2SKurt Zenker 
699808a70e2SKurt Zenker             if (pActWin)
700808a70e2SKurt Zenker             {
701808a70e2SKurt Zenker                 Size aVisSizePixel = pActWin->GetOutputSizePixel();
702a5a57130SMiklos Vajna                 ::tools::Rectangle aVisAreaWin = pActWin->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
703808a70e2SKurt Zenker                 mpViewShell->VisAreaChanged(aVisAreaWin);
704eef3f4ceSCaolán McNamara                 if (mpView)
705808a70e2SKurt Zenker                     mpView->VisAreaChanged(pActWin);
706808a70e2SKurt Zenker                 pActWin->GrabFocus();
707808a70e2SKurt Zenker             }
708808a70e2SKurt Zenker         }
709808a70e2SKurt Zenker 
710808a70e2SKurt Zenker         // restart the custom show dialog if he started us
711808a70e2SKurt Zenker         if( mpViewShell->IsStartShowWithDialog() && getDispatcher() )
712808a70e2SKurt Zenker         {
713b45a12c3SNoel Grandin             mpViewShell->SetStartShowWithDialog( false );
7148044acf2SNoel Grandin             getDispatcher()->Execute( SID_CUSTOMSHOW_DLG, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
715808a70e2SKurt Zenker         }
716808a70e2SKurt Zenker 
717808a70e2SKurt Zenker         mpViewShell->GetViewShellBase().UpdateBorder(true);
718808a70e2SKurt Zenker     }
719808a70e2SKurt Zenker 
72081f4197bSRüdiger Timm     if( mpShowWindow )
72181f4197bSRüdiger Timm     {
722bce35b8eSJulien Nabet         mpShowWindow.disposeAndClear();
72381f4197bSRüdiger Timm     }
72481f4197bSRüdiger Timm 
725b45a12c3SNoel Grandin     setActiveXToolbarsVisible( true );
72620549ebeSOliver Bolte 
727808a70e2SKurt Zenker     mbDisposed = true;
7280fefcd83SRüdiger Timm }
7290fefcd83SRüdiger Timm 
730e40dc5a0SKurt Zenker bool SlideshowImpl::startPreview(
7310fefcd83SRüdiger Timm         const Reference< XDrawPage >& xDrawPage,
732089380a5SOliver Bolte         const Reference< XAnimationNode >& xAnimationNode,
733827c46e7SNoel Grandin         vcl::Window * pParent )
7340fefcd83SRüdiger Timm {
735e40dc5a0SKurt Zenker     bool bRet = false;
736e40dc5a0SKurt Zenker 
7370fefcd83SRüdiger Timm     try
7380fefcd83SRüdiger Timm     {
739e40dc5a0SKurt Zenker         const Reference<lang::XServiceInfo> xServiceInfo( xDrawPage, UNO_QUERY );
740e40dc5a0SKurt Zenker         if (xServiceInfo.is()) {
741e40dc5a0SKurt Zenker             const Sequence<OUString> supportedServices(
742e40dc5a0SKurt Zenker                 xServiceInfo->getSupportedServiceNames() );
743d458adeeSArkadiy Illarionov             if (comphelper::findValue(supportedServices, "com.sun.star.drawing.MasterPage") != -1) {
744e9b90a77SThomas Arnhold                 OSL_FAIL("sd::SlideshowImpl::startPreview() "
745e40dc5a0SKurt Zenker                           "not allowed on master page!");
746e40dc5a0SKurt Zenker                 return false;
747e40dc5a0SKurt Zenker             }
748e40dc5a0SKurt Zenker         }
749e40dc5a0SKurt Zenker 
7500fefcd83SRüdiger Timm         mxPreviewDrawPage = xDrawPage;
7510fefcd83SRüdiger Timm         mxPreviewAnimationNode = xAnimationNode;
7520fefcd83SRüdiger Timm         meAnimationMode = ANIMATIONMODE_PREVIEW;
7530fefcd83SRüdiger Timm 
754b45a12c3SNoel Grandin         maPresSettings.mbAll = false;
755b45a12c3SNoel Grandin         maPresSettings.mbEndless = false;
756b45a12c3SNoel Grandin         maPresSettings.mbCustomShow = false;
757b45a12c3SNoel Grandin         maPresSettings.mbManual = false;
758b45a12c3SNoel Grandin         maPresSettings.mbMouseVisible = false;
759b45a12c3SNoel Grandin         maPresSettings.mbMouseAsPen = false;
760b45a12c3SNoel Grandin         maPresSettings.mbLockedPages = false;
761b45a12c3SNoel Grandin         maPresSettings.mbAlwaysOnTop = false;
762b45a12c3SNoel Grandin         maPresSettings.mbFullScreen = false;
763b45a12c3SNoel Grandin         maPresSettings.mbAnimationAllowed = true;
7640fefcd83SRüdiger Timm         maPresSettings.mnPauseTimeout = 0;
765b45a12c3SNoel Grandin         maPresSettings.mbShowPauseLogo = false;
7660fefcd83SRüdiger Timm 
767089380a5SOliver Bolte         Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW );
768089380a5SOliver Bolte         Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
769d712ebc2SNoel Grandin         mpSlideController = std::make_shared<AnimationSlideController>( xSlides, AnimationSlideController::PREVIEW );
7700fefcd83SRüdiger Timm 
771445a02edSVladimir Glazounov         sal_Int32 nSlideNumber = 0;
7720fefcd83SRüdiger Timm         Reference< XPropertySet > xSet( mxPreviewDrawPage, UNO_QUERY_THROW );
77396f9300aSOlivier Hallot         xSet->getPropertyValue( "Number" ) >>= nSlideNumber;
774089380a5SOliver Bolte         mpSlideController->insertSlideNumber( nSlideNumber-1 );
775089380a5SOliver Bolte         mpSlideController->setPreviewNode( xAnimationNode );
7760fefcd83SRüdiger Timm 
77792c697c0SStephan Bergmann         mpShowWindow = VclPtr<ShowWindow>::Create( this, ((pParent == nullptr) && mpViewShell) ?  mpParentWindow.get() : pParent );
7780fefcd83SRüdiger Timm         if( mpViewShell )
7790fefcd83SRüdiger Timm         {
7800fefcd83SRüdiger Timm             mpViewShell->SetActiveWindow( mpShowWindow );
7810fefcd83SRüdiger Timm             mpShowWindow->SetViewShell (mpViewShell);
78267aad3b7SRüdiger Timm             mpViewShell->ShowUIControls (false);
7830fefcd83SRüdiger Timm         }
7840fefcd83SRüdiger Timm 
7850fefcd83SRüdiger Timm         if( mpView )
786f41d396dSJens-Heiner Rechtien         {
78792c697c0SStephan Bergmann             mpView->AddWindowToPaintView( mpShowWindow, nullptr );
788608953c4SStephan Bergmann             mpView->SetAnimationPause( true );
789f41d396dSJens-Heiner Rechtien         }
7900fefcd83SRüdiger Timm 
7910fefcd83SRüdiger Timm         // call resize handler
792f8926799SVladimir Glazounov         if( pParent )
793f8926799SVladimir Glazounov         {
794f8926799SVladimir Glazounov             maPresSize = pParent->GetSizePixel();
795f8926799SVladimir Glazounov         }
796f8926799SVladimir Glazounov         else if( mpViewShell )
797f8926799SVladimir Glazounov         {
798a5a57130SMiklos Vajna             ::tools::Rectangle aContentRect (mpViewShell->GetViewShellBase().getClientRectangle());
799e9cb5577SNoel Grandin             if (AllSettings::GetLayoutRTL())
800a18c96c4SKurt Zenker             {
8010d9f3f76SNoel Grandin                 aContentRect.SetLeft( aContentRect.Right() );
8024beed2baSNoel Grandin                 aContentRect.AdjustRight(aContentRect.Right() );
803a18c96c4SKurt Zenker             }
80467aad3b7SRüdiger Timm             maPresSize = aContentRect.GetSize();
80567aad3b7SRüdiger Timm             mpShowWindow->SetPosPixel( aContentRect.TopLeft() );
806f8926799SVladimir Glazounov         }
807f8926799SVladimir Glazounov         else
808f8926799SVladimir Glazounov         {
809f4aaa487SThomas Arnhold             OSL_FAIL("sd::SlideshowImpl::startPreview(), I need either a parent window or a viewshell!");
810f8926799SVladimir Glazounov         }
8110fefcd83SRüdiger Timm         resize( maPresSize );
8120fefcd83SRüdiger Timm 
8130fefcd83SRüdiger Timm         sal_Int32 nPropertyCount = 1;
8140fefcd83SRüdiger Timm         if( mxPreviewAnimationNode.is() )
8150fefcd83SRüdiger Timm             nPropertyCount++;
8160fefcd83SRüdiger Timm 
8170fefcd83SRüdiger Timm         Sequence< beans::PropertyValue > aProperties(nPropertyCount);
81896f9300aSOlivier Hallot         aProperties[0].Name = "AutomaticAdvancement";
8197662e92cSNoel Grandin         aProperties[0].Value <<= 1.0; // one second timeout
8200fefcd83SRüdiger Timm 
8210fefcd83SRüdiger Timm         if( mxPreviewAnimationNode.is() )
8220fefcd83SRüdiger Timm         {
82396f9300aSOlivier Hallot             aProperties[1].Name = "NoSlideTransitions";
824198c41c4SNoel Grandin             aProperties[1].Value <<= true;
8250fefcd83SRüdiger Timm         }
8260fefcd83SRüdiger Timm 
827089380a5SOliver Bolte         bRet = startShowImpl( aProperties );
8280fefcd83SRüdiger Timm 
8291c4025baSNoel Grandin         if( mpShowWindow != nullptr && meAnimationMode == ANIMATIONMODE_PREVIEW )
8300fefcd83SRüdiger Timm             mpShowWindow->SetPreviewMode();
8310fefcd83SRüdiger Timm 
8320fefcd83SRüdiger Timm     }
8338cc98837STakeshi Abe     catch( Exception& )
8340fefcd83SRüdiger Timm     {
835889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startPreview()" );
836e40dc5a0SKurt Zenker         bRet = false;
8370fefcd83SRüdiger Timm     }
8380fefcd83SRüdiger Timm 
839e40dc5a0SKurt Zenker     return bRet;
840e40dc5a0SKurt Zenker }
841e40dc5a0SKurt Zenker 
8429610bab0SNoel Grandin bool SlideshowImpl::startShow( PresentationSettingsEx const * pPresSettings )
8430fefcd83SRüdiger Timm {
844b9fe4f26SNoel Grandin     const rtl::Reference<SlideshowImpl> xKeepAlive(this);
845e40dc5a0SKurt Zenker 
8460fefcd83SRüdiger Timm     DBG_ASSERT( !mxShow.is(), "sd::SlideshowImpl::startShow(), called twice!" );
8470fefcd83SRüdiger Timm     if( mxShow.is() )
848e40dc5a0SKurt Zenker         return true;
8491c4025baSNoel Grandin     DBG_ASSERT( mpParentWindow!=nullptr, "sd::SlideshowImpl::startShow() called without parent window" );
8501c4025baSNoel Grandin     if (mpParentWindow == nullptr)
851ce2b6494SRüdiger Timm         return false;
8520fefcd83SRüdiger Timm 
853b8608fddSSamuel Mehrbrodt     // Autoplay (pps/ppsx)
854b8608fddSSamuel Mehrbrodt     if (mpViewShell->GetDoc()->IsStartWithPresentation()){
855b8608fddSSamuel Mehrbrodt         mpViewShell->GetDoc()->SetExitAfterPresenting(true);
856b8608fddSSamuel Mehrbrodt     }
857b8608fddSSamuel Mehrbrodt 
858e40dc5a0SKurt Zenker     bool bRet = false;
8590fefcd83SRüdiger Timm 
8600fefcd83SRüdiger Timm     try
8610fefcd83SRüdiger Timm     {
8620fefcd83SRüdiger Timm         if( pPresSettings )
863594c82b6SRüdiger Timm         {
8640fefcd83SRüdiger Timm             maPresSettings = *pPresSettings;
865594c82b6SRüdiger Timm             mbRehearseTimings = pPresSettings->mbRehearseTimings;
866594c82b6SRüdiger Timm         }
8670fefcd83SRüdiger Timm 
86815d88e25SNoel Grandin         OUString  aPresSlide( maPresSettings.maPresPage );
869bce04e51SNoel Grandin         SdPage* pStartPage = mpViewShell->GetActualPage();
87012b78eddSRob Snelders         bool    bStartWithActualSlide =  pStartPage;
8710fefcd83SRüdiger Timm 
872f4a37ca9SUrs Fässler         // times should be measured?
8730fefcd83SRüdiger Timm         if( mbRehearseTimings )
8740fefcd83SRüdiger Timm         {
875b45a12c3SNoel Grandin             maPresSettings.mbEndless = false;
876b45a12c3SNoel Grandin             maPresSettings.mbManual = true;
877b45a12c3SNoel Grandin             maPresSettings.mbMouseVisible = true;
878b45a12c3SNoel Grandin             maPresSettings.mbMouseAsPen = false;
8790fefcd83SRüdiger Timm             maPresSettings.mnPauseTimeout = 0;
880b45a12c3SNoel Grandin             maPresSettings.mbShowPauseLogo = false;
8810fefcd83SRüdiger Timm         }
8820fefcd83SRüdiger Timm 
8830fefcd83SRüdiger Timm         if( pStartPage )
8840fefcd83SRüdiger Timm         {
885e588aa4dSNoel Grandin             if( pStartPage->GetPageKind() == PageKind::Notes )
8860fefcd83SRüdiger Timm             {
8870fefcd83SRüdiger Timm                 // we are in notes page mode, so get
8880fefcd83SRüdiger Timm                 // the corresponding draw page
8893d6bed44SCarsten Driesner                 const sal_uInt16 nPgNum = ( pStartPage->GetPageNum() - 2 ) >> 1;
890e588aa4dSNoel Grandin                 pStartPage = mpDoc->GetSdPage( nPgNum, PageKind::Standard );
8910fefcd83SRüdiger Timm             }
8920fefcd83SRüdiger Timm         }
8930fefcd83SRüdiger Timm 
894089380a5SOliver Bolte         if( bStartWithActualSlide )
89589e5c418SVladimir Glazounov         {
89615d88e25SNoel Grandin             if ( aPresSlide.isEmpty())
897e8b924e4SKatarina Behrens             {
898e8b924e4SKatarina Behrens                 // no preset slide yet, so pick current on one
89945e4a5efSKatarina Behrens                 aPresSlide = pStartPage->GetName();
90045e4a5efSKatarina Behrens                 // if the starting slide is hidden, we can't set slide controller to ALL mode
90145e4a5efSKatarina Behrens                 maPresSettings.mbAll = !pStartPage->IsExcluded();
902e8b924e4SKatarina Behrens             }
90345e4a5efSKatarina Behrens 
90489e5c418SVladimir Glazounov             if( meAnimationMode != ANIMATIONMODE_SHOW )
9050fefcd83SRüdiger Timm             {
906e588aa4dSNoel Grandin                 if( pStartPage->GetPageKind() == PageKind::Standard )
90789e5c418SVladimir Glazounov                 {
9080fefcd83SRüdiger Timm                     maPresSettings.mbAll = false;
9090fefcd83SRüdiger Timm                 }
91089e5c418SVladimir Glazounov             }
91189e5c418SVladimir Glazounov         }
9120fefcd83SRüdiger Timm 
91345e4a5efSKatarina Behrens         // build page list
914a1b0b68cSCaolán McNamara         createSlideList( maPresSettings.mbAll, aPresSlide );
915089380a5SOliver Bolte 
916089380a5SOliver Bolte         // remember Slide number from where the show was started
9170fefcd83SRüdiger Timm         if( pStartPage )
918089380a5SOliver Bolte             mnRestoreSlide = ( pStartPage->GetPageNum() - 1 ) / 2;
9190fefcd83SRüdiger Timm 
9206ee44161SIvo Hinkelmann         if( mpSlideController->hasSlides() )
9216ee44161SIvo Hinkelmann         {
9220fefcd83SRüdiger Timm             // hide child windows
9230fefcd83SRüdiger Timm             hideChildWindows();
9240fefcd83SRüdiger Timm 
9257819d49fSNoel Grandin             mpShowWindow = VclPtr<ShowWindow>::Create( this, mpParentWindow );
926bbf92b62SOliver Bolte             mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible );
9270fefcd83SRüdiger Timm             mpViewShell->SetActiveWindow( mpShowWindow );
9280fefcd83SRüdiger Timm             mpShowWindow->SetViewShell (mpViewShell);
9290fefcd83SRüdiger Timm             mpViewShell->GetViewShellBase().ShowUIControls (false);
930808a70e2SKurt Zenker             // Hide the side panes for in-place presentations.
931808a70e2SKurt Zenker             if ( ! maPresSettings.mbFullScreen)
932808a70e2SKurt Zenker                 mpPaneHider.reset(new PaneHider(*mpViewShell,this));
9330fefcd83SRüdiger Timm 
934820a2995SPedro Giffuni             // these Slots are forbidden in other views for this document
935d5a46662SKurt Zenker             if( mpDocSh )
936d5a46662SKurt Zenker             {
937470752f5SNoel Grandin                 mpDocSh->SetSlotFilter( true, pAllowed );
9380fefcd83SRüdiger Timm                 mpDocSh->ApplySlotFilter();
939d5a46662SKurt Zenker             }
9400fefcd83SRüdiger Timm 
9410fefcd83SRüdiger Timm             Help::DisableContextHelp();
9420fefcd83SRüdiger Timm             Help::DisableExtHelp();
9430fefcd83SRüdiger Timm 
9440fefcd83SRüdiger Timm             if( maPresSettings.mbFullScreen )
9450fefcd83SRüdiger Timm             {
9469ecac387STor Lillqvist #if HAVE_FEATURE_SCRIPTING
9470fefcd83SRüdiger Timm                 // disable basic ide error handling
9480fefcd83SRüdiger Timm                 maStarBASICGlobalErrorHdl = StarBASIC::GetGlobalErrorHdl();
949ae451af8SNoel Grandin                 StarBASIC::SetGlobalErrorHdl( Link<StarBASIC*,bool>() );
950b344c30aSTor Lillqvist #endif
9510fefcd83SRüdiger Timm             }
9520fefcd83SRüdiger Timm 
9530fefcd83SRüdiger Timm             // call resize handler
954ce2b6494SRüdiger Timm             maPresSize = mpParentWindow->GetSizePixel();
955aa121a21SCaolán McNamara             if (!maPresSettings.mbFullScreen)
9560fefcd83SRüdiger Timm             {
957a5a57130SMiklos Vajna                 const ::tools::Rectangle& aClientRect = mpViewShell->GetViewShellBase().getClientRectangle();
95867aad3b7SRüdiger Timm                 maPresSize = aClientRect.GetSize();
95967aad3b7SRüdiger Timm                 mpShowWindow->SetPosPixel( aClientRect.TopLeft() );
960f8926799SVladimir Glazounov                 resize( maPresSize );
9610fefcd83SRüdiger Timm             }
9620fefcd83SRüdiger Timm 
963f8926799SVladimir Glazounov             // #i41824#
964f8926799SVladimir Glazounov             // Note: In FullScreen Mode the OS (window manager) sends a resize to
965f8926799SVladimir Glazounov             // the WorkWindow once it actually resized it to full size.  The
966f8926799SVladimir Glazounov             // WorkWindow propagates the resize to the DrawViewShell which calls
967f8926799SVladimir Glazounov             // resize() at the SlideShow (this).  Calling resize here results in a
968f8926799SVladimir Glazounov             // temporary display of a black window in the window's default size
9690fefcd83SRüdiger Timm 
9700fefcd83SRüdiger Timm             if( mpView )
971f41d396dSJens-Heiner Rechtien             {
97292c697c0SStephan Bergmann                 mpView->AddWindowToPaintView( mpShowWindow, nullptr );
973608953c4SStephan Bergmann                 mpView->SetAnimationPause( true );
974f41d396dSJens-Heiner Rechtien             }
9750fefcd83SRüdiger Timm 
976d5a46662SKurt Zenker             SfxBindings* pBindings = getBindings();
977d5a46662SKurt Zenker             if( pBindings )
978d5a46662SKurt Zenker             {
979d5a46662SKurt Zenker                 pBindings->Invalidate( SID_PRESENTATION );
980d5a46662SKurt Zenker                 pBindings->Invalidate( SID_REHEARSE_TIMINGS );
981d5a46662SKurt Zenker             }
9820fefcd83SRüdiger Timm 
983cc5518caSSteve Yin             // Defer the sd::ShowWindow's GrabFocus to SlideShow::activate. so that the accessible event can be fired correctly.
984cc5518caSSteve Yin             //mpShowWindow->GrabFocus();
9850fefcd83SRüdiger Timm 
986e40dc5a0SKurt Zenker             std::vector<beans::PropertyValue> aProperties;
987e40dc5a0SKurt Zenker             aProperties.reserve( 4 );
9880fefcd83SRüdiger Timm 
989a185ea4eSNoel Grandin             aProperties.emplace_back( "AdvanceOnClick" ,
990dd484af7SJan Holesovsky                     -1, Any( !maPresSettings.mbLockedPages ),
991a185ea4eSNoel Grandin                     beans::PropertyState_DIRECT_VALUE );
9920fefcd83SRüdiger Timm 
993a185ea4eSNoel Grandin             aProperties.emplace_back( "ImageAnimationsAllowed" ,
994261b1ad8SJan Holesovsky                     -1, Any( maPresSettings.mbAnimationAllowed ),
995a185ea4eSNoel Grandin                     beans::PropertyState_DIRECT_VALUE );
99664048f0dSOliver Bolte 
997b45a12c3SNoel Grandin             const bool bZOrderEnabled(
99864048f0dSOliver Bolte                 SD_MOD()->GetSdOptions( mpDoc->GetDocumentType() )->IsSlideshowRespectZOrder() );
999a185ea4eSNoel Grandin             aProperties.emplace_back( "DisableAnimationZOrder" ,
100044642cbcSStephan Bergmann                     -1, Any( !bZOrderEnabled ),
1001a185ea4eSNoel Grandin                     beans::PropertyState_DIRECT_VALUE );
100264048f0dSOliver Bolte 
1003a185ea4eSNoel Grandin             aProperties.emplace_back( "ForceManualAdvance" ,
1004261b1ad8SJan Holesovsky                     -1, Any( maPresSettings.mbManual ),
1005a185ea4eSNoel Grandin                     beans::PropertyState_DIRECT_VALUE );
10060fefcd83SRüdiger Timm 
100703a5e096SChristian Lippka             if( mbUsePen )
10080fefcd83SRüdiger Timm              {
1009a185ea4eSNoel Grandin                 aProperties.emplace_back( "UserPaintColor" ,
1010af5c661bSericb                         // User paint color is black by default.
1011ef238fc5SChristian Lippka ORACLE                         -1, Any( mnUserPaintColor ),
1012a185ea4eSNoel Grandin                         beans::PropertyState_DIRECT_VALUE );
101303a5e096SChristian Lippka 
1014a185ea4eSNoel Grandin                 aProperties.emplace_back( "UserPaintStrokeWidth" ,
101503a5e096SChristian Lippka                         // User paint color is black by default.
101603a5e096SChristian Lippka                         -1, Any( mdUserPaintStrokeWidth ),
1017a185ea4eSNoel Grandin                         beans::PropertyState_DIRECT_VALUE );
1018e40dc5a0SKurt Zenker             }
1019e40dc5a0SKurt Zenker 
1020e40dc5a0SKurt Zenker             if (mbRehearseTimings) {
1021a185ea4eSNoel Grandin                 aProperties.emplace_back( "RehearseTimings" ,
1022a185ea4eSNoel Grandin                         -1, Any(true), beans::PropertyState_DIRECT_VALUE );
10230fefcd83SRüdiger Timm             }
10240fefcd83SRüdiger Timm 
1025089380a5SOliver Bolte             bRet = startShowImpl( Sequence<beans::PropertyValue>(
1026c18e2ea2SStephan Bergmann                                       aProperties.data(), aProperties.size() ) );
102720549ebeSOliver Bolte 
10280fefcd83SRüdiger Timm         }
102920549ebeSOliver Bolte 
1030b45a12c3SNoel Grandin         setActiveXToolbarsVisible( false );
10316ee44161SIvo Hinkelmann     }
1032aa121a21SCaolán McNamara     catch (const Exception&)
10330fefcd83SRüdiger Timm     {
1034889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startShow()" );
1035e40dc5a0SKurt Zenker         bRet = false;
10360fefcd83SRüdiger Timm     }
10370fefcd83SRüdiger Timm 
1038e40dc5a0SKurt Zenker     return bRet;
10390fefcd83SRüdiger Timm }
10400fefcd83SRüdiger Timm 
1041089380a5SOliver Bolte bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProperties )
10420fefcd83SRüdiger Timm {
10430fefcd83SRüdiger Timm     try
10440fefcd83SRüdiger Timm     {
1045a361231bSNoel Grandin         mxShow.set( createSlideShow(), UNO_SET_THROW );
1046903a4206SCaolán McNamara 
1047f66eec46SStephan Bergmann         mxView = new SlideShowView(
10486cfb72a5SKurt Zenker                                              *mpShowWindow,
10496cfb72a5SKurt Zenker                                              mpDoc,
10506cfb72a5SKurt Zenker                                              meAnimationMode,
10516cfb72a5SKurt Zenker                                              this,
1052f66eec46SStephan Bergmann                                              maPresSettings.mbFullScreen);
10530fefcd83SRüdiger Timm 
1054e40dc5a0SKurt Zenker         // try add wait symbol to properties:
1055e40dc5a0SKurt Zenker         const Reference<rendering::XSpriteCanvas> xSpriteCanvas(
1056e40dc5a0SKurt Zenker             mxView->getCanvas() );
1057089380a5SOliver Bolte         if (xSpriteCanvas.is())
1058089380a5SOliver Bolte         {
1059d6e8f22dSCaolán McNamara             BitmapEx waitSymbolBitmap(BMP_WAIT_ICON);
1060e40dc5a0SKurt Zenker             const Reference<rendering::XBitmap> xBitmap(
1061b32ead5dSNoel Grandin                 vcl::unotools::xBitmapFromBitmapEx( waitSymbolBitmap ) );
1062089380a5SOliver Bolte             if (xBitmap.is())
1063089380a5SOliver Bolte             {
1064089380a5SOliver Bolte                 mxShow->setProperty(
106596f9300aSOlivier Hallot                     beans::PropertyValue( "WaitSymbolBitmap" ,
1066089380a5SOliver Bolte                         -1,
1067089380a5SOliver Bolte                         makeAny( xBitmap ),
1068089380a5SOliver Bolte                         beans::PropertyState_DIRECT_VALUE ) );
1069e40dc5a0SKurt Zenker             }
1070cca0b9aeSSiqi LIU 
1071d6e8f22dSCaolán McNamara             BitmapEx pointerSymbolBitmap(BMP_POINTER_ICON);
1072cca0b9aeSSiqi LIU             const Reference<rendering::XBitmap> xPointerBitmap(
1073b32ead5dSNoel Grandin                 vcl::unotools::xBitmapFromBitmapEx( pointerSymbolBitmap ) );
1074cca0b9aeSSiqi LIU             if (xPointerBitmap.is())
1075cca0b9aeSSiqi LIU             {
1076cca0b9aeSSiqi LIU                 mxShow->setProperty(
1077cca0b9aeSSiqi LIU                     beans::PropertyValue( "PointerSymbolBitmap" ,
1078cca0b9aeSSiqi LIU                         -1,
1079cca0b9aeSSiqi LIU                         makeAny( xPointerBitmap ),
1080cca0b9aeSSiqi LIU                         beans::PropertyState_DIRECT_VALUE ) );
1081cca0b9aeSSiqi LIU             }
1082e40dc5a0SKurt Zenker         }
1083e40dc5a0SKurt Zenker 
1084d458adeeSArkadiy Illarionov         for( const auto& rProp : aProperties )
1085d458adeeSArkadiy Illarionov             mxShow->setProperty( rProp );
1086089380a5SOliver Bolte 
10870ae0b7ffSNoel         mxShow->addView( mxView );
10880aac6722SKurt Zenker 
1089808a70e2SKurt Zenker         mxListenerProxy.set( new SlideShowListenerProxy( this, mxShow ) );
1090808a70e2SKurt Zenker         mxListenerProxy->addAsSlideShowListener();
1091808a70e2SKurt Zenker 
1092e292ef25SArmin Le Grand         NotifyDocumentEvent(
1093e292ef25SArmin Le Grand             *mpDoc,
1094e292ef25SArmin Le Grand             "OnStartPresentation");
1095089380a5SOliver Bolte         displaySlideIndex( mpSlideController->getStartSlideIndex() );
1096e40dc5a0SKurt Zenker 
1097e40dc5a0SKurt Zenker         return true;
10980fefcd83SRüdiger Timm     }
10998cc98837STakeshi Abe     catch( Exception& )
11000fefcd83SRüdiger Timm     {
1101889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startShowImpl()" );
1102e40dc5a0SKurt Zenker         return false;
11030fefcd83SRüdiger Timm     }
11040fefcd83SRüdiger Timm }
11050fefcd83SRüdiger Timm 
11060aac6722SKurt Zenker /** called only by the slideshow view when the first paint event occurs.
11070aac6722SKurt Zenker     This actually starts the slideshow. */
11080aac6722SKurt Zenker void SlideshowImpl::onFirstPaint()
11090aac6722SKurt Zenker {
111012d4919bSOliver Bolte     if( mpShowWindow )
111112d4919bSOliver Bolte     {
111223a61a99SAndre Fischer         /*
1113c98d3303SNoel Grandin         mpShowWindow->SetBackground( Wallpaper( COL_BLACK ) );
111412d4919bSOliver Bolte         mpShowWindow->Erase();
111512d4919bSOliver Bolte         mpShowWindow->SetBackground();
111623a61a99SAndre Fischer         */
111712d4919bSOliver Bolte     }
111812d4919bSOliver Bolte 
1119f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
1120abf7b941SStephan Bergmann     maUpdateTimer.SetTimeout( sal_uLong(100) );
11210aac6722SKurt Zenker     maUpdateTimer.Start();
11220aac6722SKurt Zenker }
11230aac6722SKurt Zenker 
112487661a7aSNoel Grandin void SlideshowImpl::paint()
11250fefcd83SRüdiger Timm {
1126ddb02dbaSOliver Bolte     if( mxView.is() ) try
11270fefcd83SRüdiger Timm     {
11280fefcd83SRüdiger Timm         awt::PaintEvent aEvt;
11290fefcd83SRüdiger Timm         // aEvt.UpdateRect = TODO
11300fefcd83SRüdiger Timm         mxView->paint( aEvt );
11310fefcd83SRüdiger Timm     }
11328cc98837STakeshi Abe     catch( Exception& )
1133ddb02dbaSOliver Bolte     {
1134889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::paint()" );
1135ddb02dbaSOliver Bolte     }
11360fefcd83SRüdiger Timm }
11370fefcd83SRüdiger Timm 
1138e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::addSlideShowListener( const Reference< XSlideShowListener >& xListener )
11390fefcd83SRüdiger Timm {
1140808a70e2SKurt Zenker     if( mxListenerProxy.is() )
1141808a70e2SKurt Zenker         mxListenerProxy->addSlideShowListener( xListener );
1142808a70e2SKurt Zenker }
1143808a70e2SKurt Zenker 
1144e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::removeSlideShowListener( const Reference< XSlideShowListener >& xListener )
1145808a70e2SKurt Zenker {
1146808a70e2SKurt Zenker     if( mxListenerProxy.is() )
1147808a70e2SKurt Zenker         mxListenerProxy->removeSlideShowListener( xListener );
1148808a70e2SKurt Zenker }
1149808a70e2SKurt Zenker 
115076c3d136SAndre Fischer void SlideshowImpl::slideEnded(const bool bReverse)
1151808a70e2SKurt Zenker {
115276c3d136SAndre Fischer     if (bReverse)
115376c3d136SAndre Fischer         gotoPreviousSlide(true);
115476c3d136SAndre Fischer     else
1155089380a5SOliver Bolte         gotoNextSlide();
11560fefcd83SRüdiger Timm }
11570fefcd83SRüdiger Timm 
1158903a4206SCaolán McNamara bool SlideshowImpl::swipe(const CommandSwipeData &rSwipeData)
1159903a4206SCaolán McNamara {
1160873141fbSCaolán McNamara     if (mbUsePen || mnContextMenuEvent)
1161903a4206SCaolán McNamara         return false;
1162903a4206SCaolán McNamara     double nVelocityX = rSwipeData.getVelocityX();
11631adc3c76SCaolán McNamara     // tdf#108475 make it swipe only if some reasonable movement was involved
11641adc3c76SCaolán McNamara     if (fabs(nVelocityX) < 50)
11651adc3c76SCaolán McNamara         return false;
1166903a4206SCaolán McNamara     if (nVelocityX > 0)
1167903a4206SCaolán McNamara     {
1168903a4206SCaolán McNamara         gotoPreviousSlide();
1169903a4206SCaolán McNamara     }
1170903a4206SCaolán McNamara     else
1171903a4206SCaolán McNamara     {
1172903a4206SCaolán McNamara         gotoNextEffect();
1173903a4206SCaolán McNamara     }
1174903a4206SCaolán McNamara     //a swipe is followed by a mouse up, tell the view to ignore that mouse up as we've reacted
1175903a4206SCaolán McNamara     //to the swipe instead
1176903a4206SCaolán McNamara     mxView->ignoreNextMouseReleased();
1177903a4206SCaolán McNamara     return true;
1178903a4206SCaolán McNamara }
1179903a4206SCaolán McNamara 
1180873141fbSCaolán McNamara bool SlideshowImpl::longpress(const CommandLongPressData &rLongPressData)
1181873141fbSCaolán McNamara {
1182873141fbSCaolán McNamara     if (mnContextMenuEvent)
1183873141fbSCaolán McNamara         return false;
1184873141fbSCaolán McNamara 
1185873141fbSCaolán McNamara     maPopupMousePos = Point(rLongPressData.getX(), rLongPressData.getY());
1186873141fbSCaolán McNamara     mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
1187873141fbSCaolán McNamara 
1188873141fbSCaolán McNamara     return true;
1189873141fbSCaolán McNamara }
1190873141fbSCaolán McNamara 
11910fefcd83SRüdiger Timm void SlideshowImpl::removeShapeEvents()
11920fefcd83SRüdiger Timm {
1193b104e6e9SNoel Grandin     if( !(mxShow.is() && mxListenerProxy.is()) )
1194b104e6e9SNoel Grandin         return;
1195b104e6e9SNoel Grandin 
1196b104e6e9SNoel Grandin     try
11970fefcd83SRüdiger Timm     {
11987c7ec84cSArkadiy Illarionov         for( const auto& rEntry : maShapeEventMap )
11990fefcd83SRüdiger Timm         {
12007c7ec84cSArkadiy Illarionov             mxListenerProxy->removeShapeEventListener( rEntry.first );
12017c7ec84cSArkadiy Illarionov             mxShow->setShapeCursor( rEntry.first, awt::SystemPointer::ARROW );
12020fefcd83SRüdiger Timm         }
12030fefcd83SRüdiger Timm 
12040fefcd83SRüdiger Timm         maShapeEventMap.clear();
12050fefcd83SRüdiger Timm     }
12068cc98837STakeshi Abe     catch( Exception& )
12070fefcd83SRüdiger Timm     {
1208889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::removeShapeEvents()" );
12090fefcd83SRüdiger Timm     }
12100fefcd83SRüdiger Timm }
12110fefcd83SRüdiger Timm 
1212089380a5SOliver Bolte void SlideshowImpl::registerShapeEvents(sal_Int32 nSlideNumber)
12130fefcd83SRüdiger Timm {
1214b104e6e9SNoel Grandin     if( nSlideNumber < 0 )
1215b104e6e9SNoel Grandin         return;
1216b104e6e9SNoel Grandin 
1217b104e6e9SNoel Grandin     try
12180fefcd83SRüdiger Timm     {
12190fefcd83SRüdiger Timm         Reference< XDrawPagesSupplier > xDrawPages( mxModel, UNO_QUERY_THROW );
12200fefcd83SRüdiger Timm         Reference< XIndexAccess > xPages( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
12210fefcd83SRüdiger Timm 
1222ddb02dbaSOliver Bolte         Reference< XShapes > xDrawPage;
1223089380a5SOliver Bolte         xPages->getByIndex(nSlideNumber) >>= xDrawPage;
12240fefcd83SRüdiger Timm 
12250fefcd83SRüdiger Timm         if( xDrawPage.is() )
12260fefcd83SRüdiger Timm         {
1227ddb02dbaSOliver Bolte             Reference< XMasterPageTarget > xMasterPageTarget( xDrawPage, UNO_QUERY );
1228ddb02dbaSOliver Bolte             if( xMasterPageTarget.is() )
1229ddb02dbaSOliver Bolte             {
1230775c8a76SNoel Grandin                 Reference< XShapes > xMasterPage = xMasterPageTarget->getMasterPage();
1231ddb02dbaSOliver Bolte                 if( xMasterPage.is() )
1232ddb02dbaSOliver Bolte                     registerShapeEvents( xMasterPage );
1233ddb02dbaSOliver Bolte             }
1234ddb02dbaSOliver Bolte             registerShapeEvents( xDrawPage );
1235ddb02dbaSOliver Bolte         }
1236ddb02dbaSOliver Bolte     }
12378cc98837STakeshi Abe     catch( Exception& )
1238ddb02dbaSOliver Bolte     {
1239889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::registerShapeEvents()" );
1240ddb02dbaSOliver Bolte     }
1241ddb02dbaSOliver Bolte }
1242ddb02dbaSOliver Bolte 
1243dafae0feSNoel Grandin void SlideshowImpl::registerShapeEvents( Reference< XShapes > const & xShapes )
1244ddb02dbaSOliver Bolte {
1245ddb02dbaSOliver Bolte     try
1246ddb02dbaSOliver Bolte     {
1247ddb02dbaSOliver Bolte         const sal_Int32 nShapeCount = xShapes->getCount();
12480fefcd83SRüdiger Timm         sal_Int32 nShape;
12490fefcd83SRüdiger Timm         for( nShape = 0; nShape < nShapeCount; nShape++ )
12500fefcd83SRüdiger Timm         {
12510fefcd83SRüdiger Timm             Reference< XShape > xShape;
1252ddb02dbaSOliver Bolte             xShapes->getByIndex( nShape ) >>= xShape;
1253ddb02dbaSOliver Bolte 
1254d6bc02f8SSzabolcs Dezsi             if( xShape.is() && xShape->getShapeType() == "com.sun.star.drawing.GroupShape" )
1255ddb02dbaSOliver Bolte             {
1256ddb02dbaSOliver Bolte                 Reference< XShapes > xSubShapes( xShape, UNO_QUERY );
1257ddb02dbaSOliver Bolte                 if( xSubShapes.is() )
1258ddb02dbaSOliver Bolte                     registerShapeEvents( xSubShapes );
1259ddb02dbaSOliver Bolte             }
12600fefcd83SRüdiger Timm 
12610fefcd83SRüdiger Timm             Reference< XPropertySet > xSet( xShape, UNO_QUERY );
12620fefcd83SRüdiger Timm             if( !xSet.is() )
12630fefcd83SRüdiger Timm                 continue;
12640fefcd83SRüdiger Timm 
12650fefcd83SRüdiger Timm             Reference< XPropertySetInfo > xSetInfo( xSet->getPropertySetInfo() );
1266453879cfSNoel Grandin             if( !xSetInfo.is() || !xSetInfo->hasPropertyByName( gsOnClick ) )
12670fefcd83SRüdiger Timm                 continue;
12680fefcd83SRüdiger Timm 
1269d712ebc2SNoel Grandin             WrappedShapeEventImplPtr pEvent = std::make_shared<WrappedShapeEventImpl>();
1270453879cfSNoel Grandin             xSet->getPropertyValue( gsOnClick ) >>= pEvent->meClickAction;
12710fefcd83SRüdiger Timm 
12720fefcd83SRüdiger Timm             switch( pEvent->meClickAction )
12730fefcd83SRüdiger Timm             {
12740fefcd83SRüdiger Timm             case ClickAction_PREVPAGE:
12750fefcd83SRüdiger Timm             case ClickAction_NEXTPAGE:
12760fefcd83SRüdiger Timm             case ClickAction_FIRSTPAGE:
12770fefcd83SRüdiger Timm             case ClickAction_LASTPAGE:
12780fefcd83SRüdiger Timm             case ClickAction_STOPPRESENTATION:
12790fefcd83SRüdiger Timm                 break;
12800fefcd83SRüdiger Timm             case ClickAction_BOOKMARK:
1281453879cfSNoel Grandin                 if( xSetInfo->hasPropertyByName( gsBookmark ) )
1282453879cfSNoel Grandin                     xSet->getPropertyValue( gsBookmark ) >>= pEvent->maStrBookmark;
1283089380a5SOliver Bolte                 if( getSlideNumberForBookmark( pEvent->maStrBookmark ) == -1 )
12840fefcd83SRüdiger Timm                     continue;
12850f9c7a4eSVladimir Glazounov                 break;
128650621863SOliver Bolte             case ClickAction_DOCUMENT:
128750621863SOliver Bolte             case ClickAction_SOUND:
128850621863SOliver Bolte             case ClickAction_PROGRAM:
12890f9c7a4eSVladimir Glazounov             case ClickAction_MACRO:
1290453879cfSNoel Grandin                 if( xSetInfo->hasPropertyByName( gsBookmark ) )
1291453879cfSNoel Grandin                     xSet->getPropertyValue( gsBookmark ) >>= pEvent->maStrBookmark;
12920fefcd83SRüdiger Timm                 break;
12930fefcd83SRüdiger Timm             case ClickAction_VERB:
1294453879cfSNoel Grandin                 if( xSetInfo->hasPropertyByName( gsVerb ) )
1295453879cfSNoel Grandin                     xSet->getPropertyValue( gsVerb ) >>= pEvent->mnVerb;
12960fefcd83SRüdiger Timm                 break;
12970fefcd83SRüdiger Timm             default:
12980fefcd83SRüdiger Timm                 continue; // skip all others
12990fefcd83SRüdiger Timm             }
13000fefcd83SRüdiger Timm 
13010fefcd83SRüdiger Timm             maShapeEventMap[ xShape ] = pEvent;
13020fefcd83SRüdiger Timm 
1303808a70e2SKurt Zenker             if( mxListenerProxy.is() )
1304808a70e2SKurt Zenker                 mxListenerProxy->addShapeEventListener( xShape );
13050fefcd83SRüdiger Timm             mxShow->setShapeCursor( xShape, awt::SystemPointer::REFHAND );
13060fefcd83SRüdiger Timm         }
13070fefcd83SRüdiger Timm     }
13088cc98837STakeshi Abe     catch( Exception& )
13090fefcd83SRüdiger Timm     {
1310889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::registerShapeEvents()" );
13110fefcd83SRüdiger Timm     }
13120fefcd83SRüdiger Timm }
13130fefcd83SRüdiger Timm 
131476c3d136SAndre Fischer void SlideshowImpl::displayCurrentSlide (const bool bSkipAllMainSequenceEffects)
1315089380a5SOliver Bolte {
1316089380a5SOliver Bolte     stopSound();
1317089380a5SOliver Bolte     removeShapeEvents();
1318089380a5SOliver Bolte 
1319fe6cce01SStephan Bergmann     if( mpSlideController && mxShow.is() )
1320089380a5SOliver Bolte     {
13217dd531f8Sthb         Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(),
13227dd531f8Sthb                                                     UNO_QUERY_THROW );
13237dd531f8Sthb         mpSlideController->displayCurrentSlide( mxShow, xDrawPages, bSkipAllMainSequenceEffects );
1324089380a5SOliver Bolte         registerShapeEvents(mpSlideController->getCurrentSlideNumber());
1325089380a5SOliver Bolte         update();
1326bbf92b62SOliver Bolte 
1327089380a5SOliver Bolte     }
13289f27e5b0SAndrea Gelmini     // send out page change event and notify to update all acc info for current page
1329cc5518caSSteve Yin     if (mpViewShell)
1330cc5518caSSteve Yin     {
1331cc5518caSSteve Yin         sal_Int32 currentPageIndex = getCurrentSlideIndex();
1332cc5518caSSteve Yin         mpViewShell->fireSwitchCurrentPage(currentPageIndex);
1333cc5518caSSteve Yin         mpViewShell->NotifyAccUpdate();
1334cc5518caSSteve Yin     }
1335089380a5SOliver Bolte }
1336089380a5SOliver Bolte 
13370fefcd83SRüdiger Timm void SlideshowImpl::endPresentation()
13380fefcd83SRüdiger Timm {
1339516ecd07SThorsten Behrens     if( maPresSettings.mbMouseAsPen)
1340516ecd07SThorsten Behrens     {
1341516ecd07SThorsten Behrens         Reference< XMultiServiceFactory > xDocFactory(mpDoc->getUnoModel(), UNO_QUERY );
1342516ecd07SThorsten Behrens         if( xDocFactory.is() )
1343516ecd07SThorsten Behrens             mxShow->registerUserPaintPolygons(xDocFactory);
1344516ecd07SThorsten Behrens     }
1345516ecd07SThorsten Behrens 
1346285b99a1SKurt Zenker     if( !mnEndShowEvent )
1347285b99a1SKurt Zenker         mnEndShowEvent = Application::PostUserEvent( LINK(this, SlideshowImpl, endPresentationHdl) );
134812d4919bSOliver Bolte }
134912d4919bSOliver Bolte 
1350106ea872SStephan Bergmann IMPL_LINK_NOARG(SlideshowImpl, endPresentationHdl, void*, void)
135112d4919bSOliver Bolte {
135292c697c0SStephan Bergmann     mnEndShowEvent = nullptr;
1353285b99a1SKurt Zenker 
1354808a70e2SKurt Zenker     if( mxPresentation.is() )
1355808a70e2SKurt Zenker         mxPresentation->end();
13560fefcd83SRüdiger Timm }
13570fefcd83SRüdiger Timm 
1358e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::pause()
1359808a70e2SKurt Zenker {
1360f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
1361e40dc5a0SKurt Zenker 
1362b104e6e9SNoel Grandin     if( mbIsPaused )
1363b104e6e9SNoel Grandin         return;
1364b104e6e9SNoel Grandin 
1365b104e6e9SNoel Grandin     try
1366ddb02dbaSOliver Bolte     {
1367608953c4SStephan Bergmann         mbIsPaused = true;
13680fefcd83SRüdiger Timm         if( mxShow.is() )
13690fefcd83SRüdiger Timm         {
13700003e99bSStephan Bergmann             mxShow->pause(true);
13710fefcd83SRüdiger Timm 
1372808a70e2SKurt Zenker             if( mxListenerProxy.is() )
1373808a70e2SKurt Zenker                 mxListenerProxy->paused();
13740fefcd83SRüdiger Timm         }
13750fefcd83SRüdiger Timm     }
13768cc98837STakeshi Abe     catch( Exception& )
13770aac6722SKurt Zenker     {
1378889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::pause()" );
13790aac6722SKurt Zenker     }
13800aac6722SKurt Zenker }
13810fefcd83SRüdiger Timm 
1382e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::resume()
1383808a70e2SKurt Zenker {
1384f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
1385808a70e2SKurt Zenker 
1386808a70e2SKurt Zenker     if( mbIsPaused ) try
1387808a70e2SKurt Zenker     {
1388f08965c6SVladimir Glazounov         if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK )
1389f08965c6SVladimir Glazounov         {
1390f08965c6SVladimir Glazounov             mpShowWindow->RestartShow();
1391f08965c6SVladimir Glazounov         }
1392f08965c6SVladimir Glazounov         else
1393f08965c6SVladimir Glazounov         {
139464d624b6SAndrea Gelmini             mbIsPaused = false;
1395808a70e2SKurt Zenker             if( mxShow.is() )
1396808a70e2SKurt Zenker             {
13970003e99bSStephan Bergmann                 mxShow->pause(false);
1398808a70e2SKurt Zenker                 update();
1399808a70e2SKurt Zenker 
1400808a70e2SKurt Zenker                 if( mxListenerProxy.is() )
1401808a70e2SKurt Zenker                     mxListenerProxy->resumed();
1402f08965c6SVladimir Glazounov             }
1403808a70e2SKurt Zenker         }
1404808a70e2SKurt Zenker     }
14058cc98837STakeshi Abe     catch( Exception& )
1406808a70e2SKurt Zenker     {
1407889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::resume()" );
1408808a70e2SKurt Zenker     }
14098f81eb2dSAndrzej J.R. Hunt #ifdef ENABLE_SDREMOTE
14104d14068cSAndrzej J.R. Hunt     RemoteServer::presentationStarted( this );
14118f81eb2dSAndrzej J.R. Hunt #endif
1412808a70e2SKurt Zenker }
1413808a70e2SKurt Zenker 
1414e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::isPaused()
1415808a70e2SKurt Zenker {
1416f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
1417808a70e2SKurt Zenker     return mbIsPaused;
1418808a70e2SKurt Zenker }
1419808a70e2SKurt Zenker 
1420e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::blankScreen( sal_Int32 nColor )
1421808a70e2SKurt Zenker {
1422f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
1423808a70e2SKurt Zenker 
1424808a70e2SKurt Zenker     if( mpShowWindow && mpSlideController )
1425808a70e2SKurt Zenker     {
142663a68064SNoel         if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), Color(ColorTransparency, nColor) ) )
1427f08965c6SVladimir Glazounov         {
1428808a70e2SKurt Zenker             pause();
1429808a70e2SKurt Zenker         }
1430808a70e2SKurt Zenker     }
1431f08965c6SVladimir Glazounov }
1432808a70e2SKurt Zenker 
14330fefcd83SRüdiger Timm // XShapeEventListener
14340ce0c369SAlexander Wilms 
143587661a7aSNoel Grandin void SlideshowImpl::click( const Reference< XShape >& xShape )
14360fefcd83SRüdiger Timm {
1437f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
14382db95b18SKurt Zenker 
14390fefcd83SRüdiger Timm     WrappedShapeEventImplPtr pEvent = maShapeEventMap[xShape];
1440fe6cce01SStephan Bergmann     if( !pEvent )
14410fefcd83SRüdiger Timm         return;
14420fefcd83SRüdiger Timm 
14430fefcd83SRüdiger Timm     switch( pEvent->meClickAction )
14440fefcd83SRüdiger Timm     {
14450fefcd83SRüdiger Timm     case ClickAction_PREVPAGE:          gotoPreviousSlide();        break;
14460fefcd83SRüdiger Timm     case ClickAction_NEXTPAGE:          gotoNextSlide();            break;
14470fefcd83SRüdiger Timm     case ClickAction_FIRSTPAGE:         gotoFirstSlide();           break;
14480fefcd83SRüdiger Timm     case ClickAction_LASTPAGE:          gotoLastSlide();            break;
14490fefcd83SRüdiger Timm     case ClickAction_STOPPRESENTATION:  endPresentation();          break;
14500fefcd83SRüdiger Timm     case ClickAction_BOOKMARK:
14510fefcd83SRüdiger Timm     {
1452808a70e2SKurt Zenker         gotoBookmark( pEvent->maStrBookmark );
14530fefcd83SRüdiger Timm     }
14540fefcd83SRüdiger Timm     break;
145550621863SOliver Bolte     case ClickAction_SOUND:
145650621863SOliver Bolte     {
145764b3b366Sjan Iversen #if HAVE_FEATURE_AVMEDIA
145850621863SOliver Bolte         try
145950621863SOliver Bolte         {
1460a361231bSNoel Grandin             mxPlayer.set(avmedia::MediaWindow::createPlayer(pEvent->maStrBookmark, ""/*TODO?*/), uno::UNO_SET_THROW );
146150621863SOliver Bolte             mxPlayer->start();
146250621863SOliver Bolte         }
14638cc98837STakeshi Abe         catch( uno::Exception& )
146450621863SOliver Bolte         {
1465d6d80c4eSNoel             TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::click()" );
146650621863SOliver Bolte         }
146764b3b366Sjan Iversen #endif
146850621863SOliver Bolte     }
1469eee9843cSKurt Zenker     break;
14700fefcd83SRüdiger Timm 
14710fefcd83SRüdiger Timm     case ClickAction_DOCUMENT:
14720fefcd83SRüdiger Timm     {
14730f9c7a4eSVladimir Glazounov         OUString aBookmark( pEvent->maStrBookmark );
14740f9c7a4eSVladimir Glazounov 
1475d366c9b2SNoel Grandin         sal_Int32 nPos = aBookmark.indexOf( '#' );
14760f9c7a4eSVladimir Glazounov         if( nPos >= 0 )
14770f9c7a4eSVladimir Glazounov         {
14780f9c7a4eSVladimir Glazounov             OUString aURL( aBookmark.copy( 0, nPos+1 ) );
14790f9c7a4eSVladimir Glazounov             OUString aName( aBookmark.copy( nPos+1 ) );
14800f9c7a4eSVladimir Glazounov             aURL += getUiNameFromPageApiNameImpl( aName );
14810f9c7a4eSVladimir Glazounov             aBookmark = aURL;
14820f9c7a4eSVladimir Glazounov         }
14830f9c7a4eSVladimir Glazounov 
14840f9c7a4eSVladimir Glazounov         mpDocSh->OpenBookmark( aBookmark );
14850fefcd83SRüdiger Timm     }
14860fefcd83SRüdiger Timm     break;
14870fefcd83SRüdiger Timm 
14880fefcd83SRüdiger Timm     case ClickAction_PROGRAM:
14890fefcd83SRüdiger Timm     {
14902cd874cfSRüdiger Timm         INetURLObject aURL(
14912cd874cfSRüdiger Timm             ::URIHelper::SmartRel2Abs(
14922cd874cfSRüdiger Timm                 INetURLObject(mpDocSh->GetMedium()->GetBaseURL()),
14932cd874cfSRüdiger Timm                 pEvent->maStrBookmark, ::URIHelper::GetMaybeFileHdl(), true,
149480321514SNoel Grandin                 false, INetURLObject::EncodeMechanism::WasEncoded,
1495bfde4866SNoel Grandin                 INetURLObject::DecodeMechanism::Unambiguous ) );
14960fefcd83SRüdiger Timm 
149754e87df1SStephan Bergmann         if( INetProtocol::File == aURL.GetProtocol() )
14980fefcd83SRüdiger Timm         {
1499bfde4866SNoel Grandin             SfxStringItem aUrl( SID_FILE_NAME, aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
1500608953c4SStephan Bergmann             SfxBoolItem aBrowsing( SID_BROWSE, true );
15016f3b6a5dSRüdiger Timm 
15026f3b6a5dSRüdiger Timm             SfxViewFrame* pViewFrm = SfxViewFrame::Current();
15036f3b6a5dSRüdiger Timm             if (pViewFrm)
150451d7f466SMichael Stahl             {
150551d7f466SMichael Stahl                 pViewFrm->GetDispatcher()->ExecuteList( SID_OPENDOC,
15068044acf2SNoel Grandin                     SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
150751d7f466SMichael Stahl                     { &aUrl, &aBrowsing });
150851d7f466SMichael Stahl             }
15090fefcd83SRüdiger Timm         }
15100fefcd83SRüdiger Timm     }
15110fefcd83SRüdiger Timm     break;
15120fefcd83SRüdiger Timm 
15130fefcd83SRüdiger Timm     case presentation::ClickAction_MACRO:
15140fefcd83SRüdiger Timm     {
151515d88e25SNoel Grandin         const OUString aMacro( pEvent->maStrBookmark );
15160fefcd83SRüdiger Timm 
15170fefcd83SRüdiger Timm         if ( SfxApplication::IsXScriptURL( aMacro ) )
15180fefcd83SRüdiger Timm         {
15190fefcd83SRüdiger Timm             Any aRet;
15200fefcd83SRüdiger Timm             Sequence< sal_Int16 > aOutArgsIndex;
15210fefcd83SRüdiger Timm             Sequence< Any > aOutArgs;
15220fefcd83SRüdiger Timm             Sequence< Any >* pInArgs = new Sequence< Any >(0);
15230fefcd83SRüdiger Timm             mpDocSh->CallXScript( aMacro, *pInArgs, aRet, aOutArgsIndex, aOutArgs);
15240fefcd83SRüdiger Timm         }
15250fefcd83SRüdiger Timm         else
15260fefcd83SRüdiger Timm         {
15270fefcd83SRüdiger Timm             // aMacro has the following syntax:
152876b3e61bSThomas Arnhold             // "Macroname.Modulname.Libname.Documentname" or
152976b3e61bSThomas Arnhold             // "Macroname.Modulname.Libname.Applicationname"
1530437e210eSMatteo Casalin             sal_Int32 nIdx{ 0 };
1531437e210eSMatteo Casalin             const OUString aMacroName = aMacro.getToken(0, '.', nIdx);
1532437e210eSMatteo Casalin             const OUString aModulName = aMacro.getToken(0, '.', nIdx);
15330fefcd83SRüdiger Timm 
15340fefcd83SRüdiger Timm             // todo: is the limitation still given that only
15350fefcd83SRüdiger Timm             // Modulname+Macroname can be used here?
153615d88e25SNoel Grandin             OUString aExecMacro = aModulName + "." + aMacroName;
15370fefcd83SRüdiger Timm             mpDocSh->GetBasic()->Call(aExecMacro);
15380fefcd83SRüdiger Timm         }
15390fefcd83SRüdiger Timm     }
15400fefcd83SRüdiger Timm     break;
15410fefcd83SRüdiger Timm 
15420fefcd83SRüdiger Timm     case ClickAction_VERB:
15430fefcd83SRüdiger Timm     {
15440fefcd83SRüdiger Timm         // todo, better do it async?
15450fefcd83SRüdiger Timm         SdrObject* pObj = GetSdrObjectFromXShape( xShape );
154689d39bc1SOliver Specht         SdrOle2Obj* pOleObject = dynamic_cast< SdrOle2Obj* >(pObj);
15470fefcd83SRüdiger Timm         if (pOleObject && mpViewShell )
15480fefcd83SRüdiger Timm             mpViewShell->ActivateObject(pOleObject, pEvent->mnVerb);
15490fefcd83SRüdiger Timm     }
15500fefcd83SRüdiger Timm     break;
1551c9c9d428SOliver Bolte     default:
1552c9c9d428SOliver Bolte         break;
15530fefcd83SRüdiger Timm     }
15540fefcd83SRüdiger Timm }
15550fefcd83SRüdiger Timm 
1556089380a5SOliver Bolte sal_Int32 SlideshowImpl::getSlideNumberForBookmark( const OUString& rStrBookmark )
15570fefcd83SRüdiger Timm {
1558b45a12c3SNoel Grandin     bool bIsMasterPage;
1559eee9843cSKurt Zenker     OUString aBookmark = getUiNameFromPageApiNameImpl( rStrBookmark );
15603d6bed44SCarsten Driesner     sal_uInt16 nPgNum = mpDoc->GetPageByName( aBookmark, bIsMasterPage );
15610fefcd83SRüdiger Timm 
15620fefcd83SRüdiger Timm     if( nPgNum == SDRPAGE_NOTFOUND )
15630fefcd83SRüdiger Timm     {
1564b4106d05SRobert Roth         // Is the bookmark an object?
15650f9c7a4eSVladimir Glazounov         SdrObject* pObj = mpDoc->GetObj( aBookmark );
15660fefcd83SRüdiger Timm 
15670fefcd83SRüdiger Timm         if( pObj )
15680fefcd83SRüdiger Timm         {
15694b494222SArmin Le Grand             nPgNum = pObj->getSdrPageFromSdrObject()->GetPageNum();
15704b494222SArmin Le Grand             bIsMasterPage = pObj->getSdrPageFromSdrObject()->IsMasterPage();
15710fefcd83SRüdiger Timm         }
15720fefcd83SRüdiger Timm     }
15730fefcd83SRüdiger Timm 
1574e588aa4dSNoel Grandin     if( (nPgNum == SDRPAGE_NOTFOUND) || bIsMasterPage || static_cast<SdPage*>(mpDoc->GetPage(nPgNum))->GetPageKind() != PageKind::Standard )
15750fefcd83SRüdiger Timm         return -1;
15760fefcd83SRüdiger Timm 
15770fefcd83SRüdiger Timm     return ( nPgNum - 1) >> 1;
15780fefcd83SRüdiger Timm }
15790fefcd83SRüdiger Timm 
1580e57ca028SStephan Bergmann void SlideshowImpl::hyperLinkClicked( OUString const& aHyperLink )
15810fefcd83SRüdiger Timm {
1582089380a5SOliver Bolte     OUString aBookmark( aHyperLink );
15832db95b18SKurt Zenker 
1584d366c9b2SNoel Grandin     sal_Int32 nPos = aBookmark.indexOf( '#' );
1585089380a5SOliver Bolte     if( nPos >= 0 )
1586089380a5SOliver Bolte     {
1587089380a5SOliver Bolte         OUString aURL( aBookmark.copy( 0, nPos+1 ) );
1588089380a5SOliver Bolte         OUString aName( aBookmark.copy( nPos+1 ) );
1589089380a5SOliver Bolte         aURL += getUiNameFromPageApiNameImpl( aName );
1590089380a5SOliver Bolte         aBookmark = aURL;
15910fefcd83SRüdiger Timm     }
15920fefcd83SRüdiger Timm 
1593089380a5SOliver Bolte     mpDocSh->OpenBookmark( aBookmark );
15940fefcd83SRüdiger Timm }
15950fefcd83SRüdiger Timm 
1596089380a5SOliver Bolte void SlideshowImpl::displaySlideNumber( sal_Int32 nSlideNumber )
15970fefcd83SRüdiger Timm {
1598fe6cce01SStephan Bergmann     if( mpSlideController )
15990fefcd83SRüdiger Timm     {
1600089380a5SOliver Bolte         if( mpSlideController->jumpToSlideNumber( nSlideNumber ) )
1601089380a5SOliver Bolte         {
1602089380a5SOliver Bolte             displayCurrentSlide();
1603089380a5SOliver Bolte         }
16040fefcd83SRüdiger Timm     }
16050fefcd83SRüdiger Timm }
16060fefcd83SRüdiger Timm 
1607089380a5SOliver Bolte /** nSlideIndex == -1 displays current slide again */
1608089380a5SOliver Bolte void SlideshowImpl::displaySlideIndex( sal_Int32 nSlideIndex )
16090fefcd83SRüdiger Timm {
1610fe6cce01SStephan Bergmann     if( mpSlideController )
16110fefcd83SRüdiger Timm     {
1612089380a5SOliver Bolte         if( (nSlideIndex == -1) || mpSlideController->jumpToSlideIndex( nSlideIndex ) )
16130fefcd83SRüdiger Timm         {
1614089380a5SOliver Bolte             displayCurrentSlide();
16150fefcd83SRüdiger Timm         }
16160fefcd83SRüdiger Timm     }
16170fefcd83SRüdiger Timm }
16180fefcd83SRüdiger Timm 
1619589e157cSNoel Grandin void SlideshowImpl::jumpToBookmark( const OUString& sBookmark )
16200fefcd83SRüdiger Timm {
1621089380a5SOliver Bolte     sal_Int32 nSlideNumber = getSlideNumberForBookmark( sBookmark );
1622089380a5SOliver Bolte     if( nSlideNumber != -1 )
1623089380a5SOliver Bolte         displaySlideNumber( nSlideNumber );
16240fefcd83SRüdiger Timm }
16250fefcd83SRüdiger Timm 
16261902f1e4SNoel Grandin sal_Int32 SlideshowImpl::getCurrentSlideNumber() const
16270fefcd83SRüdiger Timm {
1628fe6cce01SStephan Bergmann     return mpSlideController ? mpSlideController->getCurrentSlideNumber() : -1;
16290fefcd83SRüdiger Timm }
16300fefcd83SRüdiger Timm 
1631e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::isEndless()
16320fefcd83SRüdiger Timm {
1633f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
16340fefcd83SRüdiger Timm     return maPresSettings.mbEndless;
16350fefcd83SRüdiger Timm }
16360fefcd83SRüdiger Timm 
163706d68fb0SNoel Grandin void SlideshowImpl::update()
16380fefcd83SRüdiger Timm {
16392db95b18SKurt Zenker     startUpdateTimer();
16402db95b18SKurt Zenker }
16412db95b18SKurt Zenker 
16422db95b18SKurt Zenker void SlideshowImpl::startUpdateTimer()
16432db95b18SKurt Zenker {
1644f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
16452db95b18SKurt Zenker     maUpdateTimer.SetTimeout( 0 );
16462db95b18SKurt Zenker     maUpdateTimer.Start();
16470fefcd83SRüdiger Timm }
16480fefcd83SRüdiger Timm 
164967aad3b7SRüdiger Timm /** this timer is called 20ms after a new slide was displayed.
165067aad3b7SRüdiger Timm     This is used to unfreeze user input that was disabled after
165167aad3b7SRüdiger Timm     slide change to skip input that was buffered during slide
1652da40cac5SAndrea Gelmini     transition preparation */
1653106ea872SStephan Bergmann IMPL_LINK_NOARG(SlideshowImpl, ReadyForNextInputHdl, Timer *, void)
165467aad3b7SRüdiger Timm {
165567aad3b7SRüdiger Timm     mbInputFreeze = false;
165667aad3b7SRüdiger Timm }
165767aad3b7SRüdiger Timm 
16580fefcd83SRüdiger Timm /** if I catch someone someday who calls this method by hand
165964d624b6SAndrea Gelmini     and not by using the timer, I will personally punish this
16600fefcd83SRüdiger Timm     person seriously, even if this person is me.
16610fefcd83SRüdiger Timm */
1662106ea872SStephan Bergmann IMPL_LINK_NOARG(SlideshowImpl, updateHdl, Timer *, void)
16630fefcd83SRüdiger Timm {
16648cafd082SStephan Bergmann     updateSlideShow();
1665881043d1SAndre Fischer }
1666881043d1SAndre Fischer 
166706d68fb0SNoel Grandin void SlideshowImpl::updateSlideShow()
1668881043d1SAndre Fischer {
166984da4113SThorsten Behrens     // prevent me from deletion when recursing (App::EnableYieldMode does)
1670b9fe4f26SNoel Grandin     const rtl::Reference<SlideshowImpl> xKeepAlive(this);
16710fefcd83SRüdiger Timm 
1672d60a926fSRüdiger Timm     Reference< XSlideShow > xShow( mxShow );
1673881043d1SAndre Fischer     if ( ! xShow.is())
167406d68fb0SNoel Grandin         return;
1675881043d1SAndre Fischer 
1676881043d1SAndre Fischer     try
16770fefcd83SRüdiger Timm     {
1678a0ac4cf4SRüdiger Timm         double fUpdate = 0.0;
167912d4919bSOliver Bolte         if( !xShow->update(fUpdate) )
16802db95b18SKurt Zenker             fUpdate = -1.0;
16812dfcda25SOliver Bolte 
16822dfcda25SOliver Bolte         if (mxShow.is() && (fUpdate >= 0.0))
16832db95b18SKurt Zenker         {
16843e009203SMiklos Vajna             if (::basegfx::fTools::equalZero(fUpdate))
16853e009203SMiklos Vajna             {
16863e009203SMiklos Vajna                 // Make sure idle tasks don't starve when we don't have to wait.
1687c33dd70aSMiklos Vajna                 // Don't process any events generated after invoking the function.
1688c33dd70aSMiklos Vajna                 Application::Reschedule(/*bHandleAllCurrentEvents=*/true);
16893e009203SMiklos Vajna             }
16903e009203SMiklos Vajna             else
1691a0ac4cf4SRüdiger Timm             {
16929ae35d4eSOliver Bolte                 // Avoid busy loop when the previous call to update()
1693881043d1SAndre Fischer                 // returns a small positive number but not 0 (which is
1694881043d1SAndre Fischer                 // handled above).  Also, make sure that calls to update()
1695881043d1SAndre Fischer                 // have a minimum frequency.
1696881043d1SAndre Fischer                 // => Allow up to 60 frames per second.  Call at least once
1697881043d1SAndre Fischer                 // every 4 seconds.
16985abc6695SNoel Grandin                 const static sal_Int32 nMaximumFrameCount (60);
16995abc6695SNoel Grandin                 const static double nMinimumTimeout (1.0 / nMaximumFrameCount);
17005abc6695SNoel Grandin                 const static double nMaximumTimeout (4.0);
170127cd397bSStephan Bergmann                 fUpdate = std::clamp(fUpdate, nMinimumTimeout, nMaximumTimeout);
1702881043d1SAndre Fischer 
1703881043d1SAndre Fischer                 // Make sure that the maximum frame count has not been set
1704881043d1SAndre Fischer                 // too high (only then conversion to milliseconds and long
1705881043d1SAndre Fischer                 // integer may lead to zero value.)
170697eb00c7SChris Sherlock                 OSL_ASSERT(static_cast<sal_uLong>(fUpdate * 1000.0) > 0);
170712dcf5e6SMichael Meeks             }
1708881043d1SAndre Fischer 
170912dcf5e6SMichael Meeks             // Use our high resolution timers for the asynchronous callback.
17103d6bed44SCarsten Driesner             maUpdateTimer.SetTimeout(static_cast<sal_uLong>(fUpdate * 1000.0));
17112db95b18SKurt Zenker             maUpdateTimer.Start();
17120fefcd83SRüdiger Timm         }
17130fefcd83SRüdiger Timm     }
17148cc98837STakeshi Abe     catch( Exception& )
17150fefcd83SRüdiger Timm     {
1716889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::updateSlideShow()" );
17170fefcd83SRüdiger Timm     }
17180fefcd83SRüdiger Timm }
17190fefcd83SRüdiger Timm 
17200fefcd83SRüdiger Timm bool SlideshowImpl::keyInput(const KeyEvent& rKEvt)
17210fefcd83SRüdiger Timm {
172267aad3b7SRüdiger Timm     if( !mxShow.is() || mbInputFreeze )
17230fefcd83SRüdiger Timm         return false;
17240fefcd83SRüdiger Timm 
17250fefcd83SRüdiger Timm     bool bRet = true;
1726ddb02dbaSOliver Bolte 
1727ddb02dbaSOliver Bolte     try
1728ddb02dbaSOliver Bolte     {
17290fefcd83SRüdiger Timm         const int nKeyCode = rKEvt.GetKeyCode().GetCode();
17300fefcd83SRüdiger Timm         switch( nKeyCode )
17310fefcd83SRüdiger Timm         {
1732a9bec6a7SRüdiger Timm             case awt::Key::CONTEXTMENU:
1733a9bec6a7SRüdiger Timm                 if( !mnContextMenuEvent )
1734a9bec6a7SRüdiger Timm                 {
1735a9bec6a7SRüdiger Timm                     if( mpShowWindow )
1736a9bec6a7SRüdiger Timm                         maPopupMousePos = mpShowWindow->GetPointerState().maPos;
1737a9bec6a7SRüdiger Timm                     mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
1738a9bec6a7SRüdiger Timm                 }
1739a9bec6a7SRüdiger Timm                 break;
1740a9bec6a7SRüdiger Timm 
17410fefcd83SRüdiger Timm             // cancel show
17420fefcd83SRüdiger Timm             case KEY_ESCAPE:
17430fefcd83SRüdiger Timm             case KEY_SUBTRACT:
1744db6084bdSRüdiger Timm                 // in case the user cancels the presentation, switch to current slide
1745db6084bdSRüdiger Timm                 // in edit mode
1746fe6cce01SStephan Bergmann                 if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
1747db6084bdSRüdiger Timm                 {
1748db6084bdSRüdiger Timm                     if( mpSlideController->getCurrentSlideNumber() != -1 )
1749db6084bdSRüdiger Timm                         mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
1750db6084bdSRüdiger Timm                 }
17510fefcd83SRüdiger Timm                 endPresentation();
17520fefcd83SRüdiger Timm                 break;
17530fefcd83SRüdiger Timm 
17540fefcd83SRüdiger Timm             // advance show
175592ed70feSVladimir Glazounov             case KEY_PAGEDOWN:
175692ed70feSVladimir Glazounov                 if(rKEvt.GetKeyCode().IsMod2())
175792ed70feSVladimir Glazounov                 {
175892ed70feSVladimir Glazounov                     gotoNextSlide();
175992ed70feSVladimir Glazounov                     break;
176092ed70feSVladimir Glazounov                 }
1761ab9b67bbSStephan Bergmann                 [[fallthrough]];
17620fefcd83SRüdiger Timm             case KEY_SPACE:
176392ed70feSVladimir Glazounov             case KEY_RIGHT:
176492ed70feSVladimir Glazounov             case KEY_DOWN:
176592ed70feSVladimir Glazounov                 gotoNextEffect();
17660fefcd83SRüdiger Timm                 break;
17670fefcd83SRüdiger Timm 
17680fefcd83SRüdiger Timm             case KEY_RETURN:
176950621863SOliver Bolte             {
1770589e157cSNoel Grandin                 if( !maCharBuffer.isEmpty() )
177150621863SOliver Bolte                 {
1772fe6cce01SStephan Bergmann                     if( mpSlideController )
177350621863SOliver Bolte                     {
1774589e157cSNoel Grandin                         if( mpSlideController->jumpToSlideNumber( maCharBuffer.toInt32() - 1 ) )
1775089380a5SOliver Bolte                             displayCurrentSlide();
177650621863SOliver Bolte                     }
1777cb9e8bbdSStephan Bergmann                     maCharBuffer.clear();
177850621863SOliver Bolte                 }
177950621863SOliver Bolte                 else
178050621863SOliver Bolte                 {
178192ed70feSVladimir Glazounov                     gotoNextEffect();
17820fefcd83SRüdiger Timm                 }
178350621863SOliver Bolte             }
17840fefcd83SRüdiger Timm             break;
17850fefcd83SRüdiger Timm 
17860fefcd83SRüdiger Timm             // numeric: add to buffer
17870fefcd83SRüdiger Timm             case KEY_0:
17880fefcd83SRüdiger Timm             case KEY_1:
17890fefcd83SRüdiger Timm             case KEY_2:
17900fefcd83SRüdiger Timm             case KEY_3:
17910fefcd83SRüdiger Timm             case KEY_4:
17920fefcd83SRüdiger Timm             case KEY_5:
17930fefcd83SRüdiger Timm             case KEY_6:
17940fefcd83SRüdiger Timm             case KEY_7:
17950fefcd83SRüdiger Timm             case KEY_8:
17960fefcd83SRüdiger Timm             case KEY_9:
17978b4719c2SStephan Bergmann                 maCharBuffer += OUStringChar( rKEvt.GetCharCode() );
17980fefcd83SRüdiger Timm                 break;
17990fefcd83SRüdiger Timm 
18000fefcd83SRüdiger Timm             case KEY_PAGEUP:
180176c3d136SAndre Fischer                 if(rKEvt.GetKeyCode().IsMod2())
180276c3d136SAndre Fischer                 {
180376c3d136SAndre Fischer                     gotoPreviousSlide();
180476c3d136SAndre Fischer                     break;
180576c3d136SAndre Fischer                 }
1806ab9b67bbSStephan Bergmann                 [[fallthrough]];
18070fefcd83SRüdiger Timm             case KEY_LEFT:
18080fefcd83SRüdiger Timm             case KEY_UP:
180992ed70feSVladimir Glazounov             case KEY_BACKSPACE:
181076c3d136SAndre Fischer                 gotoPreviousEffect();
18110fefcd83SRüdiger Timm                 break;
18120fefcd83SRüdiger Timm 
18135544c178SGabor Kelemen             case KEY_P:
18145544c178SGabor Kelemen                 setUsePen( !mbUsePen );
18155544c178SGabor Kelemen                 break;
18165544c178SGabor Kelemen 
18175544c178SGabor Kelemen             case KEY_E:
18185544c178SGabor Kelemen                 setEraseAllInk( true );
18195544c178SGabor Kelemen                 updateSlideShow();
18205544c178SGabor Kelemen                 break;
18215544c178SGabor Kelemen 
18220fefcd83SRüdiger Timm             case KEY_HOME:
18230fefcd83SRüdiger Timm                 gotoFirstSlide();
18240fefcd83SRüdiger Timm                 break;
18250fefcd83SRüdiger Timm 
18260fefcd83SRüdiger Timm             case KEY_END:
18270fefcd83SRüdiger Timm                 gotoLastSlide();
18280fefcd83SRüdiger Timm                 break;
18290fefcd83SRüdiger Timm 
183092ed70feSVladimir Glazounov             case KEY_B:
183192ed70feSVladimir Glazounov             case KEY_W:
183292ed70feSVladimir Glazounov             case KEY_POINT:
183392ed70feSVladimir Glazounov             case KEY_COMMA:
18340fefcd83SRüdiger Timm             {
1835808a70e2SKurt Zenker                 blankScreen( ((nKeyCode == KEY_W ) || (nKeyCode == KEY_COMMA)) ? 0x00ffffff : 0x00000000 );
18360fefcd83SRüdiger Timm             }
18370fefcd83SRüdiger Timm             break;
18380fefcd83SRüdiger Timm 
18390fefcd83SRüdiger Timm             default:
18400fefcd83SRüdiger Timm                 bRet = false;
18410fefcd83SRüdiger Timm             break;
18420fefcd83SRüdiger Timm         }
1843ddb02dbaSOliver Bolte     }
18448cc98837STakeshi Abe     catch( Exception& )
1845ddb02dbaSOliver Bolte     {
1846ddb02dbaSOliver Bolte         bRet = false;
1847889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::keyInput()" );
1848ddb02dbaSOliver Bolte     }
18490fefcd83SRüdiger Timm 
18500fefcd83SRüdiger Timm     return bRet;
18510fefcd83SRüdiger Timm }
18520fefcd83SRüdiger Timm 
1853106ea872SStephan Bergmann IMPL_LINK( SlideshowImpl, EventListenerHdl, VclSimpleEvent&, rSimpleEvent, void )
185481f4197bSRüdiger Timm {
185581f4197bSRüdiger Timm     if( !mxShow.is() || mbInputFreeze )
18561e67e94fSNoel Grandin         return;
185781f4197bSRüdiger Timm 
1858b104e6e9SNoel Grandin     if( !((rSimpleEvent.GetId() == VclEventId::WindowCommand) && static_cast<VclWindowEvent*>(&rSimpleEvent)->GetData()) )
1859b104e6e9SNoel Grandin         return;
1860b104e6e9SNoel Grandin 
18611e67e94fSNoel Grandin     const CommandEvent& rEvent = *static_cast<const CommandEvent*>(static_cast<VclWindowEvent*>(&rSimpleEvent)->GetData());
186281f4197bSRüdiger Timm 
1863b104e6e9SNoel Grandin     if( rEvent.GetCommand() != CommandEventId::Media )
1864b104e6e9SNoel Grandin         return;
1865b104e6e9SNoel Grandin 
1866508c020cSCaolán McNamara     CommandMediaData* pMediaData = rEvent.GetMediaData();
1867508c020cSCaolán McNamara     pMediaData->SetPassThroughToOS(false);
1868508c020cSCaolán McNamara     switch (pMediaData->GetMediaId())
186981f4197bSRüdiger Timm     {
1870e103887cSTor Lillqvist #if defined( MACOSX )
187132186f00SNoel Grandin     case MediaCommand::Menu:
187269922d08SVladimir Glazounov         if( !mnContextMenuEvent )
187369922d08SVladimir Glazounov         {
187469922d08SVladimir Glazounov         if( mpShowWindow )
187569922d08SVladimir Glazounov             maPopupMousePos = mpShowWindow->GetPointerState().maPos;
187669922d08SVladimir Glazounov         mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
187769922d08SVladimir Glazounov         }
187869922d08SVladimir Glazounov         break;
187932186f00SNoel Grandin     case MediaCommand::VolumeDown:
188069922d08SVladimir Glazounov         gotoPreviousSlide();
188169922d08SVladimir Glazounov         break;
188232186f00SNoel Grandin     case MediaCommand::VolumeUp:
188369922d08SVladimir Glazounov         gotoNextEffect();
188469922d08SVladimir Glazounov         break;
188569922d08SVladimir Glazounov #endif
188632186f00SNoel Grandin     case MediaCommand::NextTrack:
188781f4197bSRüdiger Timm         gotoNextEffect();
188881f4197bSRüdiger Timm         break;
188932186f00SNoel Grandin     case MediaCommand::Pause:
189081f4197bSRüdiger Timm         if( !mbIsPaused )
189181f4197bSRüdiger Timm             blankScreen(0);
189281f4197bSRüdiger Timm         break;
189332186f00SNoel Grandin     case MediaCommand::Play:
189481f4197bSRüdiger Timm         if( mbIsPaused )
189581f4197bSRüdiger Timm             resume();
189681f4197bSRüdiger Timm         break;
189769922d08SVladimir Glazounov 
189832186f00SNoel Grandin     case MediaCommand::PlayPause:
189981f4197bSRüdiger Timm         if( mbIsPaused )
190081f4197bSRüdiger Timm             resume();
190181f4197bSRüdiger Timm         else
190281f4197bSRüdiger Timm             blankScreen(0);
190381f4197bSRüdiger Timm         break;
190432186f00SNoel Grandin     case MediaCommand::PreviousTrack:
190581f4197bSRüdiger Timm         gotoPreviousSlide();
190681f4197bSRüdiger Timm         break;
190732186f00SNoel Grandin     case MediaCommand::NextTrackHold:
190869922d08SVladimir Glazounov         gotoLastSlide();
190969922d08SVladimir Glazounov         break;
191081f4197bSRüdiger Timm 
191132186f00SNoel Grandin     case MediaCommand::Rewind:
191281f4197bSRüdiger Timm         gotoFirstSlide();
191381f4197bSRüdiger Timm         break;
191432186f00SNoel Grandin     case MediaCommand::Stop:
191581f4197bSRüdiger Timm         // in case the user cancels the presentation, switch to current slide
191681f4197bSRüdiger Timm         // in edit mode
1917fe6cce01SStephan Bergmann         if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
191881f4197bSRüdiger Timm         {
191981f4197bSRüdiger Timm             if( mpSlideController->getCurrentSlideNumber() != -1 )
192081f4197bSRüdiger Timm                 mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
192181f4197bSRüdiger Timm         }
192281f4197bSRüdiger Timm         endPresentation();
192381f4197bSRüdiger Timm         break;
1924508c020cSCaolán McNamara     default:
1925508c020cSCaolán McNamara         pMediaData->SetPassThroughToOS(true);
1926508c020cSCaolán McNamara         break;
192781f4197bSRüdiger Timm     }
192881f4197bSRüdiger Timm }
192981f4197bSRüdiger Timm 
19300fefcd83SRüdiger Timm void SlideshowImpl::mouseButtonUp(const MouseEvent& rMEvt)
19310fefcd83SRüdiger Timm {
1932a9bec6a7SRüdiger Timm     if( rMEvt.IsRight() && !mnContextMenuEvent )
1933c9c9d428SOliver Bolte     {
1934c9c9d428SOliver Bolte         maPopupMousePos = rMEvt.GetPosPixel();
1935a9bec6a7SRüdiger Timm         mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
19360fefcd83SRüdiger Timm     }
1937c9c9d428SOliver Bolte }
1938c9c9d428SOliver Bolte 
1939106ea872SStephan Bergmann IMPL_LINK_NOARG(SlideshowImpl, ContextMenuHdl, void*, void)
1940c9c9d428SOliver Bolte {
194192c697c0SStephan Bergmann     mnContextMenuEvent = nullptr;
1942a9bec6a7SRüdiger Timm 
1943ccb2a1f6SNoel Grandin     if (mpSlideController == nullptr)
1944bd8b93fdSNoel Grandin         return;
1945c9c9d428SOliver Bolte 
1946c9c9d428SOliver Bolte     mbWasPaused = mbIsPaused;
1947c9c9d428SOliver Bolte     if( !mbWasPaused )
1948808a70e2SKurt Zenker         pause();
1949c9c9d428SOliver Bolte 
1950e872d77cSCaolán McNamara     std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/slidecontextmenu.ui"));
1951e872d77cSCaolán McNamara     std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
1952e872d77cSCaolán McNamara     OUString sNextImage(BMP_MENU_NEXT), sPrevImage(BMP_MENU_PREV);
1953e872d77cSCaolán McNamara     xMenu->insert(0, "next", SdResId(RID_SVXSTR_MENU_NEXT), &sNextImage, nullptr, nullptr, TRISTATE_INDET);
1954e872d77cSCaolán McNamara     xMenu->insert(1, "prev", SdResId(RID_SVXSTR_MENU_PREV), &sPrevImage, nullptr, nullptr, TRISTATE_INDET);
1955c9c9d428SOliver Bolte 
1956af5c661bSericb     // Adding button to display if in Pen  mode
1957e872d77cSCaolán McNamara     xMenu->set_active("pen", mbUsePen);
195844d83b68Sthb 
1959d5a46662SKurt Zenker     const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
1960e872d77cSCaolán McNamara     xMenu->set_visible("next", mpSlideController->getNextSlideIndex() != -1);
1961e872d77cSCaolán McNamara     xMenu->set_visible("prev", (mpSlideController->getPreviousSlideIndex() != -1 ) || (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK));
1962e872d77cSCaolán McNamara     xMenu->set_visible("edit", mpViewShell->GetDoc()->IsStartWithPresentation());
1963c9c9d428SOliver Bolte 
1964e872d77cSCaolán McNamara     std::unique_ptr<weld::Menu> xPageMenu(xBuilder->weld_menu("gotomenu"));
1965e872d77cSCaolán McNamara     OUString sFirstImage(BMP_MENU_FIRST), sLastImage(BMP_MENU_LAST);
1966e872d77cSCaolán McNamara     xPageMenu->insert(0, "first", SdResId(RID_SVXSTR_MENU_FIRST), &sFirstImage, nullptr, nullptr, TRISTATE_INDET);
1967e872d77cSCaolán McNamara     xPageMenu->insert(1, "last", SdResId(RID_SVXSTR_MENU_LAST), &sLastImage, nullptr, nullptr, TRISTATE_INDET);
1968c9c9d428SOliver Bolte 
1969c9c9d428SOliver Bolte     // populate slide goto list
1970c9c9d428SOliver Bolte     const sal_Int32 nPageNumberCount = mpSlideController->getSlideNumberCount();
1971c9c9d428SOliver Bolte     if( nPageNumberCount <= 1 )
1972c9c9d428SOliver Bolte     {
1973e872d77cSCaolán McNamara         xMenu->set_visible("goto", false);
1974c9c9d428SOliver Bolte     }
1975c9c9d428SOliver Bolte     else
1976c9c9d428SOliver Bolte     {
1977d5a46662SKurt Zenker         sal_Int32 nCurrentSlideNumber = mpSlideController->getCurrentSlideNumber();
1978d5a46662SKurt Zenker         if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
1979d5a46662SKurt Zenker             nCurrentSlideNumber = -1;
1980c9c9d428SOliver Bolte 
1981e872d77cSCaolán McNamara         xPageMenu->set_visible("first", mpSlideController->getSlideNumber(0) != nCurrentSlideNumber);
1982e872d77cSCaolán McNamara         xPageMenu->set_visible("last", mpSlideController->getSlideNumber(mpSlideController->getSlideIndexCount() - 1) != nCurrentSlideNumber);
1983c9c9d428SOliver Bolte 
1984c9c9d428SOliver Bolte         sal_Int32 nPageNumber;
1985c9c9d428SOliver Bolte 
1986c9c9d428SOliver Bolte         for( nPageNumber = 0; nPageNumber < nPageNumberCount; nPageNumber++ )
1987c9c9d428SOliver Bolte         {
1988c9c9d428SOliver Bolte             if( mpSlideController->isVisibleSlideNumber( nPageNumber ) )
1989c9c9d428SOliver Bolte             {
1990abf7b941SStephan Bergmann                 SdPage* pPage = mpDoc->GetSdPage(static_cast<sal_uInt16>(nPageNumber), PageKind::Standard);
1991c9c9d428SOliver Bolte                 if (pPage)
1992c9c9d428SOliver Bolte                 {
1993e872d77cSCaolán McNamara                     OUString sId(OUString::number(CM_SLIDES + nPageNumber));
1994e872d77cSCaolán McNamara                     xPageMenu->append_check(sId, pPage->GetName());
1995c9c9d428SOliver Bolte                     if (nPageNumber == nCurrentSlideNumber)
1996e872d77cSCaolán McNamara                         xPageMenu->set_active(sId.toUtf8(), true);
1997c9c9d428SOliver Bolte                 }
1998c9c9d428SOliver Bolte             }
1999c9c9d428SOliver Bolte         }
2000c9c9d428SOliver Bolte     }
2001e872d77cSCaolán McNamara 
2002e872d77cSCaolán McNamara     std::unique_ptr<weld::Menu> xBlankMenu(xBuilder->weld_menu("screenmenu"));
2003c9c9d428SOliver Bolte 
2004c9c9d428SOliver Bolte     if (mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK)
2005c9c9d428SOliver Bolte     {
2006e872d77cSCaolán McNamara         xBlankMenu->set_active((mpShowWindow->GetBlankColor() == COL_WHITE) ? "white" : "black", true);
2007c9c9d428SOliver Bolte     }
2008c9c9d428SOliver Bolte 
2009e872d77cSCaolán McNamara     std::unique_ptr<weld::Menu> xWidthMenu(xBuilder->weld_menu("widthmenu"));
201044d83b68Sthb 
201144d83b68Sthb     // populate color width list
201244d83b68Sthb     sal_Int32 nIterator;
201344d83b68Sthb     double nWidth;
201444d83b68Sthb 
201544d83b68Sthb     nWidth = 4.0;
201644d83b68Sthb     for( nIterator = 1; nIterator < 6; nIterator++)
201744d83b68Sthb     {
201844d83b68Sthb         switch(nIterator)
201944d83b68Sthb         {
202044d83b68Sthb             case 1:
202144d83b68Sthb                 nWidth = 4.0;
202244d83b68Sthb                 break;
202344d83b68Sthb             case 2:
202444d83b68Sthb                 nWidth = 100.0;
202544d83b68Sthb                 break;
202644d83b68Sthb             case 3:
202744d83b68Sthb                 nWidth = 150.0;
202844d83b68Sthb                 break;
202944d83b68Sthb             case 4:
203044d83b68Sthb                 nWidth = 200.0;
203144d83b68Sthb                 break;
203244d83b68Sthb             case 5:
203344d83b68Sthb                 nWidth = 400.0;
203444d83b68Sthb                 break;
203544d83b68Sthb             default:
203644d83b68Sthb                 break;
203744d83b68Sthb         }
203844d83b68Sthb 
203944d83b68Sthb         if (nWidth == mdUserPaintStrokeWidth)
2040e872d77cSCaolán McNamara             xWidthMenu->set_active(OString::number(nWidth), true);
204144d83b68Sthb     }
2042c9c9d428SOliver Bolte 
2043e872d77cSCaolán McNamara     ::tools::Rectangle aRect(maPopupMousePos, Size(1,1));
2044e872d77cSCaolán McNamara     weld::Window* pParent = weld::GetPopupParent(*mpShowWindow, aRect);
2045e872d77cSCaolán McNamara     ContextMenuSelectHdl(xMenu->popup_at_rect(pParent, aRect));
2046c9c9d428SOliver Bolte 
2047a9bec6a7SRüdiger Timm     if( mxView.is() )
2048a9bec6a7SRüdiger Timm         mxView->ignoreNextMouseReleased();
2049a9bec6a7SRüdiger Timm 
2050808a70e2SKurt Zenker     if( !mbWasPaused )
2051808a70e2SKurt Zenker         resume();
2052c9c9d428SOliver Bolte }
2053c9c9d428SOliver Bolte 
2054e872d77cSCaolán McNamara void SlideshowImpl::ContextMenuSelectHdl(const OString& rMenuId)
2055c9c9d428SOliver Bolte {
2056e872d77cSCaolán McNamara     if (rMenuId == "prev")
2057c9c9d428SOliver Bolte     {
2058c9c9d428SOliver Bolte         gotoPreviousSlide();
2059d5a46662SKurt Zenker         mbWasPaused = false;
2060747a4f30SCaolán McNamara     }
2061e872d77cSCaolán McNamara     else if(rMenuId == "next")
2062747a4f30SCaolán McNamara     {
2063c9c9d428SOliver Bolte         gotoNextSlide();
2064d5a46662SKurt Zenker         mbWasPaused = false;
2065747a4f30SCaolán McNamara     }
2066e872d77cSCaolán McNamara     else if (rMenuId == "first")
2067747a4f30SCaolán McNamara     {
2068c9c9d428SOliver Bolte         gotoFirstSlide();
2069d5a46662SKurt Zenker         mbWasPaused = false;
2070747a4f30SCaolán McNamara     }
2071e872d77cSCaolán McNamara     else if (rMenuId == "last")
2072747a4f30SCaolán McNamara     {
2073c9c9d428SOliver Bolte         gotoLastSlide();
2074d5a46662SKurt Zenker         mbWasPaused = false;
2075747a4f30SCaolán McNamara     }
2076e872d77cSCaolán McNamara     else if (rMenuId == "black" || rMenuId == "white")
2077c9c9d428SOliver Bolte     {
2078e872d77cSCaolán McNamara         const Color aBlankColor(rMenuId == "white" ? COL_WHITE : COL_BLACK);
2079c9c9d428SOliver Bolte         if( mbWasPaused )
2080c9c9d428SOliver Bolte         {
2081c9c9d428SOliver Bolte             if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK )
2082c9c9d428SOliver Bolte             {
2083c9c9d428SOliver Bolte                 if( mpShowWindow->GetBlankColor() == aBlankColor )
2084c9c9d428SOliver Bolte                 {
2085c9c9d428SOliver Bolte                     mbWasPaused = false;
2086c9c9d428SOliver Bolte                     mpShowWindow->RestartShow();
2087e872d77cSCaolán McNamara                     return;
2088c9c9d428SOliver Bolte                 }
2089c9c9d428SOliver Bolte             }
2090c9c9d428SOliver Bolte             mpShowWindow->RestartShow();
2091c9c9d428SOliver Bolte         }
2092c9c9d428SOliver Bolte         if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), aBlankColor ) )
2093c9c9d428SOliver Bolte         {
2094808a70e2SKurt Zenker             pause();
2095c9c9d428SOliver Bolte             mbWasPaused = true;
2096c9c9d428SOliver Bolte         }
2097c9c9d428SOliver Bolte     }
2098e872d77cSCaolán McNamara     else if (rMenuId == "color")
209954e4becdSthb     {
210044d83b68Sthb         //Open a color picker based on SvColorDialog
210163a68064SNoel         ::Color aColor( ColorTransparency, mnUserPaintColor );
2102b15244d5SCaolán McNamara         SvColorDialog aColorDlg;
210344d83b68Sthb         aColorDlg.SetColor( aColor );
210444d83b68Sthb 
2105b15244d5SCaolán McNamara         if (aColorDlg.Execute(mpShowWindow->GetFrameWeld()))
210644d83b68Sthb         {
210744d83b68Sthb             aColor = aColorDlg.GetColor();
21081a41c071SNoel Grandin             setPenColor(sal_Int32(aColor));
210944d83b68Sthb         }
211044d83b68Sthb         mbWasPaused = false;
211144d83b68Sthb     }
2112e872d77cSCaolán McNamara     else if (rMenuId == "4")
211344d83b68Sthb     {
211444d83b68Sthb         setPenWidth(4.0);
211544d83b68Sthb         mbWasPaused = false;
211644d83b68Sthb     }
2117e872d77cSCaolán McNamara     else if (rMenuId == "100")
211844d83b68Sthb     {
211944d83b68Sthb         setPenWidth(100.0);
212044d83b68Sthb         mbWasPaused = false;
212144d83b68Sthb     }
2122e872d77cSCaolán McNamara     else if (rMenuId == "150")
212344d83b68Sthb     {
212444d83b68Sthb         setPenWidth(150.0);
212544d83b68Sthb         mbWasPaused = false;
212644d83b68Sthb     }
2127e872d77cSCaolán McNamara     else if (rMenuId == "200")
212844d83b68Sthb     {
212944d83b68Sthb         setPenWidth(200.0);
213044d83b68Sthb         mbWasPaused = false;
213144d83b68Sthb     }
2132e872d77cSCaolán McNamara     else if (rMenuId == "400")
213344d83b68Sthb     {
213444d83b68Sthb         setPenWidth(400.0);
213544d83b68Sthb         mbWasPaused = false;
213644d83b68Sthb     }
2137e872d77cSCaolán McNamara     else if (rMenuId == "erase")
213844d83b68Sthb     {
213944d83b68Sthb         setEraseAllInk(true);
214044d83b68Sthb         mbWasPaused = false;
214144d83b68Sthb     }
2142e872d77cSCaolán McNamara     else if (rMenuId == "pen")
2143af5c661bSericb     {
214403a5e096SChristian Lippka         setUsePen(!mbUsePen);
2145af5c661bSericb         mbWasPaused = false;
2146af5c661bSericb     }
2147e872d77cSCaolán McNamara     else if (rMenuId == "edit")
2148747a4f30SCaolán McNamara     {
2149b8608fddSSamuel Mehrbrodt         // When in autoplay mode (pps/ppsx), offer editing of the presentation
2150b8608fddSSamuel Mehrbrodt         // Turn autostart off, else Impress will close when exiting the Presentation
2151b8608fddSSamuel Mehrbrodt         mpViewShell->GetDoc()->SetExitAfterPresenting(false);
2152fe6cce01SStephan Bergmann         if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
2153b8608fddSSamuel Mehrbrodt         {
2154b8608fddSSamuel Mehrbrodt             if( mpSlideController->getCurrentSlideNumber() != -1 )
2155b8608fddSSamuel Mehrbrodt             {
2156b8608fddSSamuel Mehrbrodt                 mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
2157b8608fddSSamuel Mehrbrodt             }
2158b8608fddSSamuel Mehrbrodt         }
2159b8608fddSSamuel Mehrbrodt         endPresentation();
2160747a4f30SCaolán McNamara     }
2161e872d77cSCaolán McNamara     else if (rMenuId == "end")
2162747a4f30SCaolán McNamara     {
2163c9c9d428SOliver Bolte         // in case the user cancels the presentation, switch to current slide
2164c9c9d428SOliver Bolte         // in edit mode
2165fe6cce01SStephan Bergmann         if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
2166c9c9d428SOliver Bolte         {
2167c9c9d428SOliver Bolte             if( mpSlideController->getCurrentSlideNumber() != -1 )
2168d5a46662SKurt Zenker             {
2169c9c9d428SOliver Bolte                 mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
2170c9c9d428SOliver Bolte             }
2171d5a46662SKurt Zenker         }
2172c9c9d428SOliver Bolte         endPresentation();
2173747a4f30SCaolán McNamara     }
2174e872d77cSCaolán McNamara     else if (!rMenuId.isEmpty())
2175747a4f30SCaolán McNamara     {
2176e872d77cSCaolán McNamara         sal_Int32 nPageNumber = rMenuId.toInt32() - CM_SLIDES;
2177d5a46662SKurt Zenker         const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
2178d5a46662SKurt Zenker         if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
2179d5a46662SKurt Zenker         {
2180d5a46662SKurt Zenker             mpShowWindow->RestartShow( nPageNumber );
2181d5a46662SKurt Zenker         }
2182d5a46662SKurt Zenker         else if( nPageNumber != mpSlideController->getCurrentSlideNumber() )
2183d5a46662SKurt Zenker         {
2184c9c9d428SOliver Bolte             displaySlideNumber( nPageNumber );
2185d5a46662SKurt Zenker         }
2186c9c9d428SOliver Bolte         mbWasPaused = false;
2187c9c9d428SOliver Bolte     }
2188c9c9d428SOliver Bolte }
2189c9c9d428SOliver Bolte 
21906ca16a4cSNoel Grandin Reference< XSlideShow > SlideshowImpl::createSlideShow()
21910fefcd83SRüdiger Timm {
21920fefcd83SRüdiger Timm     Reference< XSlideShow > xShow;
21930fefcd83SRüdiger Timm 
21940fefcd83SRüdiger Timm     try
21950fefcd83SRüdiger Timm     {
219623ef230fSNoel Grandin         Reference< uno::XComponentContext > xContext =
219723ef230fSNoel Grandin             ::comphelper::getProcessComponentContext();
21980fefcd83SRüdiger Timm 
2199a361231bSNoel Grandin         xShow.set( presentation::SlideShow::create(xContext), UNO_SET_THROW );
22000fefcd83SRüdiger Timm     }
22018cc98837STakeshi Abe     catch( uno::Exception& )
22020fefcd83SRüdiger Timm     {
2203889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::createSlideShow()" );
22040fefcd83SRüdiger Timm     }
22050fefcd83SRüdiger Timm 
22060fefcd83SRüdiger Timm     return xShow;
22070fefcd83SRüdiger Timm }
22080fefcd83SRüdiger Timm 
2209bb06f513SNoel void SlideshowImpl::createSlideList( bool bAll, std::u16string_view rPresSlide )
22100fefcd83SRüdiger Timm {
2211e588aa4dSNoel Grandin     const sal_uInt16 nSlideCount = mpDoc->GetSdPageCount( PageKind::Standard );
22120fefcd83SRüdiger Timm 
2213b104e6e9SNoel Grandin     if( !nSlideCount )
2214b104e6e9SNoel Grandin         return;
2215b104e6e9SNoel Grandin 
22160fefcd83SRüdiger Timm     SdCustomShow*   pCustomShow;
22170fefcd83SRüdiger Timm 
2218a1b0b68cSCaolán McNamara     if( mpDoc->GetCustomShowList() && maPresSettings.mbCustomShow )
2219b10a5e4cSNoel Grandin         pCustomShow = mpDoc->GetCustomShowList()->GetCurObject();
22200fefcd83SRüdiger Timm     else
222192c697c0SStephan Bergmann         pCustomShow = nullptr;
22220fefcd83SRüdiger Timm 
2223089380a5SOliver Bolte     // create animation slide controller
2224089380a5SOliver Bolte     AnimationSlideController::Mode eMode =
22252c1b7e8dSNoel Grandin         ( pCustomShow && !pCustomShow->PagesVector().empty() ) ? AnimationSlideController::CUSTOM :
2226089380a5SOliver Bolte             (bAll ? AnimationSlideController::ALL : AnimationSlideController::FROM);
2227089380a5SOliver Bolte 
2228089380a5SOliver Bolte     Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW );
2229089380a5SOliver Bolte     Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
2230d712ebc2SNoel Grandin     mpSlideController = std::make_shared<AnimationSlideController>( xSlides, eMode );
2231089380a5SOliver Bolte 
2232089380a5SOliver Bolte     if( eMode != AnimationSlideController::CUSTOM )
22330fefcd83SRüdiger Timm     {
223445e4a5efSKatarina Behrens         sal_Int32 nFirstVisibleSlide = 0;
223545e4a5efSKatarina Behrens 
2236f4a37ca9SUrs Fässler         // normal presentation
2237bb06f513SNoel         if( !rPresSlide.empty() )
22380fefcd83SRüdiger Timm         {
2239089380a5SOliver Bolte             sal_Int32 nSlide;
2240b45a12c3SNoel Grandin             bool bTakeNextAvailable = false;
22410fefcd83SRüdiger Timm 
2242e8b924e4SKatarina Behrens             for( nSlide = 0, nFirstVisibleSlide = -1;
224345e4a5efSKatarina Behrens                 ( nSlide < nSlideCount ) && ( -1 == nFirstVisibleSlide ); nSlide++ )
22440fefcd83SRüdiger Timm             {
2245abf7b941SStephan Bergmann                 SdPage* pTestSlide = mpDoc->GetSdPage( static_cast<sal_uInt16>(nSlide), PageKind::Standard );
22460fefcd83SRüdiger Timm 
2247089380a5SOliver Bolte                 if( pTestSlide->GetName() == rPresSlide )
22480fefcd83SRüdiger Timm                 {
2249089380a5SOliver Bolte                     if( pTestSlide->IsExcluded() )
2250b45a12c3SNoel Grandin                         bTakeNextAvailable = true;
22510fefcd83SRüdiger Timm                     else
225245e4a5efSKatarina Behrens                         nFirstVisibleSlide = nSlide;
22530fefcd83SRüdiger Timm                 }
2254089380a5SOliver Bolte                 else if( bTakeNextAvailable && !pTestSlide->IsExcluded() )
225545e4a5efSKatarina Behrens                     nFirstVisibleSlide = nSlide;
22560fefcd83SRüdiger Timm             }
22570fefcd83SRüdiger Timm 
225845e4a5efSKatarina Behrens             if( -1 == nFirstVisibleSlide )
225945e4a5efSKatarina Behrens                 nFirstVisibleSlide = 0;
22600fefcd83SRüdiger Timm         }
22610fefcd83SRüdiger Timm 
2262089380a5SOliver Bolte         for( sal_Int32 i = 0; i < nSlideCount; i++ )
2263089380a5SOliver Bolte         {
2264abf7b941SStephan Bergmann             bool bVisible = ! mpDoc->GetSdPage( static_cast<sal_uInt16>(i), PageKind::Standard )->IsExcluded();
2265089380a5SOliver Bolte             if( bVisible || (eMode == AnimationSlideController::ALL) )
2266089380a5SOliver Bolte                 mpSlideController->insertSlideNumber( i, bVisible );
2267089380a5SOliver Bolte         }
22680fefcd83SRüdiger Timm 
226945e4a5efSKatarina Behrens         mpSlideController->setStartSlideNumber( nFirstVisibleSlide );
22700fefcd83SRüdiger Timm     }
22710fefcd83SRüdiger Timm     else
22720fefcd83SRüdiger Timm     {
2273bb06f513SNoel         if( meAnimationMode != ANIMATIONMODE_SHOW && !rPresSlide.empty() )
22740fefcd83SRüdiger Timm         {
2275089380a5SOliver Bolte             sal_Int32 nSlide;
2276089380a5SOliver Bolte             for( nSlide = 0; nSlide < nSlideCount; nSlide++ )
2277abf7b941SStephan Bergmann                 if( rPresSlide == mpDoc->GetSdPage( static_cast<sal_uInt16>(nSlide), PageKind::Standard )->GetName() )
22780fefcd83SRüdiger Timm                     break;
22790fefcd83SRüdiger Timm 
2280089380a5SOliver Bolte             if( nSlide < nSlideCount )
2281abf7b941SStephan Bergmann                 mpSlideController->insertSlideNumber( static_cast<sal_uInt16>(nSlide) );
22820fefcd83SRüdiger Timm         }
22830fefcd83SRüdiger Timm 
22847c7ec84cSArkadiy Illarionov         for( const auto& rpPage : pCustomShow->PagesVector() )
22850fefcd83SRüdiger Timm         {
22867c7ec84cSArkadiy Illarionov             const sal_uInt16 nSdSlide = ( rpPage->GetPageNum() - 1 ) / 2;
22870fefcd83SRüdiger Timm 
22882e5508a1SNoel Grandin             if( ! mpDoc->GetSdPage( nSdSlide, PageKind::Standard )->IsExcluded())
2289089380a5SOliver Bolte                 mpSlideController->insertSlideNumber( nSdSlide );
22900fefcd83SRüdiger Timm         }
22910fefcd83SRüdiger Timm     }
22920fefcd83SRüdiger Timm }
22930fefcd83SRüdiger Timm 
22943d6bed44SCarsten Driesner typedef sal_uInt16 (*FncGetChildWindowId)();
22950fefcd83SRüdiger Timm 
229672fcc08eSStephan Bergmann const FncGetChildWindowId aShowChildren[] =
22970fefcd83SRüdiger Timm {
22980fefcd83SRüdiger Timm     &AnimationChildWindow::GetChildWindowId,
22990fefcd83SRüdiger Timm     &Svx3DChildWindow::GetChildWindowId,
23000fefcd83SRüdiger Timm     &SvxFontWorkChildWindow::GetChildWindowId,
23010fefcd83SRüdiger Timm     &SvxColorChildWindow::GetChildWindowId,
23020fefcd83SRüdiger Timm     &SvxSearchDialogWrapper::GetChildWindowId,
23030fefcd83SRüdiger Timm     &SvxBmpMaskChildWindow::GetChildWindowId,
23040fefcd83SRüdiger Timm     &SvxIMapDlgChildWindow::GetChildWindowId,
23050fefcd83SRüdiger Timm     &SvxHlinkDlgWrapper::GetChildWindowId,
2306c767f824SCédric Bosdonnat     &SfxInfoBarContainerChild::GetChildWindowId
23070fefcd83SRüdiger Timm };
23080fefcd83SRüdiger Timm 
23090fefcd83SRüdiger Timm void SlideshowImpl::hideChildWindows()
23100fefcd83SRüdiger Timm {
23112e8acde1SNoel Grandin     mnChildMask = 0;
23120fefcd83SRüdiger Timm 
2313b104e6e9SNoel Grandin     if( ANIMATIONMODE_SHOW != meAnimationMode )
2314b104e6e9SNoel Grandin         return;
2315b104e6e9SNoel Grandin 
23160fefcd83SRüdiger Timm     SfxViewFrame* pViewFrame = getViewFrame();
23170fefcd83SRüdiger Timm 
2318b104e6e9SNoel Grandin     if( !pViewFrame )
2319b104e6e9SNoel Grandin         return;
2320b104e6e9SNoel Grandin 
23211aa4df61SNoel Grandin     for( sal_uLong i = 0; i < SAL_N_ELEMENTS( aShowChildren ); i++ )
23220fefcd83SRüdiger Timm     {
2323dcfd4bebSMichael T. Whiteley         const sal_uInt16 nId = ( *aShowChildren[ i ] )();
23240fefcd83SRüdiger Timm 
23250fefcd83SRüdiger Timm         if( pViewFrame->GetChildWindow( nId ) )
23260fefcd83SRüdiger Timm         {
23279278df2cSNoel Grandin             pViewFrame->SetChildWindow( nId, false );
2328941f2c86SNoel             mnChildMask |= ::tools::ULong(1) << i;
23290fefcd83SRüdiger Timm         }
23300fefcd83SRüdiger Timm     }
23310fefcd83SRüdiger Timm }
23320fefcd83SRüdiger Timm 
23330fefcd83SRüdiger Timm void SlideshowImpl::showChildWindows()
23340fefcd83SRüdiger Timm {
233589e5c418SVladimir Glazounov     if( ANIMATIONMODE_SHOW == meAnimationMode )
23360fefcd83SRüdiger Timm     {
23370fefcd83SRüdiger Timm         SfxViewFrame* pViewFrame = getViewFrame();
2338d5a46662SKurt Zenker         if( pViewFrame )
2339d5a46662SKurt Zenker         {
23401aa4df61SNoel Grandin             for( sal_uLong i = 0; i < SAL_N_ELEMENTS(aShowChildren); i++ )
23410fefcd83SRüdiger Timm             {
2342941f2c86SNoel                 if( mnChildMask & ( ::tools::ULong(1) << i ) )
23439278df2cSNoel Grandin                     pViewFrame->SetChildWindow( ( *aShowChildren[ i ] )(), true );
23440fefcd83SRüdiger Timm             }
23450fefcd83SRüdiger Timm         }
23460fefcd83SRüdiger Timm     }
2347d5a46662SKurt Zenker }
23480fefcd83SRüdiger Timm 
23490fefcd83SRüdiger Timm SfxViewFrame* SlideshowImpl::getViewFrame() const
23500fefcd83SRüdiger Timm {
235192c697c0SStephan Bergmann     return mpViewShell ? mpViewShell->GetViewFrame() : nullptr;
2352d5a46662SKurt Zenker }
2353d5a46662SKurt Zenker 
2354d5a46662SKurt Zenker SfxDispatcher* SlideshowImpl::getDispatcher() const
2355d5a46662SKurt Zenker {
235692c697c0SStephan Bergmann     return (mpViewShell && mpViewShell->GetViewFrame()) ? mpViewShell->GetViewFrame()->GetDispatcher() : nullptr;
2357d5a46662SKurt Zenker }
2358d5a46662SKurt Zenker 
2359d5a46662SKurt Zenker SfxBindings* SlideshowImpl::getBindings() const
2360d5a46662SKurt Zenker {
236192c697c0SStephan Bergmann     return (mpViewShell && mpViewShell->GetViewFrame()) ? &mpViewShell->GetViewFrame()->GetBindings() : nullptr;
23620fefcd83SRüdiger Timm }
23630fefcd83SRüdiger Timm 
23640fefcd83SRüdiger Timm void SlideshowImpl::resize( const Size& rSize )
23650fefcd83SRüdiger Timm {
23660fefcd83SRüdiger Timm     maPresSize = rSize;
23670fefcd83SRüdiger Timm 
2368916cbd94SJulien Nabet     if(mpShowWindow)
23690fefcd83SRüdiger Timm     {
23700fefcd83SRüdiger Timm         mpShowWindow->SetSizePixel( maPresSize );
23710fefcd83SRüdiger Timm         mpShowWindow->Show();
23720fefcd83SRüdiger Timm     }
23730fefcd83SRüdiger Timm 
2374ddb02dbaSOliver Bolte     if( mxView.is() ) try
23750fefcd83SRüdiger Timm     {
23760fefcd83SRüdiger Timm         awt::WindowEvent aEvt;
23770fefcd83SRüdiger Timm         mxView->windowResized(aEvt);
23780fefcd83SRüdiger Timm     }
23798cc98837STakeshi Abe     catch( Exception& )
2380ddb02dbaSOliver Bolte     {
2381889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::resize()" );
2382ddb02dbaSOliver Bolte     }
23830fefcd83SRüdiger Timm }
23840fefcd83SRüdiger Timm 
2385b45a12c3SNoel Grandin void SlideshowImpl::setActiveXToolbarsVisible( bool bVisible )
238620549ebeSOliver Bolte {
238720549ebeSOliver Bolte     // in case of ActiveX control the toolbars should not be visible if slide show runs in window mode
238820549ebeSOliver Bolte     // actually it runs always in window mode in case of ActiveX control
2389b104e6e9SNoel Grandin     if ( !(!maPresSettings.mbFullScreen && mpDocSh && mpDocSh->GetMedium()) )
2390b104e6e9SNoel Grandin         return;
2391b104e6e9SNoel Grandin 
2392adeefc62SJan Holesovsky     const SfxBoolItem* pItem = SfxItemSet::GetItem<SfxBoolItem>(mpDocSh->GetMedium()->GetItemSet(), SID_VIEWONLY, false);
2393b104e6e9SNoel Grandin     if ( !(pItem && pItem->GetValue()) )
2394b104e6e9SNoel Grandin         return;
2395b104e6e9SNoel Grandin 
239620549ebeSOliver Bolte     // this is a plugin/activex mode, no toolbars should be visible during slide show
239720549ebeSOliver Bolte     // after the end of slide show they should be visible again
239820549ebeSOliver Bolte     SfxViewFrame* pViewFrame = getViewFrame();
2399b104e6e9SNoel Grandin     if( !pViewFrame )
2400b104e6e9SNoel Grandin         return;
2401b104e6e9SNoel Grandin 
240220549ebeSOliver Bolte     try
240320549ebeSOliver Bolte     {
240420549ebeSOliver Bolte         Reference< frame::XLayoutManager > xLayoutManager;
24052b3de550SNoel Grandin         Reference< beans::XPropertySet > xFrameProps( pViewFrame->GetFrame().GetFrameInterface(), UNO_QUERY_THROW );
240696f9300aSOlivier Hallot         if ( ( xFrameProps->getPropertyValue( "LayoutManager" )
240720549ebeSOliver Bolte                     >>= xLayoutManager )
240820549ebeSOliver Bolte           && xLayoutManager.is() )
240920549ebeSOliver Bolte         {
241020549ebeSOliver Bolte             xLayoutManager->setVisible( bVisible );
241120549ebeSOliver Bolte         }
241220549ebeSOliver Bolte     }
241320549ebeSOliver Bolte     catch( uno::Exception& )
241420549ebeSOliver Bolte     {}
241520549ebeSOliver Bolte }
241620549ebeSOliver Bolte 
2417e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::activate()
24180fefcd83SRüdiger Timm {
2419f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2420808a70e2SKurt Zenker 
2421808a70e2SKurt Zenker     maDeactivateTimer.Stop();
2422808a70e2SKurt Zenker 
2423e67657d5SNoel Grandin     if( mbActive || !mxShow.is() )
2424b104e6e9SNoel Grandin         return;
2425b104e6e9SNoel Grandin 
2426b45a12c3SNoel Grandin     mbActive = true;
24270fefcd83SRüdiger Timm 
24280fefcd83SRüdiger Timm     if( ANIMATIONMODE_SHOW == meAnimationMode )
24290fefcd83SRüdiger Timm     {
2430cfb3429dSOliver Bolte         if( mbAutoSaveWasOn )
2431cfb3429dSOliver Bolte             setAutoSaveState( false );
24320fefcd83SRüdiger Timm 
24330fefcd83SRüdiger Timm         if( mpShowWindow )
24340fefcd83SRüdiger Timm         {
2435d5a46662SKurt Zenker             SfxViewFrame* pViewFrame = getViewFrame();
243692c697c0SStephan Bergmann             SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : nullptr;
24370fefcd83SRüdiger Timm 
243889e5c418SVladimir Glazounov             hideChildWindows();
24390fefcd83SRüdiger Timm 
2440d5a46662SKurt Zenker             if( pDispatcher )
2441d5a46662SKurt Zenker             {
244237427486SAndrea Gelmini                 // filter all forbidden slots
2443470752f5SNoel Grandin                 pDispatcher->SetSlotFilter( SfxSlotFilterState::ENABLED, pAllowed );
2444d5a46662SKurt Zenker             }
24450fefcd83SRüdiger Timm 
2446d5a46662SKurt Zenker             if( getBindings() )
2447c2324940SNoel Grandin                 getBindings()->InvalidateAll(true);
2448d5a46662SKurt Zenker 
24490fefcd83SRüdiger Timm             mpShowWindow->GrabFocus();
24500fefcd83SRüdiger Timm         }
24510fefcd83SRüdiger Timm     }
24520fefcd83SRüdiger Timm 
2453808a70e2SKurt Zenker     resume();
2454808a70e2SKurt Zenker }
24550fefcd83SRüdiger Timm 
2456e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::deactivate()
24570fefcd83SRüdiger Timm {
2458f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
24590fefcd83SRüdiger Timm 
2460808a70e2SKurt Zenker     if( mbActive && mxShow.is() )
2461808a70e2SKurt Zenker     {
2462808a70e2SKurt Zenker         maDeactivateTimer.Start();
2463808a70e2SKurt Zenker     }
2464808a70e2SKurt Zenker }
2465808a70e2SKurt Zenker 
2466106ea872SStephan Bergmann IMPL_LINK_NOARG(SlideshowImpl, deactivateHdl, Timer *, void)
2467808a70e2SKurt Zenker {
2468b104e6e9SNoel Grandin     if( !(mbActive && mxShow.is()) )
2469b104e6e9SNoel Grandin         return;
2470b104e6e9SNoel Grandin 
2471b45a12c3SNoel Grandin     mbActive = false;
2472808a70e2SKurt Zenker 
2473808a70e2SKurt Zenker     pause();
24740fefcd83SRüdiger Timm 
24750fefcd83SRüdiger Timm     if( ANIMATIONMODE_SHOW == meAnimationMode )
24760fefcd83SRüdiger Timm     {
2477cfb3429dSOliver Bolte         if( mbAutoSaveWasOn )
2478cfb3429dSOliver Bolte             setAutoSaveState( true );
24790fefcd83SRüdiger Timm 
24800fefcd83SRüdiger Timm         if( mpShowWindow )
24810fefcd83SRüdiger Timm         {
248289e5c418SVladimir Glazounov             showChildWindows();
24830fefcd83SRüdiger Timm         }
24840fefcd83SRüdiger Timm     }
24850fefcd83SRüdiger Timm }
2486808a70e2SKurt Zenker 
2487e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::isActive()
2488808a70e2SKurt Zenker {
2489f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2490808a70e2SKurt Zenker     return mbActive;
2491808a70e2SKurt Zenker }
24920fefcd83SRüdiger Timm 
2493cfb3429dSOliver Bolte void SlideshowImpl::setAutoSaveState( bool bOn)
2494cfb3429dSOliver Bolte {
2495cfb3429dSOliver Bolte     try
2496cfb3429dSOliver Bolte     {
24970fcd1a73SNoel Grandin         uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() );
2498cfb3429dSOliver Bolte 
24990fcd1a73SNoel Grandin         uno::Reference< util::XURLTransformer > xParser(util::URLTransformer::create(xContext));
2500cfb3429dSOliver Bolte         util::URL aURL;
250196f9300aSOlivier Hallot         aURL.Complete = "vnd.sun.star.autorecovery:/setAutoSaveState";
2502cfb3429dSOliver Bolte         xParser->parseStrict(aURL);
2503cfb3429dSOliver Bolte 
2504cfb3429dSOliver Bolte         Sequence< beans::PropertyValue > aArgs(1);
250596f9300aSOlivier Hallot         aArgs[0].Name = "AutoSaveState";
2506b36e8678SStephan Bergmann         aArgs[0].Value <<= bOn;
2507cfb3429dSOliver Bolte 
2508dd1c991bSMatúš Kukan         uno::Reference< frame::XDispatch > xAutoSave = frame::theAutoRecovery::get(xContext);
2509cfb3429dSOliver Bolte         xAutoSave->dispatch(aURL, aArgs);
2510cfb3429dSOliver Bolte     }
2511cfb3429dSOliver Bolte     catch( Exception& )
2512cfb3429dSOliver Bolte     {
2513d6d80c4eSNoel         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::setAutoSaveState()");
2514cfb3429dSOliver Bolte     }
2515cfb3429dSOliver Bolte }
2516cfb3429dSOliver Bolte 
2517e57ca028SStephan Bergmann Reference< XDrawPage > SAL_CALL SlideshowImpl::getCurrentSlide()
25182db95b18SKurt Zenker {
2519f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2520808a70e2SKurt Zenker 
2521808a70e2SKurt Zenker     Reference< XDrawPage > xSlide;
2522fe6cce01SStephan Bergmann     if( mxShow.is() && mpSlideController )
2523808a70e2SKurt Zenker     {
2524808a70e2SKurt Zenker         sal_Int32 nSlide = getCurrentSlideNumber();
2525808a70e2SKurt Zenker         if( (nSlide >= 0) && (nSlide < mpSlideController->getSlideNumberCount() ) )
2526808a70e2SKurt Zenker             xSlide = mpSlideController->getSlideByNumber( nSlide );
25272db95b18SKurt Zenker     }
25282db95b18SKurt Zenker 
2529808a70e2SKurt Zenker     return xSlide;
2530808a70e2SKurt Zenker }
2531808a70e2SKurt Zenker 
2532e57ca028SStephan Bergmann sal_Int32 SAL_CALL SlideshowImpl::getNextSlideIndex()
25332db95b18SKurt Zenker {
2534f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2535808a70e2SKurt Zenker 
2536808a70e2SKurt Zenker     if( mxShow.is() )
2537808a70e2SKurt Zenker     {
2538808a70e2SKurt Zenker         return mpSlideController->getNextSlideIndex();
2539808a70e2SKurt Zenker     }
2540808a70e2SKurt Zenker     else
2541808a70e2SKurt Zenker     {
2542808a70e2SKurt Zenker         return -1;
2543808a70e2SKurt Zenker     }
2544808a70e2SKurt Zenker }
2545808a70e2SKurt Zenker 
2546e57ca028SStephan Bergmann sal_Int32 SAL_CALL SlideshowImpl::getCurrentSlideIndex()
2547808a70e2SKurt Zenker {
2548fe6cce01SStephan Bergmann     return mpSlideController ? mpSlideController->getCurrentSlideIndex() : -1;
2549808a70e2SKurt Zenker }
2550808a70e2SKurt Zenker 
2551a2795356SNoel Grandin // css::presentation::XSlideShowController:
25520ce0c369SAlexander Wilms 
2553e57ca028SStephan Bergmann ::sal_Int32 SAL_CALL SlideshowImpl::getSlideCount()
2554808a70e2SKurt Zenker {
2555fe6cce01SStephan Bergmann     return mpSlideController ? mpSlideController->getSlideIndexCount() : 0;
2556808a70e2SKurt Zenker }
2557808a70e2SKurt Zenker 
2558e57ca028SStephan Bergmann Reference< XDrawPage > SAL_CALL SlideshowImpl::getSlideByIndex(::sal_Int32 Index)
2559808a70e2SKurt Zenker {
2560ccb2a1f6SNoel Grandin     if ((mpSlideController == nullptr) || (Index < 0)
2561ccb2a1f6SNoel Grandin         || (Index >= mpSlideController->getSlideIndexCount()))
2562808a70e2SKurt Zenker         throw IndexOutOfBoundsException();
2563808a70e2SKurt Zenker 
2564808a70e2SKurt Zenker     return mpSlideController->getSlideByNumber( mpSlideController->getSlideNumber( Index ) );
2565808a70e2SKurt Zenker }
2566808a70e2SKurt Zenker 
2567e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::getAlwaysOnTop()
2568808a70e2SKurt Zenker {
2569f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2570808a70e2SKurt Zenker     return maPresSettings.mbAlwaysOnTop;
2571808a70e2SKurt Zenker }
2572808a70e2SKurt Zenker 
2573e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::setAlwaysOnTop( sal_Bool bAlways )
2574808a70e2SKurt Zenker {
2575f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2576e19cd844SStephan Bergmann     if( maPresSettings.mbAlwaysOnTop != bool(bAlways) )
2577808a70e2SKurt Zenker     {
2578808a70e2SKurt Zenker         maPresSettings.mbAlwaysOnTop = bAlways;
2579808a70e2SKurt Zenker         // todo, can this be changed while running?
2580808a70e2SKurt Zenker     }
2581808a70e2SKurt Zenker }
2582808a70e2SKurt Zenker 
2583e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::isFullScreen()
2584808a70e2SKurt Zenker {
2585f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2586808a70e2SKurt Zenker     return maPresSettings.mbFullScreen;
2587808a70e2SKurt Zenker }
2588808a70e2SKurt Zenker 
2589e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::getMouseVisible()
2590808a70e2SKurt Zenker {
2591f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2592808a70e2SKurt Zenker     return maPresSettings.mbMouseVisible;
2593808a70e2SKurt Zenker }
2594808a70e2SKurt Zenker 
2595e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::setMouseVisible( sal_Bool bVisible )
2596808a70e2SKurt Zenker {
2597f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2598e19cd844SStephan Bergmann     if( maPresSettings.mbMouseVisible != bool(bVisible) )
2599808a70e2SKurt Zenker     {
2600808a70e2SKurt Zenker         maPresSettings.mbMouseVisible = bVisible;
2601808a70e2SKurt Zenker         if( mpShowWindow )
2602808a70e2SKurt Zenker             mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible );
2603808a70e2SKurt Zenker     }
2604808a70e2SKurt Zenker }
2605808a70e2SKurt Zenker 
2606e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::getUsePen()
2607808a70e2SKurt Zenker {
2608f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
260903a5e096SChristian Lippka     return mbUsePen;
2610808a70e2SKurt Zenker }
2611808a70e2SKurt Zenker 
2612e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::setUsePen( sal_Bool bMouseAsPen )
2613808a70e2SKurt Zenker {
2614f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
261503a5e096SChristian Lippka     mbUsePen = bMouseAsPen;
2616b104e6e9SNoel Grandin     if( !mxShow.is() )
2617b104e6e9SNoel Grandin         return;
2618b104e6e9SNoel Grandin 
2619b104e6e9SNoel Grandin     try
2620808a70e2SKurt Zenker     {
2621af5c661bSericb         // For Pencolor;
2622808a70e2SKurt Zenker         Any aValue;
262303a5e096SChristian Lippka         if( mbUsePen )
2624808a70e2SKurt Zenker             aValue <<= mnUserPaintColor;
2625808a70e2SKurt Zenker         beans::PropertyValue aPenProp;
262696f9300aSOlivier Hallot         aPenProp.Name = "UserPaintColor";
2627808a70e2SKurt Zenker         aPenProp.Value = aValue;
2628808a70e2SKurt Zenker         mxShow->setProperty( aPenProp );
262944d83b68Sthb 
263003a5e096SChristian Lippka         //for StrokeWidth :
263103a5e096SChristian Lippka         if( mbUsePen )
263203a5e096SChristian Lippka         {
263344d83b68Sthb             beans::PropertyValue aPenPropWidth;
263496f9300aSOlivier Hallot             aPenPropWidth.Name = "UserPaintStrokeWidth";
263503a5e096SChristian Lippka             aPenPropWidth.Value <<= mdUserPaintStrokeWidth;
263644d83b68Sthb             mxShow->setProperty( aPenPropWidth );
263744d83b68Sthb 
2638af5c661bSericb             // for Pen Mode
2639af5c661bSericb             beans::PropertyValue aPenPropSwitchPenMode;
264096f9300aSOlivier Hallot             aPenPropSwitchPenMode.Name = "SwitchPenMode";
26410003e99bSStephan Bergmann             aPenPropSwitchPenMode.Value <<= true;
2642af5c661bSericb             mxShow->setProperty( aPenPropSwitchPenMode );
264303a5e096SChristian Lippka         }
2644808a70e2SKurt Zenker     }
26458cc98837STakeshi Abe     catch( Exception& )
2646808a70e2SKurt Zenker     {
2647889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::setUsePen()" );
2648808a70e2SKurt Zenker     }
2649808a70e2SKurt Zenker }
2650808a70e2SKurt Zenker 
2651e57ca028SStephan Bergmann double SAL_CALL SlideshowImpl::getPenWidth()
265244d83b68Sthb {
2653f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
265444d83b68Sthb     return mdUserPaintStrokeWidth;
265544d83b68Sthb }
265644d83b68Sthb 
2657e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::setPenWidth( double dStrokeWidth )
265844d83b68Sthb {
2659f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
266044d83b68Sthb     mdUserPaintStrokeWidth = dStrokeWidth;
266103a5e096SChristian Lippka     setUsePen( true ); // enable pen mode, update color and width
266244d83b68Sthb }
2663ef238fc5SChristian Lippka ORACLE 
2664e57ca028SStephan Bergmann sal_Int32 SAL_CALL SlideshowImpl::getPenColor()
2665808a70e2SKurt Zenker {
2666f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2667808a70e2SKurt Zenker     return mnUserPaintColor;
2668808a70e2SKurt Zenker }
2669808a70e2SKurt Zenker 
2670e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::setPenColor( sal_Int32 nColor )
2671808a70e2SKurt Zenker {
2672f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2673808a70e2SKurt Zenker     mnUserPaintColor = nColor;
267403a5e096SChristian Lippka     setUsePen( true ); // enable pen mode, update color
2675808a70e2SKurt Zenker }
2676808a70e2SKurt Zenker 
26775544c178SGabor Kelemen void SAL_CALL SlideshowImpl::setEraseAllInk(sal_Bool bEraseAllInk)
267844d83b68Sthb {
2679b104e6e9SNoel Grandin     if( !bEraseAllInk )
2680b104e6e9SNoel Grandin         return;
2681b104e6e9SNoel Grandin 
2682f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2683b104e6e9SNoel Grandin     if( !mxShow.is() )
2684b104e6e9SNoel Grandin         return;
2685b104e6e9SNoel Grandin 
2686b104e6e9SNoel Grandin     try
268703a5e096SChristian Lippka     {
268803a5e096SChristian Lippka         beans::PropertyValue aPenPropEraseAllInk;
268996f9300aSOlivier Hallot         aPenPropEraseAllInk.Name = "EraseAllInk";
269003a5e096SChristian Lippka         aPenPropEraseAllInk.Value <<= bEraseAllInk;
269103a5e096SChristian Lippka         mxShow->setProperty( aPenPropEraseAllInk );
269244d83b68Sthb     }
26938cc98837STakeshi Abe     catch( Exception& )
269403a5e096SChristian Lippka     {
2695889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd.slideshow", "sd::SlideshowImpl::setEraseAllInk()" );
269603a5e096SChristian Lippka     }
269703a5e096SChristian Lippka }
269803a5e096SChristian Lippka 
2699808a70e2SKurt Zenker // XSlideShowController Methods
2700e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::isRunning(  )
2701808a70e2SKurt Zenker {
2702f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2703808a70e2SKurt Zenker     return mxShow.is();
2704808a70e2SKurt Zenker }
2705808a70e2SKurt Zenker 
2706e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoNextEffect(  )
2707808a70e2SKurt Zenker {
2708f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2709808a70e2SKurt Zenker 
2710fe6cce01SStephan Bergmann     if( !(mxShow.is() && mpSlideController && mpShowWindow) )
2711b104e6e9SNoel Grandin         return;
2712b104e6e9SNoel Grandin 
2713808a70e2SKurt Zenker     if( mbIsPaused )
2714808a70e2SKurt Zenker         resume();
2715808a70e2SKurt Zenker 
2716808a70e2SKurt Zenker     const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
2717808a70e2SKurt Zenker     if( eMode == SHOWWINDOWMODE_END )
2718808a70e2SKurt Zenker     {
2719808a70e2SKurt Zenker         endPresentation();
2720808a70e2SKurt Zenker     }
2721808a70e2SKurt Zenker     else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
2722808a70e2SKurt Zenker     {
2723808a70e2SKurt Zenker         mpShowWindow->RestartShow();
2724808a70e2SKurt Zenker     }
2725808a70e2SKurt Zenker     else
2726808a70e2SKurt Zenker     {
2727808a70e2SKurt Zenker         mxShow->nextEffect();
2728808a70e2SKurt Zenker         update();
2729808a70e2SKurt Zenker     }
2730808a70e2SKurt Zenker }
2731808a70e2SKurt Zenker 
2732e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoPreviousEffect(  )
273376c3d136SAndre Fischer {
2734f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
273576c3d136SAndre Fischer 
2736fe6cce01SStephan Bergmann     if( !(mxShow.is() && mpSlideController && mpShowWindow) )
2737b104e6e9SNoel Grandin         return;
2738b104e6e9SNoel Grandin 
273976c3d136SAndre Fischer     if( mbIsPaused )
274076c3d136SAndre Fischer         resume();
274176c3d136SAndre Fischer 
274276c3d136SAndre Fischer     const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
274376c3d136SAndre Fischer     if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
274476c3d136SAndre Fischer     {
274576c3d136SAndre Fischer         mpShowWindow->RestartShow();
274676c3d136SAndre Fischer     }
274776c3d136SAndre Fischer     else
274876c3d136SAndre Fischer     {
274976c3d136SAndre Fischer         mxShow->previousEffect();
275076c3d136SAndre Fischer         update();
275176c3d136SAndre Fischer     }
275276c3d136SAndre Fischer }
275376c3d136SAndre Fischer 
2754e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoFirstSlide(  )
2755808a70e2SKurt Zenker {
2756f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2757808a70e2SKurt Zenker 
2758fe6cce01SStephan Bergmann     if( !(mpShowWindow && mpSlideController) )
2759b104e6e9SNoel Grandin         return;
2760b104e6e9SNoel Grandin 
2761808a70e2SKurt Zenker     if( mbIsPaused )
2762808a70e2SKurt Zenker         resume();
2763808a70e2SKurt Zenker 
2764808a70e2SKurt Zenker     if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END )
2765808a70e2SKurt Zenker     {
2766808a70e2SKurt Zenker         if( mpSlideController->getSlideIndexCount() )
2767808a70e2SKurt Zenker             mpShowWindow->RestartShow( 0);
2768808a70e2SKurt Zenker     }
2769808a70e2SKurt Zenker     else
2770808a70e2SKurt Zenker     {
2771808a70e2SKurt Zenker         displaySlideIndex( 0 );
2772808a70e2SKurt Zenker     }
2773808a70e2SKurt Zenker }
2774808a70e2SKurt Zenker 
2775e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoNextSlide(  )
2776808a70e2SKurt Zenker {
2777f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2778808a70e2SKurt Zenker 
2779808a70e2SKurt Zenker     if( mbIsPaused )
2780808a70e2SKurt Zenker         resume();
2781808a70e2SKurt Zenker 
2782808a70e2SKurt Zenker     const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
2783808a70e2SKurt Zenker     if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
2784808a70e2SKurt Zenker     {
2785808a70e2SKurt Zenker         mpShowWindow->RestartShow();
2786808a70e2SKurt Zenker     }
2787808a70e2SKurt Zenker     else
2788808a70e2SKurt Zenker     {
2789808a70e2SKurt Zenker         // if this is a show, ignore user inputs and
2790d35d893cSJulien Nabet         // start 20ms timer to reenable inputs to filter
2791808a70e2SKurt Zenker         // buffered inputs during slide transition
2792808a70e2SKurt Zenker         if( meAnimationMode == ANIMATIONMODE_SHOW )
2793808a70e2SKurt Zenker         {
2794808a70e2SKurt Zenker             mbInputFreeze = true;
2795808a70e2SKurt Zenker             maInputFreezeTimer.Start();
2796808a70e2SKurt Zenker         }
2797808a70e2SKurt Zenker 
2798fe6cce01SStephan Bergmann         if( mpSlideController )
2799808a70e2SKurt Zenker         {
2800808a70e2SKurt Zenker             if( mpSlideController->nextSlide() )
2801808a70e2SKurt Zenker             {
2802808a70e2SKurt Zenker                 displayCurrentSlide();
2803808a70e2SKurt Zenker             }
2804808a70e2SKurt Zenker             else
2805808a70e2SKurt Zenker             {
2806808a70e2SKurt Zenker                 stopSound();
2807808a70e2SKurt Zenker 
2808808a70e2SKurt Zenker                 if( meAnimationMode == ANIMATIONMODE_PREVIEW )
2809808a70e2SKurt Zenker                 {
2810808a70e2SKurt Zenker                     endPresentation();
2811808a70e2SKurt Zenker                 }
2812808a70e2SKurt Zenker                 else if( maPresSettings.mbEndless )
2813808a70e2SKurt Zenker                 {
2814808a70e2SKurt Zenker                     if( maPresSettings.mnPauseTimeout )
2815808a70e2SKurt Zenker                     {
2816808a70e2SKurt Zenker                         if( mpShowWindow )
2817c8428842SChristian Lippka                         {
28184d362d23SAriel Constenla-Haile                             if ( maPresSettings.mbShowPauseLogo )
28194d362d23SAriel Constenla-Haile                             {
2820918f8ed9SCaolán McNamara                                 Graphic aGraphic(SfxApplication::GetApplicationLogo(360));
2821f946e905SNoel Grandin                                 mpShowWindow->SetPauseMode( maPresSettings.mnPauseTimeout, &aGraphic );
2822c8428842SChristian Lippka                             }
28234d362d23SAriel Constenla-Haile                             else
2824f946e905SNoel Grandin                                 mpShowWindow->SetPauseMode( maPresSettings.mnPauseTimeout );
28254d362d23SAriel Constenla-Haile                         }
2826808a70e2SKurt Zenker                     }
2827808a70e2SKurt Zenker                     else
2828808a70e2SKurt Zenker                     {
2829808a70e2SKurt Zenker                         displaySlideIndex( 0 );
2830808a70e2SKurt Zenker                     }
2831808a70e2SKurt Zenker                 }
2832808a70e2SKurt Zenker                 else
2833808a70e2SKurt Zenker                 {
2834808a70e2SKurt Zenker                     if( mpShowWindow )
2835808a70e2SKurt Zenker                     {
2836808a70e2SKurt Zenker                         mpShowWindow->SetEndMode();
28376fdcfcc1SKatarina Machalkova                         if( !mpViewShell->GetDoc()->IsStartWithPresentation() )
2838808a70e2SKurt Zenker                             pause();
2839808a70e2SKurt Zenker                     }
2840808a70e2SKurt Zenker                 }
2841808a70e2SKurt Zenker             }
2842808a70e2SKurt Zenker         }
2843808a70e2SKurt Zenker     }
2844808a70e2SKurt Zenker }
2845808a70e2SKurt Zenker 
2846e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoPreviousSlide(  )
2847808a70e2SKurt Zenker {
284876c3d136SAndre Fischer     gotoPreviousSlide(false);
284976c3d136SAndre Fischer }
285076c3d136SAndre Fischer 
285176c3d136SAndre Fischer void SlideshowImpl::gotoPreviousSlide (const bool bSkipAllMainSequenceEffects)
285276c3d136SAndre Fischer {
2853f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2854808a70e2SKurt Zenker 
2855fe6cce01SStephan Bergmann     if( !(mxShow.is() && mpSlideController) )
2856b104e6e9SNoel Grandin         return;
2857b104e6e9SNoel Grandin 
2858b104e6e9SNoel Grandin     try
2859808a70e2SKurt Zenker     {
2860808a70e2SKurt Zenker         if( mbIsPaused )
2861808a70e2SKurt Zenker             resume();
2862808a70e2SKurt Zenker 
2863808a70e2SKurt Zenker         const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
2864808a70e2SKurt Zenker         if( eMode == SHOWWINDOWMODE_END )
2865808a70e2SKurt Zenker         {
2866f804c72aSRob Snelders             mpShowWindow->RestartShow( mpSlideController->getCurrentSlideIndex() );
2867808a70e2SKurt Zenker         }
2868808a70e2SKurt Zenker         else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
2869808a70e2SKurt Zenker         {
2870808a70e2SKurt Zenker             mpShowWindow->RestartShow();
2871808a70e2SKurt Zenker         }
2872808a70e2SKurt Zenker         else
2873808a70e2SKurt Zenker         {
2874808a70e2SKurt Zenker             if( mpSlideController->previousSlide())
287576c3d136SAndre Fischer                 displayCurrentSlide(bSkipAllMainSequenceEffects);
287676c3d136SAndre Fischer             else if (bSkipAllMainSequenceEffects)
287776c3d136SAndre Fischer             {
287876c3d136SAndre Fischer                 // We could not go to the previous slide (probably because
287976c3d136SAndre Fischer                 // the current slide is already the first one).  We still
288076c3d136SAndre Fischer                 // have to call displayCurrentSlide because the calling
288176c3d136SAndre Fischer                 // slideshow can not determine whether there is a previous
288276c3d136SAndre Fischer                 // slide or not and has already prepared for a slide change.
288376c3d136SAndre Fischer                 // This slide change has to be completed now, even when
288476c3d136SAndre Fischer                 // changing to the same slide.
288576c3d136SAndre Fischer                 // Note that in this special case we do NOT pass
288676c3d136SAndre Fischer                 // bSkipAllMainSequenceEffects because we display the same
288776c3d136SAndre Fischer                 // slide as before and do not want to show all its effects.
288818793ae6SNoel Grandin                 displayCurrentSlide();
288976c3d136SAndre Fischer             }
2890808a70e2SKurt Zenker         }
2891808a70e2SKurt Zenker     }
28928cc98837STakeshi Abe     catch( Exception& )
2893808a70e2SKurt Zenker     {
2894889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::gotoPreviousSlide()" );
2895808a70e2SKurt Zenker     }
2896808a70e2SKurt Zenker }
2897808a70e2SKurt Zenker 
2898e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoLastSlide()
2899808a70e2SKurt Zenker {
2900f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2901808a70e2SKurt Zenker 
2902fe6cce01SStephan Bergmann     if( !mpSlideController )
2903b104e6e9SNoel Grandin         return;
2904b104e6e9SNoel Grandin 
2905808a70e2SKurt Zenker     if( mbIsPaused )
2906808a70e2SKurt Zenker         resume();
2907808a70e2SKurt Zenker 
2908808a70e2SKurt Zenker     const sal_Int32 nLastSlideIndex = mpSlideController->getSlideIndexCount() - 1;
2909808a70e2SKurt Zenker     if( nLastSlideIndex >= 0 )
2910808a70e2SKurt Zenker     {
2911808a70e2SKurt Zenker         if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END )
2912808a70e2SKurt Zenker         {
2913808a70e2SKurt Zenker             mpShowWindow->RestartShow( nLastSlideIndex );
2914808a70e2SKurt Zenker         }
2915808a70e2SKurt Zenker         else
2916808a70e2SKurt Zenker         {
2917808a70e2SKurt Zenker             displaySlideIndex( nLastSlideIndex );
2918808a70e2SKurt Zenker         }
2919808a70e2SKurt Zenker     }
2920808a70e2SKurt Zenker }
2921808a70e2SKurt Zenker 
2922e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoBookmark( const OUString& rBookmark )
2923808a70e2SKurt Zenker {
2924f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2925808a70e2SKurt Zenker 
2926808a70e2SKurt Zenker     if( mbIsPaused )
2927808a70e2SKurt Zenker         resume();
2928808a70e2SKurt Zenker 
2929808a70e2SKurt Zenker     sal_Int32 nSlideNumber = getSlideNumberForBookmark( rBookmark );
2930808a70e2SKurt Zenker     if( nSlideNumber != -1 )
2931808a70e2SKurt Zenker         displaySlideNumber( nSlideNumber );
2932808a70e2SKurt Zenker }
2933808a70e2SKurt Zenker 
2934808a70e2SKurt Zenker void SAL_CALL SlideshowImpl::gotoSlide( const Reference< XDrawPage >& xSlide )
2935808a70e2SKurt Zenker {
2936f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2937808a70e2SKurt Zenker 
2938fe6cce01SStephan Bergmann     if( !(mpSlideController && xSlide.is()) )
2939b104e6e9SNoel Grandin         return;
2940b104e6e9SNoel Grandin 
2941808a70e2SKurt Zenker     if( mbIsPaused )
2942808a70e2SKurt Zenker         resume();
2943808a70e2SKurt Zenker 
2944808a70e2SKurt Zenker     const sal_Int32 nSlideCount = mpSlideController->getSlideNumberCount();
2945808a70e2SKurt Zenker     for( sal_Int32 nSlide = 0; nSlide < nSlideCount; nSlide++ )
2946808a70e2SKurt Zenker     {
2947808a70e2SKurt Zenker         if( mpSlideController->getSlideByNumber( nSlide ) == xSlide )
2948808a70e2SKurt Zenker         {
2949808a70e2SKurt Zenker             displaySlideNumber( nSlide );
2950808a70e2SKurt Zenker         }
2951808a70e2SKurt Zenker     }
2952808a70e2SKurt Zenker }
2953808a70e2SKurt Zenker 
2954e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::gotoSlideIndex( sal_Int32 nIndex )
2955808a70e2SKurt Zenker {
2956f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2957808a70e2SKurt Zenker 
2958808a70e2SKurt Zenker     if( mbIsPaused )
2959808a70e2SKurt Zenker         resume();
2960808a70e2SKurt Zenker 
2961808a70e2SKurt Zenker     displaySlideIndex( nIndex );
2962808a70e2SKurt Zenker }
2963808a70e2SKurt Zenker 
2964e57ca028SStephan Bergmann void SAL_CALL SlideshowImpl::stopSound(  )
2965808a70e2SKurt Zenker {
2966f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
2967808a70e2SKurt Zenker 
2968808a70e2SKurt Zenker     try
2969808a70e2SKurt Zenker     {
2970808a70e2SKurt Zenker         if( mxPlayer.is() )
2971808a70e2SKurt Zenker         {
2972808a70e2SKurt Zenker             mxPlayer->stop();
2973808a70e2SKurt Zenker             mxPlayer.clear();
2974808a70e2SKurt Zenker         }
2975808a70e2SKurt Zenker     }
29768cc98837STakeshi Abe     catch( Exception& )
2977808a70e2SKurt Zenker     {
2978889dc7bfSNoel Grandin         TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::stopSound()" );
2979808a70e2SKurt Zenker     }
2980808a70e2SKurt Zenker }
2981808a70e2SKurt Zenker 
2982808a70e2SKurt Zenker // XIndexAccess
29830ce0c369SAlexander Wilms 
2984e57ca028SStephan Bergmann ::sal_Int32 SAL_CALL SlideshowImpl::getCount(  )
2985808a70e2SKurt Zenker {
2986808a70e2SKurt Zenker     return getSlideCount();
2987808a70e2SKurt Zenker }
2988808a70e2SKurt Zenker 
2989e57ca028SStephan Bergmann css::uno::Any SAL_CALL SlideshowImpl::getByIndex( ::sal_Int32 Index )
2990808a70e2SKurt Zenker {
2991808a70e2SKurt Zenker     return Any( getSlideByIndex( Index ) );
2992808a70e2SKurt Zenker }
2993808a70e2SKurt Zenker 
2994e57ca028SStephan Bergmann css::uno::Type SAL_CALL SlideshowImpl::getElementType(  )
2995808a70e2SKurt Zenker {
299683e191e2SStephan Bergmann     return cppu::UnoType<XDrawPage>::get();
2997808a70e2SKurt Zenker }
2998808a70e2SKurt Zenker 
2999e57ca028SStephan Bergmann sal_Bool SAL_CALL SlideshowImpl::hasElements(  )
3000808a70e2SKurt Zenker {
3001808a70e2SKurt Zenker     return getSlideCount() != 0;
3002808a70e2SKurt Zenker }
3003808a70e2SKurt Zenker 
3004e57ca028SStephan Bergmann Reference< XSlideShow > SAL_CALL SlideshowImpl::getSlideShow()
3005808a70e2SKurt Zenker {
3006808a70e2SKurt Zenker     return mxShow;
3007808a70e2SKurt Zenker }
3008808a70e2SKurt Zenker 
300958dd8501SChristian Lippka PresentationSettingsEx::PresentationSettingsEx( const PresentationSettingsEx& r )
3010808a70e2SKurt Zenker : PresentationSettings( r )
3011808a70e2SKurt Zenker , mbRehearseTimings(r.mbRehearseTimings)
3012808a70e2SKurt Zenker , mbPreview(r.mbPreview)
301392c697c0SStephan Bergmann , mpParentWindow( nullptr )
3014808a70e2SKurt Zenker {
3015808a70e2SKurt Zenker }
3016808a70e2SKurt Zenker 
3017dafae0feSNoel Grandin PresentationSettingsEx::PresentationSettingsEx( PresentationSettings const & r )
3018808a70e2SKurt Zenker : PresentationSettings( r )
3019b45a12c3SNoel Grandin , mbRehearseTimings(false)
3020b45a12c3SNoel Grandin , mbPreview(false)
302192c697c0SStephan Bergmann , mpParentWindow(nullptr)
3022808a70e2SKurt Zenker {
3023808a70e2SKurt Zenker }
3024808a70e2SKurt Zenker 
3025e57ca028SStephan Bergmann void PresentationSettingsEx::SetArguments( const Sequence< PropertyValue >& rArguments )
3026808a70e2SKurt Zenker {
3027d458adeeSArkadiy Illarionov     for( const PropertyValue& rValue : rArguments )
3028808a70e2SKurt Zenker     {
3029d458adeeSArkadiy Illarionov         SetPropertyValue( rValue.Name, rValue.Value );
3030808a70e2SKurt Zenker     }
3031808a70e2SKurt Zenker }
3032808a70e2SKurt Zenker 
30338332d6d8SNoel void PresentationSettingsEx::SetPropertyValue( std::u16string_view rProperty, const Any& rValue )
3034808a70e2SKurt Zenker {
30358332d6d8SNoel     if ( rProperty == u"RehearseTimings" )
3036808a70e2SKurt Zenker     {
3037808a70e2SKurt Zenker         if( rValue >>= mbRehearseTimings )
3038808a70e2SKurt Zenker             return;
3039808a70e2SKurt Zenker     }
30408332d6d8SNoel     else if ( rProperty == u"Preview" )
3041808a70e2SKurt Zenker     {
3042808a70e2SKurt Zenker         if( rValue >>= mbPreview )
3043808a70e2SKurt Zenker             return;
3044808a70e2SKurt Zenker     }
30458332d6d8SNoel     else if ( rProperty == u"AnimationNode" )
3046808a70e2SKurt Zenker     {
3047808a70e2SKurt Zenker         if( rValue >>= mxAnimationNode )
3048808a70e2SKurt Zenker             return;
3049808a70e2SKurt Zenker     }
30508332d6d8SNoel     else if ( rProperty == u"ParentWindow" )
3051808a70e2SKurt Zenker     {
3052808a70e2SKurt Zenker         Reference< XWindow > xWindow;
3053808a70e2SKurt Zenker         if( rValue >>= xWindow )
3054808a70e2SKurt Zenker         {
3055ad194534SMichael Meeks             mpParentWindow = xWindow.is() ? VCLUnoHelper::GetWindow( xWindow )
30561aa31294SNoel Grandin                                           : nullptr;
3057808a70e2SKurt Zenker             return;
3058808a70e2SKurt Zenker         }
3059808a70e2SKurt Zenker     }
30608332d6d8SNoel     else if ( rProperty == u"AllowAnimations" )
3061808a70e2SKurt Zenker     {
3062808a70e2SKurt Zenker         if( rValue >>= mbAnimationAllowed )
3063808a70e2SKurt Zenker             return;
3064808a70e2SKurt Zenker     }
30658332d6d8SNoel     else if ( rProperty == u"FirstPage" )
3066808a70e2SKurt Zenker     {
3067808a70e2SKurt Zenker         OUString aPresPage;
3068808a70e2SKurt Zenker         if( rValue >>= aPresPage )
3069808a70e2SKurt Zenker         {
3070808a70e2SKurt Zenker             maPresPage = getUiNameFromPageApiNameImpl(aPresPage);
3071b45a12c3SNoel Grandin             mbCustomShow = false;
3072b45a12c3SNoel Grandin             mbAll = false;
3073808a70e2SKurt Zenker             return;
3074808a70e2SKurt Zenker         }
3075808a70e2SKurt Zenker         else
3076808a70e2SKurt Zenker         {
3077808a70e2SKurt Zenker             if( rValue >>= mxStartPage )
3078808a70e2SKurt Zenker                 return;
3079808a70e2SKurt Zenker         }
3080808a70e2SKurt Zenker     }
30818332d6d8SNoel     else if ( rProperty == u"IsAlwaysOnTop" )
3082808a70e2SKurt Zenker     {
3083808a70e2SKurt Zenker         if( rValue >>= mbAlwaysOnTop )
3084808a70e2SKurt Zenker             return;
3085808a70e2SKurt Zenker     }
30868332d6d8SNoel     else if ( rProperty == u"IsAutomatic" )
3087808a70e2SKurt Zenker     {
3088808a70e2SKurt Zenker         if( rValue >>= mbManual )
3089808a70e2SKurt Zenker             return;
3090808a70e2SKurt Zenker     }
30918332d6d8SNoel     else if ( rProperty == u"IsEndless" )
3092808a70e2SKurt Zenker     {
3093808a70e2SKurt Zenker         if( rValue >>= mbEndless )
3094808a70e2SKurt Zenker             return;
3095808a70e2SKurt Zenker     }
30968332d6d8SNoel     else if ( rProperty == u"IsFullScreen" )
3097808a70e2SKurt Zenker     {
3098808a70e2SKurt Zenker         if( rValue >>= mbFullScreen )
3099808a70e2SKurt Zenker             return;
3100808a70e2SKurt Zenker     }
31018332d6d8SNoel     else if ( rProperty == u"IsMouseVisible" )
3102808a70e2SKurt Zenker     {
3103808a70e2SKurt Zenker         if( rValue >>= mbMouseVisible )
3104808a70e2SKurt Zenker             return;
3105808a70e2SKurt Zenker     }
31068332d6d8SNoel     else if ( rProperty == u"Pause" )
3107808a70e2SKurt Zenker     {
3108808a70e2SKurt Zenker         sal_Int32 nPause = -1;
3109808a70e2SKurt Zenker         if( (rValue >>= nPause) && (nPause >= 0) )
3110808a70e2SKurt Zenker         {
3111808a70e2SKurt Zenker             mnPauseTimeout = nPause;
3112808a70e2SKurt Zenker             return;
3113808a70e2SKurt Zenker         }
3114808a70e2SKurt Zenker     }
31158332d6d8SNoel     else if ( rProperty == u"UsePen" )
3116808a70e2SKurt Zenker     {
3117808a70e2SKurt Zenker         if( rValue >>= mbMouseAsPen )
3118808a70e2SKurt Zenker             return;
3119808a70e2SKurt Zenker     }
3120808a70e2SKurt Zenker     throw IllegalArgumentException();
3121808a70e2SKurt Zenker }
3122808a70e2SKurt Zenker 
3123808a70e2SKurt Zenker // XAnimationListener
31240ce0c369SAlexander Wilms 
3125808a70e2SKurt Zenker SlideShowListenerProxy::SlideShowListenerProxy( const rtl::Reference< SlideshowImpl >& xController, const css::uno::Reference< css::presentation::XSlideShow >& xSlideShow )
3126808a70e2SKurt Zenker : maListeners( m_aMutex )
3127808a70e2SKurt Zenker , mxController( xController )
3128808a70e2SKurt Zenker , mxSlideShow( xSlideShow )
3129808a70e2SKurt Zenker {
3130808a70e2SKurt Zenker }
3131808a70e2SKurt Zenker 
3132808a70e2SKurt Zenker SlideShowListenerProxy::~SlideShowListenerProxy()
3133808a70e2SKurt Zenker {
3134808a70e2SKurt Zenker }
3135808a70e2SKurt Zenker 
3136808a70e2SKurt Zenker void SlideShowListenerProxy::addAsSlideShowListener()
3137808a70e2SKurt Zenker {
3138808a70e2SKurt Zenker     if( mxSlideShow.is() )
3139808a70e2SKurt Zenker     {
3140808a70e2SKurt Zenker         Reference< XSlideShowListener > xSlideShowListener( this );
3141808a70e2SKurt Zenker         mxSlideShow->addSlideShowListener( xSlideShowListener );
3142808a70e2SKurt Zenker     }
3143808a70e2SKurt Zenker }
3144808a70e2SKurt Zenker 
3145808a70e2SKurt Zenker void SlideShowListenerProxy::removeAsSlideShowListener()
3146808a70e2SKurt Zenker {
3147808a70e2SKurt Zenker     if( mxSlideShow.is() )
3148808a70e2SKurt Zenker     {
3149808a70e2SKurt Zenker         Reference< XSlideShowListener > xSlideShowListener( this );
3150808a70e2SKurt Zenker         mxSlideShow->removeSlideShowListener( xSlideShowListener );
3151808a70e2SKurt Zenker     }
3152808a70e2SKurt Zenker }
3153808a70e2SKurt Zenker 
3154808a70e2SKurt Zenker void SlideShowListenerProxy::addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape )
3155808a70e2SKurt Zenker {
3156808a70e2SKurt Zenker     if( mxSlideShow.is() )
3157808a70e2SKurt Zenker     {
3158808a70e2SKurt Zenker         Reference< XShapeEventListener > xListener( this );
3159808a70e2SKurt Zenker         mxSlideShow->addShapeEventListener( xListener, xShape );
3160808a70e2SKurt Zenker     }
3161808a70e2SKurt Zenker }
3162808a70e2SKurt Zenker 
3163808a70e2SKurt Zenker void SlideShowListenerProxy::removeShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape )
3164808a70e2SKurt Zenker {
3165808a70e2SKurt Zenker     if( mxSlideShow.is() )
3166808a70e2SKurt Zenker     {
3167808a70e2SKurt Zenker         Reference< XShapeEventListener > xListener( this );
3168808a70e2SKurt Zenker         mxSlideShow->removeShapeEventListener( xListener, xShape );
3169808a70e2SKurt Zenker     }
3170808a70e2SKurt Zenker }
3171808a70e2SKurt Zenker 
3172808a70e2SKurt Zenker void SlideShowListenerProxy::addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener )
3173808a70e2SKurt Zenker {
3174808a70e2SKurt Zenker     maListeners.addInterface(xListener);
3175808a70e2SKurt Zenker }
3176808a70e2SKurt Zenker 
3177808a70e2SKurt Zenker void SlideShowListenerProxy::removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener )
3178808a70e2SKurt Zenker {
3179808a70e2SKurt Zenker     maListeners.removeInterface(xListener);
3180808a70e2SKurt Zenker }
3181808a70e2SKurt Zenker 
3182e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::beginEvent( const Reference< XAnimationNode >& xNode )
3183808a70e2SKurt Zenker {
3184808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3185808a70e2SKurt Zenker 
3186808a70e2SKurt Zenker     if( maListeners.getLength() >= 0 )
3187521c5602SMichael Stahl     {
3188521c5602SMichael Stahl         maListeners.forEach<XSlideShowListener>(
3189521c5602SMichael Stahl             [&] (Reference<XAnimationListener> const& xListener) {
3190521c5602SMichael Stahl                 return xListener->beginEvent(xNode);
3191521c5602SMichael Stahl             } );
3192521c5602SMichael Stahl     }
3193808a70e2SKurt Zenker }
3194808a70e2SKurt Zenker 
3195e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::endEvent( const Reference< XAnimationNode >& xNode )
3196808a70e2SKurt Zenker {
3197808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3198808a70e2SKurt Zenker 
3199808a70e2SKurt Zenker     if( maListeners.getLength() >= 0 )
3200521c5602SMichael Stahl     {
3201521c5602SMichael Stahl         maListeners.forEach<XSlideShowListener>(
3202521c5602SMichael Stahl             [&] (Reference<XAnimationListener> const& xListener) {
3203521c5602SMichael Stahl                 return xListener->endEvent(xNode);
3204521c5602SMichael Stahl             } );
3205521c5602SMichael Stahl     }
3206808a70e2SKurt Zenker }
3207808a70e2SKurt Zenker 
3208e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::repeat( const Reference< XAnimationNode >& xNode, ::sal_Int32 nRepeat )
3209808a70e2SKurt Zenker {
3210808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3211808a70e2SKurt Zenker 
3212808a70e2SKurt Zenker     if( maListeners.getLength() >= 0 )
3213521c5602SMichael Stahl     {
3214521c5602SMichael Stahl         maListeners.forEach<XSlideShowListener>(
3215521c5602SMichael Stahl             [&] (Reference<XAnimationListener> const& xListener) {
3216521c5602SMichael Stahl                 return xListener->repeat(xNode, nRepeat);
3217521c5602SMichael Stahl             } );
3218521c5602SMichael Stahl     }
3219808a70e2SKurt Zenker }
3220808a70e2SKurt Zenker 
3221a2795356SNoel Grandin // css::presentation::XSlideShowListener:
32220ce0c369SAlexander Wilms 
3223e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::paused(  )
3224808a70e2SKurt Zenker {
3225808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3226808a70e2SKurt Zenker 
3227148da261SMichael Stahl     maListeners.forEach<XSlideShowListener>(
3228148da261SMichael Stahl         [](uno::Reference<presentation::XSlideShowListener> const& xListener)
3229148da261SMichael Stahl         {
3230148da261SMichael Stahl             xListener->paused();
3231148da261SMichael Stahl         });
3232808a70e2SKurt Zenker }
3233808a70e2SKurt Zenker 
3234e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::resumed(  )
3235808a70e2SKurt Zenker {
3236808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3237808a70e2SKurt Zenker 
3238148da261SMichael Stahl     maListeners.forEach<XSlideShowListener>(
3239148da261SMichael Stahl         [](uno::Reference<presentation::XSlideShowListener> const& xListener)
3240148da261SMichael Stahl         {
3241148da261SMichael Stahl             xListener->resumed();
3242148da261SMichael Stahl         });
3243808a70e2SKurt Zenker }
3244808a70e2SKurt Zenker 
3245e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::slideTransitionStarted( )
3246808a70e2SKurt Zenker {
3247808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3248808a70e2SKurt Zenker 
3249148da261SMichael Stahl     maListeners.forEach<XSlideShowListener>(
3250148da261SMichael Stahl         [](uno::Reference<presentation::XSlideShowListener> const& xListener)
3251148da261SMichael Stahl         {
3252148da261SMichael Stahl             xListener->slideTransitionStarted();
3253148da261SMichael Stahl         });
3254808a70e2SKurt Zenker }
3255808a70e2SKurt Zenker 
3256e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::slideTransitionEnded( )
3257808a70e2SKurt Zenker {
3258808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3259808a70e2SKurt Zenker 
3260148da261SMichael Stahl     maListeners.forEach<XSlideShowListener>(
3261148da261SMichael Stahl         [](uno::Reference<presentation::XSlideShowListener> const& xListener)
3262148da261SMichael Stahl         {
3263148da261SMichael Stahl             xListener->slideTransitionEnded ();
3264148da261SMichael Stahl         });
3265808a70e2SKurt Zenker }
3266808a70e2SKurt Zenker 
3267e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::slideAnimationsEnded(  )
3268808a70e2SKurt Zenker {
3269808a70e2SKurt Zenker     ::osl::MutexGuard aGuard( m_aMutex );
3270808a70e2SKurt Zenker 
3271148da261SMichael Stahl     maListeners.forEach<XSlideShowListener>(
3272148da261SMichael Stahl         [](uno::Reference<presentation::XSlideShowListener> const& xListener)
3273148da261SMichael Stahl         {
3274148da261SMichael Stahl             xListener->slideAnimationsEnded ();
3275148da261SMichael Stahl         });
3276808a70e2SKurt Zenker }
3277808a70e2SKurt Zenker 
3278e57ca028SStephan Bergmann void SlideShowListenerProxy::slideEnded(sal_Bool bReverse)
3279808a70e2SKurt Zenker {
3280808a70e2SKurt Zenker     {
3281808a70e2SKurt Zenker         ::osl::MutexGuard aGuard( m_aMutex );
3282808a70e2SKurt Zenker 
3283808a70e2SKurt Zenker         if( maListeners.getLength() >= 0 )
3284521c5602SMichael Stahl         {
328576c3d136SAndre Fischer             maListeners.forEach<XSlideShowListener>(
3286521c5602SMichael Stahl                 [&] (Reference<XSlideShowListener> const& xListener) {
3287521c5602SMichael Stahl                     return xListener->slideEnded(bReverse);
3288521c5602SMichael Stahl                 } );
3289521c5602SMichael Stahl         }
3290808a70e2SKurt Zenker     }
3291808a70e2SKurt Zenker 
3292808a70e2SKurt Zenker     {
3293f883da35SNorbert Thiebaud         SolarMutexGuard aSolarGuard;
3294808a70e2SKurt Zenker         if( mxController.is() )
329576c3d136SAndre Fischer             mxController->slideEnded(bReverse);
3296808a70e2SKurt Zenker     }
3297808a70e2SKurt Zenker }
3298808a70e2SKurt Zenker 
3299e57ca028SStephan Bergmann void SlideShowListenerProxy::hyperLinkClicked( OUString const& aHyperLink )
3300808a70e2SKurt Zenker {
3301808a70e2SKurt Zenker     {
3302808a70e2SKurt Zenker         ::osl::MutexGuard aGuard( m_aMutex );
3303808a70e2SKurt Zenker 
3304808a70e2SKurt Zenker         if( maListeners.getLength() >= 0 )
3305521c5602SMichael Stahl         {
3306521c5602SMichael Stahl             maListeners.forEach<XSlideShowListener>(
3307521c5602SMichael Stahl                 [&] (Reference<XSlideShowListener> const& xListener) {
3308521c5602SMichael Stahl                     return xListener->hyperLinkClicked(aHyperLink);
3309521c5602SMichael Stahl                 } );
3310521c5602SMichael Stahl         }
3311808a70e2SKurt Zenker     }
3312808a70e2SKurt Zenker 
3313808a70e2SKurt Zenker     {
3314f883da35SNorbert Thiebaud         SolarMutexGuard aSolarGuard;
3315808a70e2SKurt Zenker         if( mxController.is() )
3316808a70e2SKurt Zenker             mxController->hyperLinkClicked(aHyperLink);
3317808a70e2SKurt Zenker     }
3318808a70e2SKurt Zenker }
3319808a70e2SKurt Zenker 
3320808a70e2SKurt Zenker // XEventListener
33210ce0c369SAlexander Wilms 
3322e57ca028SStephan Bergmann void SAL_CALL SlideShowListenerProxy::disposing( const css::lang::EventObject& aDisposeEvent )
3323808a70e2SKurt Zenker {
3324808a70e2SKurt Zenker     maListeners.disposeAndClear( aDisposeEvent );
3325808a70e2SKurt Zenker     mxController.clear();
3326808a70e2SKurt Zenker     mxSlideShow.clear();
3327808a70e2SKurt Zenker }
3328808a70e2SKurt Zenker 
3329808a70e2SKurt Zenker // XShapeEventListener
33300ce0c369SAlexander Wilms 
333187661a7aSNoel Grandin void SAL_CALL SlideShowListenerProxy::click( const Reference< XShape >& xShape, const css::awt::MouseEvent& /*aOriginalEvent*/ )
3332808a70e2SKurt Zenker {
3333f883da35SNorbert Thiebaud     SolarMutexGuard aSolarGuard;
3334808a70e2SKurt Zenker     if( mxController.is() )
333587661a7aSNoel Grandin         mxController->click(xShape );
33362db95b18SKurt Zenker }
33372db95b18SKurt Zenker 
33380fefcd83SRüdiger Timm } // namespace ::sd
333980b08615SSebastian Spaeth 
334080b08615SSebastian Spaeth /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
3341