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