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