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