LCOV - code coverage report
Current view: top level - sd/source/ui/slideshow - slideshowimpl.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 1597 0.1 %
Date: 2015-06-13 12:38:46 Functions: 2 155 1.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <config_features.h>
      21             : 
      22             : #include <com/sun/star/frame/theAutoRecovery.hpp>
      23             : #include <com/sun/star/frame/XComponentLoader.hpp>
      24             : #include <com/sun/star/lang/XInitialization.hpp>
      25             : #include <com/sun/star/document/XEventsSupplier.hpp>
      26             : #include <com/sun/star/drawing/XMasterPageTarget.hpp>
      27             : #include <com/sun/star/container/XNameReplace.hpp>
      28             : #include <com/sun/star/beans/PropertyValue.hpp>
      29             : #include <com/sun/star/beans/XPropertySetInfo.hpp>
      30             : #include <com/sun/star/beans/XPropertySet.hpp>
      31             : #include <com/sun/star/awt/SystemPointer.hpp>
      32             : #include <com/sun/star/util/URLTransformer.hpp>
      33             : #include <com/sun/star/util/XURLTransformer.hpp>
      34             : #include <com/sun/star/frame/XDispatch.hpp>
      35             : #include <com/sun/star/frame/XLayoutManager.hpp>
      36             : #include <com/sun/star/presentation/SlideShow.hpp>
      37             : #include <svl/aeitem.hxx>
      38             : #include <svl/urihelper.hxx>
      39             : 
      40             : #include <toolkit/helper/vclunohelper.hxx>
      41             : 
      42             : #include <sfx2/infobar.hxx>
      43             : #include <sfx2/imagemgr.hxx>
      44             : #include <sfx2/request.hxx>
      45             : #include <sfx2/docfile.hxx>
      46             : #include <sfx2/app.hxx>
      47             : #include <svx/unoapi.hxx>
      48             : #include <svx/svdoole2.hxx>
      49             : #include <sfx2/templdlg.hxx>
      50             : #include <svx/f3dchild.hxx>
      51             : #include <svx/imapdlg.hxx>
      52             : #include <svx/fontwork.hxx>
      53             : #include <svx/SvxColorChildWindow.hxx>
      54             : #include <svx/bmpmask.hxx>
      55             : #include <svx/srchdlg.hxx>
      56             : #include <svx/hyperdlg.hxx>
      57             : #include "NavigatorChildWindow.hxx"
      58             : #include "AnimationChildWindow.hxx"
      59             : #include "notifydocumentevent.hxx"
      60             : #include <slideshowimpl.hxx>
      61             : #include <slideshowviewimpl.hxx>
      62             : #include <pgjump.hxx>
      63             : #include "PaneHider.hxx"
      64             : 
      65             : #include "glob.hrc"
      66             : #include "res_bmp.hrc"
      67             : #include "sdresid.hxx"
      68             : #include "vcl/canvastools.hxx"
      69             : #include <vcl/settings.hxx>
      70             : 
      71             : #include "comphelper/anytostring.hxx"
      72             : #include "cppuhelper/exc_hlp.hxx"
      73             : #include "rtl/ref.hxx"
      74             : #include "slideshow.hrc"
      75             : #include "canvas/elapsedtime.hxx"
      76             : #include "avmedia/mediawindow.hxx"
      77             : #include "svtools/colrdlg.hxx"
      78             : #include "RemoteServer.hxx"
      79             : #include "customshowlist.hxx"
      80             : #include "unopage.hxx"
      81             : 
      82             : #include <boost/bind.hpp>
      83             : 
      84             : using ::cppu::OInterfaceContainerHelper;
      85             : using ::com::sun::star::animations::XAnimationNode;
      86             : using ::com::sun::star::animations::XAnimationListener;
      87             : using ::com::sun::star::awt::XWindow;
      88             : using namespace ::com::sun::star;
      89             : using namespace ::com::sun::star::lang;
      90             : using namespace ::com::sun::star::uno;
      91             : using namespace ::com::sun::star::drawing;
      92             : using namespace ::com::sun::star::container;
      93             : using namespace ::com::sun::star::document;
      94             : using namespace ::com::sun::star::presentation;
      95             : using namespace ::com::sun::star::beans;
      96             : 
      97             : namespace sd
      98             : {
      99             : /** Slots, which will be disabled in the slide show and are managed by Sfx.
     100             :     Have to be sorted in the order of the SIDs */
     101             : static sal_uInt16 const pAllowed[] =
     102             : {
     103             :     SID_OPENDOC                             , //     5501   ///< that internally jumps work
     104             :     SID_JUMPTOMARK                          , //     5598
     105             :     SID_OPENHYPERLINK                       , //     6676
     106             :     SID_NAVIGATOR                           , //    10366
     107             :     SID_PRESENTATION_END                    , //    27218
     108             :     SID_NAVIGATOR_PAGENAME                  , //    27287
     109             :     SID_NAVIGATOR_STATE                     , //    27288
     110             :     SID_NAVIGATOR_INIT                      , //    27289
     111             :     SID_NAVIGATOR_PEN                       , //    27291
     112             :     SID_NAVIGATOR_PAGE                      , //    27292
     113             :     SID_NAVIGATOR_OBJECT                      //    27293
     114             : };
     115             : 
     116           0 : class AnimationSlideController
     117             : {
     118             : public:
     119             :     enum Mode { ALL, FROM, CUSTOM, PREVIEW };
     120             : 
     121             : public:
     122             :     AnimationSlideController( Reference< XIndexAccess > xSlides, Mode eMode );
     123             : 
     124           0 :     void setStartSlideNumber( sal_Int32 nSlideNumber ) { mnStartSlideNumber = nSlideNumber; }
     125             :     sal_Int32 getStartSlideIndex() const;
     126             : 
     127             :     sal_Int32 getCurrentSlideNumber() const;
     128             :     sal_Int32 getCurrentSlideIndex() const;
     129             : 
     130           0 :     sal_Int32 getSlideIndexCount() const { return maSlideNumbers.size(); }
     131           0 :     sal_Int32 getSlideNumberCount() const { return mnSlideCount; }
     132             : 
     133             :     sal_Int32 getSlideNumber( sal_Int32 nSlideIndex ) const;
     134             : 
     135             :     void insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible = true );
     136             :     void setPreviewNode( const Reference< XAnimationNode >& xPreviewNode );
     137             : 
     138             :     bool jumpToSlideIndex( sal_Int32 nNewSlideIndex );
     139             :     bool jumpToSlideNumber( sal_Int32 nNewSlideIndex );
     140             : 
     141             :     bool nextSlide();
     142             :     bool previousSlide();
     143             : 
     144             :     void displayCurrentSlide( const Reference< XSlideShow >& xShow,
     145             :                               const Reference< XDrawPagesSupplier>& xDrawPages,
     146             :                               const bool bSkipAllMainSequenceEffects );
     147             : 
     148             :     sal_Int32 getNextSlideIndex() const;
     149             :     sal_Int32 getPreviousSlideIndex() const;
     150             : 
     151             :     bool isVisibleSlideNumber( sal_Int32 nSlideNumber ) const;
     152             : 
     153             :     Reference< XDrawPage > getSlideByNumber( sal_Int32 nSlideNumber ) const;
     154             : 
     155             :     sal_Int32 getNextSlideNumber() const;
     156             : 
     157           0 :     bool hasSlides() const { return !maSlideNumbers.empty(); }
     158             : 
     159             : private:
     160             :     bool getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode );
     161             :     sal_Int32 findSlideIndex( sal_Int32 nSlideNumber ) const;
     162             : 
     163           0 :     bool isValidIndex( sal_Int32 nIndex ) const { return (nIndex >= 0) && (nIndex < (sal_Int32)maSlideNumbers.size()); }
     164           0 :     bool isValidSlideNumber( sal_Int32 nSlideNumber ) const { return (nSlideNumber >= 0) && (nSlideNumber < mnSlideCount); }
     165             : 
     166             : private:
     167             :     Mode meMode;
     168             :     sal_Int32 mnStartSlideNumber;
     169             :     std::vector< sal_Int32 > maSlideNumbers;
     170             :     std::vector< bool > maSlideVisible;
     171             :     std::vector< bool > maSlideVisited;
     172             :     Reference< XAnimationNode > mxPreviewNode;
     173             :     sal_Int32 mnSlideCount;
     174             :     sal_Int32 mnCurrentSlideIndex;
     175             :     sal_Int32 mnHiddenSlideNumber;
     176             :     Reference< XIndexAccess > mxSlides;
     177             : };
     178             : 
     179           0 : Reference< XDrawPage > AnimationSlideController::getSlideByNumber( sal_Int32 nSlideNumber ) const
     180             : {
     181           0 :     Reference< XDrawPage > xSlide;
     182           0 :     if( mxSlides.is() && (nSlideNumber >= 0) && (nSlideNumber < mxSlides->getCount()) )
     183           0 :         mxSlides->getByIndex( nSlideNumber ) >>= xSlide;
     184           0 :     return xSlide;
     185             : }
     186             : 
     187           0 : bool AnimationSlideController::isVisibleSlideNumber( sal_Int32 nSlideNumber ) const
     188             : {
     189           0 :     sal_Int32 nIndex = findSlideIndex( nSlideNumber );
     190             : 
     191           0 :     if( nIndex != -1 )
     192           0 :         return maSlideVisible[ nIndex ];
     193             :     else
     194           0 :         return false;
     195             : }
     196             : 
     197           0 : void AnimationSlideController::setPreviewNode( const Reference< XAnimationNode >& xPreviewNode )
     198             : {
     199           0 :     mxPreviewNode = xPreviewNode;
     200           0 : }
     201             : 
     202           0 : AnimationSlideController::AnimationSlideController( Reference< XIndexAccess > xSlides, Mode eMode  )
     203             : :   meMode( eMode )
     204             : ,   mnStartSlideNumber(-1)
     205             : ,   mnSlideCount( 0 )
     206             : ,   mnCurrentSlideIndex(0)
     207             : ,   mnHiddenSlideNumber( -1 )
     208           0 : ,   mxSlides( xSlides )
     209             : {
     210           0 :     if( mxSlides.is() )
     211           0 :         mnSlideCount = xSlides->getCount();
     212           0 : }
     213             : 
     214           0 : sal_Int32 AnimationSlideController::getStartSlideIndex() const
     215             : {
     216           0 :     if( mnStartSlideNumber >= 0 )
     217             :     {
     218             :         sal_Int32 nIndex;
     219           0 :         const sal_Int32 nCount = maSlideNumbers.size();
     220             : 
     221           0 :         for( nIndex = 0; nIndex < nCount; nIndex++ )
     222             :         {
     223           0 :             if( maSlideNumbers[nIndex] == mnStartSlideNumber )
     224           0 :                 return nIndex;
     225             :         }
     226             :     }
     227             : 
     228           0 :     return 0;
     229             : }
     230             : 
     231           0 : sal_Int32 AnimationSlideController::getCurrentSlideNumber() const
     232             : {
     233           0 :     if( mnHiddenSlideNumber != -1 )
     234           0 :         return mnHiddenSlideNumber;
     235           0 :     else if( !maSlideNumbers.empty() )
     236           0 :         return maSlideNumbers[mnCurrentSlideIndex];
     237             :     else
     238           0 :         return 0;
     239             : }
     240             : 
     241           0 : sal_Int32 AnimationSlideController::getCurrentSlideIndex() const
     242             : {
     243           0 :     if( mnHiddenSlideNumber != -1 )
     244           0 :         return -1;
     245             :     else
     246           0 :         return mnCurrentSlideIndex;
     247             : }
     248             : 
     249           0 : bool AnimationSlideController::jumpToSlideIndex( sal_Int32 nNewSlideIndex )
     250             : {
     251           0 :     if( isValidIndex( nNewSlideIndex ) )
     252             :     {
     253           0 :         mnCurrentSlideIndex = nNewSlideIndex;
     254           0 :         mnHiddenSlideNumber = -1;
     255           0 :         maSlideVisited[mnCurrentSlideIndex] = true;
     256           0 :         return true;
     257             :     }
     258             :     else
     259             :     {
     260           0 :         return false;
     261             :     }
     262             : }
     263             : 
     264           0 : bool AnimationSlideController::jumpToSlideNumber( sal_Int32 nNewSlideNumber )
     265             : {
     266           0 :     sal_Int32 nIndex = findSlideIndex( nNewSlideNumber );
     267           0 :     if( isValidIndex( nIndex ) )
     268             :     {
     269           0 :         return jumpToSlideIndex( nIndex );
     270             :     }
     271           0 :     else if( (nNewSlideNumber >= 0) && (nNewSlideNumber < mnSlideCount) )
     272             :     {
     273             :         // jump to a hidden slide
     274           0 :         mnHiddenSlideNumber = nNewSlideNumber;
     275           0 :         return true;
     276             :     }
     277             :     else
     278             :     {
     279           0 :         return false;
     280             :     }
     281             : }
     282             : 
     283           0 : sal_Int32 AnimationSlideController::getSlideNumber( sal_Int32 nSlideIndex ) const
     284             : {
     285           0 :     if( isValidIndex( nSlideIndex ) )
     286           0 :         return maSlideNumbers[nSlideIndex];
     287             :     else
     288           0 :         return -1;
     289             : }
     290             : 
     291           0 : void AnimationSlideController::insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible /* = true */ )
     292             : {
     293             :     DBG_ASSERT( isValidSlideNumber( nSlideNumber ), "sd::AnimationSlideController::insertSlideNumber(), illegal index" );
     294           0 :     if( isValidSlideNumber( nSlideNumber ) )
     295             :     {
     296           0 :         maSlideNumbers.push_back( nSlideNumber );
     297           0 :         maSlideVisible.push_back( bVisible );
     298           0 :         maSlideVisited.push_back( false );
     299             :     }
     300           0 : }
     301             : 
     302           0 : bool AnimationSlideController::getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode )
     303             : {
     304           0 :     if( isValidSlideNumber( nSlideNumber ) ) try
     305             :     {
     306           0 :         xSlide = Reference< XDrawPage >( mxSlides->getByIndex(nSlideNumber), UNO_QUERY_THROW );
     307             : 
     308           0 :         if( meMode == PREVIEW )
     309             :         {
     310           0 :             xAnimNode = mxPreviewNode;
     311             :         }
     312             :         else
     313             :         {
     314           0 :                Reference< animations::XAnimationNodeSupplier > xAnimNodeSupplier( xSlide, UNO_QUERY_THROW );
     315           0 :             xAnimNode = xAnimNodeSupplier->getAnimationNode();
     316             :         }
     317             : 
     318           0 :         return true;
     319             :     }
     320           0 :     catch( Exception& )
     321             :     {
     322             :         OSL_FAIL(
     323             :             OString(OString("sd::AnimationSlideController::getSlideAPI(), "
     324             :                     "exception caught: ") +
     325             :             OUStringToOString(
     326             :                 comphelper::anyToString( cppu::getCaughtException() ),
     327             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
     328             : 
     329             :     }
     330             : 
     331           0 :     return false;
     332             : }
     333             : 
     334           0 : sal_Int32 AnimationSlideController::findSlideIndex( sal_Int32 nSlideNumber ) const
     335             : {
     336             :     sal_Int32 nIndex;
     337           0 :     const sal_Int32 nCount = maSlideNumbers.size();
     338             : 
     339           0 :     for( nIndex = 0; nIndex < nCount; nIndex++ )
     340             :     {
     341           0 :         if( maSlideNumbers[nIndex] == nSlideNumber )
     342           0 :             return nIndex;
     343             :     }
     344             : 
     345           0 :     return -1;
     346             : }
     347             : 
     348           0 : sal_Int32 AnimationSlideController::getNextSlideIndex() const
     349             : {
     350           0 :     switch( meMode )
     351             :     {
     352             :     case ALL:
     353             :         {
     354           0 :             sal_Int32 nNewSlideIndex = mnCurrentSlideIndex + 1;
     355           0 :             if( isValidIndex( nNewSlideIndex ) )
     356             :             {
     357             :                 // if the current slide is not excluded, make sure the
     358             :                 // next slide is also not excluded.
     359             :                 // if the current slide is excluded, we want to go
     360             :                 // to the next slide, even if this is also excluded.
     361           0 :                 if( maSlideVisible[mnCurrentSlideIndex] )
     362             :                 {
     363           0 :                     while( isValidIndex( nNewSlideIndex ) )
     364             :                     {
     365           0 :                         if( maSlideVisible[nNewSlideIndex] )
     366           0 :                             break;
     367             : 
     368           0 :                         nNewSlideIndex++;
     369             :                     }
     370             :                 }
     371             :             }
     372           0 :             return isValidIndex( nNewSlideIndex ) ? nNewSlideIndex : -1;
     373             :         }
     374             : 
     375             :     case FROM:
     376             :     case CUSTOM:
     377           0 :         return mnHiddenSlideNumber == -1 ? mnCurrentSlideIndex + 1 : mnCurrentSlideIndex;
     378             : 
     379             :     default:
     380             :     case PREVIEW:
     381           0 :         return -1;
     382             : 
     383             :     }
     384             : }
     385             : 
     386           0 : sal_Int32 AnimationSlideController::getNextSlideNumber() const
     387             : {
     388           0 :     sal_Int32 nNextSlideIndex = getNextSlideIndex();
     389           0 :     if( isValidIndex( nNextSlideIndex ) )
     390             :     {
     391           0 :         return maSlideNumbers[nNextSlideIndex];
     392             :     }
     393             :     else
     394             :     {
     395           0 :         return -1;
     396             :     }
     397             : }
     398             : 
     399           0 : bool AnimationSlideController::nextSlide()
     400             : {
     401           0 :     return jumpToSlideIndex( getNextSlideIndex() );
     402             : }
     403             : 
     404           0 : sal_Int32 AnimationSlideController::getPreviousSlideIndex() const
     405             : {
     406           0 :     sal_Int32 nNewSlideIndex = mnCurrentSlideIndex - 1;
     407             : 
     408           0 :     switch( meMode )
     409             :     {
     410             :         case ALL:
     411             :         {
     412             :             // make sure the previous slide is visible
     413             :             // or was already visited
     414           0 :             while( isValidIndex( nNewSlideIndex ) )
     415             :             {
     416           0 :                 if( maSlideVisible[nNewSlideIndex] || maSlideVisited[nNewSlideIndex] )
     417           0 :                     break;
     418             : 
     419           0 :                 nNewSlideIndex--;
     420             :             }
     421             : 
     422           0 :             break;
     423             :         }
     424             : 
     425             :         case PREVIEW:
     426           0 :             return -1;
     427             : 
     428             :         default:
     429           0 :             break;
     430             :     }
     431             : 
     432           0 :     return nNewSlideIndex;
     433             : }
     434             : 
     435           0 : bool AnimationSlideController::previousSlide()
     436             : {
     437           0 :     return jumpToSlideIndex( getPreviousSlideIndex() );
     438             : }
     439             : 
     440           0 : void AnimationSlideController::displayCurrentSlide( const Reference< XSlideShow >& xShow,
     441             :                                                     const Reference< XDrawPagesSupplier>& xDrawPages,
     442             :                                                     const bool bSkipAllMainSequenceEffects )
     443             : {
     444           0 :     const sal_Int32 nCurrentSlideNumber = getCurrentSlideNumber();
     445             : 
     446           0 :     if( xShow.is() && (nCurrentSlideNumber != -1 ) )
     447             :     {
     448           0 :         Reference< XDrawPage > xSlide;
     449           0 :         Reference< XAnimationNode > xAnimNode;
     450           0 :         ::std::vector<PropertyValue> aProperties;
     451             : 
     452           0 :         const sal_Int32 nNextSlideNumber = getNextSlideNumber();
     453           0 :         if( getSlideAPI( nNextSlideNumber, xSlide, xAnimNode )  )
     454             :         {
     455           0 :             Sequence< Any > aValue(2);
     456           0 :             aValue[0] <<= xSlide;
     457           0 :             aValue[1] <<= xAnimNode;
     458             :             aProperties.push_back(
     459             :                 PropertyValue( "Prefetch" ,
     460             :                     -1,
     461             :                     Any(aValue),
     462           0 :                     PropertyState_DIRECT_VALUE));
     463             :         }
     464           0 :         if (bSkipAllMainSequenceEffects)
     465             :         {
     466             :             // Add one property that prevents the slide transition from being
     467             :             // shown (to speed up the transition to the previous slide) and
     468             :             // one to show all main sequence effects so that the user can
     469             :             // continue to undo effects.
     470             :             aProperties.push_back(
     471             :                 PropertyValue( "SkipAllMainSequenceEffects",
     472             :                     -1,
     473             :                     Any(sal_True),
     474           0 :                     PropertyState_DIRECT_VALUE));
     475             :             aProperties.push_back(
     476             :                 PropertyValue("SkipSlideTransition",
     477             :                     -1,
     478             :                     Any(sal_True),
     479           0 :                     PropertyState_DIRECT_VALUE));
     480             :         }
     481             : 
     482             :         // Convert vector into uno Sequence.
     483           0 :         Sequence< PropertyValue > aPropertySequence (aProperties.size());
     484           0 :         for (int nIndex=0,nCount=aProperties.size();nIndex<nCount; ++nIndex)
     485           0 :             aPropertySequence[nIndex] = aProperties[nIndex];
     486             : 
     487           0 :         if( getSlideAPI( nCurrentSlideNumber, xSlide, xAnimNode ) )
     488           0 :             xShow->displaySlide( xSlide, xDrawPages, xAnimNode, aPropertySequence );
     489             :     }
     490           0 : }
     491             : 
     492           0 : SlideshowImpl::SlideshowImpl( const Reference< XPresentation2 >& xPresentation, ViewShell* pViewSh, ::sd::View* pView, SdDrawDocument* pDoc, vcl::Window* pParentWindow )
     493             : : SlideshowImplBase( m_aMutex )
     494             : , mxModel(pDoc->getUnoModel(),UNO_QUERY_THROW)
     495             : , mpView(pView)
     496             : , mpViewShell(pViewSh)
     497           0 : , mpDocSh(pDoc->GetDocSh())
     498             : , mpDoc(pDoc)
     499             : , mpNewAttr(0)
     500             : , mpParentWindow(pParentWindow)
     501             : , mpShowWindow(0)
     502             : , mpTimeButton(0)
     503             : , mnRestoreSlide(0)
     504             : , maPresSize( -1, -1 )
     505             : , meAnimationMode(ANIMATIONMODE_SHOW)
     506             : , mpOldActiveWindow(0)
     507             : , mnChildMask( 0 )
     508             : , mbGridVisible(false)
     509             : , mbBordVisible(false)
     510             : , mbSlideBorderVisible(false)
     511             : , mbSetOnlineSpelling(false)
     512             : , mbDisposed(false)
     513             : , mbAutoSaveWasOn(false)
     514             : , mbRehearseTimings(false)
     515             : , mbDesignMode(false)
     516             : , mbIsPaused(false)
     517             : , mbWasPaused(false)
     518             : , mbInputFreeze(false)
     519             : , mbActive(false)
     520           0 : , maPresSettings( pDoc->getPresentationSettings() )
     521             : , mnUserPaintColor( 0x80ff0000L )
     522             : , mbUsePen(false)
     523             : , mdUserPaintStrokeWidth ( 150.0 )
     524             : #ifdef ENABLE_ERASER_UI
     525             : , mbSwitchEraserMode(false)
     526             : , mnEraseInkSize(100)
     527             : #endif
     528             : , mnEntryCounter(0)
     529             : , mnLastSlideNumber(-1)
     530             : , msOnClick( "OnClick" )
     531             : , msBookmark( "Bookmark" )
     532             : , msVerb( "Verb" )
     533             : , mnEndShowEvent(0)
     534             : , mnContextMenuEvent(0)
     535           0 : , mxPresentation( xPresentation )
     536             : {
     537           0 :     if( mpViewShell )
     538           0 :         mpOldActiveWindow = mpViewShell->GetActiveWindow();
     539             : 
     540           0 :     maUpdateTimer.SetTimeoutHdl(LINK(this, SlideshowImpl, updateHdl));
     541             : 
     542           0 :     maDeactivateTimer.SetTimeoutHdl(LINK(this, SlideshowImpl, deactivateHdl));
     543           0 :     maDeactivateTimer.SetTimeout( 20 );
     544             : 
     545           0 :     maInputFreezeTimer.SetTimeoutHdl( LINK( this, SlideshowImpl, ReadyForNextInputHdl ) );
     546           0 :     maInputFreezeTimer.SetTimeout( 20 );
     547             : 
     548           0 :     SvtSaveOptions aOptions;
     549             : 
     550             :         // no autosave during show
     551           0 :     if( aOptions.IsAutoSave() )
     552           0 :         mbAutoSaveWasOn = true;
     553             : 
     554           0 :     Application::AddEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) );
     555             : 
     556           0 :     mbUsePen = maPresSettings.mbMouseAsPen;
     557             : 
     558           0 :     SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
     559           0 :     if( pOptions )
     560             :     {
     561           0 :         mnUserPaintColor = pOptions->GetPresentationPenColor();
     562           0 :         mdUserPaintStrokeWidth = pOptions->GetPresentationPenWidth();
     563           0 :     }
     564           0 : }
     565             : 
     566           0 : SlideshowImpl::~SlideshowImpl()
     567             : {
     568           0 :     SdModule *pModule = SD_MOD();
     569             :     //rhbz#806663 SlideshowImpl can outlive SdModule
     570             :     SdOptions* pOptions = pModule ?
     571           0 :         pModule->GetSdOptions(DOCUMENT_TYPE_IMPRESS) : NULL;
     572           0 :     if( pOptions )
     573             :     {
     574           0 :         pOptions->SetPresentationPenColor(mnUserPaintColor);
     575           0 :         pOptions->SetPresentationPenWidth(mdUserPaintStrokeWidth);
     576             :     }
     577             : 
     578           0 :     Application::RemoveEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) );
     579             : 
     580           0 :     maDeactivateTimer.Stop();
     581             : 
     582           0 :     if( !mbDisposed )
     583             :     {
     584             :         OSL_FAIL("SlideshowImpl::~SlideshowImpl(), component was not disposed!");
     585           0 :         disposing();
     586             :     }
     587           0 : }
     588             : 
     589           0 : void SAL_CALL SlideshowImpl::disposing()
     590             : {
     591             : #ifdef ENABLE_SDREMOTE
     592           0 :     RemoteServer::presentationStopped();
     593             : #endif
     594           0 :     if( mxShow.is() && mpDoc )
     595           0 :         NotifyDocumentEvent( mpDoc, "OnEndPresentation" );
     596             : 
     597           0 :     if( mbAutoSaveWasOn )
     598           0 :         setAutoSaveState( true );
     599             : 
     600           0 :     if( mnEndShowEvent )
     601           0 :         Application::RemoveUserEvent( mnEndShowEvent );
     602           0 :     if( mnContextMenuEvent )
     603           0 :         Application::RemoveUserEvent( mnContextMenuEvent );
     604             : 
     605           0 :     maInputFreezeTimer.Stop();
     606             : 
     607           0 :     SolarMutexGuard aSolarGuard;
     608             : 
     609           0 :     if( !mxShow.is() )
     610           0 :         return;
     611             : 
     612           0 :     if( mxPresentation.is() )
     613           0 :         mxPresentation->end();
     614             : 
     615           0 :     maUpdateTimer.Stop();
     616             : 
     617           0 :     removeShapeEvents();
     618             : 
     619           0 :     if( mxListenerProxy.is() )
     620           0 :         mxListenerProxy->removeAsSlideShowListener();
     621             : 
     622             :     try
     623             :     {
     624           0 :         if( mxView.is() )
     625           0 :             mxShow->removeView( mxView.get() );
     626             : 
     627           0 :         Reference< XComponent > xComponent( mxShow, UNO_QUERY );
     628           0 :         if( xComponent.is() )
     629           0 :             xComponent->dispose();
     630             : 
     631           0 :         if( mxView.is() )
     632           0 :             mxView->dispose();
     633             :     }
     634           0 :     catch( Exception& )
     635             :     {
     636             :         OSL_FAIL(
     637             :             OString(OString("sd::SlideshowImpl::stop(), "
     638             :                     "exception caught: ") +
     639             :             OUStringToOString(
     640             :                 comphelper::anyToString( cppu::getCaughtException() ),
     641             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
     642             : 
     643             :     }
     644             : 
     645           0 :     mxShow.clear();
     646           0 :     mxView.clear();
     647           0 :     mxListenerProxy.clear();
     648           0 :     mpSlideController.reset();
     649             : 
     650             :     // take DrawView from presentation window, but give the old window back
     651           0 :     if( mpShowWindow && mpView )
     652           0 :         mpView->DeleteWindowFromPaintView( mpShowWindow );
     653             : 
     654           0 :     if( mpView )
     655           0 :         mpView->SetAnimationPause( false );
     656             : 
     657           0 :     if( mpViewShell )
     658             :     {
     659           0 :         mpViewShell->SetActiveWindow(mpOldActiveWindow);
     660           0 :         if (mpShowWindow)
     661           0 :             mpShowWindow->SetViewShell( NULL );
     662             :     }
     663             : 
     664           0 :     if( mpView )
     665           0 :         mpView->InvalidateAllWin();
     666             : 
     667           0 :     if( maPresSettings.mbFullScreen )
     668             :     {
     669             : #if HAVE_FEATURE_SCRIPTING
     670             :         // restore StarBASICErrorHdl
     671           0 :         StarBASIC::SetGlobalErrorHdl(maStarBASICGlobalErrorHdl);
     672           0 :         maStarBASICGlobalErrorHdl = Link<StarBASIC*,bool>();
     673             : #endif
     674             :     }
     675             :     else
     676             :     {
     677           0 :         if( mpShowWindow )
     678           0 :             mpShowWindow->Hide();
     679             :     }
     680             : 
     681           0 :     if( meAnimationMode == ANIMATIONMODE_SHOW )
     682             :     {
     683           0 :         mpDocSh->SetSlotFilter();
     684           0 :         mpDocSh->ApplySlotFilter();
     685             : 
     686           0 :         Help::EnableContextHelp();
     687           0 :         Help::EnableExtHelp();
     688             : 
     689           0 :         showChildWindows();
     690           0 :         mnChildMask = 0UL;
     691             :     }
     692             : 
     693             :     // show current window again
     694           0 :     if( mpViewShell && !mpViewShell->ISA(PresentationViewShell))
     695             :     {
     696           0 :         if( meAnimationMode == ANIMATIONMODE_SHOW )
     697             :         {
     698           0 :             mpViewShell->GetViewShellBase().ShowUIControls (true);
     699           0 :             mpPaneHider.reset();
     700             :         }
     701           0 :         else if( meAnimationMode == ANIMATIONMODE_PREVIEW )
     702             :         {
     703           0 :             mpViewShell->ShowUIControls (true);
     704             :         }
     705             :     }
     706             : 
     707           0 :     if( mpTimeButton )
     708           0 :         mpTimeButton->Hide();
     709           0 :     mpTimeButton.disposeAndClear();
     710             : 
     711           0 :     if( mpShowWindow )
     712           0 :         mpShowWindow->Hide();
     713           0 :     mpShowWindow.disposeAndClear();
     714             : 
     715           0 :     if ( mpViewShell )
     716             :     {
     717           0 :         if( meAnimationMode == ANIMATIONMODE_SHOW )
     718             :         {
     719           0 :             ::sd::Window* pActWin = mpViewShell->GetActiveWindow();
     720             : 
     721           0 :             if (pActWin)
     722             :             {
     723           0 :                 Size aVisSizePixel = pActWin->GetOutputSizePixel();
     724           0 :                 Rectangle aVisAreaWin = pActWin->PixelToLogic( Rectangle( Point(0,0), aVisSizePixel) );
     725           0 :                 mpViewShell->VisAreaChanged(aVisAreaWin);
     726           0 :                 if (mpView)
     727           0 :                     mpView->VisAreaChanged(pActWin);
     728           0 :                 pActWin->GrabFocus();
     729             :             }
     730             :         }
     731             : 
     732             :         // restart the custom show dialog if he started us
     733           0 :         if( mpViewShell->IsStartShowWithDialog() && getDispatcher() )
     734             :         {
     735           0 :             mpViewShell->SetStartShowWithDialog( false );
     736           0 :             getDispatcher()->Execute( SID_CUSTOMSHOW_DLG, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
     737             :         }
     738             : 
     739           0 :         mpViewShell->GetViewShellBase().UpdateBorder(true);
     740             :     }
     741             : 
     742           0 :     if( mpShowWindow )
     743             :     {
     744           0 :         mpShowWindow.clear();
     745             :     }
     746             : 
     747           0 :     setActiveXToolbarsVisible( true );
     748             : 
     749           0 :     Application::DisableNoYieldMode();
     750           0 :     Application::RemovePostYieldListener(LINK(this, SlideshowImpl, PostYieldListener));
     751             : 
     752           0 :     mbDisposed = true;
     753             : }
     754             : 
     755           0 : bool SlideshowImpl::startPreview(
     756             :         const Reference< XDrawPage >& xDrawPage,
     757             :         const Reference< XAnimationNode >& xAnimationNode,
     758             :         vcl::Window* pParent )
     759             : {
     760           0 :     bool bRet = false;
     761             : 
     762             :     try
     763             :     {
     764           0 :         const Reference<lang::XServiceInfo> xServiceInfo( xDrawPage, UNO_QUERY );
     765           0 :         if (xServiceInfo.is()) {
     766             :             const Sequence<OUString> supportedServices(
     767           0 :                 xServiceInfo->getSupportedServiceNames() );
     768           0 :             for ( sal_Int32 pos = supportedServices.getLength(); pos--; ) {
     769           0 :                 if ( supportedServices[pos] == "com.sun.star.drawing.MasterPage" ) {
     770             :                     OSL_FAIL("sd::SlideshowImpl::startPreview() "
     771             :                               "not allowed on master page!");
     772           0 :                     return false;
     773             :                 }
     774           0 :             }
     775             :         }
     776             : 
     777           0 :         mxPreviewDrawPage = xDrawPage;
     778           0 :         mxPreviewAnimationNode = xAnimationNode;
     779           0 :         meAnimationMode = ANIMATIONMODE_PREVIEW;
     780             : 
     781           0 :         maPresSettings.mbAll = false;
     782           0 :         maPresSettings.mbEndless = false;
     783           0 :         maPresSettings.mbCustomShow = false;
     784           0 :         maPresSettings.mbManual = false;
     785           0 :         maPresSettings.mbMouseVisible = false;
     786           0 :         maPresSettings.mbMouseAsPen = false;
     787           0 :         maPresSettings.mbLockedPages = false;
     788           0 :         maPresSettings.mbAlwaysOnTop = false;
     789           0 :         maPresSettings.mbFullScreen = false;
     790           0 :         maPresSettings.mbAnimationAllowed = true;
     791           0 :         maPresSettings.mnPauseTimeout = 0;
     792           0 :         maPresSettings.mbShowPauseLogo = false;
     793           0 :         maPresSettings.mbStartWithNavigator = false;
     794             : 
     795           0 :         Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW );
     796           0 :         Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
     797           0 :         mpSlideController.reset( new AnimationSlideController( xSlides, AnimationSlideController::PREVIEW ) );
     798             : 
     799           0 :         sal_Int32 nSlideNumber = 0;
     800           0 :         Reference< XPropertySet > xSet( mxPreviewDrawPage, UNO_QUERY_THROW );
     801           0 :         xSet->getPropertyValue( "Number" ) >>= nSlideNumber;
     802           0 :         mpSlideController->insertSlideNumber( nSlideNumber-1 );
     803           0 :         mpSlideController->setPreviewNode( xAnimationNode );
     804             : 
     805           0 :         mpShowWindow = VclPtr<ShowWindow>::Create( this, ((pParent == 0) && mpViewShell) ?  mpParentWindow.get() : pParent );
     806           0 :         if( mpViewShell )
     807             :         {
     808           0 :             mpViewShell->SetActiveWindow( mpShowWindow );
     809           0 :             mpShowWindow->SetViewShell (mpViewShell);
     810           0 :             mpViewShell->ShowUIControls (false);
     811             :         }
     812             : 
     813           0 :         if( mpView )
     814             :         {
     815           0 :             mpView->AddWindowToPaintView( mpShowWindow );
     816           0 :             mpView->SetAnimationPause( true );
     817             :         }
     818             : 
     819             :         // call resize handler
     820           0 :         if( pParent )
     821             :         {
     822           0 :             maPresSize = pParent->GetSizePixel();
     823             :         }
     824           0 :         else if( mpViewShell )
     825             :         {
     826           0 :             Rectangle aContentRect (mpViewShell->GetViewShellBase().getClientRectangle());
     827           0 :             if (AllSettings::GetLayoutRTL())
     828             :             {
     829           0 :                 aContentRect.Left() = aContentRect.Right();
     830           0 :                 aContentRect.Right() += aContentRect.Right();
     831             :             }
     832           0 :             maPresSize = aContentRect.GetSize();
     833           0 :             mpShowWindow->SetPosPixel( aContentRect.TopLeft() );
     834             :         }
     835             :         else
     836             :         {
     837             :             OSL_FAIL("sd::SlideshowImpl::startPreview(), I need either a parent window or a viewshell!");
     838             :         }
     839           0 :         resize( maPresSize );
     840             : 
     841           0 :         sal_Int32 nPropertyCount = 1;
     842           0 :         if( mxPreviewAnimationNode.is() )
     843           0 :             nPropertyCount++;
     844             : 
     845           0 :         Sequence< beans::PropertyValue > aProperties(nPropertyCount);
     846           0 :         aProperties[0].Name = "AutomaticAdvancement";
     847           0 :         aProperties[0].Value = uno::makeAny( (double)1.0 ); // one second timeout
     848             : 
     849           0 :         if( mxPreviewAnimationNode.is() )
     850             :         {
     851           0 :             aProperties[1].Name = "NoSlideTransitions";
     852           0 :             aProperties[1].Value = uno::makeAny( sal_True );
     853             :         }
     854             : 
     855           0 :         bRet = startShowImpl( aProperties );
     856             : 
     857           0 :         if( mpShowWindow != nullptr && meAnimationMode == ANIMATIONMODE_PREVIEW )
     858           0 :             mpShowWindow->SetPreviewMode();
     859             : 
     860             :     }
     861           0 :     catch( Exception& )
     862             :     {
     863             :         OSL_FAIL(
     864             :             OString(OString("sd::SlideshowImpl::startPreview(), "
     865             :                      "exception caught: ") +
     866             :              OUStringToOString(
     867             :                  comphelper::anyToString( cppu::getCaughtException() ),
     868             :                  RTL_TEXTENCODING_UTF8 )).getStr() );
     869           0 :         bRet = false;
     870             :     }
     871             : 
     872           0 :     return bRet;
     873             : }
     874             : 
     875           0 : bool SlideshowImpl::startShow( PresentationSettingsEx* pPresSettings )
     876             : {
     877           0 :     const rtl::Reference<SlideshowImpl> this_(this);
     878             : 
     879             :     DBG_ASSERT( !mxShow.is(), "sd::SlideshowImpl::startShow(), called twice!" );
     880           0 :     if( mxShow.is() )
     881           0 :         return true;
     882             :     DBG_ASSERT( mpParentWindow!=nullptr, "sd::SlideshowImpl::startShow() called without parent window" );
     883           0 :     if (mpParentWindow == nullptr)
     884           0 :         return false;
     885             : 
     886             :     // Autoplay (pps/ppsx)
     887           0 :     if (mpViewShell->GetDoc()->IsStartWithPresentation()){
     888           0 :         mpViewShell->GetDoc()->SetExitAfterPresenting(true);
     889             :     }
     890             : 
     891           0 :     bool bRet = false;
     892             : 
     893             :     try
     894             :     {
     895           0 :         if( pPresSettings )
     896             :         {
     897           0 :             maPresSettings = *pPresSettings;
     898           0 :             mbRehearseTimings = pPresSettings->mbRehearseTimings;
     899             :         }
     900             : 
     901           0 :         OUString  aPresSlide( maPresSettings.maPresPage );
     902           0 :         SdPage* pStartPage = mpViewShell->GetActualPage();
     903           0 :         bool    bStartWithActualSlide =  pStartPage;
     904             : 
     905             :         // times should be measured?
     906           0 :         if( mbRehearseTimings )
     907             :         {
     908           0 :             maPresSettings.mbEndless = false;
     909           0 :             maPresSettings.mbManual = true;
     910           0 :             maPresSettings.mbMouseVisible = true;
     911           0 :             maPresSettings.mbMouseAsPen = false;
     912           0 :             maPresSettings.mnPauseTimeout = 0;
     913           0 :             maPresSettings.mbShowPauseLogo = false;
     914           0 :             maPresSettings.mbStartWithNavigator = false;
     915             :         }
     916             : 
     917           0 :         if( pStartPage )
     918             :         {
     919           0 :             if( pStartPage->GetPageKind() == PK_NOTES )
     920             :             {
     921             :                 // we are in notes page mode, so get
     922             :                 // the corresponding draw page
     923           0 :                 const sal_uInt16 nPgNum = ( pStartPage->GetPageNum() - 2 ) >> 1;
     924           0 :                 pStartPage = mpDoc->GetSdPage( nPgNum, PK_STANDARD );
     925             :             }
     926             :         }
     927             : 
     928           0 :         if( bStartWithActualSlide )
     929             :         {
     930           0 :             if ( aPresSlide.isEmpty())
     931             :             {
     932             :                 // no preset slide yet, so pick current on one
     933           0 :                 aPresSlide = pStartPage->GetName();
     934             :                 // if the starting slide is hidden, we can't set slide controller to ALL mode
     935           0 :                 maPresSettings.mbAll = !pStartPage->IsExcluded();
     936             :             }
     937             : 
     938           0 :             if( meAnimationMode != ANIMATIONMODE_SHOW )
     939             :             {
     940           0 :                 if( pStartPage->GetPageKind() == PK_STANDARD )
     941             :                 {
     942           0 :                     maPresSettings.mbAll = false;
     943             :                 }
     944             :             }
     945             :         }
     946             : 
     947             :         // build page list
     948           0 :         createSlideList( maPresSettings.mbAll, aPresSlide );
     949             : 
     950             :         // remember Slide number from where the show was started
     951           0 :         if( pStartPage )
     952           0 :             mnRestoreSlide = ( pStartPage->GetPageNum() - 1 ) / 2;
     953             : 
     954           0 :         if( mpSlideController->hasSlides() )
     955             :         {
     956             :             // hide child windows
     957           0 :             hideChildWindows();
     958             : 
     959           0 :             mpShowWindow = VclPtr<ShowWindow>::Create( this, mpParentWindow );
     960           0 :             mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible );
     961           0 :             mpViewShell->SetActiveWindow( mpShowWindow );
     962           0 :             mpShowWindow->SetViewShell (mpViewShell);
     963           0 :             mpViewShell->GetViewShellBase().ShowUIControls (false);
     964             :             // Hide the side panes for in-place presentations.
     965           0 :             if ( ! maPresSettings.mbFullScreen)
     966           0 :                 mpPaneHider.reset(new PaneHider(*mpViewShell,this));
     967             : 
     968           0 :             if( getViewFrame() )
     969           0 :                 getViewFrame()->SetChildWindow( SID_NAVIGATOR, maPresSettings.mbStartWithNavigator );
     970             : 
     971             :             // these Slots are forbidden in other views for this document
     972           0 :             if( mpDocSh )
     973             :             {
     974           0 :                 mpDocSh->SetSlotFilter( true, sizeof( pAllowed ) / sizeof( sal_uInt16 ), pAllowed );
     975           0 :                 mpDocSh->ApplySlotFilter();
     976             :             }
     977             : 
     978           0 :             Help::DisableContextHelp();
     979           0 :             Help::DisableExtHelp();
     980             : 
     981           0 :             if( maPresSettings.mbFullScreen )
     982             :             {
     983             : #if HAVE_FEATURE_SCRIPTING
     984             :                 // disable basic ide error handling
     985           0 :                 maStarBASICGlobalErrorHdl = StarBASIC::GetGlobalErrorHdl();
     986           0 :                 StarBASIC::SetGlobalErrorHdl( Link<StarBASIC*,bool>() );
     987             : #endif
     988             :             }
     989             : 
     990             :             // call resize handler
     991           0 :             maPresSize = mpParentWindow->GetSizePixel();
     992           0 :             if (!maPresSettings.mbFullScreen)
     993             :             {
     994           0 :                 const Rectangle& aClientRect = mpViewShell->GetViewShellBase().getClientRectangle();
     995           0 :                 maPresSize = aClientRect.GetSize();
     996           0 :                 mpShowWindow->SetPosPixel( aClientRect.TopLeft() );
     997           0 :                 resize( maPresSize );
     998             :             }
     999             : 
    1000             :             // #i41824#
    1001             :             // Note: In FullScreen Mode the OS (window manager) sends a resize to
    1002             :             // the WorkWindow once it actually resized it to full size.  The
    1003             :             // WorkWindow propagates the resize to the DrawViewShell which calls
    1004             :             // resize() at the SlideShow (this).  Calling resize here results in a
    1005             :             // temporary display of a black window in the window's default size
    1006             : 
    1007           0 :             if( mpView )
    1008             :             {
    1009           0 :                 mpView->AddWindowToPaintView( mpShowWindow );
    1010           0 :                 mpView->SetAnimationPause( true );
    1011             :             }
    1012             : 
    1013           0 :             SfxBindings* pBindings = getBindings();
    1014           0 :             if( pBindings )
    1015             :             {
    1016           0 :                 pBindings->Invalidate( SID_PRESENTATION );
    1017           0 :                 pBindings->Invalidate( SID_REHEARSE_TIMINGS );
    1018             :             }
    1019             : 
    1020             :             // Defer the sd::ShowWindow's GrabFocus to SlideShow::activate. so that the accessible event can be fired correctly.
    1021             :             //mpShowWindow->GrabFocus();
    1022             : 
    1023           0 :             std::vector<beans::PropertyValue> aProperties;
    1024           0 :             aProperties.reserve( 4 );
    1025             : 
    1026             :             aProperties.push_back(
    1027             :                 beans::PropertyValue( "AdvanceOnClick" ,
    1028           0 :                     -1, Any( !maPresSettings.mbLockedPages ),
    1029           0 :                     beans::PropertyState_DIRECT_VALUE ) );
    1030             : 
    1031             :             aProperties.push_back(
    1032             :                 beans::PropertyValue( "ImageAnimationsAllowed" ,
    1033             :                     -1, Any( maPresSettings.mbAnimationAllowed ),
    1034           0 :                     beans::PropertyState_DIRECT_VALUE ) );
    1035             : 
    1036             :             const bool bZOrderEnabled(
    1037           0 :                 SD_MOD()->GetSdOptions( mpDoc->GetDocumentType() )->IsSlideshowRespectZOrder() );
    1038             :             aProperties.push_back(
    1039             :                 beans::PropertyValue( "DisableAnimationZOrder" ,
    1040           0 :                     -1, Any( !bZOrderEnabled ),
    1041           0 :                     beans::PropertyState_DIRECT_VALUE ) );
    1042             : 
    1043             :             aProperties.push_back(
    1044             :                 beans::PropertyValue( "ForceManualAdvance" ,
    1045             :                     -1, Any( maPresSettings.mbManual ),
    1046           0 :                     beans::PropertyState_DIRECT_VALUE ) );
    1047             : 
    1048           0 :             if( mbUsePen )
    1049             :              {
    1050             :                 aProperties.push_back(
    1051             :                     beans::PropertyValue( "UserPaintColor" ,
    1052             :                         // User paint color is black by default.
    1053             :                         -1, Any( mnUserPaintColor ),
    1054           0 :                         beans::PropertyState_DIRECT_VALUE ) );
    1055             : 
    1056             :                 aProperties.push_back(
    1057             :                     beans::PropertyValue( "UserPaintStrokeWidth" ,
    1058             :                         // User paint color is black by default.
    1059             :                         -1, Any( mdUserPaintStrokeWidth ),
    1060           0 :                         beans::PropertyState_DIRECT_VALUE ) );
    1061             :             }
    1062             : 
    1063           0 :             if (mbRehearseTimings) {
    1064             :                 aProperties.push_back(
    1065             :                     beans::PropertyValue( "RehearseTimings" ,
    1066           0 :                         -1, Any(true), beans::PropertyState_DIRECT_VALUE ) );
    1067             :             }
    1068             : 
    1069             :             bRet = startShowImpl( Sequence<beans::PropertyValue>(
    1070           0 :                                       &aProperties[0], aProperties.size() ) );
    1071             : 
    1072             :         }
    1073             : 
    1074           0 :         setActiveXToolbarsVisible( false );
    1075             :     }
    1076           0 :     catch (const Exception&)
    1077             :     {
    1078             :         OSL_FAIL(
    1079             :             OString(OString("sd::SlideshowImpl::startShow(), "
    1080             :                      "exception caught: ") +
    1081             :              OUStringToOString(
    1082             :                  comphelper::anyToString( cppu::getCaughtException() ),
    1083             :                  RTL_TEXTENCODING_UTF8 )).getStr() );
    1084           0 :         bRet = false;
    1085             :     }
    1086             : 
    1087           0 :     return bRet;
    1088             : }
    1089             : 
    1090           0 : bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProperties )
    1091             : {
    1092             :     try
    1093             :     {
    1094           0 :         mxShow = Reference< XSlideShow >( createSlideShow(), UNO_QUERY_THROW );
    1095             : 
    1096           0 :         mxView = new SlideShowView(
    1097           0 :                                              *mpShowWindow,
    1098             :                                              mpDoc,
    1099             :                                              meAnimationMode,
    1100             :                                              this,
    1101           0 :                                              maPresSettings.mbFullScreen);
    1102             : 
    1103             :         // try add wait symbol to properties:
    1104             :         const Reference<rendering::XSpriteCanvas> xSpriteCanvas(
    1105           0 :             mxView->getCanvas() );
    1106           0 :         if (xSpriteCanvas.is())
    1107             :         {
    1108           0 :             BitmapEx waitSymbolBitmap( SdResId(BMP_WAIT_ICON) );
    1109             :             const Reference<rendering::XBitmap> xBitmap(
    1110             :                 vcl::unotools::xBitmapFromBitmapEx(
    1111           0 :                     xSpriteCanvas->getDevice(), waitSymbolBitmap ) );
    1112           0 :             if (xBitmap.is())
    1113             :             {
    1114           0 :                 mxShow->setProperty(
    1115             :                     beans::PropertyValue( "WaitSymbolBitmap" ,
    1116             :                         -1,
    1117             :                         makeAny( xBitmap ),
    1118           0 :                         beans::PropertyState_DIRECT_VALUE ) );
    1119             :             }
    1120             : 
    1121           0 :             BitmapEx pointerSymbolBitmap( SdResId(BMP_POINTER_ICON) );
    1122             :             const Reference<rendering::XBitmap> xPointerBitmap(
    1123             :                 vcl::unotools::xBitmapFromBitmapEx(
    1124           0 :                     xSpriteCanvas->getDevice(), pointerSymbolBitmap ) );
    1125           0 :             if (xPointerBitmap.is())
    1126             :             {
    1127           0 :                 mxShow->setProperty(
    1128             :                     beans::PropertyValue( "PointerSymbolBitmap" ,
    1129             :                         -1,
    1130             :                         makeAny( xPointerBitmap ),
    1131           0 :                         beans::PropertyState_DIRECT_VALUE ) );
    1132           0 :             }
    1133             :         }
    1134             : 
    1135           0 :         const sal_Int32 nCount = aProperties.getLength();
    1136             :         sal_Int32 nIndex;
    1137           0 :         for( nIndex = 0; nIndex < nCount; nIndex++ )
    1138           0 :             mxShow->setProperty( aProperties[nIndex] );
    1139             : 
    1140           0 :         mxShow->addView( mxView.get() );
    1141             : 
    1142           0 :         mxListenerProxy.set( new SlideShowListenerProxy( this, mxShow ) );
    1143           0 :         mxListenerProxy->addAsSlideShowListener();
    1144             : 
    1145           0 :         NotifyDocumentEvent( mpDoc, "OnStartPresentation");
    1146           0 :         displaySlideIndex( mpSlideController->getStartSlideIndex() );
    1147             : 
    1148           0 :         return true;
    1149             :     }
    1150           0 :     catch( Exception& )
    1151             :     {
    1152             :         OSL_FAIL(
    1153             :             OString(OString("sd::SlideshowImpl::startShowImpl(), "
    1154             :                      "exception caught: ") +
    1155             :              OUStringToOString(
    1156             :                  comphelper::anyToString( cppu::getCaughtException() ),
    1157             :                  RTL_TEXTENCODING_UTF8 )).getStr() );
    1158           0 :         return false;
    1159             :     }
    1160             : }
    1161             : 
    1162             : /** called only by the slideshow view when the first paint event occurs.
    1163             :     This actually starts the slideshow. */
    1164           0 : void SlideshowImpl::onFirstPaint()
    1165             : {
    1166           0 :     if( mpShowWindow )
    1167             :     {
    1168             :         /*
    1169             :         mpShowWindow->SetBackground( Wallpaper( Color( COL_BLACK ) ) );
    1170             :         mpShowWindow->Erase();
    1171             :         mpShowWindow->SetBackground();
    1172             :         */
    1173             :     }
    1174             : 
    1175           0 :     SolarMutexGuard aSolarGuard;
    1176           0 :     maUpdateTimer.SetTimeout( (sal_uLong)100 );
    1177           0 :     maUpdateTimer.Start();
    1178           0 : }
    1179             : 
    1180           0 : void SlideshowImpl::paint( const Rectangle& /* rRect */ )
    1181             : {
    1182           0 :     if( mxView.is() ) try
    1183             :     {
    1184           0 :         awt::PaintEvent aEvt;
    1185             :         // aEvt.UpdateRect = TODO
    1186           0 :         mxView->paint( aEvt );
    1187             :     }
    1188           0 :     catch( Exception& )
    1189             :     {
    1190             :         OSL_FAIL(
    1191             :             OString(OString("sd::SlideshowImpl::paint(), "
    1192             :                     "exception caught: ") +
    1193             :             OUStringToOString(
    1194             :                 comphelper::anyToString( cppu::getCaughtException() ),
    1195             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    1196             :     }
    1197           0 : }
    1198             : 
    1199           0 : void SAL_CALL SlideshowImpl::addSlideShowListener( const Reference< XSlideShowListener >& xListener ) throw (RuntimeException, std::exception)
    1200             : {
    1201           0 :     if( mxListenerProxy.is() )
    1202           0 :         mxListenerProxy->addSlideShowListener( xListener );
    1203           0 : }
    1204             : 
    1205           0 : void SAL_CALL SlideshowImpl::removeSlideShowListener( const Reference< XSlideShowListener >& xListener ) throw (RuntimeException, std::exception)
    1206             : {
    1207           0 :     if( mxListenerProxy.is() )
    1208           0 :         mxListenerProxy->removeSlideShowListener( xListener );
    1209           0 : }
    1210             : 
    1211           0 : void SlideshowImpl::slideEnded(const bool bReverse)
    1212             : {
    1213           0 :     if (bReverse)
    1214           0 :         gotoPreviousSlide(true);
    1215             :     else
    1216           0 :         gotoNextSlide();
    1217           0 : }
    1218             : 
    1219           0 : bool SlideshowImpl::swipe(const CommandSwipeData &rSwipeData)
    1220             : {
    1221           0 :     if (mbUsePen || mnContextMenuEvent)
    1222           0 :         return false;
    1223             : 
    1224           0 :     double nVelocityX = rSwipeData.getVelocityX();
    1225           0 :     if (nVelocityX > 0)
    1226             :     {
    1227           0 :         gotoPreviousSlide();
    1228             :     }
    1229             :     else
    1230             :     {
    1231           0 :         gotoNextEffect();
    1232             :     }
    1233             :     //a swipe is followed by a mouse up, tell the view to ignore that mouse up as we've reacted
    1234             :     //to the swipe instead
    1235           0 :     mxView->ignoreNextMouseReleased();
    1236           0 :     return true;
    1237             : }
    1238             : 
    1239           0 : bool SlideshowImpl::longpress(const CommandLongPressData &rLongPressData)
    1240             : {
    1241           0 :     if (mnContextMenuEvent)
    1242           0 :         return false;
    1243             : 
    1244           0 :     maPopupMousePos = Point(rLongPressData.getX(), rLongPressData.getY());
    1245           0 :     mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
    1246             : 
    1247           0 :     return true;
    1248             : }
    1249             : 
    1250           0 : void SlideshowImpl::removeShapeEvents()
    1251             : {
    1252           0 :     if( mxShow.is() && mxListenerProxy.is() ) try
    1253             :     {
    1254           0 :         WrappedShapeEventImplMap::iterator aIter;
    1255           0 :         const WrappedShapeEventImplMap::iterator aEnd( maShapeEventMap.end() );
    1256             : 
    1257           0 :         for( aIter = maShapeEventMap.begin(); aIter != aEnd; ++aIter )
    1258             :         {
    1259           0 :             mxListenerProxy->removeShapeEventListener( (*aIter).first );
    1260           0 :             mxShow->setShapeCursor( (*aIter).first, awt::SystemPointer::ARROW );
    1261             :         }
    1262             : 
    1263           0 :         maShapeEventMap.clear();
    1264             :     }
    1265           0 :     catch( Exception& )
    1266             :     {
    1267             :         OSL_FAIL(
    1268             :             OString(OString("sd::SlideshowImpl::removeShapeEvents(), "
    1269             :                      "exception caught: ") +
    1270             :              OUStringToOString(
    1271             :                  comphelper::anyToString( cppu::getCaughtException() ),
    1272             :                  RTL_TEXTENCODING_UTF8 )).getStr() );
    1273             :     }
    1274           0 : }
    1275             : 
    1276           0 : void SlideshowImpl::registerShapeEvents(sal_Int32 nSlideNumber)
    1277             : {
    1278           0 :     if( nSlideNumber >= 0 ) try
    1279             :     {
    1280           0 :         Reference< XDrawPagesSupplier > xDrawPages( mxModel, UNO_QUERY_THROW );
    1281           0 :         Reference< XIndexAccess > xPages( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
    1282             : 
    1283           0 :         Reference< XShapes > xDrawPage;
    1284           0 :         xPages->getByIndex(nSlideNumber) >>= xDrawPage;
    1285             : 
    1286           0 :         if( xDrawPage.is() )
    1287             :         {
    1288           0 :             Reference< XMasterPageTarget > xMasterPageTarget( xDrawPage, UNO_QUERY );
    1289           0 :             if( xMasterPageTarget.is() )
    1290             :             {
    1291           0 :                 Reference< XShapes > xMasterPage( xMasterPageTarget->getMasterPage(), UNO_QUERY );
    1292           0 :                 if( xMasterPage.is() )
    1293           0 :                     registerShapeEvents( xMasterPage );
    1294             :             }
    1295           0 :             registerShapeEvents( xDrawPage );
    1296           0 :         }
    1297             :     }
    1298           0 :     catch( Exception& )
    1299             :     {
    1300             :         OSL_FAIL(
    1301             :             OString(OString("sd::SlideshowImpl::registerShapeEvents(), "
    1302             :                      "exception caught: ") +
    1303             :              OUStringToOString(
    1304             :                  comphelper::anyToString( cppu::getCaughtException() ),
    1305             :                  RTL_TEXTENCODING_UTF8 )).getStr() );
    1306             :     }
    1307           0 : }
    1308             : 
    1309           0 : void SlideshowImpl::registerShapeEvents( Reference< XShapes >& xShapes ) throw( Exception )
    1310             : {
    1311             :     try
    1312             :     {
    1313           0 :         const sal_Int32 nShapeCount = xShapes->getCount();
    1314             :         sal_Int32 nShape;
    1315           0 :         for( nShape = 0; nShape < nShapeCount; nShape++ )
    1316             :         {
    1317           0 :             Reference< XShape > xShape;
    1318           0 :             xShapes->getByIndex( nShape ) >>= xShape;
    1319             : 
    1320           0 :             if( xShape.is() && xShape->getShapeType() == "com.sun.star.drawing.GroupShape" )
    1321             :             {
    1322           0 :                 Reference< XShapes > xSubShapes( xShape, UNO_QUERY );
    1323           0 :                 if( xSubShapes.is() )
    1324           0 :                     registerShapeEvents( xSubShapes );
    1325             :             }
    1326             : 
    1327           0 :             Reference< XPropertySet > xSet( xShape, UNO_QUERY );
    1328           0 :             if( !xSet.is() )
    1329           0 :                 continue;
    1330             : 
    1331           0 :             Reference< XPropertySetInfo > xSetInfo( xSet->getPropertySetInfo() );
    1332           0 :             if( !xSetInfo.is() || !xSetInfo->hasPropertyByName( msOnClick ) )
    1333           0 :                 continue;
    1334             : 
    1335           0 :             WrappedShapeEventImplPtr pEvent( new WrappedShapeEventImpl );
    1336           0 :             xSet->getPropertyValue( msOnClick ) >>= pEvent->meClickAction;
    1337             : 
    1338           0 :             switch( pEvent->meClickAction )
    1339             :             {
    1340             :             case ClickAction_PREVPAGE:
    1341             :             case ClickAction_NEXTPAGE:
    1342             :             case ClickAction_FIRSTPAGE:
    1343             :             case ClickAction_LASTPAGE:
    1344             :             case ClickAction_STOPPRESENTATION:
    1345           0 :                 break;
    1346             :             case ClickAction_BOOKMARK:
    1347           0 :                 if( xSetInfo->hasPropertyByName( msBookmark ) )
    1348           0 :                     xSet->getPropertyValue( msBookmark ) >>= pEvent->maStrBookmark;
    1349           0 :                 if( getSlideNumberForBookmark( pEvent->maStrBookmark ) == -1 )
    1350           0 :                     continue;
    1351           0 :                 break;
    1352             :             case ClickAction_DOCUMENT:
    1353             :             case ClickAction_SOUND:
    1354             :             case ClickAction_PROGRAM:
    1355             :             case ClickAction_MACRO:
    1356           0 :                 if( xSetInfo->hasPropertyByName( msBookmark ) )
    1357           0 :                     xSet->getPropertyValue( msBookmark ) >>= pEvent->maStrBookmark;
    1358           0 :                 break;
    1359             :             case ClickAction_VERB:
    1360           0 :                 if( xSetInfo->hasPropertyByName( msVerb ) )
    1361           0 :                     xSet->getPropertyValue( msVerb ) >>= pEvent->mnVerb;
    1362           0 :                 break;
    1363             :             default:
    1364           0 :                 continue; // skip all others
    1365             :             }
    1366             : 
    1367           0 :             maShapeEventMap[ xShape ] = pEvent;
    1368             : 
    1369           0 :             if( mxListenerProxy.is() )
    1370           0 :                 mxListenerProxy->addShapeEventListener( xShape );
    1371           0 :             mxShow->setShapeCursor( xShape, awt::SystemPointer::REFHAND );
    1372           0 :         }
    1373             :     }
    1374           0 :     catch( Exception& )
    1375             :     {
    1376             :         OSL_FAIL(
    1377             :             OString(OString("sd::SlideshowImpl::registerShapeEvents(), "
    1378             :                     "exception caught: ") +
    1379             :             OUStringToOString(
    1380             :                 comphelper::anyToString( cppu::getCaughtException() ),
    1381             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    1382             :     }
    1383           0 : }
    1384             : 
    1385           0 : void SlideshowImpl::displayCurrentSlide (const bool bSkipAllMainSequenceEffects)
    1386             : {
    1387           0 :     stopSound();
    1388           0 :     removeShapeEvents();
    1389             : 
    1390           0 :     if( mpSlideController.get() && mxShow.is() )
    1391             :     {
    1392             :         Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(),
    1393           0 :                                                     UNO_QUERY_THROW );
    1394           0 :         mpSlideController->displayCurrentSlide( mxShow, xDrawPages, bSkipAllMainSequenceEffects );
    1395           0 :         registerShapeEvents(mpSlideController->getCurrentSlideNumber());
    1396           0 :         update();
    1397             : 
    1398           0 :         SfxBindings* pBindings = getBindings();
    1399           0 :         if( pBindings )
    1400             :         {
    1401           0 :             pBindings->Invalidate( SID_NAVIGATOR_STATE );
    1402           0 :             pBindings->Invalidate( SID_NAVIGATOR_PAGENAME );
    1403           0 :         }
    1404             :     }
    1405             :     // send out page change event and notity to update all acc info for current page
    1406           0 :     if (mpViewShell)
    1407             :     {
    1408           0 :         sal_Int32 currentPageIndex = getCurrentSlideIndex();
    1409           0 :         mpViewShell->fireSwitchCurrentPage(currentPageIndex);
    1410           0 :         mpViewShell->NotifyAccUpdate();
    1411             :     }
    1412           0 : }
    1413             : 
    1414           0 : void SlideshowImpl::endPresentation()
    1415             : {
    1416           0 :     if( maPresSettings.mbMouseAsPen)
    1417             :     {
    1418           0 :         Reference< XMultiServiceFactory > xDocFactory(mpDoc->getUnoModel(), UNO_QUERY );
    1419           0 :         if( xDocFactory.is() )
    1420           0 :             mxShow->registerUserPaintPolygons(xDocFactory);
    1421             :     }
    1422             : 
    1423           0 :     if( !mnEndShowEvent )
    1424           0 :         mnEndShowEvent = Application::PostUserEvent( LINK(this, SlideshowImpl, endPresentationHdl) );
    1425           0 : }
    1426             : 
    1427           0 : IMPL_LINK_NOARG(SlideshowImpl, endPresentationHdl)
    1428             : {
    1429           0 :     mnEndShowEvent = 0;
    1430             : 
    1431           0 :     if( mxPresentation.is() )
    1432           0 :         mxPresentation->end();
    1433           0 :     return 0;
    1434             : }
    1435             : 
    1436           0 : void SAL_CALL SlideshowImpl::pause() throw (RuntimeException, std::exception)
    1437             : {
    1438           0 :     SolarMutexGuard aSolarGuard;
    1439             : 
    1440           0 :     if( !mbIsPaused ) try
    1441             :     {
    1442           0 :         mbIsPaused = true;
    1443           0 :         if( mxShow.is() )
    1444             :         {
    1445           0 :             mxShow->pause(sal_True);
    1446             : 
    1447           0 :             if( mxListenerProxy.is() )
    1448           0 :                 mxListenerProxy->paused();
    1449             :         }
    1450             :     }
    1451           0 :     catch( Exception& )
    1452             :     {
    1453             :         OSL_FAIL(
    1454             :             OString(OString("sd::SlideshowImpl::pause(), "
    1455             :                     "exception caught: ") +
    1456             :             OUStringToOString(
    1457             :                 comphelper::anyToString( cppu::getCaughtException() ),
    1458             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    1459           0 :     }
    1460           0 : }
    1461             : 
    1462           0 : void SAL_CALL SlideshowImpl::resume() throw (RuntimeException, std::exception)
    1463             : {
    1464           0 :     SolarMutexGuard aSolarGuard;
    1465             : 
    1466           0 :     if( mbIsPaused ) try
    1467             :     {
    1468           0 :         if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK )
    1469             :         {
    1470           0 :             mpShowWindow->RestartShow();
    1471             :         }
    1472             :         else
    1473             :         {
    1474           0 :             mbIsPaused = false;;
    1475           0 :             if( mxShow.is() )
    1476             :             {
    1477           0 :                 mxShow->pause(sal_False);
    1478           0 :                 update();
    1479             : 
    1480           0 :                 if( mxListenerProxy.is() )
    1481           0 :                     mxListenerProxy->resumed();
    1482             :             }
    1483             :         }
    1484             :     }
    1485           0 :     catch( Exception& )
    1486             :     {
    1487             :         OSL_FAIL(
    1488             :             OString(OString("sd::SlideshowImpl::resume(), "
    1489             :                     "exception caught: ") +
    1490             :             OUStringToOString(
    1491             :                 comphelper::anyToString( cppu::getCaughtException() ),
    1492             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    1493             :     }
    1494             : #ifdef ENABLE_SDREMOTE
    1495           0 :     RemoteServer::presentationStarted( this );
    1496             : #endif
    1497           0 : }
    1498             : 
    1499           0 : sal_Bool SAL_CALL SlideshowImpl::isPaused() throw (RuntimeException, std::exception)
    1500             : {
    1501           0 :     SolarMutexGuard aSolarGuard;
    1502           0 :     return mbIsPaused;
    1503             : }
    1504             : 
    1505           0 : void SAL_CALL SlideshowImpl::blankScreen( sal_Int32 nColor ) throw (RuntimeException, std::exception)
    1506             : {
    1507           0 :     SolarMutexGuard aSolarGuard;
    1508             : 
    1509           0 :     if( mpShowWindow && mpSlideController )
    1510             :     {
    1511           0 :         if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), nColor ) )
    1512             :         {
    1513           0 :             pause();
    1514             :         }
    1515           0 :     }
    1516           0 : }
    1517             : 
    1518             : // XShapeEventListener
    1519             : 
    1520           0 : void SlideshowImpl::click( const Reference< XShape >& xShape, const ::com::sun::star::awt::MouseEvent& /* aOriginalEvent */ )
    1521             : {
    1522           0 :     SolarMutexGuard aSolarGuard;
    1523             : 
    1524           0 :     WrappedShapeEventImplPtr pEvent = maShapeEventMap[xShape];
    1525           0 :     if( !pEvent.get() )
    1526           0 :         return;
    1527             : 
    1528           0 :     switch( pEvent->meClickAction )
    1529             :     {
    1530           0 :     case ClickAction_PREVPAGE:          gotoPreviousSlide();        break;
    1531           0 :     case ClickAction_NEXTPAGE:          gotoNextSlide();            break;
    1532           0 :     case ClickAction_FIRSTPAGE:         gotoFirstSlide();           break;
    1533           0 :     case ClickAction_LASTPAGE:          gotoLastSlide();            break;
    1534           0 :     case ClickAction_STOPPRESENTATION:  endPresentation();          break;
    1535             :     case ClickAction_BOOKMARK:
    1536             :     {
    1537           0 :         gotoBookmark( pEvent->maStrBookmark );
    1538             :     }
    1539           0 :     break;
    1540             :     case ClickAction_SOUND:
    1541             :     {
    1542             :         try
    1543             :         {
    1544           0 :             mxPlayer.set(avmedia::MediaWindow::createPlayer(pEvent->maStrBookmark, ""/*TODO?*/), uno::UNO_QUERY_THROW );
    1545           0 :             mxPlayer->start();
    1546             :         }
    1547           0 :         catch( uno::Exception& )
    1548             :         {
    1549             :             OSL_FAIL("sd::SlideshowImpl::click(), exception caught!" );
    1550             :         }
    1551             :     }
    1552           0 :     break;
    1553             : 
    1554             :     case ClickAction_DOCUMENT:
    1555             :     {
    1556           0 :         OUString aBookmark( pEvent->maStrBookmark );
    1557             : 
    1558           0 :         sal_Int32 nPos = aBookmark.indexOf( '#' );
    1559           0 :         if( nPos >= 0 )
    1560             :         {
    1561           0 :             OUString aURL( aBookmark.copy( 0, nPos+1 ) );
    1562           0 :             OUString aName( aBookmark.copy( nPos+1 ) );
    1563           0 :             aURL += getUiNameFromPageApiNameImpl( aName );
    1564           0 :             aBookmark = aURL;
    1565             :         }
    1566             : 
    1567           0 :         mpDocSh->OpenBookmark( aBookmark );
    1568             :     }
    1569           0 :     break;
    1570             : 
    1571             :     case ClickAction_PROGRAM:
    1572             :     {
    1573             :         INetURLObject aURL(
    1574             :             ::URIHelper::SmartRel2Abs(
    1575             :                 INetURLObject(mpDocSh->GetMedium()->GetBaseURL()),
    1576           0 :                 pEvent->maStrBookmark, ::URIHelper::GetMaybeFileHdl(), true,
    1577             :                 false, INetURLObject::WAS_ENCODED,
    1578           0 :                 INetURLObject::DECODE_UNAMBIGUOUS ) );
    1579             : 
    1580           0 :         if( INetProtocol::File == aURL.GetProtocol() )
    1581             :         {
    1582           0 :             SfxStringItem aUrl( SID_FILE_NAME, aURL.GetMainURL( INetURLObject::NO_DECODE ) );
    1583           0 :             SfxBoolItem aBrowsing( SID_BROWSE, true );
    1584             : 
    1585           0 :             SfxViewFrame* pViewFrm = SfxViewFrame::Current();
    1586           0 :             if (pViewFrm)
    1587             :                 pViewFrm->GetDispatcher()->Execute( SID_OPENDOC,
    1588             :                                               SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
    1589             :                                             &aUrl,
    1590             :                                             &aBrowsing,
    1591           0 :                                             0L );
    1592           0 :         }
    1593             :     }
    1594           0 :     break;
    1595             : 
    1596             :     case presentation::ClickAction_MACRO:
    1597             :     {
    1598           0 :         const OUString aMacro( pEvent->maStrBookmark );
    1599             : 
    1600           0 :         if ( SfxApplication::IsXScriptURL( aMacro ) )
    1601             :         {
    1602           0 :             Any aRet;
    1603           0 :             Sequence< sal_Int16 > aOutArgsIndex;
    1604           0 :             Sequence< Any > aOutArgs;
    1605           0 :             Sequence< Any >* pInArgs = new Sequence< Any >(0);
    1606           0 :             mpDocSh->CallXScript( aMacro, *pInArgs, aRet, aOutArgsIndex, aOutArgs);
    1607             :         }
    1608             :         else
    1609             :         {
    1610             :             // aMacro has the following syntax:
    1611             :             // "Macroname.Modulname.Libname.Documentname" or
    1612             :             // "Macroname.Modulname.Libname.Applicationname"
    1613           0 :             OUString aMacroName = aMacro.getToken(0, '.');
    1614           0 :             OUString aModulName = aMacro.getToken(1, '.');
    1615             : 
    1616             :             // todo: is the limitation still given that only
    1617             :             // Modulname+Macroname can be used here?
    1618           0 :             OUString aExecMacro = aModulName + "." + aMacroName;
    1619           0 :             mpDocSh->GetBasic()->Call(aExecMacro);
    1620           0 :         }
    1621             :     }
    1622           0 :     break;
    1623             : 
    1624             :     case ClickAction_VERB:
    1625             :     {
    1626             :         // todo, better do it async?
    1627           0 :         SdrObject* pObj = GetSdrObjectFromXShape( xShape );
    1628           0 :         SdrOle2Obj* pOleObject = PTR_CAST(SdrOle2Obj, pObj);
    1629           0 :         if (pOleObject && mpViewShell )
    1630           0 :             mpViewShell->ActivateObject(pOleObject, pEvent->mnVerb);
    1631             :     }
    1632           0 :     break;
    1633             :     default:
    1634           0 :         break;
    1635           0 :     }
    1636             : }
    1637             : 
    1638           0 : sal_Int32 SlideshowImpl::getSlideNumberForBookmark( const OUString& rStrBookmark )
    1639             : {
    1640             :     bool bIsMasterPage;
    1641           0 :     OUString aBookmark = getUiNameFromPageApiNameImpl( rStrBookmark );
    1642           0 :     sal_uInt16 nPgNum = mpDoc->GetPageByName( aBookmark, bIsMasterPage );
    1643             : 
    1644           0 :     if( nPgNum == SDRPAGE_NOTFOUND )
    1645             :     {
    1646             :         // Is the bookmark an object?
    1647           0 :         SdrObject* pObj = mpDoc->GetObj( aBookmark );
    1648             : 
    1649           0 :         if( pObj )
    1650             :         {
    1651           0 :             nPgNum = pObj->GetPage()->GetPageNum();
    1652           0 :             bIsMasterPage = pObj->GetPage()->IsMasterPage();
    1653             :         }
    1654             :     }
    1655             : 
    1656           0 :     if( (nPgNum == SDRPAGE_NOTFOUND) || bIsMasterPage || static_cast<SdPage*>(mpDoc->GetPage(nPgNum))->GetPageKind() != PK_STANDARD )
    1657           0 :         return -1;
    1658             : 
    1659           0 :     return ( nPgNum - 1) >> 1;
    1660             : }
    1661             : 
    1662           0 : void SlideshowImpl::hyperLinkClicked( OUString const& aHyperLink ) throw (RuntimeException)
    1663             : {
    1664           0 :     OUString aBookmark( aHyperLink );
    1665             : 
    1666           0 :     sal_Int32 nPos = aBookmark.indexOf( '#' );
    1667           0 :     if( nPos >= 0 )
    1668             :     {
    1669           0 :         OUString aURL( aBookmark.copy( 0, nPos+1 ) );
    1670           0 :         OUString aName( aBookmark.copy( nPos+1 ) );
    1671           0 :         aURL += getUiNameFromPageApiNameImpl( aName );
    1672           0 :         aBookmark = aURL;
    1673             :     }
    1674             : 
    1675           0 :     mpDocSh->OpenBookmark( aBookmark );
    1676           0 : }
    1677             : 
    1678           0 : void SlideshowImpl::displaySlideNumber( sal_Int32 nSlideNumber )
    1679             : {
    1680           0 :     if( mpSlideController.get() )
    1681             :     {
    1682           0 :         if( mpSlideController->jumpToSlideNumber( nSlideNumber ) )
    1683             :         {
    1684           0 :             displayCurrentSlide();
    1685             :         }
    1686             :     }
    1687           0 : }
    1688             : 
    1689             : /** nSlideIndex == -1 displays current slide again */
    1690           0 : void SlideshowImpl::displaySlideIndex( sal_Int32 nSlideIndex )
    1691             : {
    1692           0 :     if( mpSlideController.get() )
    1693             :     {
    1694           0 :         if( (nSlideIndex == -1) || mpSlideController->jumpToSlideIndex( nSlideIndex ) )
    1695             :         {
    1696           0 :             displayCurrentSlide();
    1697             :         }
    1698             :     }
    1699           0 : }
    1700             : 
    1701           0 : void SlideshowImpl::jumpToBookmark( const OUString& sBookmark )
    1702             : {
    1703           0 :     sal_Int32 nSlideNumber = getSlideNumberForBookmark( sBookmark );
    1704           0 :     if( nSlideNumber != -1 )
    1705           0 :         displaySlideNumber( nSlideNumber );
    1706           0 : }
    1707             : 
    1708           0 : sal_Int32 SlideshowImpl::getCurrentSlideNumber()
    1709             : {
    1710           0 :     return mpSlideController.get() ? mpSlideController->getCurrentSlideNumber() : -1;
    1711             : }
    1712             : 
    1713           0 : sal_Int32 SlideshowImpl::getFirstSlideNumber()
    1714             : {
    1715           0 :     sal_Int32 nRet = 0;
    1716           0 :     if( mpSlideController.get() )
    1717             :     {
    1718           0 :         sal_Int32 nSlideIndexCount = mpSlideController->getSlideIndexCount() - 1;
    1719           0 :         if( nSlideIndexCount >= 0 )
    1720             :         {
    1721           0 :             nRet = mpSlideController->getSlideNumber( nSlideIndexCount );
    1722           0 :             while( nSlideIndexCount-- )
    1723             :             {
    1724           0 :                 sal_Int32 nTemp = mpSlideController->getSlideNumber( nSlideIndexCount );
    1725           0 :                 if( nRet > nTemp )
    1726           0 :                     nRet = nTemp;
    1727             :             }
    1728             :         }
    1729             :     }
    1730             : 
    1731           0 :     return nRet;
    1732             : }
    1733             : 
    1734           0 : sal_Int32 SlideshowImpl::getLastSlideNumber()
    1735             : {
    1736           0 :     sal_Int32 nRet = 0;
    1737           0 :     if( mpSlideController.get() )
    1738             :     {
    1739           0 :         sal_Int32 nSlideIndexCount = mpSlideController->getSlideIndexCount() - 1;
    1740           0 :         if( nSlideIndexCount >= 0 )
    1741             :         {
    1742           0 :             nRet = mpSlideController->getSlideNumber( nSlideIndexCount );
    1743           0 :             while( nSlideIndexCount-- )
    1744             :             {
    1745           0 :                 sal_Int32 nTemp = mpSlideController->getSlideNumber( nSlideIndexCount );
    1746           0 :                 if( nRet < nTemp )
    1747           0 :                     nRet = nTemp;
    1748             :             }
    1749             :         }
    1750             :     }
    1751             : 
    1752           0 :     return nRet;
    1753             : }
    1754             : 
    1755           0 : sal_Bool SAL_CALL SlideshowImpl::isEndless() throw( RuntimeException, std::exception )
    1756             : {
    1757           0 :     SolarMutexGuard aSolarGuard;
    1758           0 :     return maPresSettings.mbEndless;
    1759             : }
    1760             : 
    1761           0 : double SlideshowImpl::update()
    1762             : {
    1763           0 :     startUpdateTimer();
    1764           0 :     return -1;
    1765             : }
    1766             : 
    1767           0 : void SlideshowImpl::startUpdateTimer()
    1768             : {
    1769           0 :     SolarMutexGuard aSolarGuard;
    1770           0 :     maUpdateTimer.SetTimeout( 0 );
    1771           0 :     maUpdateTimer.Start();
    1772           0 : }
    1773             : 
    1774             : /** this timer is called 20ms after a new slide was displayed.
    1775             :     This is used to unfreeze user input that was disabled after
    1776             :     slide change to skip input that was buffered during slide
    1777             :     transition preparation */
    1778           0 : IMPL_LINK_NOARG_TYPED(SlideshowImpl, ReadyForNextInputHdl, Timer *, void)
    1779             : {
    1780           0 :     mbInputFreeze = false;
    1781           0 : }
    1782             : 
    1783             : /** if I catch someone someday who calls this method by hand
    1784             :     and not by using the timer, I will personaly punish this
    1785             :     person seriously, even if this person is me.
    1786             : */
    1787           0 : IMPL_LINK_NOARG_TYPED(SlideshowImpl, updateHdl, Timer *, void)
    1788             : {
    1789           0 :     updateSlideShow();
    1790           0 : }
    1791             : 
    1792           0 : IMPL_LINK_NOARG(SlideshowImpl, PostYieldListener)
    1793             : {
    1794             :     // prevent me from deletion when recursing (App::Reschedule does)
    1795           0 :     const rtl::Reference<SlideshowImpl> this_(this);
    1796             : 
    1797           0 :     Application::DisableNoYieldMode();
    1798           0 :     Application::RemovePostYieldListener(LINK(this, SlideshowImpl, PostYieldListener));
    1799           0 :     Application::Reschedule(true); // fix for fdo#32861 - process
    1800             :                                    // *all* outstanding events after
    1801             :                                    // yield is done.
    1802           0 :     if (mbDisposed)
    1803           0 :         return 0;
    1804           0 :     Application::Reschedule(true);
    1805           0 :     return updateSlideShow();
    1806             : }
    1807             : 
    1808           0 : sal_Int32 SlideshowImpl::updateSlideShow()
    1809             : {
    1810             :     // prevent me from deletion when recursing (App::EnableYieldMode does)
    1811           0 :     const rtl::Reference<SlideshowImpl> this_(this);
    1812             : 
    1813           0 :     Reference< XSlideShow > xShow( mxShow );
    1814           0 :     if ( ! xShow.is())
    1815           0 :         return 0;
    1816             : 
    1817             :     try
    1818             :     {
    1819             :         // TODO(Q3): Evaluate under various systems and setups,
    1820             :         // whether this is really necessary. Under WinXP and Matrox
    1821             :         // G550, the frame rates were much more steadier with this
    1822             :         // tweak, although.
    1823             : 
    1824             :         // currently no solution, because this kills sound (at least on Windows)
    1825             : 
    1826           0 :         double fUpdate = 0.0;
    1827           0 :         if( !xShow->update(fUpdate) )
    1828           0 :             fUpdate = -1.0;
    1829             : 
    1830           0 :         if (mxShow.is() && (fUpdate >= 0.0))
    1831             :         {
    1832           0 :             if (::basegfx::fTools::equalZero(fUpdate))
    1833             :             {
    1834             :                 // Use post yield listener for short update intervalls.
    1835           0 :                 Application::EnableNoYieldMode();
    1836           0 :                 Application::AddPostYieldListener(LINK(this, SlideshowImpl, PostYieldListener));
    1837             :             }
    1838             :             else
    1839             :             {
    1840             :                 // Avoid busy loop when the previous call to update()
    1841             :                 // returns a small positive number but not 0 (which is
    1842             :                 // handled above).  Also, make sure that calls to update()
    1843             :                 // have a minimum frequency.
    1844             :                 // => Allow up to 60 frames per second.  Call at least once
    1845             :                 // every 4 seconds.
    1846             :                 const static sal_Int32 mnMaximumFrameCount (60);
    1847             :                 const static double mnMinimumTimeout (1.0 / mnMaximumFrameCount);
    1848             :                 const static double mnMaximumTimeout (4.0);
    1849           0 :                 fUpdate = ::basegfx::clamp(fUpdate, mnMinimumTimeout, mnMaximumTimeout);
    1850             : 
    1851             :                 // Make sure that the maximum frame count has not been set
    1852             :                 // too high (only then conversion to milliseconds and long
    1853             :                 // integer may lead to zero value.)
    1854             :                 OSL_ASSERT(static_cast<sal_uLong>(fUpdate * 1000.0) > 0);
    1855             : 
    1856           0 :                 Application::DisableNoYieldMode();
    1857           0 :                 Application::RemovePostYieldListener(LINK(this, SlideshowImpl, PostYieldListener));
    1858             : 
    1859             :                 // Use a timer for the asynchronous callback.
    1860           0 :                 maUpdateTimer.SetTimeout(static_cast<sal_uLong>(fUpdate * 1000.0));
    1861           0 :                 maUpdateTimer.Start();
    1862             :             }
    1863             :         }
    1864             :     }
    1865           0 :     catch( Exception& )
    1866             :     {
    1867             :         OSL_FAIL(
    1868             :             OString(OString("sd::SlideshowImpl::updateSlideShow(), exception caught: ")
    1869             :                 + OUStringToOString(
    1870             :                     comphelper::anyToString( cppu::getCaughtException() ),
    1871             :                     RTL_TEXTENCODING_UTF8 )).getStr() );
    1872             :     }
    1873           0 :     return 0;
    1874             : }
    1875             : 
    1876           0 : bool SlideshowImpl::keyInput(const KeyEvent& rKEvt)
    1877             : {
    1878           0 :     if( !mxShow.is() || mbInputFreeze )
    1879           0 :         return false;
    1880             : 
    1881           0 :     bool bRet = true;
    1882             : 
    1883             :     try
    1884             :     {
    1885           0 :         const int nKeyCode = rKEvt.GetKeyCode().GetCode();
    1886           0 :         switch( nKeyCode )
    1887             :         {
    1888             :             case awt::Key::CONTEXTMENU:
    1889           0 :                 if( !mnContextMenuEvent )
    1890             :                 {
    1891           0 :                     if( mpShowWindow )
    1892           0 :                         maPopupMousePos = mpShowWindow->GetPointerState().maPos;
    1893           0 :                     mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
    1894             :                 }
    1895           0 :                 break;
    1896             : 
    1897             :             // cancel show
    1898             :             case KEY_ESCAPE:
    1899             :             case KEY_SUBTRACT:
    1900             :                 // in case the user cancels the presentation, switch to current slide
    1901             :                 // in edit mode
    1902           0 :                 if( mpSlideController.get() && (ANIMATIONMODE_SHOW == meAnimationMode) )
    1903             :                 {
    1904           0 :                     if( mpSlideController->getCurrentSlideNumber() != -1 )
    1905           0 :                         mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
    1906             :                 }
    1907           0 :                 endPresentation();
    1908           0 :                 break;
    1909             : 
    1910             :             // advance show
    1911             :             case KEY_PAGEDOWN:
    1912           0 :                 if(rKEvt.GetKeyCode().IsMod2())
    1913             :                 {
    1914           0 :                     gotoNextSlide();
    1915           0 :                     break;
    1916             :                 }
    1917             :                 // warning, fall through!
    1918             :             case KEY_SPACE:
    1919             :             case KEY_RIGHT:
    1920             :             case KEY_DOWN:
    1921             :             case KEY_N:
    1922           0 :                 gotoNextEffect();
    1923           0 :                 break;
    1924             : 
    1925             :             case KEY_RETURN:
    1926             :             {
    1927           0 :                 if( !maCharBuffer.isEmpty() )
    1928             :                 {
    1929           0 :                     if( mpSlideController.get() )
    1930             :                     {
    1931           0 :                         if( mpSlideController->jumpToSlideNumber( maCharBuffer.toInt32() - 1 ) )
    1932           0 :                             displayCurrentSlide();
    1933             :                     }
    1934           0 :                     maCharBuffer.clear();
    1935             :                 }
    1936             :                 else
    1937             :                 {
    1938           0 :                     gotoNextEffect();
    1939             :                 }
    1940             :             }
    1941           0 :             break;
    1942             : 
    1943             :             // numeric: add to buffer
    1944             :             case KEY_0:
    1945             :             case KEY_1:
    1946             :             case KEY_2:
    1947             :             case KEY_3:
    1948             :             case KEY_4:
    1949             :             case KEY_5:
    1950             :             case KEY_6:
    1951             :             case KEY_7:
    1952             :             case KEY_8:
    1953             :             case KEY_9:
    1954           0 :                 maCharBuffer += OUString( rKEvt.GetCharCode() );
    1955           0 :                 break;
    1956             : 
    1957             :             case KEY_PAGEUP:
    1958           0 :                 if(rKEvt.GetKeyCode().IsMod2())
    1959             :                 {
    1960           0 :                     gotoPreviousSlide();
    1961           0 :                     break;
    1962             :                 }
    1963             :                 // warning, fall through!
    1964             :             case KEY_LEFT:
    1965             :             case KEY_UP:
    1966             :             case KEY_P:
    1967             :             case KEY_BACKSPACE:
    1968           0 :                 gotoPreviousEffect();
    1969           0 :                 break;
    1970             : 
    1971             :             case KEY_HOME:
    1972           0 :                 gotoFirstSlide();
    1973           0 :                 break;
    1974             : 
    1975             :             case KEY_END:
    1976           0 :                 gotoLastSlide();
    1977           0 :                 break;
    1978             : 
    1979             :             case KEY_B:
    1980             :             case KEY_W:
    1981             :             case KEY_POINT:
    1982             :             case KEY_COMMA:
    1983             :             {
    1984           0 :                 blankScreen( ((nKeyCode == KEY_W ) || (nKeyCode == KEY_COMMA)) ? 0x00ffffff : 0x00000000 );
    1985             :             }
    1986           0 :             break;
    1987             : 
    1988             :             default:
    1989           0 :                 bRet = false;
    1990           0 :             break;
    1991             :         }
    1992             :     }
    1993           0 :     catch( Exception& )
    1994             :     {
    1995           0 :         bRet = false;
    1996             :         OSL_FAIL(
    1997             :             OString(OString("sd::SlideshowImpl::keyInput(), "
    1998             :                     "exception caught: ") +
    1999             :             OUStringToOString(
    2000             :                 comphelper::anyToString( cppu::getCaughtException() ),
    2001             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    2002             :     }
    2003             : 
    2004           0 :     return bRet;
    2005             : }
    2006             : 
    2007           0 : IMPL_LINK( SlideshowImpl, EventListenerHdl, VclSimpleEvent*, pEvent )
    2008             : {
    2009           0 :     if( !mxShow.is() || mbInputFreeze )
    2010           0 :         return 0;
    2011             : 
    2012           0 :     if( pEvent && (pEvent->GetId() == VCLEVENT_WINDOW_COMMAND) && static_cast<VclWindowEvent*>(pEvent)->GetData() )
    2013             :     {
    2014           0 :         const CommandEvent& rEvent = *static_cast<const CommandEvent*>(static_cast<VclWindowEvent*>(pEvent)->GetData());
    2015             : 
    2016           0 :         if( rEvent.GetCommand() == CommandEventId::Media )
    2017             :         {
    2018           0 :             CommandMediaData* pMediaData = rEvent.GetMediaData();
    2019           0 :             pMediaData->SetPassThroughToOS(false);
    2020           0 :             switch (pMediaData->GetMediaId())
    2021             :             {
    2022             : #if defined( MACOSX )
    2023             :             case MediaCommand::Menu:
    2024             :                 if( !mnContextMenuEvent )
    2025             :                 {
    2026             :                 if( mpShowWindow )
    2027             :                     maPopupMousePos = mpShowWindow->GetPointerState().maPos;
    2028             :                 mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
    2029             :                 }
    2030             :                 break;
    2031             :             case MediaCommand::VolumeDown:
    2032             :                 gotoPreviousSlide();
    2033             :                 break;
    2034             :             case MediaCommand::VolumeUp:
    2035             :                 gotoNextEffect();
    2036             :                 break;
    2037             : #endif
    2038             :             case MediaCommand::NextTrack:
    2039           0 :                 gotoNextEffect();
    2040           0 :                 break;
    2041             :             case MediaCommand::Pause:
    2042           0 :                 if( !mbIsPaused )
    2043           0 :                     blankScreen(0);
    2044           0 :                 break;
    2045             :             case MediaCommand::Play:
    2046           0 :                 if( mbIsPaused )
    2047           0 :                     resume();
    2048           0 :                 break;
    2049             : 
    2050             :             case MediaCommand::PlayPause:
    2051           0 :                 if( mbIsPaused )
    2052           0 :                     resume();
    2053             :                 else
    2054           0 :                     blankScreen(0);
    2055           0 :                 break;
    2056             :             case MediaCommand::PreviousTrack:
    2057           0 :                 gotoPreviousSlide();
    2058           0 :                 break;
    2059             :             case MediaCommand::NextTrackHold:
    2060           0 :                 gotoLastSlide();
    2061           0 :                 break;
    2062             : 
    2063             :             case MediaCommand::Rewind:
    2064           0 :                 gotoFirstSlide();
    2065           0 :                 break;
    2066             :             case MediaCommand::Stop:
    2067             :                 // in case the user cancels the presentation, switch to current slide
    2068             :                 // in edit mode
    2069           0 :                 if( mpSlideController.get() && (ANIMATIONMODE_SHOW == meAnimationMode) )
    2070             :                 {
    2071           0 :                     if( mpSlideController->getCurrentSlideNumber() != -1 )
    2072           0 :                         mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
    2073             :                 }
    2074           0 :                 endPresentation();
    2075           0 :                 break;
    2076             :             default:
    2077           0 :                 pMediaData->SetPassThroughToOS(true);
    2078           0 :                 break;
    2079             :             }
    2080             :         }
    2081             :     }
    2082             : 
    2083           0 :     return 0;
    2084             : }
    2085             : 
    2086           0 : void SlideshowImpl::mouseButtonUp(const MouseEvent& rMEvt)
    2087             : {
    2088           0 :     if( rMEvt.IsRight() && !mnContextMenuEvent )
    2089             :     {
    2090           0 :         maPopupMousePos = rMEvt.GetPosPixel();
    2091           0 :         mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
    2092             :     }
    2093           0 : }
    2094             : 
    2095           0 : IMPL_LINK_NOARG(SlideshowImpl, ContextMenuHdl)
    2096             : {
    2097           0 :     mnContextMenuEvent = 0;
    2098             : 
    2099           0 :     if( mpSlideController.get() == 0 )
    2100           0 :         return 0;
    2101             : 
    2102           0 :     mbWasPaused = mbIsPaused;
    2103           0 :     if( !mbWasPaused )
    2104           0 :         pause();
    2105             : 
    2106           0 :     PopupMenu* pMenu = new PopupMenu( SdResId( RID_SLIDESHOW_CONTEXTMENU ) );
    2107             : 
    2108             :     // Adding button to display if in Pen  mode
    2109           0 :     pMenu->CheckItem( CM_PEN_MODE, mbUsePen);
    2110             : 
    2111           0 :     const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
    2112           0 :     pMenu->EnableItem( CM_NEXT_SLIDE, ( mpSlideController->getNextSlideIndex() != -1 ) );
    2113           0 :     pMenu->EnableItem( CM_PREV_SLIDE, ( mpSlideController->getPreviousSlideIndex() != -1 ) || (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) );
    2114           0 :     pMenu->EnableItem( CM_EDIT_PRESENTATION, mpViewShell->GetDoc()->IsStartWithPresentation());
    2115             : 
    2116           0 :     PopupMenu* pPageMenu = pMenu->GetPopupMenu( CM_GOTO );
    2117             : 
    2118           0 :     SfxViewFrame* pViewFrame = getViewFrame();
    2119           0 :     if( pViewFrame )
    2120             :     {
    2121           0 :         Reference< ::com::sun::star::frame::XFrame > xFrame( pViewFrame->GetFrame().GetFrameInterface() );
    2122           0 :         if( xFrame.is() )
    2123             :         {
    2124           0 :             pMenu->SetItemImage( CM_NEXT_SLIDE, GetImage( xFrame, "slot:10617" , false ) );
    2125           0 :             pMenu->SetItemImage( CM_PREV_SLIDE, GetImage( xFrame, "slot:10618" , false ) );
    2126             : 
    2127           0 :             if( pPageMenu )
    2128             :             {
    2129           0 :                 pPageMenu->SetItemImage( CM_FIRST_SLIDE, GetImage( xFrame, "slot:10616" , false ) );
    2130           0 :                 pPageMenu->SetItemImage( CM_LAST_SLIDE, GetImage( xFrame, "slot:10619" , false ) );
    2131             :             }
    2132           0 :         }
    2133             :     }
    2134             : 
    2135             :     // populate slide goto list
    2136           0 :     if( pPageMenu )
    2137             :     {
    2138           0 :         const sal_Int32 nPageNumberCount = mpSlideController->getSlideNumberCount();
    2139           0 :         if( nPageNumberCount <= 1 )
    2140             :         {
    2141           0 :             pMenu->EnableItem( CM_GOTO, false );
    2142             :         }
    2143             :         else
    2144             :         {
    2145           0 :             sal_Int32 nCurrentSlideNumber = mpSlideController->getCurrentSlideNumber();
    2146           0 :             if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
    2147           0 :                 nCurrentSlideNumber = -1;
    2148             : 
    2149           0 :             pPageMenu->EnableItem( CM_FIRST_SLIDE, ( mpSlideController->getSlideNumber(0) != nCurrentSlideNumber ) );
    2150           0 :             pPageMenu->EnableItem( CM_LAST_SLIDE, ( mpSlideController->getSlideNumber( mpSlideController->getSlideIndexCount() - 1) != nCurrentSlideNumber ) );
    2151             : 
    2152             :             sal_Int32 nPageNumber;
    2153             : 
    2154           0 :             for( nPageNumber = 0; nPageNumber < nPageNumberCount; nPageNumber++ )
    2155             :             {
    2156           0 :                 if( mpSlideController->isVisibleSlideNumber( nPageNumber ) )
    2157             :                 {
    2158           0 :                     SdPage* pPage = mpDoc->GetSdPage((sal_uInt16)nPageNumber, PK_STANDARD);
    2159           0 :                     if (pPage)
    2160             :                     {
    2161           0 :                         pPageMenu->InsertItem( (sal_uInt16)(CM_SLIDES + nPageNumber), pPage->GetName() );
    2162           0 :                         if( nPageNumber == nCurrentSlideNumber )
    2163           0 :                             pPageMenu->CheckItem( (sal_uInt16)(CM_SLIDES + nPageNumber) );
    2164             :                     }
    2165             :                 }
    2166             :             }
    2167             :         }
    2168             :     }
    2169             : 
    2170           0 :     if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK )
    2171             :     {
    2172           0 :         PopupMenu* pBlankMenu = pMenu->GetPopupMenu( CM_SCREEN );
    2173           0 :         if( pBlankMenu )
    2174             :         {
    2175           0 :             pBlankMenu->CheckItem( ( mpShowWindow->GetBlankColor() == Color( COL_WHITE ) ) ? CM_SCREEN_WHITE : CM_SCREEN_BLACK  );
    2176             :         }
    2177             :     }
    2178             : 
    2179           0 :     PopupMenu* pWidthMenu = pMenu->GetPopupMenu( CM_WIDTH_PEN);
    2180             : 
    2181             :     // populate color width list
    2182           0 :     if( pWidthMenu )
    2183             :     {
    2184             :         sal_Int32 nIterator;
    2185             :         double nWidth;
    2186             : 
    2187           0 :         nWidth = 4.0;
    2188           0 :         for( nIterator = 1; nIterator < 6; nIterator++)
    2189             :         {
    2190           0 :             switch(nIterator)
    2191             :             {
    2192             :                 case 1:
    2193           0 :                     nWidth = 4.0;
    2194           0 :                     break;
    2195             :                 case 2:
    2196           0 :                     nWidth = 100.0;
    2197           0 :                     break;
    2198             :                 case 3:
    2199           0 :                     nWidth = 150.0;
    2200           0 :                     break;
    2201             :                 case 4:
    2202           0 :                     nWidth = 200.0;
    2203           0 :                     break;
    2204             :                 case 5:
    2205           0 :                     nWidth = 400.0;
    2206           0 :                     break;
    2207             :                 default:
    2208           0 :                     break;
    2209             :             }
    2210             : 
    2211           0 :             pWidthMenu->EnableItem( (sal_uInt16)(CM_WIDTH_PEN + nIterator), true);
    2212           0 :             if( nWidth ==  mdUserPaintStrokeWidth)
    2213           0 :                 pWidthMenu->CheckItem( (sal_uInt16)(CM_WIDTH_PEN + nIterator) );
    2214             :         }
    2215             :     }
    2216             : 
    2217           0 :     pMenu->SetSelectHdl( LINK( this, SlideshowImpl, ContextMenuSelectHdl ) );
    2218           0 :     pMenu->Execute( mpShowWindow, maPopupMousePos );
    2219           0 :     delete pMenu;
    2220             : 
    2221           0 :     if( mxView.is() )
    2222           0 :         mxView->ignoreNextMouseReleased();
    2223             : 
    2224           0 :     if( !mbWasPaused )
    2225           0 :         resume();
    2226           0 :     return 0;
    2227             : }
    2228             : 
    2229           0 : IMPL_LINK( SlideshowImpl, ContextMenuSelectHdl, Menu *, pMenu )
    2230             : {
    2231           0 :     if( pMenu )
    2232             :     {
    2233           0 :         sal_uInt16 nMenuId = pMenu->GetCurItemId();
    2234             : 
    2235           0 :         switch( nMenuId )
    2236             :         {
    2237             :         case CM_PREV_SLIDE:
    2238           0 :             gotoPreviousSlide();
    2239           0 :             mbWasPaused = false;
    2240           0 :             break;
    2241             :         case CM_NEXT_SLIDE:
    2242           0 :             gotoNextSlide();
    2243           0 :             mbWasPaused = false;
    2244           0 :             break;
    2245             :         case CM_FIRST_SLIDE:
    2246           0 :             gotoFirstSlide();
    2247           0 :             mbWasPaused = false;
    2248           0 :             break;
    2249             :         case CM_LAST_SLIDE:
    2250           0 :             gotoLastSlide();
    2251           0 :             mbWasPaused = false;
    2252           0 :             break;
    2253             :         case CM_SCREEN_BLACK:
    2254             :         case CM_SCREEN_WHITE:
    2255             :         {
    2256           0 :             const Color aBlankColor( (nMenuId == CM_SCREEN_WHITE) ? COL_WHITE : COL_BLACK );
    2257           0 :             if( mbWasPaused )
    2258             :             {
    2259           0 :                 if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK )
    2260             :                 {
    2261           0 :                     if( mpShowWindow->GetBlankColor() == aBlankColor )
    2262             :                     {
    2263           0 :                         mbWasPaused = false;
    2264           0 :                         mpShowWindow->RestartShow();
    2265           0 :                         break;
    2266             :                     }
    2267             :                 }
    2268           0 :                 mpShowWindow->RestartShow();
    2269             :             }
    2270           0 :             if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), aBlankColor ) )
    2271             :             {
    2272           0 :                 pause();
    2273           0 :                 mbWasPaused = true;
    2274             :             }
    2275             :         }
    2276           0 :         break;
    2277             :         case CM_COLOR_PEN:
    2278             :             {
    2279             :                 //Open a color picker based on SvColorDialog
    2280           0 :                 ::Color aColor( mnUserPaintColor );
    2281           0 :                 SvColorDialog aColorDlg( mpShowWindow);
    2282           0 :                 aColorDlg.SetColor( aColor );
    2283             : 
    2284           0 :                 if (aColorDlg.Execute() )
    2285             :                 {
    2286           0 :                     aColor = aColorDlg.GetColor();
    2287           0 :                     setPenColor(aColor.GetColor());
    2288             :                 }
    2289           0 :                 mbWasPaused = false;
    2290             :             }
    2291           0 :             break;
    2292             : 
    2293             :         case CM_WIDTH_PEN_VERY_THIN:
    2294             :             {
    2295           0 :                 setPenWidth(4.0);
    2296           0 :                 mbWasPaused = false;
    2297             :             }
    2298           0 :             break;
    2299             : 
    2300             :         case CM_WIDTH_PEN_THIN:
    2301             :             {
    2302           0 :                 setPenWidth(100.0);
    2303           0 :                 mbWasPaused = false;
    2304             :             }
    2305           0 :             break;
    2306             : 
    2307             :         case CM_WIDTH_PEN_NORMAL:
    2308             :             {
    2309           0 :                 setPenWidth(150.0);
    2310           0 :                 mbWasPaused = false;
    2311             :             }
    2312           0 :             break;
    2313             : 
    2314             :         case CM_WIDTH_PEN_THICK:
    2315             :             {
    2316           0 :                 setPenWidth(200.0);
    2317           0 :                 mbWasPaused = false;
    2318             :             }
    2319           0 :             break;
    2320             : 
    2321             :         case CM_WIDTH_PEN_VERY_THICK:
    2322             :             {
    2323           0 :                 setPenWidth(400.0);
    2324           0 :                 mbWasPaused = false;
    2325             :             }
    2326           0 :             break;
    2327             :         case CM_ERASE_ALLINK:
    2328             :             {
    2329           0 :                 setEraseAllInk(true);
    2330           0 :                     mbWasPaused = false;
    2331             :             }
    2332           0 :             break;
    2333             :         case CM_PEN_MODE:
    2334             :             {
    2335           0 :                 setUsePen(!mbUsePen);
    2336           0 :                 mbWasPaused = false;
    2337             :             }
    2338           0 :             break;
    2339             :         case CM_EDIT_PRESENTATION:
    2340             :             // When in autoplay mode (pps/ppsx), offer editing of the presentation
    2341             :             // Turn autostart off, else Impress will close when exiting the Presentation
    2342           0 :             mpViewShell->GetDoc()->SetExitAfterPresenting(false);
    2343           0 :             if( mpSlideController.get() && (ANIMATIONMODE_SHOW == meAnimationMode) )
    2344             :             {
    2345           0 :                 if( mpSlideController->getCurrentSlideNumber() != -1 )
    2346             :                 {
    2347           0 :                     mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
    2348             :                 }
    2349             :             }
    2350           0 :             endPresentation();
    2351           0 :             break;
    2352             :         case CM_ENDSHOW:
    2353             :             // in case the user cancels the presentation, switch to current slide
    2354             :             // in edit mode
    2355           0 :             if( mpSlideController.get() && (ANIMATIONMODE_SHOW == meAnimationMode) )
    2356             :             {
    2357           0 :                 if( mpSlideController->getCurrentSlideNumber() != -1 )
    2358             :                 {
    2359           0 :                     mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
    2360             :                 }
    2361             :             }
    2362           0 :             endPresentation();
    2363           0 :             break;
    2364             :         default:
    2365           0 :             sal_Int32 nPageNumber = nMenuId - CM_SLIDES;
    2366           0 :             const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
    2367           0 :             if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
    2368             :             {
    2369           0 :                 mpShowWindow->RestartShow( nPageNumber );
    2370             :             }
    2371           0 :             else if( nPageNumber != mpSlideController->getCurrentSlideNumber() )
    2372             :             {
    2373           0 :                 displaySlideNumber( nPageNumber );
    2374             :             }
    2375           0 :             mbWasPaused = false;
    2376           0 :             break;
    2377             :         }
    2378             :     }
    2379             : 
    2380           0 :     return 0;
    2381             : }
    2382             : 
    2383           0 : Reference< XSlideShow > SlideshowImpl::createSlideShow()
    2384             : {
    2385           0 :     Reference< XSlideShow > xShow;
    2386             : 
    2387             :     try
    2388             :     {
    2389             :         Reference< uno::XComponentContext > xContext =
    2390           0 :             ::comphelper::getProcessComponentContext();
    2391             : 
    2392           0 :         xShow.set( presentation::SlideShow::create(xContext), UNO_QUERY_THROW );
    2393             :     }
    2394           0 :     catch( uno::Exception& )
    2395             :     {
    2396             :         OSL_FAIL(
    2397             :             OString(OString("sd::SlideshowImpl::createSlideShow(), "
    2398             :                      "exception caught: ") +
    2399             :              OUStringToOString(
    2400             :                  comphelper::anyToString( cppu::getCaughtException() ),
    2401             :                  RTL_TEXTENCODING_UTF8 )).getStr() );
    2402             :     }
    2403             : 
    2404           0 :     return xShow;
    2405             : }
    2406             : 
    2407           0 : void SlideshowImpl::createSlideList( bool bAll, const OUString& rPresSlide )
    2408             : {
    2409           0 :     const sal_uInt16 nSlideCount = mpDoc->GetSdPageCount( PK_STANDARD );
    2410             : 
    2411           0 :     if( nSlideCount )
    2412             :     {
    2413             :         SdCustomShow*   pCustomShow;
    2414             : 
    2415           0 :         if( mpDoc->GetCustomShowList() && maPresSettings.mbCustomShow )
    2416           0 :             pCustomShow = mpDoc->GetCustomShowList()->GetCurObject();
    2417             :         else
    2418           0 :             pCustomShow = NULL;
    2419             : 
    2420             :         // create animation slide controller
    2421             :         AnimationSlideController::Mode eMode =
    2422           0 :             ( pCustomShow && pCustomShow->PagesVector().size() ) ? AnimationSlideController::CUSTOM :
    2423           0 :                 (bAll ? AnimationSlideController::ALL : AnimationSlideController::FROM);
    2424             : 
    2425           0 :         Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW );
    2426           0 :         Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
    2427           0 :         mpSlideController.reset( new AnimationSlideController( xSlides, eMode ) );
    2428             : 
    2429           0 :         if( eMode != AnimationSlideController::CUSTOM )
    2430             :         {
    2431           0 :             sal_Int32 nFirstVisibleSlide = 0;
    2432             : 
    2433             :             // normal presentation
    2434           0 :             if( !rPresSlide.isEmpty() )
    2435             :             {
    2436             :                 sal_Int32 nSlide;
    2437           0 :                 bool bTakeNextAvailable = false;
    2438             : 
    2439           0 :                 for( nSlide = 0, nFirstVisibleSlide = -1;
    2440           0 :                     ( nSlide < nSlideCount ) && ( -1 == nFirstVisibleSlide ); nSlide++ )
    2441             :                 {
    2442           0 :                     SdPage* pTestSlide = mpDoc->GetSdPage( (sal_uInt16)nSlide, PK_STANDARD );
    2443             : 
    2444           0 :                     if( pTestSlide->GetName() == rPresSlide )
    2445             :                     {
    2446           0 :                         if( pTestSlide->IsExcluded() )
    2447           0 :                             bTakeNextAvailable = true;
    2448             :                         else
    2449           0 :                             nFirstVisibleSlide = nSlide;
    2450             :                     }
    2451           0 :                     else if( bTakeNextAvailable && !pTestSlide->IsExcluded() )
    2452           0 :                         nFirstVisibleSlide = nSlide;
    2453             :                 }
    2454             : 
    2455           0 :                 if( -1 == nFirstVisibleSlide )
    2456           0 :                     nFirstVisibleSlide = 0;
    2457             :             }
    2458             : 
    2459           0 :             for( sal_Int32 i = 0; i < nSlideCount; i++ )
    2460             :             {
    2461           0 :                 bool bVisible = !( mpDoc->GetSdPage( (sal_uInt16)i, PK_STANDARD ) )->IsExcluded();
    2462           0 :                 if( bVisible || (eMode == AnimationSlideController::ALL) )
    2463           0 :                     mpSlideController->insertSlideNumber( i, bVisible );
    2464             :             }
    2465             : 
    2466           0 :             mpSlideController->setStartSlideNumber( nFirstVisibleSlide );
    2467             :         }
    2468             :         else
    2469             :         {
    2470           0 :             if( meAnimationMode != ANIMATIONMODE_SHOW && !rPresSlide.isEmpty() )
    2471             :             {
    2472             :                 sal_Int32 nSlide;
    2473           0 :                 for( nSlide = 0; nSlide < nSlideCount; nSlide++ )
    2474           0 :                     if( rPresSlide == mpDoc->GetSdPage( (sal_uInt16) nSlide, PK_STANDARD )->GetName() )
    2475           0 :                         break;
    2476             : 
    2477           0 :                 if( nSlide < nSlideCount )
    2478           0 :                     mpSlideController->insertSlideNumber( (sal_uInt16) nSlide );
    2479             :             }
    2480             : 
    2481           0 :             sal_Int32 nSlideIndex = 0;
    2482           0 :             for( SdCustomShow::PageVec::iterator it = pCustomShow->PagesVector().begin();
    2483           0 :                  it != pCustomShow->PagesVector().end(); ++it, nSlideIndex++ )
    2484             :             {
    2485           0 :                 const sal_uInt16 nSdSlide = ( (*it)->GetPageNum() - 1 ) / 2;
    2486             : 
    2487           0 :                 if( !( mpDoc->GetSdPage( nSdSlide, PK_STANDARD ) )->IsExcluded())
    2488           0 :                     mpSlideController->insertSlideNumber( nSdSlide );
    2489             :             }
    2490           0 :         }
    2491             :     }
    2492           0 : }
    2493             : 
    2494             : typedef sal_uInt16 (*FncGetChildWindowId)();
    2495             : 
    2496             : FncGetChildWindowId aShowChildren[] =
    2497             : {
    2498             :     &AnimationChildWindow::GetChildWindowId,
    2499             :     &Svx3DChildWindow::GetChildWindowId,
    2500             :     &SvxFontWorkChildWindow::GetChildWindowId,
    2501             :     &SvxColorChildWindow::GetChildWindowId,
    2502             :     &SvxSearchDialogWrapper::GetChildWindowId,
    2503             :     &SvxBmpMaskChildWindow::GetChildWindowId,
    2504             :     &SvxIMapDlgChildWindow::GetChildWindowId,
    2505             :     &SvxHlinkDlgWrapper::GetChildWindowId,
    2506             :     &SfxInfoBarContainerChild::GetChildWindowId
    2507             : };
    2508             : 
    2509             : #define NAVIGATOR_CHILD_MASK        0x80000000UL
    2510             : 
    2511           0 : void SlideshowImpl::hideChildWindows()
    2512             : {
    2513           0 :     mnChildMask = 0UL;
    2514             : 
    2515           0 :     if( ANIMATIONMODE_SHOW == meAnimationMode )
    2516             :     {
    2517           0 :         SfxViewFrame* pViewFrame = getViewFrame();
    2518             : 
    2519           0 :         if( pViewFrame )
    2520             :         {
    2521           0 :             if( pViewFrame->GetChildWindow( SID_NAVIGATOR ) != NULL )
    2522           0 :                 mnChildMask |= NAVIGATOR_CHILD_MASK;
    2523             : 
    2524           0 :             for( sal_uLong i = 0, nCount = sizeof( aShowChildren ) / sizeof( FncGetChildWindowId ); i < nCount; i++ )
    2525             :             {
    2526           0 :                 const sal_uInt16 nId = ( *aShowChildren[ i ] )();
    2527             : 
    2528           0 :                 if( pViewFrame->GetChildWindow( nId ) )
    2529             :                 {
    2530           0 :                     pViewFrame->SetChildWindow( nId, false );
    2531           0 :                     mnChildMask |= 1 << i;
    2532             :                 }
    2533             :             }
    2534             :         }
    2535             :     }
    2536           0 : }
    2537             : 
    2538           0 : void SlideshowImpl::showChildWindows()
    2539             : {
    2540           0 :     if( ANIMATIONMODE_SHOW == meAnimationMode )
    2541             :     {
    2542           0 :         SfxViewFrame* pViewFrame = getViewFrame();
    2543           0 :         if( pViewFrame )
    2544             :         {
    2545           0 :             pViewFrame->SetChildWindow( SID_NAVIGATOR, ( mnChildMask & NAVIGATOR_CHILD_MASK ) != 0 );
    2546             : 
    2547           0 :             for( sal_uLong i = 0, nCount = sizeof( aShowChildren ) / sizeof( FncGetChildWindowId ); i < nCount; i++ )
    2548             :             {
    2549           0 :                 if( mnChildMask & ( 1 << i ) )
    2550           0 :                     pViewFrame->SetChildWindow( ( *aShowChildren[ i ] )(), true );
    2551             :             }
    2552             :         }
    2553             :     }
    2554           0 : }
    2555             : 
    2556           0 : SfxViewFrame* SlideshowImpl::getViewFrame() const
    2557             : {
    2558           0 :     return mpViewShell ? mpViewShell->GetViewFrame() : 0;
    2559             : }
    2560             : 
    2561           0 : SfxDispatcher* SlideshowImpl::getDispatcher() const
    2562             : {
    2563           0 :     return (mpViewShell && mpViewShell->GetViewFrame()) ? mpViewShell->GetViewFrame()->GetDispatcher() : 0;
    2564             : }
    2565             : 
    2566           0 : SfxBindings* SlideshowImpl::getBindings() const
    2567             : {
    2568           0 :     return (mpViewShell && mpViewShell->GetViewFrame()) ? &mpViewShell->GetViewFrame()->GetBindings() : 0;
    2569             : }
    2570             : 
    2571           0 : void SlideshowImpl::resize( const Size& rSize )
    2572             : {
    2573           0 :     maPresSize = rSize;
    2574             : 
    2575           0 :     if(mpShowWindow)
    2576             :     {
    2577           0 :         mpShowWindow->SetSizePixel( maPresSize );
    2578           0 :         mpShowWindow->Show();
    2579             :     }
    2580             : 
    2581           0 :     if( mxView.is() ) try
    2582             :     {
    2583           0 :         awt::WindowEvent aEvt;
    2584           0 :         mxView->windowResized(aEvt);
    2585             :     }
    2586           0 :     catch( Exception& )
    2587             :     {
    2588             :         OSL_FAIL(
    2589             :             OString(OString("sd::SlideshowImpl::resize(), "
    2590             :                     "exception caught: ") +
    2591             :             OUStringToOString(
    2592             :                 comphelper::anyToString( cppu::getCaughtException() ),
    2593             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    2594             :     }
    2595           0 : }
    2596             : 
    2597           0 : void SlideshowImpl::setActiveXToolbarsVisible( bool bVisible )
    2598             : {
    2599             :     // in case of ActiveX control the toolbars should not be visible if slide show runs in window mode
    2600             :     // actually it runs always in window mode in case of ActiveX control
    2601           0 :     if ( !maPresSettings.mbFullScreen && mpDocSh && mpDocSh->GetMedium() )
    2602             :     {
    2603           0 :         SFX_ITEMSET_ARG( mpDocSh->GetMedium()->GetItemSet(), pItem, SfxBoolItem, SID_VIEWONLY, false );
    2604           0 :         if ( pItem && pItem->GetValue() )
    2605             :         {
    2606             :             // this is a plugin/activex mode, no toolbars should be visible during slide show
    2607             :             // after the end of slide show they should be visible again
    2608           0 :             SfxViewFrame* pViewFrame = getViewFrame();
    2609           0 :             if( pViewFrame )
    2610             :             {
    2611             :                 try
    2612             :                 {
    2613           0 :                     Reference< frame::XLayoutManager > xLayoutManager;
    2614           0 :                     Reference< beans::XPropertySet > xFrameProps( pViewFrame->GetFrame().GetTopFrame().GetFrameInterface(), UNO_QUERY_THROW );
    2615           0 :                     if ( ( xFrameProps->getPropertyValue( "LayoutManager" )
    2616           0 :                                 >>= xLayoutManager )
    2617           0 :                       && xLayoutManager.is() )
    2618             :                     {
    2619           0 :                         xLayoutManager->setVisible( bVisible );
    2620           0 :                     }
    2621             :                 }
    2622           0 :                 catch( uno::Exception& )
    2623             :                 {}
    2624             :             }
    2625             :         }
    2626             :     }
    2627           0 : }
    2628             : 
    2629           0 : void SAL_CALL SlideshowImpl::activate() throw (RuntimeException, std::exception)
    2630             : {
    2631           0 :     SolarMutexGuard aSolarGuard;
    2632             : 
    2633           0 :     maDeactivateTimer.Stop();
    2634             : 
    2635           0 :     if( !mbActive && mxShow.is() )
    2636             :     {
    2637           0 :         mbActive = true;
    2638             : 
    2639           0 :         if( ANIMATIONMODE_SHOW == meAnimationMode )
    2640             :         {
    2641           0 :             if( mbAutoSaveWasOn )
    2642           0 :                 setAutoSaveState( false );
    2643             : 
    2644           0 :             if( mpShowWindow )
    2645             :             {
    2646           0 :                 SfxViewFrame* pViewFrame = getViewFrame();
    2647           0 :                 SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : 0;
    2648             : 
    2649           0 :                 hideChildWindows();
    2650             : 
    2651           0 :                 if( pDispatcher )
    2652             :                 {
    2653             :                     // filter all forbbiden slots
    2654           0 :                     pDispatcher->SetSlotFilter( SfxSlotFilterState::ENABLED, sizeof(pAllowed) / sizeof(sal_uInt16), pAllowed );
    2655             :                 }
    2656             : 
    2657           0 :                 if( getBindings() )
    2658           0 :                     getBindings()->InvalidateAll(true);
    2659             : 
    2660           0 :                 mpShowWindow->GrabFocus();
    2661             :             }
    2662             :         }
    2663             : 
    2664           0 :         resume();
    2665           0 :     }
    2666           0 : }
    2667             : 
    2668           0 : void SAL_CALL SlideshowImpl::deactivate() throw (RuntimeException, std::exception)
    2669             : {
    2670           0 :     SolarMutexGuard aSolarGuard;
    2671             : 
    2672           0 :     if( mbActive && mxShow.is() )
    2673             :     {
    2674           0 :         maDeactivateTimer.Start();
    2675           0 :     }
    2676           0 : }
    2677             : 
    2678           0 : IMPL_LINK_NOARG_TYPED(SlideshowImpl, deactivateHdl, Timer *, void)
    2679             : {
    2680           0 :     if( mbActive && mxShow.is() )
    2681             :     {
    2682           0 :         mbActive = false;
    2683             : 
    2684           0 :         pause();
    2685             : 
    2686           0 :         if( ANIMATIONMODE_SHOW == meAnimationMode )
    2687             :         {
    2688           0 :             if( mbAutoSaveWasOn )
    2689           0 :                 setAutoSaveState( true );
    2690             : 
    2691           0 :             if( mpShowWindow )
    2692             :             {
    2693           0 :                 showChildWindows();
    2694             :             }
    2695             :         }
    2696             :     }
    2697           0 : }
    2698             : 
    2699           0 : sal_Bool SAL_CALL SlideshowImpl::isActive() throw (RuntimeException, std::exception)
    2700             : {
    2701           0 :     SolarMutexGuard aSolarGuard;
    2702           0 :     return mbActive;
    2703             : }
    2704             : 
    2705           0 : void SlideshowImpl::receiveRequest(SfxRequest& rReq)
    2706             : {
    2707           0 :     const SfxItemSet* pArgs      = rReq.GetArgs();
    2708             : 
    2709           0 :     switch ( rReq.GetSlot() )
    2710             :     {
    2711             :         case SID_NAVIGATOR_PEN:
    2712           0 :             setUsePen(!mbUsePen);
    2713           0 :         break;
    2714             : 
    2715             :         case SID_NAVIGATOR_PAGE:
    2716             :         {
    2717           0 :             PageJump    eJump = (PageJump)static_cast<const SfxAllEnumItem&>( pArgs->Get(SID_NAVIGATOR_PAGE)).GetValue();
    2718           0 :             switch( eJump )
    2719             :             {
    2720           0 :                 case PAGE_FIRST:        gotoFirstSlide(); break;
    2721           0 :                 case PAGE_LAST:         gotoLastSlide(); break;
    2722           0 :                 case PAGE_NEXT:         gotoNextSlide(); break;
    2723           0 :                 case PAGE_PREVIOUS:     gotoPreviousSlide(); break;
    2724           0 :                 case PAGE_NONE:         break;
    2725             :             }
    2726             :         }
    2727           0 :         break;
    2728             : 
    2729             :         case SID_NAVIGATOR_OBJECT:
    2730             :         {
    2731           0 :             const OUString aTarget( static_cast<const SfxStringItem&>(pArgs->Get(SID_NAVIGATOR_OBJECT)).GetValue() );
    2732             : 
    2733             :             // is the bookmark a Slide?
    2734             :             bool        bIsMasterPage;
    2735           0 :             sal_uInt16  nPgNum = mpDoc->GetPageByName( aTarget, bIsMasterPage );
    2736           0 :             SdrObject*  pObj   = NULL;
    2737             : 
    2738           0 :             if( nPgNum == SDRPAGE_NOTFOUND )
    2739             :             {
    2740             :                 // is the bookmark an object?
    2741           0 :                 pObj = mpDoc->GetObj( aTarget );
    2742             : 
    2743           0 :                 if( pObj )
    2744           0 :                     nPgNum = pObj->GetPage()->GetPageNum();
    2745             :             }
    2746             : 
    2747           0 :             if( nPgNum != SDRPAGE_NOTFOUND )
    2748             :             {
    2749           0 :                 nPgNum = ( nPgNum - 1 ) >> 1;
    2750           0 :                 displaySlideNumber( nPgNum );
    2751           0 :             }
    2752             :         }
    2753           0 :         break;
    2754             :     }
    2755           0 : }
    2756             : 
    2757           0 : void SlideshowImpl::setAutoSaveState( bool bOn)
    2758             : {
    2759             :     try
    2760             :     {
    2761           0 :         uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() );
    2762             : 
    2763           0 :         uno::Reference< util::XURLTransformer > xParser(util::URLTransformer::create(xContext));
    2764           0 :         util::URL aURL;
    2765           0 :         aURL.Complete = "vnd.sun.star.autorecovery:/setAutoSaveState";
    2766           0 :         xParser->parseStrict(aURL);
    2767             : 
    2768           0 :         Sequence< beans::PropertyValue > aArgs(1);
    2769           0 :         aArgs[0].Name = "AutoSaveState";
    2770           0 :         aArgs[0].Value <<= bOn ? sal_True : sal_False;
    2771             : 
    2772           0 :         uno::Reference< frame::XDispatch > xAutoSave = frame::theAutoRecovery::get(xContext);
    2773           0 :         xAutoSave->dispatch(aURL, aArgs);
    2774             :     }
    2775           0 :     catch( Exception& )
    2776             :     {
    2777             :         OSL_FAIL("sd::SlideshowImpl::setAutoSaveState(), exception caught!");
    2778             :     }
    2779           0 : }
    2780             : 
    2781           0 : Reference< XDrawPage > SAL_CALL SlideshowImpl::getCurrentSlide() throw (RuntimeException, std::exception)
    2782             : {
    2783           0 :     SolarMutexGuard aSolarGuard;
    2784             : 
    2785           0 :     Reference< XDrawPage > xSlide;
    2786           0 :     if( mxShow.is() && mpSlideController.get() )
    2787             :     {
    2788           0 :         sal_Int32 nSlide = getCurrentSlideNumber();
    2789           0 :         if( (nSlide >= 0) && (nSlide < mpSlideController->getSlideNumberCount() ) )
    2790           0 :             xSlide = mpSlideController->getSlideByNumber( nSlide );
    2791             :     }
    2792             : 
    2793           0 :     return xSlide;
    2794             : }
    2795             : 
    2796           0 : sal_Int32 SAL_CALL SlideshowImpl::getNextSlideIndex() throw (RuntimeException, std::exception)
    2797             : {
    2798           0 :     SolarMutexGuard aSolarGuard;
    2799             : 
    2800           0 :     if( mxShow.is() )
    2801             :     {
    2802           0 :         return mpSlideController->getNextSlideIndex();
    2803             :     }
    2804             :     else
    2805             :     {
    2806           0 :         return -1;
    2807           0 :     }
    2808             : }
    2809             : 
    2810           0 : sal_Int32 SAL_CALL SlideshowImpl::getCurrentSlideIndex() throw (RuntimeException, std::exception)
    2811             : {
    2812           0 :     return mpSlideController.get() ? mpSlideController->getCurrentSlideIndex() : -1;
    2813             : }
    2814             : 
    2815             : // ::com::sun::star::presentation::XSlideShowController:
    2816             : 
    2817           0 : ::sal_Int32 SAL_CALL SlideshowImpl::getSlideCount() throw (RuntimeException, std::exception)
    2818             : {
    2819           0 :     return mpSlideController.get() ? mpSlideController->getSlideIndexCount() : 0;
    2820             : }
    2821             : 
    2822           0 : Reference< XDrawPage > SAL_CALL SlideshowImpl::getSlideByIndex(::sal_Int32 Index) throw (RuntimeException, css::lang::IndexOutOfBoundsException, std::exception)
    2823             : {
    2824           0 :     if( (mpSlideController.get() == 0 ) || (Index < 0) || (Index >= mpSlideController->getSlideIndexCount() ) )
    2825           0 :         throw IndexOutOfBoundsException();
    2826             : 
    2827           0 :     return mpSlideController->getSlideByNumber( mpSlideController->getSlideNumber( Index ) );
    2828             : }
    2829             : 
    2830           0 : sal_Bool SAL_CALL SlideshowImpl::getAlwaysOnTop() throw (RuntimeException, std::exception)
    2831             : {
    2832           0 :     SolarMutexGuard aSolarGuard;
    2833           0 :     return maPresSettings.mbAlwaysOnTop;
    2834             : }
    2835             : 
    2836           0 : void SAL_CALL SlideshowImpl::setAlwaysOnTop( sal_Bool bAlways ) throw (RuntimeException, std::exception)
    2837             : {
    2838           0 :     SolarMutexGuard aSolarGuard;
    2839           0 :     if( maPresSettings.mbAlwaysOnTop != bool(bAlways) )
    2840             :     {
    2841           0 :         maPresSettings.mbAlwaysOnTop = bAlways;
    2842             :         // todo, can this be changed while running?
    2843           0 :     }
    2844           0 : }
    2845             : 
    2846           0 : sal_Bool SAL_CALL SlideshowImpl::isFullScreen() throw (RuntimeException, std::exception)
    2847             : {
    2848           0 :     SolarMutexGuard aSolarGuard;
    2849           0 :     return maPresSettings.mbFullScreen;
    2850             : }
    2851             : 
    2852           0 : sal_Bool SAL_CALL SlideshowImpl::getMouseVisible() throw (RuntimeException, std::exception)
    2853             : {
    2854           0 :     SolarMutexGuard aSolarGuard;
    2855           0 :     return maPresSettings.mbMouseVisible;
    2856             : }
    2857             : 
    2858           0 : void SAL_CALL SlideshowImpl::setMouseVisible( sal_Bool bVisible ) throw (RuntimeException, std::exception)
    2859             : {
    2860           0 :     SolarMutexGuard aSolarGuard;
    2861           0 :     if( maPresSettings.mbMouseVisible != bool(bVisible) )
    2862             :     {
    2863           0 :         maPresSettings.mbMouseVisible = bVisible;
    2864           0 :         if( mpShowWindow )
    2865           0 :             mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible );
    2866           0 :     }
    2867           0 : }
    2868             : 
    2869           0 : sal_Bool SAL_CALL SlideshowImpl::getUsePen() throw (RuntimeException, std::exception)
    2870             : {
    2871           0 :     SolarMutexGuard aSolarGuard;
    2872           0 :     return mbUsePen;
    2873             : }
    2874             : 
    2875           0 : void SAL_CALL SlideshowImpl::setUsePen( sal_Bool bMouseAsPen ) throw (RuntimeException, std::exception)
    2876             : {
    2877           0 :     SolarMutexGuard aSolarGuard;
    2878           0 :     mbUsePen = bMouseAsPen;
    2879           0 :     if( mxShow.is() ) try
    2880             :     {
    2881             :         // For Pencolor;
    2882           0 :         Any aValue;
    2883           0 :         if( mbUsePen )
    2884           0 :             aValue <<= mnUserPaintColor;
    2885           0 :         beans::PropertyValue aPenProp;
    2886           0 :         aPenProp.Name = "UserPaintColor";
    2887           0 :         aPenProp.Value = aValue;
    2888           0 :         mxShow->setProperty( aPenProp );
    2889             : 
    2890             :         //for StrokeWidth :
    2891           0 :         if( mbUsePen )
    2892             :         {
    2893           0 :             beans::PropertyValue aPenPropWidth;
    2894           0 :             aPenPropWidth.Name = "UserPaintStrokeWidth";
    2895           0 :             aPenPropWidth.Value <<= mdUserPaintStrokeWidth;
    2896           0 :             mxShow->setProperty( aPenPropWidth );
    2897             : 
    2898             :             // for Pen Mode
    2899           0 :             beans::PropertyValue aPenPropSwitchPenMode;
    2900           0 :             aPenPropSwitchPenMode.Name = "SwitchPenMode";
    2901           0 :             aPenPropSwitchPenMode.Value <<= sal_True;
    2902           0 :             mxShow->setProperty( aPenPropSwitchPenMode );
    2903           0 :         }
    2904             :     }
    2905           0 :     catch( Exception& )
    2906             :     {
    2907             :         OSL_FAIL(
    2908             :             OString(OString("sd::SlideshowImpl::setUsePen(), "
    2909             :                     "exception caught: ") +
    2910             :             OUStringToOString(
    2911             :                 comphelper::anyToString( cppu::getCaughtException() ),
    2912             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    2913           0 :     }
    2914           0 : }
    2915             : 
    2916           0 : double SAL_CALL SlideshowImpl::getPenWidth() throw (RuntimeException, std::exception)
    2917             : {
    2918           0 :     SolarMutexGuard aSolarGuard;
    2919           0 :     return mdUserPaintStrokeWidth;
    2920             : }
    2921             : 
    2922           0 : void SAL_CALL SlideshowImpl::setPenWidth( double dStrokeWidth ) throw (RuntimeException, std::exception)
    2923             : {
    2924           0 :     SolarMutexGuard aSolarGuard;
    2925           0 :     mdUserPaintStrokeWidth = dStrokeWidth;
    2926           0 :     setUsePen( true ); // enable pen mode, update color and width
    2927           0 : }
    2928             : 
    2929           0 : sal_Int32 SAL_CALL SlideshowImpl::getPenColor() throw (RuntimeException, std::exception)
    2930             : {
    2931           0 :     SolarMutexGuard aSolarGuard;
    2932           0 :     return mnUserPaintColor;
    2933             : }
    2934             : 
    2935           0 : void SAL_CALL SlideshowImpl::setPenColor( sal_Int32 nColor ) throw (RuntimeException, std::exception)
    2936             : {
    2937           0 :     SolarMutexGuard aSolarGuard;
    2938           0 :     mnUserPaintColor = nColor;
    2939           0 :     setUsePen( true ); // enable pen mode, update color
    2940           0 : }
    2941             : 
    2942           0 : void SAL_CALL SlideshowImpl::setEraseAllInk(bool bEraseAllInk) throw (RuntimeException)
    2943             : {
    2944           0 :     if( bEraseAllInk )
    2945             :     {
    2946           0 :         SolarMutexGuard aSolarGuard;
    2947           0 :         if( mxShow.is() ) try
    2948             :         {
    2949           0 :             beans::PropertyValue aPenPropEraseAllInk;
    2950           0 :             aPenPropEraseAllInk.Name = "EraseAllInk";
    2951           0 :             aPenPropEraseAllInk.Value <<= bEraseAllInk;
    2952           0 :             mxShow->setProperty( aPenPropEraseAllInk );
    2953             :         }
    2954           0 :         catch( Exception& )
    2955             :         {
    2956             :             SAL_WARN( "sd.slideshow", "sd::SlideshowImpl::setEraseAllInk(), "
    2957             :                 "exception caught: " << comphelper::anyToString( cppu::getCaughtException() ));
    2958           0 :         }
    2959             :     }
    2960           0 : }
    2961             : 
    2962             : // XSlideShowController Methods
    2963           0 : sal_Bool SAL_CALL SlideshowImpl::isRunning(  ) throw (RuntimeException, std::exception)
    2964             : {
    2965           0 :     SolarMutexGuard aSolarGuard;
    2966           0 :     return mxShow.is();
    2967             : }
    2968             : 
    2969           0 : void SAL_CALL SlideshowImpl::gotoNextEffect(  ) throw (RuntimeException, std::exception)
    2970             : {
    2971           0 :     SolarMutexGuard aSolarGuard;
    2972             : 
    2973           0 :     if( mxShow.is() && mpSlideController.get() && mpShowWindow )
    2974             :     {
    2975           0 :         if( mbIsPaused )
    2976           0 :             resume();
    2977             : 
    2978           0 :         const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
    2979           0 :         if( eMode == SHOWWINDOWMODE_END )
    2980             :         {
    2981           0 :             endPresentation();
    2982             :         }
    2983           0 :         else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
    2984             :         {
    2985           0 :             mpShowWindow->RestartShow();
    2986             :         }
    2987             :         else
    2988             :         {
    2989           0 :             mxShow->nextEffect();
    2990           0 :             update();
    2991             :         }
    2992           0 :     }
    2993           0 : }
    2994             : 
    2995           0 : void SAL_CALL SlideshowImpl::gotoPreviousEffect(  ) throw (RuntimeException, std::exception)
    2996             : {
    2997           0 :     SolarMutexGuard aSolarGuard;
    2998             : 
    2999           0 :     if( mxShow.is() && mpSlideController.get() && mpShowWindow )
    3000             :     {
    3001           0 :         if( mbIsPaused )
    3002           0 :             resume();
    3003             : 
    3004           0 :         const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
    3005           0 :         if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
    3006             :         {
    3007           0 :             mpShowWindow->RestartShow();
    3008             :         }
    3009             :         else
    3010             :         {
    3011           0 :             mxShow->previousEffect();
    3012           0 :             update();
    3013             :         }
    3014           0 :     }
    3015           0 : }
    3016             : 
    3017           0 : void SAL_CALL SlideshowImpl::gotoFirstSlide(  ) throw (RuntimeException, std::exception)
    3018             : {
    3019           0 :     SolarMutexGuard aSolarGuard;
    3020             : 
    3021           0 :     if( mpShowWindow && mpSlideController.get() )
    3022             :     {
    3023           0 :         if( mbIsPaused )
    3024           0 :             resume();
    3025             : 
    3026           0 :         if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END )
    3027             :         {
    3028           0 :             if( mpSlideController->getSlideIndexCount() )
    3029           0 :                 mpShowWindow->RestartShow( 0);
    3030             :         }
    3031             :         else
    3032             :         {
    3033           0 :             displaySlideIndex( 0 );
    3034             :         }
    3035           0 :     }
    3036           0 : }
    3037             : 
    3038           0 : void SAL_CALL SlideshowImpl::gotoNextSlide(  ) throw (RuntimeException, std::exception)
    3039             : {
    3040           0 :     SolarMutexGuard aSolarGuard;
    3041             : 
    3042           0 :     if( mbIsPaused )
    3043           0 :         resume();
    3044             : 
    3045           0 :     const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
    3046           0 :     if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
    3047             :     {
    3048           0 :         mpShowWindow->RestartShow();
    3049             :     }
    3050             :     else
    3051             :     {
    3052             :         // if this is a show, ignore user inputs and
    3053             :         // start 20ms timer to reenable inputs to filter
    3054             :         // buffered inputs during slide transition
    3055           0 :         if( meAnimationMode == ANIMATIONMODE_SHOW )
    3056             :         {
    3057           0 :             mbInputFreeze = true;
    3058           0 :             maInputFreezeTimer.Start();
    3059             :         }
    3060             : 
    3061           0 :         if( mpSlideController.get() )
    3062             :         {
    3063           0 :             if( mpSlideController->nextSlide() )
    3064             :             {
    3065           0 :                 displayCurrentSlide();
    3066             :             }
    3067             :             else
    3068             :             {
    3069           0 :                 stopSound();
    3070             : 
    3071           0 :                 if( meAnimationMode == ANIMATIONMODE_PREVIEW )
    3072             :                 {
    3073           0 :                     endPresentation();
    3074             :                 }
    3075           0 :                 else if( maPresSettings.mbEndless )
    3076             :                 {
    3077           0 :                     if( maPresSettings.mnPauseTimeout )
    3078             :                     {
    3079           0 :                         if( mpShowWindow )
    3080             :                         {
    3081           0 :                             if ( maPresSettings.mbShowPauseLogo )
    3082             :                             {
    3083           0 :                                 Graphic aGraphic(SfxApplication::GetApplicationLogo(360));
    3084           0 :                                 mpShowWindow->SetPauseMode( 0, maPresSettings.mnPauseTimeout, &aGraphic );
    3085             :                             }
    3086             :                             else
    3087           0 :                                 mpShowWindow->SetPauseMode( 0, maPresSettings.mnPauseTimeout );
    3088             :                         }
    3089             :                     }
    3090             :                     else
    3091             :                     {
    3092           0 :                         displaySlideIndex( 0 );
    3093             :                     }
    3094             :                 }
    3095             :                 else
    3096             :                 {
    3097           0 :                     if( mpShowWindow )
    3098             :                     {
    3099           0 :                         mpShowWindow->SetEndMode();
    3100           0 :                         if( !mpViewShell->GetDoc()->IsStartWithPresentation() )
    3101           0 :                             pause();
    3102             :                     }
    3103             :                 }
    3104             :             }
    3105             :         }
    3106           0 :     }
    3107           0 : }
    3108             : 
    3109           0 : void SAL_CALL SlideshowImpl::gotoPreviousSlide(  ) throw (RuntimeException, std::exception)
    3110             : {
    3111           0 :     gotoPreviousSlide(false);
    3112           0 : }
    3113             : 
    3114           0 : void SlideshowImpl::gotoPreviousSlide (const bool bSkipAllMainSequenceEffects)
    3115             : {
    3116           0 :     SolarMutexGuard aSolarGuard;
    3117             : 
    3118           0 :     if( mxShow.is() && mpSlideController.get() ) try
    3119             :     {
    3120           0 :         if( mbIsPaused )
    3121           0 :             resume();
    3122             : 
    3123           0 :         const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
    3124           0 :         if( eMode == SHOWWINDOWMODE_END )
    3125             :         {
    3126           0 :             mpShowWindow->RestartShow( mpSlideController->getCurrentSlideIndex() );
    3127             :         }
    3128           0 :         else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
    3129             :         {
    3130           0 :             mpShowWindow->RestartShow();
    3131             :         }
    3132             :         else
    3133             :         {
    3134           0 :             if( mpSlideController->previousSlide())
    3135           0 :                 displayCurrentSlide(bSkipAllMainSequenceEffects);
    3136           0 :             else if (bSkipAllMainSequenceEffects)
    3137             :             {
    3138             :                 // We could not go to the previous slide (probably because
    3139             :                 // the current slide is already the first one).  We still
    3140             :                 // have to call displayCurrentSlide because the calling
    3141             :                 // slideshow can not determine whether there is a previous
    3142             :                 // slide or not and has already prepared for a slide change.
    3143             :                 // This slide change has to be completed now, even when
    3144             :                 // changing to the same slide.
    3145             :                 // Note that in this special case we do NOT pass
    3146             :                 // bSkipAllMainSequenceEffects because we display the same
    3147             :                 // slide as before and do not want to show all its effects.
    3148           0 :                 displayCurrentSlide(false);
    3149             :             }
    3150             :         }
    3151             :     }
    3152           0 :     catch( Exception& )
    3153             :     {
    3154             :         OSL_FAIL(
    3155             :             OString(OString("sd::SlideshowImpl::gotoPreviousSlide(), "
    3156             :                     "exception caught: ") +
    3157             :             OUStringToOString(
    3158             :                 comphelper::anyToString( cppu::getCaughtException() ),
    3159             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    3160           0 :     }
    3161           0 : }
    3162             : 
    3163           0 : void SAL_CALL SlideshowImpl::gotoLastSlide() throw (RuntimeException, std::exception)
    3164             : {
    3165           0 :     SolarMutexGuard aSolarGuard;
    3166             : 
    3167           0 :     if( mpSlideController.get() )
    3168             :     {
    3169           0 :         if( mbIsPaused )
    3170           0 :             resume();
    3171             : 
    3172           0 :         const sal_Int32 nLastSlideIndex = mpSlideController->getSlideIndexCount() - 1;
    3173           0 :         if( nLastSlideIndex >= 0 )
    3174             :         {
    3175           0 :             if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END )
    3176             :             {
    3177           0 :                 mpShowWindow->RestartShow( nLastSlideIndex );
    3178             :             }
    3179             :             else
    3180             :             {
    3181           0 :                 displaySlideIndex( nLastSlideIndex );
    3182             :             }
    3183             :         }
    3184           0 :     }
    3185           0 : }
    3186             : 
    3187           0 : void SAL_CALL SlideshowImpl::gotoBookmark( const OUString& rBookmark ) throw (RuntimeException, std::exception)
    3188             : {
    3189           0 :     SolarMutexGuard aSolarGuard;
    3190             : 
    3191           0 :     if( mbIsPaused )
    3192           0 :         resume();
    3193             : 
    3194           0 :     sal_Int32 nSlideNumber = getSlideNumberForBookmark( rBookmark );
    3195           0 :     if( nSlideNumber != -1 )
    3196           0 :         displaySlideNumber( nSlideNumber );
    3197           0 : }
    3198             : 
    3199           0 : void SAL_CALL SlideshowImpl::gotoSlide( const Reference< XDrawPage >& xSlide )
    3200             :     throw(IllegalArgumentException, RuntimeException, std::exception)
    3201             : {
    3202           0 :     SolarMutexGuard aSolarGuard;
    3203             : 
    3204           0 :     if( mpSlideController.get() && xSlide.is() )
    3205             :     {
    3206           0 :         if( mbIsPaused )
    3207           0 :             resume();
    3208             : 
    3209           0 :         const sal_Int32 nSlideCount = mpSlideController->getSlideNumberCount();
    3210           0 :         for( sal_Int32 nSlide = 0; nSlide < nSlideCount; nSlide++ )
    3211             :         {
    3212           0 :             if( mpSlideController->getSlideByNumber( nSlide ) == xSlide )
    3213             :             {
    3214           0 :                 displaySlideNumber( nSlide );
    3215             :             }
    3216             :         }
    3217           0 :     }
    3218           0 : }
    3219             : 
    3220           0 : void SAL_CALL SlideshowImpl::gotoSlideIndex( sal_Int32 nIndex ) throw (RuntimeException, std::exception)
    3221             : {
    3222           0 :     SolarMutexGuard aSolarGuard;
    3223             : 
    3224           0 :     if( mbIsPaused )
    3225           0 :         resume();
    3226             : 
    3227           0 :     displaySlideIndex( nIndex );
    3228           0 : }
    3229             : 
    3230           0 : void SAL_CALL SlideshowImpl::stopSound(  ) throw (RuntimeException, std::exception)
    3231             : {
    3232           0 :     SolarMutexGuard aSolarGuard;
    3233             : 
    3234             :     try
    3235             :     {
    3236           0 :         if( mxPlayer.is() )
    3237             :         {
    3238           0 :             mxPlayer->stop();
    3239           0 :             mxPlayer.clear();
    3240             :         }
    3241             :     }
    3242           0 :     catch( Exception& )
    3243             :     {
    3244             :         OSL_FAIL(
    3245             :             OString(OString("sd::SlideshowImpl::stopSound(), "
    3246             :                     "exception caught: ") +
    3247             :             OUStringToOString(
    3248             :                 comphelper::anyToString( cppu::getCaughtException() ),
    3249             :                 RTL_TEXTENCODING_UTF8 )).getStr() );
    3250           0 :     }
    3251           0 : }
    3252             : 
    3253             : // XIndexAccess
    3254             : 
    3255           0 : ::sal_Int32 SAL_CALL SlideshowImpl::getCount(  ) throw (::com::sun::star::uno::RuntimeException, std::exception)
    3256             : {
    3257           0 :     return getSlideCount();
    3258             : }
    3259             : 
    3260           0 : ::com::sun::star::uno::Any SAL_CALL SlideshowImpl::getByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception)
    3261             : {
    3262           0 :     return Any( getSlideByIndex( Index ) );
    3263             : }
    3264             : 
    3265           0 : ::com::sun::star::uno::Type SAL_CALL SlideshowImpl::getElementType(  ) throw (::com::sun::star::uno::RuntimeException, std::exception)
    3266             : {
    3267           0 :     return cppu::UnoType<XDrawPage>::get();
    3268             : }
    3269             : 
    3270           0 : sal_Bool SAL_CALL SlideshowImpl::hasElements(  ) throw (::com::sun::star::uno::RuntimeException, std::exception)
    3271             : {
    3272           0 :     return getSlideCount() != 0;
    3273             : }
    3274             : 
    3275           0 : Reference< XSlideShow > SAL_CALL SlideshowImpl::getSlideShow() throw (RuntimeException, std::exception)
    3276             : {
    3277           0 :     return mxShow;
    3278             : }
    3279             : 
    3280           0 : PresentationSettingsEx::PresentationSettingsEx( const PresentationSettingsEx& r )
    3281             : : PresentationSettings( r )
    3282             : , mbRehearseTimings(r.mbRehearseTimings)
    3283             : , mbPreview(r.mbPreview)
    3284           0 : , mpParentWindow( 0 )
    3285             : {
    3286           0 : }
    3287             : 
    3288           0 : PresentationSettingsEx::PresentationSettingsEx( PresentationSettings& r )
    3289             : : PresentationSettings( r )
    3290             : , mbRehearseTimings(false)
    3291             : , mbPreview(false)
    3292           0 : , mpParentWindow(0)
    3293             : {
    3294           0 : }
    3295             : 
    3296           0 : void PresentationSettingsEx::SetArguments( const Sequence< PropertyValue >& rArguments ) throw (IllegalArgumentException)
    3297             : {
    3298           0 :     sal_Int32 nArguments = rArguments.getLength();
    3299           0 :     const PropertyValue* pValue = rArguments.getConstArray();
    3300             : 
    3301           0 :     while( nArguments-- )
    3302             :     {
    3303           0 :         SetPropertyValue( pValue->Name, pValue->Value );
    3304           0 :         pValue++;
    3305             :     }
    3306           0 : }
    3307             : 
    3308           0 : void PresentationSettingsEx::SetPropertyValue( const OUString& rProperty, const Any& rValue ) throw (IllegalArgumentException)
    3309             : {
    3310           0 :     if ( rProperty == "RehearseTimings" )
    3311             :     {
    3312           0 :         if( rValue >>= mbRehearseTimings )
    3313           0 :             return;
    3314             :     }
    3315           0 :     else if ( rProperty == "Preview" )
    3316             :     {
    3317           0 :         if( rValue >>= mbPreview )
    3318           0 :             return;
    3319             :     }
    3320           0 :     else if ( rProperty == "AnimationNode" )
    3321             :     {
    3322           0 :         if( rValue >>= mxAnimationNode )
    3323           0 :             return;
    3324             :     }
    3325           0 :     else if ( rProperty == "ParentWindow" )
    3326             :     {
    3327           0 :         Reference< XWindow > xWindow;
    3328           0 :         if( rValue >>= xWindow )
    3329             :         {
    3330           0 :             mpParentWindow = xWindow.is() ? VCLUnoHelper::GetWindow( xWindow )
    3331           0 :                                           : VclPtr<vcl::Window>();
    3332           0 :             return;
    3333           0 :         }
    3334             :     }
    3335           0 :     else if ( rProperty == "AllowAnimations" )
    3336             :     {
    3337           0 :         if( rValue >>= mbAnimationAllowed )
    3338           0 :             return;
    3339             :     }
    3340           0 :     else if ( rProperty == "FirstPage" )
    3341             :     {
    3342           0 :         OUString aPresPage;
    3343           0 :         if( rValue >>= aPresPage )
    3344             :         {
    3345           0 :             maPresPage = getUiNameFromPageApiNameImpl(aPresPage);
    3346           0 :             mbCustomShow = false;
    3347           0 :             mbAll = false;
    3348           0 :             return;
    3349             :         }
    3350             :         else
    3351             :         {
    3352           0 :             if( rValue >>= mxStartPage )
    3353           0 :                 return;
    3354           0 :         }
    3355             :     }
    3356           0 :     else if ( rProperty == "IsAlwaysOnTop" )
    3357             :     {
    3358           0 :         if( rValue >>= mbAlwaysOnTop )
    3359           0 :             return;
    3360             :     }
    3361           0 :     else if ( rProperty == "IsAutomatic" )
    3362             :     {
    3363           0 :         if( rValue >>= mbManual )
    3364           0 :             return;
    3365             :     }
    3366           0 :     else if ( rProperty == "IsEndless" )
    3367             :     {
    3368           0 :         if( rValue >>= mbEndless )
    3369           0 :             return;
    3370             :     }
    3371           0 :     else if ( rProperty == "IsFullScreen" )
    3372             :     {
    3373           0 :         if( rValue >>= mbFullScreen )
    3374           0 :             return;
    3375             :     }
    3376           0 :     else if ( rProperty == "IsMouseVisible" )
    3377             :     {
    3378           0 :         if( rValue >>= mbMouseVisible )
    3379           0 :             return;
    3380             :     }
    3381           0 :     else if ( rProperty == "Pause" )
    3382             :     {
    3383           0 :         sal_Int32 nPause = -1;
    3384           0 :         if( (rValue >>= nPause) && (nPause >= 0) )
    3385             :         {
    3386           0 :             mnPauseTimeout = nPause;
    3387           0 :             return;
    3388             :         }
    3389             :     }
    3390           0 :     else if ( rProperty == "StartWithNavigator" )
    3391             :     {
    3392           0 :         if( rValue >>= mbStartWithNavigator )
    3393           0 :             return;
    3394             :     }
    3395           0 :     else if ( rProperty == "UsePen" )
    3396             :     {
    3397           0 :         if( rValue >>= mbMouseAsPen )
    3398           0 :             return;
    3399             :     }
    3400           0 :     throw IllegalArgumentException();
    3401             : }
    3402             : 
    3403             : // XAnimationListener
    3404             : 
    3405           0 : SlideShowListenerProxy::SlideShowListenerProxy( const rtl::Reference< SlideshowImpl >& xController, const css::uno::Reference< css::presentation::XSlideShow >& xSlideShow )
    3406             : : maListeners( m_aMutex )
    3407             : , mxController( xController )
    3408           0 : , mxSlideShow( xSlideShow )
    3409             : {
    3410           0 : }
    3411             : 
    3412           0 : SlideShowListenerProxy::~SlideShowListenerProxy()
    3413             : {
    3414           0 : }
    3415             : 
    3416           0 : void SlideShowListenerProxy::addAsSlideShowListener()
    3417             : {
    3418           0 :     if( mxSlideShow.is() )
    3419             :     {
    3420           0 :         Reference< XSlideShowListener > xSlideShowListener( this );
    3421           0 :         mxSlideShow->addSlideShowListener( xSlideShowListener );
    3422             :     }
    3423           0 : }
    3424             : 
    3425           0 : void SlideShowListenerProxy::removeAsSlideShowListener()
    3426             : {
    3427           0 :     if( mxSlideShow.is() )
    3428             :     {
    3429           0 :         Reference< XSlideShowListener > xSlideShowListener( this );
    3430           0 :         mxSlideShow->removeSlideShowListener( xSlideShowListener );
    3431             :     }
    3432           0 : }
    3433             : 
    3434           0 : void SlideShowListenerProxy::addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape )
    3435             : {
    3436           0 :     if( mxSlideShow.is() )
    3437             :     {
    3438           0 :         Reference< XShapeEventListener > xListener( this );
    3439           0 :         mxSlideShow->addShapeEventListener( xListener, xShape );
    3440             :     }
    3441           0 : }
    3442             : 
    3443           0 : void SlideShowListenerProxy::removeShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape )
    3444             : {
    3445           0 :     if( mxSlideShow.is() )
    3446             :     {
    3447           0 :         Reference< XShapeEventListener > xListener( this );
    3448           0 :         mxSlideShow->removeShapeEventListener( xListener, xShape );
    3449             :     }
    3450           0 : }
    3451             : 
    3452           0 : void SlideShowListenerProxy::addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener )
    3453             : {
    3454           0 :     maListeners.addInterface(xListener);
    3455           0 : }
    3456             : 
    3457           0 : void SlideShowListenerProxy::removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener )
    3458             : {
    3459           0 :     maListeners.removeInterface(xListener);
    3460           0 : }
    3461             : 
    3462           0 : void SAL_CALL SlideShowListenerProxy::beginEvent( const Reference< XAnimationNode >& xNode ) throw (RuntimeException, std::exception)
    3463             : {
    3464           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3465             : 
    3466           0 :     if( maListeners.getLength() >= 0 )
    3467           0 :         maListeners.forEach<XSlideShowListener>( boost::bind( &XAnimationListener::beginEvent, _1,  boost::cref(xNode) ));
    3468           0 : }
    3469             : 
    3470           0 : void SAL_CALL SlideShowListenerProxy::endEvent( const Reference< XAnimationNode >& xNode ) throw (RuntimeException, std::exception)
    3471             : {
    3472           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3473             : 
    3474           0 :     if( maListeners.getLength() >= 0 )
    3475           0 :         maListeners.forEach<XSlideShowListener>( boost::bind( &XAnimationListener::endEvent, _1, boost::cref(xNode) ));
    3476           0 : }
    3477             : 
    3478           0 : void SAL_CALL SlideShowListenerProxy::repeat( const Reference< XAnimationNode >& xNode, ::sal_Int32 nRepeat ) throw (RuntimeException, std::exception)
    3479             : {
    3480           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3481             : 
    3482           0 :     if( maListeners.getLength() >= 0 )
    3483           0 :         maListeners.forEach<XSlideShowListener>( boost::bind( &XAnimationListener::repeat, _1,  boost::cref(xNode), boost::cref(nRepeat) ));
    3484           0 : }
    3485             : 
    3486             : // ::com::sun::star::presentation::XSlideShowListener:
    3487             : 
    3488           0 : void SAL_CALL SlideShowListenerProxy::paused(  ) throw (::com::sun::star::uno::RuntimeException, std::exception)
    3489             : {
    3490           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3491             : 
    3492           0 :     if( maListeners.getLength() >= 0 )
    3493           0 :         maListeners.forEach<XSlideShowListener>( boost::mem_fn( &XSlideShowListener::paused ) );
    3494           0 : }
    3495             : 
    3496           0 : void SAL_CALL SlideShowListenerProxy::resumed(  ) throw (::com::sun::star::uno::RuntimeException, std::exception)
    3497             : {
    3498           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3499             : 
    3500           0 :     if( maListeners.getLength() >= 0 )
    3501           0 :         maListeners.forEach<XSlideShowListener>( boost::mem_fn( &XSlideShowListener::resumed ) );
    3502           0 : }
    3503             : 
    3504           0 : void SAL_CALL SlideShowListenerProxy::slideTransitionStarted( ) throw (RuntimeException, std::exception)
    3505             : {
    3506           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3507             : 
    3508           0 :     if( maListeners.getLength() >= 0 )
    3509           0 :         maListeners.forEach<XSlideShowListener>( boost::mem_fn( &XSlideShowListener::slideTransitionStarted ) );
    3510           0 : }
    3511             : 
    3512           0 : void SAL_CALL SlideShowListenerProxy::slideTransitionEnded( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
    3513             : {
    3514           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3515             : 
    3516           0 :     if( maListeners.getLength() >= 0 )
    3517           0 :         maListeners.forEach<XSlideShowListener>( boost::mem_fn( &XSlideShowListener::slideTransitionEnded ) );
    3518           0 : }
    3519             : 
    3520           0 : void SAL_CALL SlideShowListenerProxy::slideAnimationsEnded(  ) throw (::com::sun::star::uno::RuntimeException, std::exception)
    3521             : {
    3522           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3523             : 
    3524           0 :     if( maListeners.getLength() >= 0 )
    3525           0 :         maListeners.forEach<XSlideShowListener>( boost::mem_fn( &XSlideShowListener::slideAnimationsEnded ) );
    3526           0 : }
    3527             : 
    3528           0 : void SlideShowListenerProxy::slideEnded(sal_Bool bReverse) throw (RuntimeException, std::exception)
    3529             : {
    3530             :     {
    3531           0 :         ::osl::MutexGuard aGuard( m_aMutex );
    3532             : 
    3533           0 :         if( maListeners.getLength() >= 0 )
    3534             :             maListeners.forEach<XSlideShowListener>(
    3535           0 :                 boost::bind( &XSlideShowListener::slideEnded, _1, bReverse) );
    3536             :     }
    3537             : 
    3538             :     {
    3539           0 :         SolarMutexGuard aSolarGuard;
    3540           0 :         if( mxController.is() )
    3541           0 :             mxController->slideEnded(bReverse);
    3542             :     }
    3543           0 : }
    3544             : 
    3545           0 : void SlideShowListenerProxy::hyperLinkClicked( OUString const& aHyperLink ) throw (RuntimeException, std::exception)
    3546             : {
    3547             :     {
    3548           0 :         ::osl::MutexGuard aGuard( m_aMutex );
    3549             : 
    3550           0 :         if( maListeners.getLength() >= 0 )
    3551           0 :             maListeners.forEach<XSlideShowListener>( boost::bind( &XSlideShowListener::hyperLinkClicked, _1, boost::cref(aHyperLink) ));
    3552             :     }
    3553             : 
    3554             :     {
    3555           0 :         SolarMutexGuard aSolarGuard;
    3556           0 :         if( mxController.is() )
    3557           0 :             mxController->hyperLinkClicked(aHyperLink);
    3558             :     }
    3559           0 : }
    3560             : 
    3561             : // XEventListener
    3562             : 
    3563           0 : void SAL_CALL SlideShowListenerProxy::disposing( const ::com::sun::star::lang::EventObject& aDisposeEvent ) throw (RuntimeException, std::exception)
    3564             : {
    3565           0 :     maListeners.disposeAndClear( aDisposeEvent );
    3566           0 :     mxController.clear();
    3567           0 :     mxSlideShow.clear();
    3568           0 : }
    3569             : 
    3570             : // XShapeEventListener
    3571             : 
    3572           0 : void SAL_CALL SlideShowListenerProxy::click( const Reference< XShape >& xShape, const ::com::sun::star::awt::MouseEvent& aOriginalEvent ) throw (RuntimeException, std::exception)
    3573             : {
    3574           0 :     SolarMutexGuard aSolarGuard;
    3575           0 :     if( mxController.is() )
    3576           0 :         mxController->click(xShape, aOriginalEvent );
    3577           0 : }
    3578             : 
    3579          66 : } // namespace ::sd
    3580             : 
    3581             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11