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