xref: /AOO41X/main/sd/source/ui/animations/SlideTransitionPane.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sd.hxx"
30*cdf0e10cSrcweir #include <com/sun/star/animations/XAnimationNode.hpp>
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir #include "SlideTransitionPane.hxx"
33*cdf0e10cSrcweir #include "SlideTransitionPane.hrc"
34*cdf0e10cSrcweir #include "CustomAnimation.hrc"
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #include "TransitionPreset.hxx"
37*cdf0e10cSrcweir #include "sdresid.hxx"
38*cdf0e10cSrcweir #include "ViewShellBase.hxx"
39*cdf0e10cSrcweir #include "DrawDocShell.hxx"
40*cdf0e10cSrcweir #include "SlideSorterViewShell.hxx"
41*cdf0e10cSrcweir #include "drawdoc.hxx"
42*cdf0e10cSrcweir #include "filedlg.hxx"
43*cdf0e10cSrcweir #include "strings.hrc"
44*cdf0e10cSrcweir #include "DrawController.hxx"
45*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #ifndef _SVT_CONTROLDIMS_HRC_
48*cdf0e10cSrcweir #include <svtools/controldims.hrc>
49*cdf0e10cSrcweir #endif
50*cdf0e10cSrcweir #include <svx/gallery.hxx>
51*cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
52*cdf0e10cSrcweir #include <vcl/msgbox.hxx>
53*cdf0e10cSrcweir #include <tools/urlobj.hxx>
54*cdf0e10cSrcweir #include "DrawViewShell.hxx"
55*cdf0e10cSrcweir #include "slideshow.hxx"
56*cdf0e10cSrcweir #include "drawview.hxx"
57*cdf0e10cSrcweir #include "sdundogr.hxx"
58*cdf0e10cSrcweir #include "undoanim.hxx"
59*cdf0e10cSrcweir #include "optsitem.hxx"
60*cdf0e10cSrcweir #include "sddll.hxx"
61*cdf0e10cSrcweir #include "framework/FrameworkHelper.hxx"
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir #include "DialogListBox.hxx"
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir #include <algorithm>
66*cdf0e10cSrcweir #include <memory>
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir using namespace ::com::sun::star;
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
72*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
73*cdf0e10cSrcweir using ::rtl::OUString;
74*cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException;
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir using ::sd::framework::FrameworkHelper;
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir // ____________________________
79*cdf0e10cSrcweir //
80*cdf0e10cSrcweir // ::sd::impl::TransitionEffect
81*cdf0e10cSrcweir // ____________________________
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir namespace sd
84*cdf0e10cSrcweir {
85*cdf0e10cSrcweir namespace impl
86*cdf0e10cSrcweir {
87*cdf0e10cSrcweir struct TransitionEffect
88*cdf0e10cSrcweir {
89*cdf0e10cSrcweir     TransitionEffect() :
90*cdf0e10cSrcweir             mnType( 0 ),
91*cdf0e10cSrcweir             mnSubType( 0 ),
92*cdf0e10cSrcweir             mbDirection( sal_True ),
93*cdf0e10cSrcweir             mnFadeColor( 0 )
94*cdf0e10cSrcweir     {
95*cdf0e10cSrcweir         init();
96*cdf0e10cSrcweir     }
97*cdf0e10cSrcweir     explicit TransitionEffect( const ::sd::TransitionPreset & rPreset ) :
98*cdf0e10cSrcweir             mnType( rPreset.getTransition()),
99*cdf0e10cSrcweir             mnSubType( rPreset.getSubtype()),
100*cdf0e10cSrcweir             mbDirection( rPreset.getDirection()),
101*cdf0e10cSrcweir             mnFadeColor( rPreset.getFadeColor())
102*cdf0e10cSrcweir     {
103*cdf0e10cSrcweir         init();
104*cdf0e10cSrcweir     }
105*cdf0e10cSrcweir     explicit TransitionEffect( sal_Int16 nType, sal_Int16 nSubType,
106*cdf0e10cSrcweir                                sal_Bool  bDirection, sal_Int32 nFadeColor ) :
107*cdf0e10cSrcweir             mnType( nType),
108*cdf0e10cSrcweir             mnSubType( nSubType ),
109*cdf0e10cSrcweir             mbDirection( bDirection ),
110*cdf0e10cSrcweir             mnFadeColor( nFadeColor )
111*cdf0e10cSrcweir     {
112*cdf0e10cSrcweir         init();
113*cdf0e10cSrcweir     }
114*cdf0e10cSrcweir     explicit TransitionEffect( const SdPage & rPage ) :
115*cdf0e10cSrcweir             mnType( rPage.getTransitionType() ),
116*cdf0e10cSrcweir             mnSubType( rPage.getTransitionSubtype() ),
117*cdf0e10cSrcweir             mbDirection( rPage.getTransitionDirection() ),
118*cdf0e10cSrcweir             mnFadeColor( rPage.getTransitionFadeColor() )
119*cdf0e10cSrcweir     {
120*cdf0e10cSrcweir         init();
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir         mfDuration = rPage.getTransitionDuration();
123*cdf0e10cSrcweir         mnTime = rPage.GetTime();
124*cdf0e10cSrcweir         mePresChange = rPage.GetPresChange();
125*cdf0e10cSrcweir         mbSoundOn = rPage.IsSoundOn();
126*cdf0e10cSrcweir         maSound = rPage.GetSoundFile();
127*cdf0e10cSrcweir 		mbLoopSound = rPage.IsLoopSound();
128*cdf0e10cSrcweir 		mbStopSound = rPage.IsStopSound();
129*cdf0e10cSrcweir     }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir     void init()
132*cdf0e10cSrcweir     {
133*cdf0e10cSrcweir         mfDuration = 2.0;
134*cdf0e10cSrcweir         mnTime = 0;
135*cdf0e10cSrcweir         mePresChange = PRESCHANGE_MANUAL;
136*cdf0e10cSrcweir         mbSoundOn = sal_False;
137*cdf0e10cSrcweir 		mbLoopSound = sal_False;
138*cdf0e10cSrcweir 		mbStopSound = sal_False;
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir         mbEffectAmbiguous = false;
141*cdf0e10cSrcweir         mbDurationAmbiguous = false;
142*cdf0e10cSrcweir         mbTimeAmbiguous = false;
143*cdf0e10cSrcweir         mbPresChangeAmbiguous = false;
144*cdf0e10cSrcweir         mbSoundAmbiguous = false;
145*cdf0e10cSrcweir         mbLoopSoundAmbiguous = false;
146*cdf0e10cSrcweir     }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir     void setAllAmbiguous()
149*cdf0e10cSrcweir     {
150*cdf0e10cSrcweir         mbEffectAmbiguous = true;
151*cdf0e10cSrcweir         mbDurationAmbiguous = true;
152*cdf0e10cSrcweir         mbTimeAmbiguous = true;
153*cdf0e10cSrcweir         mbPresChangeAmbiguous = true;
154*cdf0e10cSrcweir         mbSoundAmbiguous = true;
155*cdf0e10cSrcweir 		mbLoopSoundAmbiguous = true;
156*cdf0e10cSrcweir     }
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir     bool operator == ( const ::sd::TransitionPreset & rPreset ) const
159*cdf0e10cSrcweir     {
160*cdf0e10cSrcweir         return
161*cdf0e10cSrcweir             (mnType == rPreset.getTransition()) &&
162*cdf0e10cSrcweir             (mnSubType == rPreset.getSubtype()) &&
163*cdf0e10cSrcweir             (mbDirection == rPreset.getDirection()) &&
164*cdf0e10cSrcweir             (mnFadeColor ==  rPreset.getFadeColor());
165*cdf0e10cSrcweir     }
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir     void applyTo( SdPage & rOutPage ) const
168*cdf0e10cSrcweir     {
169*cdf0e10cSrcweir         if( ! mbEffectAmbiguous )
170*cdf0e10cSrcweir         {
171*cdf0e10cSrcweir 			rOutPage.setTransitionType( mnType );
172*cdf0e10cSrcweir 			rOutPage.setTransitionSubtype( mnSubType );
173*cdf0e10cSrcweir             rOutPage.setTransitionDirection( mbDirection );
174*cdf0e10cSrcweir             rOutPage.setTransitionFadeColor( mnFadeColor );
175*cdf0e10cSrcweir         }
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir         if( ! mbDurationAmbiguous )
178*cdf0e10cSrcweir             rOutPage.setTransitionDuration( mfDuration );
179*cdf0e10cSrcweir         if( ! mbTimeAmbiguous )
180*cdf0e10cSrcweir             rOutPage.SetTime( mnTime );
181*cdf0e10cSrcweir         if( ! mbPresChangeAmbiguous )
182*cdf0e10cSrcweir             rOutPage.SetPresChange( mePresChange );
183*cdf0e10cSrcweir         if( ! mbSoundAmbiguous )
184*cdf0e10cSrcweir 		{
185*cdf0e10cSrcweir 			if( mbStopSound )
186*cdf0e10cSrcweir 			{
187*cdf0e10cSrcweir 				rOutPage.SetStopSound( sal_True );
188*cdf0e10cSrcweir 	            rOutPage.SetSound( sal_False );
189*cdf0e10cSrcweir 			}
190*cdf0e10cSrcweir 			else
191*cdf0e10cSrcweir 			{
192*cdf0e10cSrcweir 				rOutPage.SetStopSound( sal_False );
193*cdf0e10cSrcweir 	            rOutPage.SetSound( mbSoundOn );
194*cdf0e10cSrcweir 		        rOutPage.SetSoundFile( maSound );
195*cdf0e10cSrcweir 			}
196*cdf0e10cSrcweir 		}
197*cdf0e10cSrcweir 		if( ! mbLoopSoundAmbiguous )
198*cdf0e10cSrcweir 			rOutPage.SetLoopSound( mbLoopSound );
199*cdf0e10cSrcweir     }
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir     void compareWith( const SdPage & rPage )
202*cdf0e10cSrcweir     {
203*cdf0e10cSrcweir         TransitionEffect aOtherEffect( rPage );
204*cdf0e10cSrcweir         mbEffectAmbiguous = mbEffectAmbiguous || aOtherEffect.mbEffectAmbiguous
205*cdf0e10cSrcweir 											  || (mnType != aOtherEffect.mnType)
206*cdf0e10cSrcweir 											  || (mnSubType != aOtherEffect.mnSubType)
207*cdf0e10cSrcweir 											  || (mbDirection != aOtherEffect.mbDirection)
208*cdf0e10cSrcweir 											  || (mnFadeColor != aOtherEffect.mnFadeColor);
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir         mbDurationAmbiguous = mbDurationAmbiguous || aOtherEffect.mbDurationAmbiguous || mfDuration != aOtherEffect.mfDuration;
211*cdf0e10cSrcweir         mbTimeAmbiguous = mbTimeAmbiguous || aOtherEffect.mbTimeAmbiguous || mnTime != aOtherEffect.mnTime;
212*cdf0e10cSrcweir         mbPresChangeAmbiguous = mbPresChangeAmbiguous || aOtherEffect.mbPresChangeAmbiguous || mePresChange != aOtherEffect.mePresChange;
213*cdf0e10cSrcweir         mbSoundAmbiguous = mbSoundAmbiguous || aOtherEffect.mbSoundAmbiguous || mbSoundOn != aOtherEffect.mbSoundOn;
214*cdf0e10cSrcweir 						(!mbStopSound && !aOtherEffect.mbStopSound && maSound != aOtherEffect.maSound) || (mbStopSound != aOtherEffect.mbStopSound);
215*cdf0e10cSrcweir 		mbLoopSoundAmbiguous = mbLoopSoundAmbiguous || aOtherEffect.mbLoopSoundAmbiguous || mbLoopSound != aOtherEffect.mbLoopSound;
216*cdf0e10cSrcweir     }
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir     // effect
219*cdf0e10cSrcweir     sal_Int16 mnType;
220*cdf0e10cSrcweir     sal_Int16 mnSubType;
221*cdf0e10cSrcweir     sal_Bool  mbDirection;
222*cdf0e10cSrcweir     sal_Int32 mnFadeColor;
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir     // other settings
225*cdf0e10cSrcweir     double		mfDuration;
226*cdf0e10cSrcweir     sal_uLong       mnTime;
227*cdf0e10cSrcweir     PresChange  mePresChange;
228*cdf0e10cSrcweir     sal_Bool        mbSoundOn;
229*cdf0e10cSrcweir     String      maSound;
230*cdf0e10cSrcweir 	bool		mbLoopSound;
231*cdf0e10cSrcweir 	bool		mbStopSound;
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir     bool mbEffectAmbiguous;
234*cdf0e10cSrcweir     bool mbDurationAmbiguous;
235*cdf0e10cSrcweir     bool mbTimeAmbiguous;
236*cdf0e10cSrcweir     bool mbPresChangeAmbiguous;
237*cdf0e10cSrcweir     bool mbSoundAmbiguous;
238*cdf0e10cSrcweir     bool mbLoopSoundAmbiguous;
239*cdf0e10cSrcweir };
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir } // namespace impl
242*cdf0e10cSrcweir } // namespace sd
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir // ______________________
245*cdf0e10cSrcweir //
246*cdf0e10cSrcweir // Local Helper Functions
247*cdf0e10cSrcweir // ______________________
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir namespace
250*cdf0e10cSrcweir {
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir void lcl_ApplyToPages(
253*cdf0e10cSrcweir     const ::sd::slidesorter::SharedPageSelection& rpPages,
254*cdf0e10cSrcweir     const ::sd::impl::TransitionEffect & rEffect )
255*cdf0e10cSrcweir {
256*cdf0e10cSrcweir     ::std::vector< SdPage * >::const_iterator aIt( rpPages->begin());
257*cdf0e10cSrcweir     const ::std::vector< SdPage * >::const_iterator aEndIt( rpPages->end());
258*cdf0e10cSrcweir     for( ; aIt != aEndIt; ++aIt )
259*cdf0e10cSrcweir     {
260*cdf0e10cSrcweir         rEffect.applyTo( *(*aIt) );
261*cdf0e10cSrcweir     }
262*cdf0e10cSrcweir }
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir void lcl_CreateUndoForPages(
265*cdf0e10cSrcweir     const ::sd::slidesorter::SharedPageSelection& rpPages,
266*cdf0e10cSrcweir     ::sd::ViewShellBase& rBase )
267*cdf0e10cSrcweir {
268*cdf0e10cSrcweir 	::sd::DrawDocShell* pDocSh	    = rBase.GetDocShell();
269*cdf0e10cSrcweir 	::svl::IUndoManager* pManager   = pDocSh->GetUndoManager();
270*cdf0e10cSrcweir 	SdDrawDocument*	pDoc		    = pDocSh->GetDoc();
271*cdf0e10cSrcweir 	if( pManager && pDocSh && pDoc )
272*cdf0e10cSrcweir 	{
273*cdf0e10cSrcweir 		String aComment( SdResId(STR_UNDO_SLIDE_PARAMS) );
274*cdf0e10cSrcweir 		pManager->EnterListAction(aComment, aComment);
275*cdf0e10cSrcweir 		SdUndoGroup* pUndoGroup = new SdUndoGroup( pDoc );
276*cdf0e10cSrcweir 		pUndoGroup->SetComment( aComment );
277*cdf0e10cSrcweir 
278*cdf0e10cSrcweir 		::std::vector< SdPage * >::const_iterator aIt( rpPages->begin());
279*cdf0e10cSrcweir 		const ::std::vector< SdPage * >::const_iterator aEndIt( rpPages->end());
280*cdf0e10cSrcweir 		for( ; aIt != aEndIt; ++aIt )
281*cdf0e10cSrcweir 		{
282*cdf0e10cSrcweir 			pUndoGroup->AddAction( new sd::UndoTransition( pDoc, (*aIt) ) );
283*cdf0e10cSrcweir 		}
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir 		pManager->AddUndoAction( pUndoGroup );
286*cdf0e10cSrcweir 		pManager->LeaveListAction();
287*cdf0e10cSrcweir 	}
288*cdf0e10cSrcweir }
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir sal_uInt16 lcl_getTransitionEffectIndex(
291*cdf0e10cSrcweir     SdDrawDocument * pDoc,
292*cdf0e10cSrcweir     const ::sd::impl::TransitionEffect & rTransition )
293*cdf0e10cSrcweir {
294*cdf0e10cSrcweir     // first entry: "<none>"
295*cdf0e10cSrcweir     sal_uInt16 nResultIndex = LISTBOX_ENTRY_NOTFOUND;
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir     if( pDoc )
298*cdf0e10cSrcweir     {
299*cdf0e10cSrcweir         sal_uInt16 nCurrentIndex = 0;
300*cdf0e10cSrcweir 		const ::sd::TransitionPresetList & rPresetList = ::sd::TransitionPreset::getTransitionPresetList();
301*cdf0e10cSrcweir         ::sd::TransitionPresetList::const_iterator aIt( rPresetList.begin());
302*cdf0e10cSrcweir         const ::sd::TransitionPresetList::const_iterator aEndIt( rPresetList.end());
303*cdf0e10cSrcweir         for( ; aIt != aEndIt; ++aIt, ++nCurrentIndex )
304*cdf0e10cSrcweir         {
305*cdf0e10cSrcweir             if( rTransition.operator==( *(*aIt) ))
306*cdf0e10cSrcweir             {
307*cdf0e10cSrcweir                 nResultIndex = nCurrentIndex;
308*cdf0e10cSrcweir                 break;
309*cdf0e10cSrcweir             }
310*cdf0e10cSrcweir         }
311*cdf0e10cSrcweir     }
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir     return nResultIndex;
314*cdf0e10cSrcweir }
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir ::sd::TransitionPresetPtr lcl_getTransitionPresetByUIName(
317*cdf0e10cSrcweir     SdDrawDocument * pDoc,
318*cdf0e10cSrcweir     const OUString & rUIName )
319*cdf0e10cSrcweir {
320*cdf0e10cSrcweir     ::sd::TransitionPresetPtr pResult;
321*cdf0e10cSrcweir     if( pDoc )
322*cdf0e10cSrcweir     {
323*cdf0e10cSrcweir 		const ::sd::TransitionPresetList& rPresetList = ::sd::TransitionPreset::getTransitionPresetList();
324*cdf0e10cSrcweir         ::sd::TransitionPresetList::const_iterator aIter( rPresetList.begin() );
325*cdf0e10cSrcweir         const ::sd::TransitionPresetList::const_iterator aEnd( rPresetList.end() );
326*cdf0e10cSrcweir         for( ; aIter != aEnd; ++aIter )
327*cdf0e10cSrcweir         {
328*cdf0e10cSrcweir             if( (*aIter)->getUIName().equals( rUIName ))
329*cdf0e10cSrcweir             {
330*cdf0e10cSrcweir                 pResult = *aIter;
331*cdf0e10cSrcweir                 break;
332*cdf0e10cSrcweir             }
333*cdf0e10cSrcweir         }
334*cdf0e10cSrcweir     }
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir     return pResult;
337*cdf0e10cSrcweir }
338*cdf0e10cSrcweir 
339*cdf0e10cSrcweir struct lcl_EqualsSoundFileName : public ::std::unary_function< String, bool >
340*cdf0e10cSrcweir {
341*cdf0e10cSrcweir     explicit lcl_EqualsSoundFileName( const String & rStr ) :
342*cdf0e10cSrcweir             maStr( rStr )
343*cdf0e10cSrcweir     {}
344*cdf0e10cSrcweir 
345*cdf0e10cSrcweir     bool operator() ( const String & rStr ) const
346*cdf0e10cSrcweir     {
347*cdf0e10cSrcweir         // note: formerly this was a case insensitive search for all
348*cdf0e10cSrcweir         // platforms. It seems more sensible to do this platform-dependent
349*cdf0e10cSrcweir #if defined( WNT )
350*cdf0e10cSrcweir         return maStr.EqualsIgnoreCaseAscii( rStr );
351*cdf0e10cSrcweir #else
352*cdf0e10cSrcweir         return maStr.Equals( rStr );
353*cdf0e10cSrcweir #endif
354*cdf0e10cSrcweir     }
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir private:
357*cdf0e10cSrcweir     String maStr;
358*cdf0e10cSrcweir };
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir // returns -1 if no object was found
361*cdf0e10cSrcweir bool lcl_findSoundInList( const ::std::vector< String > & rSoundList,
362*cdf0e10cSrcweir                           const String & rFileName,
363*cdf0e10cSrcweir                           ::std::vector< String >::size_type & rOutPosition )
364*cdf0e10cSrcweir {
365*cdf0e10cSrcweir     ::std::vector< String >::const_iterator aIt =
366*cdf0e10cSrcweir           ::std::find_if( rSoundList.begin(), rSoundList.end(),
367*cdf0e10cSrcweir                           lcl_EqualsSoundFileName( rFileName ));
368*cdf0e10cSrcweir     if( aIt != rSoundList.end())
369*cdf0e10cSrcweir     {
370*cdf0e10cSrcweir         rOutPosition = ::std::distance( rSoundList.begin(), aIt );
371*cdf0e10cSrcweir         return true;
372*cdf0e10cSrcweir     }
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir     return false;
375*cdf0e10cSrcweir }
376*cdf0e10cSrcweir 
377*cdf0e10cSrcweir String lcl_getSoundFileURL(
378*cdf0e10cSrcweir     const ::std::vector< String > & rSoundList,
379*cdf0e10cSrcweir     const ListBox & rListBox )
380*cdf0e10cSrcweir {
381*cdf0e10cSrcweir     String aResult;
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir     if( rListBox.GetSelectEntryCount() > 0 )
384*cdf0e10cSrcweir     {
385*cdf0e10cSrcweir         sal_uInt16 nPos = rListBox.GetSelectEntryPos();
386*cdf0e10cSrcweir         // the first three entries are no actual sounds
387*cdf0e10cSrcweir         if( nPos >= 3 )
388*cdf0e10cSrcweir         {
389*cdf0e10cSrcweir             DBG_ASSERT( (sal_uInt32)(rListBox.GetEntryCount() - 3) == rSoundList.size(),
390*cdf0e10cSrcweir                         "Sound list-box is not synchronized to sound list" );
391*cdf0e10cSrcweir             nPos -= 3;
392*cdf0e10cSrcweir             if( rSoundList.size() > nPos )
393*cdf0e10cSrcweir                 aResult = rSoundList[ nPos ];
394*cdf0e10cSrcweir         }
395*cdf0e10cSrcweir     }
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir     return aResult;
398*cdf0e10cSrcweir }
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir struct lcl_AppendSoundToListBox : public ::std::unary_function< String, void >
401*cdf0e10cSrcweir {
402*cdf0e10cSrcweir     lcl_AppendSoundToListBox( ListBox & rListBox ) :
403*cdf0e10cSrcweir             mrListBox( rListBox )
404*cdf0e10cSrcweir     {}
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir     void operator() ( const String & rString ) const
407*cdf0e10cSrcweir     {
408*cdf0e10cSrcweir         INetURLObject aURL( rString );
409*cdf0e10cSrcweir         mrListBox.InsertEntry( aURL.GetBase(), LISTBOX_APPEND );
410*cdf0e10cSrcweir     }
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir private:
413*cdf0e10cSrcweir     ListBox & mrListBox;
414*cdf0e10cSrcweir };
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir void lcl_FillSoundListBox(
417*cdf0e10cSrcweir     const ::std::vector< String > & rSoundList,
418*cdf0e10cSrcweir     ListBox & rOutListBox )
419*cdf0e10cSrcweir {
420*cdf0e10cSrcweir     sal_uInt16 nCount = rOutListBox.GetEntryCount();
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir     // keep first three entries
423*cdf0e10cSrcweir     for( sal_uInt16 i=nCount - 1; i>=3; --i )
424*cdf0e10cSrcweir         rOutListBox.RemoveEntry( i );
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir     ::std::for_each( rSoundList.begin(), rSoundList.end(),
427*cdf0e10cSrcweir                      lcl_AppendSoundToListBox( rOutListBox ));
428*cdf0e10cSrcweir }
429*cdf0e10cSrcweir 
430*cdf0e10cSrcweir } // anonymous namespace
431*cdf0e10cSrcweir 
432*cdf0e10cSrcweir namespace sd
433*cdf0e10cSrcweir {
434*cdf0e10cSrcweir 
435*cdf0e10cSrcweir // ___________________
436*cdf0e10cSrcweir //
437*cdf0e10cSrcweir // SlideTransitionPane
438*cdf0e10cSrcweir // ___________________
439*cdf0e10cSrcweir 
440*cdf0e10cSrcweir SlideTransitionPane::SlideTransitionPane(
441*cdf0e10cSrcweir     ::Window * pParent,
442*cdf0e10cSrcweir     ViewShellBase & rBase,
443*cdf0e10cSrcweir     const Size& rMinSize,
444*cdf0e10cSrcweir     SdDrawDocument* pDoc ) :
445*cdf0e10cSrcweir         Control( pParent, SdResId( DLG_SLIDE_TRANSITION_PANE ) ),
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir         mrBase( rBase ),
448*cdf0e10cSrcweir         mpDrawDoc( pDoc ),
449*cdf0e10cSrcweir         maMinSize( rMinSize ),
450*cdf0e10cSrcweir         maFL_APPLY_TRANSITION( this, SdResId( FL_APPLY_TRANSITION ) ),
451*cdf0e10cSrcweir         maLB_SLIDE_TRANSITIONS( this, SdResId( LB_SLIDE_TRANSITIONS ) ),
452*cdf0e10cSrcweir         maFL_MODIFY_TRANSITION( this, SdResId( FL_MODIFY_TRANSITION ) ),
453*cdf0e10cSrcweir         maFT_SPEED( this, SdResId( FT_SPEED ) ),
454*cdf0e10cSrcweir         maLB_SPEED( this, SdResId( LB_SPEED ) ),
455*cdf0e10cSrcweir         maFT_SOUND( this, SdResId( FT_SOUND ) ),
456*cdf0e10cSrcweir         maLB_SOUND( this, SdResId( LB_SOUND ) ),
457*cdf0e10cSrcweir         maCB_LOOP_SOUND( this, SdResId( CB_LOOP_SOUND ) ),
458*cdf0e10cSrcweir         maFL_ADVANCE_SLIDE( this, SdResId( FL_ADVANCE_SLIDE ) ),
459*cdf0e10cSrcweir         maRB_ADVANCE_ON_MOUSE( this, SdResId( RB_ADVANCE_ON_MOUSE ) ),
460*cdf0e10cSrcweir         maRB_ADVANCE_AUTO( this, SdResId( RB_ADVANCE_AUTO ) ),
461*cdf0e10cSrcweir         maMF_ADVANCE_AUTO_AFTER( this, SdResId( MF_ADVANCE_AUTO_AFTER ) ),
462*cdf0e10cSrcweir         maFL_EMPTY1( this, SdResId( FL_EMPTY1 ) ),
463*cdf0e10cSrcweir         maPB_APPLY_TO_ALL( this, SdResId( PB_APPLY_TO_ALL ) ),
464*cdf0e10cSrcweir         maPB_PLAY( this, SdResId( PB_PLAY ) ),
465*cdf0e10cSrcweir         maPB_SLIDE_SHOW( this, SdResId( PB_SLIDE_SHOW ) ),
466*cdf0e10cSrcweir         maFL_EMPTY2( this, SdResId( FL_EMPTY2 ) ),
467*cdf0e10cSrcweir         maCB_AUTO_PREVIEW( this, SdResId( CB_AUTO_PREVIEW ) ),
468*cdf0e10cSrcweir 
469*cdf0e10cSrcweir         maSTR_NO_TRANSITION( SdResId( STR_NO_TRANSITION ) ),
470*cdf0e10cSrcweir         mbHasSelection( false ),
471*cdf0e10cSrcweir         mbUpdatingControls( false ),
472*cdf0e10cSrcweir         mbIsMainViewChangePending( false ),
473*cdf0e10cSrcweir         maLateInitTimer()
474*cdf0e10cSrcweir {
475*cdf0e10cSrcweir     // use no resource ids from here on
476*cdf0e10cSrcweir     FreeResource();
477*cdf0e10cSrcweir 
478*cdf0e10cSrcweir     // use bold font for group headings (same font for all fixed lines):
479*cdf0e10cSrcweir     Font font( maFL_APPLY_TRANSITION.GetFont() );
480*cdf0e10cSrcweir     font.SetWeight( WEIGHT_BOLD );
481*cdf0e10cSrcweir     maFL_APPLY_TRANSITION.SetFont( font );
482*cdf0e10cSrcweir     maFL_MODIFY_TRANSITION.SetFont( font );
483*cdf0e10cSrcweir     maFL_ADVANCE_SLIDE.SetFont( font );
484*cdf0e10cSrcweir 
485*cdf0e10cSrcweir     if( pDoc )
486*cdf0e10cSrcweir         mxModel.set( pDoc->getUnoModel(), uno::UNO_QUERY );
487*cdf0e10cSrcweir     // TODO: get correct view
488*cdf0e10cSrcweir     if( mxModel.is())
489*cdf0e10cSrcweir         mxView.set( mxModel->getCurrentController(), uno::UNO_QUERY );
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir     // fill list box of slide transitions
492*cdf0e10cSrcweir     maLB_SLIDE_TRANSITIONS.InsertEntry( maSTR_NO_TRANSITION );
493*cdf0e10cSrcweir 
494*cdf0e10cSrcweir     // set defaults
495*cdf0e10cSrcweir     maCB_AUTO_PREVIEW.Check();      // automatic preview on
496*cdf0e10cSrcweir 
497*cdf0e10cSrcweir     // update control states before adding handlers
498*cdf0e10cSrcweir     updateLayout();
499*cdf0e10cSrcweir     //    updateSoundList();
500*cdf0e10cSrcweir     updateControls();
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir     // set handlers
503*cdf0e10cSrcweir     maPB_APPLY_TO_ALL.SetClickHdl( LINK( this, SlideTransitionPane, ApplyToAllButtonClicked ));
504*cdf0e10cSrcweir     maPB_PLAY.SetClickHdl( LINK( this, SlideTransitionPane, PlayButtonClicked ));
505*cdf0e10cSrcweir     maPB_SLIDE_SHOW.SetClickHdl( LINK( this, SlideTransitionPane, SlideShowButtonClicked ));
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir     maLB_SLIDE_TRANSITIONS.SetSelectHdl( LINK( this, SlideTransitionPane, TransitionSelected ));
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir     maLB_SPEED.SetSelectHdl( LINK( this, SlideTransitionPane, SpeedListBoxSelected ));
510*cdf0e10cSrcweir     maLB_SOUND.SetSelectHdl( LINK( this, SlideTransitionPane, SoundListBoxSelected ));
511*cdf0e10cSrcweir     maCB_LOOP_SOUND.SetClickHdl( LINK( this, SlideTransitionPane, LoopSoundBoxChecked ));
512*cdf0e10cSrcweir 
513*cdf0e10cSrcweir     maRB_ADVANCE_ON_MOUSE.SetToggleHdl( LINK( this, SlideTransitionPane, AdvanceSlideRadioButtonToggled ));
514*cdf0e10cSrcweir     maRB_ADVANCE_AUTO.SetToggleHdl( LINK( this, SlideTransitionPane, AdvanceSlideRadioButtonToggled ));
515*cdf0e10cSrcweir     maMF_ADVANCE_AUTO_AFTER.SetModifyHdl( LINK( this, SlideTransitionPane, AdvanceTimeModified ));
516*cdf0e10cSrcweir 	maCB_AUTO_PREVIEW.SetClickHdl( LINK( this, SlideTransitionPane, AutoPreviewClicked ));
517*cdf0e10cSrcweir     addListener();
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir     maLateInitTimer.SetTimeout(200);
520*cdf0e10cSrcweir     maLateInitTimer.SetTimeoutHdl(LINK(this, SlideTransitionPane, LateInitCallback));
521*cdf0e10cSrcweir     maLateInitTimer.Start();
522*cdf0e10cSrcweir }
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir SlideTransitionPane::~SlideTransitionPane()
525*cdf0e10cSrcweir {
526*cdf0e10cSrcweir     maLateInitTimer.Stop();
527*cdf0e10cSrcweir 	removeListener();
528*cdf0e10cSrcweir }
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir void SlideTransitionPane::Resize()
531*cdf0e10cSrcweir {
532*cdf0e10cSrcweir 	updateLayout();
533*cdf0e10cSrcweir }
534*cdf0e10cSrcweir 
535*cdf0e10cSrcweir void SlideTransitionPane::onSelectionChanged()
536*cdf0e10cSrcweir {
537*cdf0e10cSrcweir     updateControls();
538*cdf0e10cSrcweir }
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir void SlideTransitionPane::onChangeCurrentPage()
541*cdf0e10cSrcweir {
542*cdf0e10cSrcweir     updateControls();
543*cdf0e10cSrcweir }
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir ::sd::slidesorter::SharedPageSelection SlideTransitionPane::getSelectedPages (void) const
546*cdf0e10cSrcweir {
547*cdf0e10cSrcweir     ::sd::slidesorter::SlideSorterViewShell * pSlideSorterViewShell
548*cdf0e10cSrcweir         = ::sd::slidesorter::SlideSorterViewShell::GetSlideSorter(mrBase);
549*cdf0e10cSrcweir //    DBG_ASSERT( pSlideSorterViewShell, "No Slide-Sorter available" );
550*cdf0e10cSrcweir     ::boost::shared_ptr<sd::slidesorter::SlideSorterViewShell::PageSelection> pSelection;
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir     if( pSlideSorterViewShell )
553*cdf0e10cSrcweir     {
554*cdf0e10cSrcweir         pSelection = pSlideSorterViewShell->GetPageSelection();
555*cdf0e10cSrcweir     }
556*cdf0e10cSrcweir 	else
557*cdf0e10cSrcweir     {
558*cdf0e10cSrcweir         pSelection.reset(new sd::slidesorter::SlideSorterViewShell::PageSelection());
559*cdf0e10cSrcweir         if( mxView.is() )
560*cdf0e10cSrcweir         {
561*cdf0e10cSrcweir             SdPage* pPage = SdPage::getImplementation( mxView->getCurrentPage() );
562*cdf0e10cSrcweir             if( pPage )
563*cdf0e10cSrcweir                 pSelection->push_back(pPage);
564*cdf0e10cSrcweir         }
565*cdf0e10cSrcweir 	}
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir     return pSelection;
568*cdf0e10cSrcweir }
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir void SlideTransitionPane::updateLayout()
571*cdf0e10cSrcweir {
572*cdf0e10cSrcweir 	::Size aPaneSize( GetSizePixel() );
573*cdf0e10cSrcweir 	if( aPaneSize.Width() < maMinSize.Width() )
574*cdf0e10cSrcweir 		aPaneSize.Width() = maMinSize.Width();
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir 	if( aPaneSize.Height() < maMinSize.Height() )
577*cdf0e10cSrcweir 		aPaneSize.Height() = maMinSize.Height();
578*cdf0e10cSrcweir 
579*cdf0e10cSrcweir     // start layouting elements from bottom to top.  The remaining space is used
580*cdf0e10cSrcweir     // for the topmost list box
581*cdf0e10cSrcweir 	::Point aOffset( LogicToPixel( Point( 3, 3 ), MAP_APPFONT ) );
582*cdf0e10cSrcweir     long nOffsetX = aOffset.getX();
583*cdf0e10cSrcweir     long nOffsetY = aOffset.getY();
584*cdf0e10cSrcweir     long nOffsetBtnX = LogicToPixel( Point( 6, 1 ), MAP_APPFONT ).getX();
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir     const long nMinCtrlWidth = LogicToPixel( ::Point( 32, 1 ), MAP_APPFONT ).getX();
587*cdf0e10cSrcweir     const long nTextIndent = LogicToPixel( ::Point( RSC_SP_CHK_TEXTINDENT, 1 ), MAP_APPFONT ).getX();
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir 	::Point aUpperLeft( nOffsetX, aPaneSize.getHeight() - nOffsetY );
590*cdf0e10cSrcweir     long nMaxWidth = aPaneSize.getWidth() - 2 * nOffsetX;
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir     // auto preview check-box
593*cdf0e10cSrcweir     ::Size aCtrlSize = maCB_AUTO_PREVIEW.GetSizePixel();
594*cdf0e10cSrcweir     aCtrlSize.setWidth( maCB_AUTO_PREVIEW.CalcMinimumSize( nMaxWidth ).getWidth());
595*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
596*cdf0e10cSrcweir     maCB_AUTO_PREVIEW.SetPosSizePixel( aUpperLeft, aCtrlSize );
597*cdf0e10cSrcweir 
598*cdf0e10cSrcweir     // fixed line above check-box
599*cdf0e10cSrcweir     aCtrlSize = maFL_EMPTY2.GetSizePixel();
600*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth );
601*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
602*cdf0e10cSrcweir     maFL_EMPTY2.SetPosSizePixel( aUpperLeft, aCtrlSize );
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir     // buttons "Play" and "Slide Show"
605*cdf0e10cSrcweir     long nPlayButtonWidth = maPB_PLAY.CalcMinimumSize().getWidth() + 2 * nOffsetBtnX;
606*cdf0e10cSrcweir     long nSlideShowButtonWidth = maPB_SLIDE_SHOW.CalcMinimumSize().getWidth() + 2 * nOffsetBtnX;
607*cdf0e10cSrcweir 
608*cdf0e10cSrcweir     if( (nPlayButtonWidth + nSlideShowButtonWidth + nOffsetX) <= nMaxWidth )
609*cdf0e10cSrcweir     {
610*cdf0e10cSrcweir         // place buttons side by side
611*cdf0e10cSrcweir         aCtrlSize = maPB_PLAY.GetSizePixel();
612*cdf0e10cSrcweir         aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
613*cdf0e10cSrcweir         aCtrlSize.setWidth( nPlayButtonWidth );
614*cdf0e10cSrcweir         maPB_PLAY.SetPosSizePixel( aUpperLeft, aCtrlSize );
615*cdf0e10cSrcweir 
616*cdf0e10cSrcweir         aUpperLeft.setX( aUpperLeft.getX() + nPlayButtonWidth + nOffsetX );
617*cdf0e10cSrcweir         aCtrlSize.setWidth( nSlideShowButtonWidth );
618*cdf0e10cSrcweir         maPB_SLIDE_SHOW.SetPosSizePixel( aUpperLeft, aCtrlSize );
619*cdf0e10cSrcweir         aUpperLeft.setX( nOffsetX );
620*cdf0e10cSrcweir     }
621*cdf0e10cSrcweir     else
622*cdf0e10cSrcweir     {
623*cdf0e10cSrcweir         // place buttons on top of each other
624*cdf0e10cSrcweir         aCtrlSize = maPB_SLIDE_SHOW.GetSizePixel();
625*cdf0e10cSrcweir         aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
626*cdf0e10cSrcweir         aCtrlSize.setWidth( nSlideShowButtonWidth );
627*cdf0e10cSrcweir         maPB_SLIDE_SHOW.SetPosSizePixel( aUpperLeft, aCtrlSize );
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir         aCtrlSize = maPB_PLAY.GetSizePixel();
630*cdf0e10cSrcweir         aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
631*cdf0e10cSrcweir         aCtrlSize.setWidth( nPlayButtonWidth );
632*cdf0e10cSrcweir         maPB_PLAY.SetPosSizePixel( aUpperLeft, aCtrlSize );
633*cdf0e10cSrcweir     }
634*cdf0e10cSrcweir 
635*cdf0e10cSrcweir     // "Apply to All Slides" button
636*cdf0e10cSrcweir     aCtrlSize = maPB_APPLY_TO_ALL.GetSizePixel();
637*cdf0e10cSrcweir     aCtrlSize.setWidth( maPB_APPLY_TO_ALL.CalcMinimumSize( nMaxWidth ).getWidth() + 2 * nOffsetBtnX );
638*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
639*cdf0e10cSrcweir     maPB_APPLY_TO_ALL.SetPosSizePixel( aUpperLeft, aCtrlSize );
640*cdf0e10cSrcweir 
641*cdf0e10cSrcweir     // fixed line above "Apply to All Slides" button
642*cdf0e10cSrcweir     aCtrlSize = maFL_EMPTY1.GetSizePixel();
643*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth );
644*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
645*cdf0e10cSrcweir     maFL_EMPTY1.SetPosSizePixel( aUpperLeft, aCtrlSize );
646*cdf0e10cSrcweir 
647*cdf0e10cSrcweir     // advance automatically after ... seconds
648*cdf0e10cSrcweir     long nItemWidth = maRB_ADVANCE_AUTO.CalcMinimumSize().getWidth();
649*cdf0e10cSrcweir 
650*cdf0e10cSrcweir     if( (nItemWidth + nMinCtrlWidth + nOffsetX) <= nMaxWidth )
651*cdf0e10cSrcweir     {
652*cdf0e10cSrcweir         long nBase = aUpperLeft.getY();
653*cdf0e10cSrcweir 
654*cdf0e10cSrcweir         // place controls side by side
655*cdf0e10cSrcweir         aCtrlSize = maRB_ADVANCE_AUTO.GetSizePixel();
656*cdf0e10cSrcweir         aUpperLeft.setY( nBase - aCtrlSize.getHeight());
657*cdf0e10cSrcweir         aCtrlSize.setWidth( nItemWidth );
658*cdf0e10cSrcweir         maRB_ADVANCE_AUTO.SetPosSizePixel( aUpperLeft, aCtrlSize );
659*cdf0e10cSrcweir 
660*cdf0e10cSrcweir         aCtrlSize = maMF_ADVANCE_AUTO_AFTER.GetSizePixel();
661*cdf0e10cSrcweir         aUpperLeft.setY( nBase - aCtrlSize.getHeight() );
662*cdf0e10cSrcweir         aUpperLeft.setX( aUpperLeft.getX() + nItemWidth + nOffsetX );
663*cdf0e10cSrcweir         aCtrlSize.setWidth( nMinCtrlWidth );
664*cdf0e10cSrcweir         maMF_ADVANCE_AUTO_AFTER.SetPosSizePixel( aUpperLeft, aCtrlSize );
665*cdf0e10cSrcweir         aUpperLeft.setX( nOffsetX );
666*cdf0e10cSrcweir     }
667*cdf0e10cSrcweir     else
668*cdf0e10cSrcweir     {
669*cdf0e10cSrcweir         // place controls on top of each other
670*cdf0e10cSrcweir         aCtrlSize = maMF_ADVANCE_AUTO_AFTER.GetSizePixel();
671*cdf0e10cSrcweir         aUpperLeft.setX( nOffsetX + nTextIndent );
672*cdf0e10cSrcweir         aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
673*cdf0e10cSrcweir         aCtrlSize.setWidth( nMinCtrlWidth );
674*cdf0e10cSrcweir         maMF_ADVANCE_AUTO_AFTER.SetPosSizePixel( aUpperLeft, aCtrlSize );
675*cdf0e10cSrcweir 
676*cdf0e10cSrcweir         aCtrlSize = maRB_ADVANCE_AUTO.GetSizePixel();
677*cdf0e10cSrcweir         aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
678*cdf0e10cSrcweir         aUpperLeft.setX( nOffsetX );
679*cdf0e10cSrcweir         aCtrlSize.setWidth( nItemWidth );
680*cdf0e10cSrcweir         maRB_ADVANCE_AUTO.SetPosSizePixel( aUpperLeft, aCtrlSize );
681*cdf0e10cSrcweir         aUpperLeft.setX( nOffsetX );
682*cdf0e10cSrcweir     }
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir     // check box "On mouse click"
685*cdf0e10cSrcweir     aCtrlSize = maRB_ADVANCE_ON_MOUSE.GetSizePixel();
686*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth );
687*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
688*cdf0e10cSrcweir     maRB_ADVANCE_ON_MOUSE.SetPosSizePixel( aUpperLeft, aCtrlSize );
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir     // fixed line "Advance slide"
691*cdf0e10cSrcweir     aCtrlSize = maFL_ADVANCE_SLIDE.GetSizePixel();
692*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth );
693*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
694*cdf0e10cSrcweir     maFL_ADVANCE_SLIDE.SetPosSizePixel( aUpperLeft, aCtrlSize );
695*cdf0e10cSrcweir 
696*cdf0e10cSrcweir     // check box "Loop until next sound"
697*cdf0e10cSrcweir     long nFTSpeedWidth = maFT_SPEED.CalcMinimumSize().getWidth() + 2 * nOffsetX;
698*cdf0e10cSrcweir     long nFTSoundWidth = maFT_SOUND.CalcMinimumSize().getWidth() + 2 * nOffsetX;
699*cdf0e10cSrcweir     long nIndent = ::std::max( nFTSoundWidth, nFTSpeedWidth );
700*cdf0e10cSrcweir 
701*cdf0e10cSrcweir     bool bStack = ( (nIndent + nMinCtrlWidth + nOffsetX) > nMaxWidth );
702*cdf0e10cSrcweir 
703*cdf0e10cSrcweir     if( bStack )
704*cdf0e10cSrcweir         nIndent = nTextIndent;
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir     aCtrlSize = maCB_LOOP_SOUND.GetSizePixel();
707*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth - nIndent );
708*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
709*cdf0e10cSrcweir     aUpperLeft.setX( nIndent );
710*cdf0e10cSrcweir     maCB_LOOP_SOUND.SetPosSizePixel( aUpperLeft, aCtrlSize );
711*cdf0e10cSrcweir 
712*cdf0e10cSrcweir     aCtrlSize = maLB_SOUND.GetSizePixel();
713*cdf0e10cSrcweir     aCtrlSize.setWidth( ::std::max( nMaxWidth - nIndent, nMinCtrlWidth ) );
714*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
715*cdf0e10cSrcweir     maLB_SOUND.SetPosSizePixel( aUpperLeft, aCtrlSize );
716*cdf0e10cSrcweir     maLB_SOUND.SetDropDownLineCount( 8 );
717*cdf0e10cSrcweir     aUpperLeft.setX( nOffsetX );
718*cdf0e10cSrcweir 
719*cdf0e10cSrcweir     aCtrlSize = maFT_SOUND.GetSizePixel();
720*cdf0e10cSrcweir     if( bStack )
721*cdf0e10cSrcweir         aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
722*cdf0e10cSrcweir     aCtrlSize.setWidth( nFTSoundWidth );
723*cdf0e10cSrcweir     maFT_SOUND.SetPosSizePixel( aUpperLeft, aCtrlSize );
724*cdf0e10cSrcweir 
725*cdf0e10cSrcweir     aUpperLeft.setX( nIndent );
726*cdf0e10cSrcweir     aCtrlSize = maLB_SPEED.GetSizePixel();
727*cdf0e10cSrcweir     aCtrlSize.setWidth( ::std::max( nMaxWidth - nIndent, nMinCtrlWidth ) );
728*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
729*cdf0e10cSrcweir     maLB_SPEED.SetPosSizePixel( aUpperLeft, aCtrlSize );
730*cdf0e10cSrcweir     maLB_SPEED.SetDropDownLineCount( 3 );
731*cdf0e10cSrcweir     aUpperLeft.setX( nOffsetX );
732*cdf0e10cSrcweir 
733*cdf0e10cSrcweir     aCtrlSize = maFT_SPEED.GetSizePixel();
734*cdf0e10cSrcweir     if( bStack )
735*cdf0e10cSrcweir         aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight());
736*cdf0e10cSrcweir     aCtrlSize.setWidth( nFTSpeedWidth );
737*cdf0e10cSrcweir     maFT_SPEED.SetPosSizePixel( aUpperLeft, aCtrlSize );
738*cdf0e10cSrcweir 
739*cdf0e10cSrcweir     // fixed line "Modify Transition"
740*cdf0e10cSrcweir     aCtrlSize = maFL_MODIFY_TRANSITION.GetSizePixel();
741*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth );
742*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - aCtrlSize.getHeight() - nOffsetY );
743*cdf0e10cSrcweir     maFL_MODIFY_TRANSITION.SetPosSizePixel( aUpperLeft, aCtrlSize );
744*cdf0e10cSrcweir 
745*cdf0e10cSrcweir     // fixed line "Apply to selected slides"
746*cdf0e10cSrcweir     aCtrlSize = maFL_APPLY_TRANSITION.GetSizePixel();
747*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth );
748*cdf0e10cSrcweir     ::Point aUpperLeftCorner( nOffsetX, nOffsetY );
749*cdf0e10cSrcweir     maFL_APPLY_TRANSITION.SetPosSizePixel( aUpperLeftCorner, aCtrlSize );
750*cdf0e10cSrcweir     aUpperLeftCorner.setY( aUpperLeftCorner.getY() + aCtrlSize.getHeight() + nOffsetY );
751*cdf0e10cSrcweir     aUpperLeft.setY( aUpperLeft.getY() - nOffsetY );
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir     // list box slide transitions
754*cdf0e10cSrcweir     aCtrlSize.setWidth( nMaxWidth );
755*cdf0e10cSrcweir     aCtrlSize.setHeight( aUpperLeft.getY() - aUpperLeftCorner.getY() );
756*cdf0e10cSrcweir     maLB_SLIDE_TRANSITIONS.SetPosSizePixel( aUpperLeftCorner, aCtrlSize );
757*cdf0e10cSrcweir }
758*cdf0e10cSrcweir 
759*cdf0e10cSrcweir void SlideTransitionPane::updateControls()
760*cdf0e10cSrcweir {
761*cdf0e10cSrcweir     ::sd::slidesorter::SharedPageSelection pSelectedPages(getSelectedPages());
762*cdf0e10cSrcweir     if( pSelectedPages->empty())
763*cdf0e10cSrcweir     {
764*cdf0e10cSrcweir         mbHasSelection = false;
765*cdf0e10cSrcweir         return;
766*cdf0e10cSrcweir     }
767*cdf0e10cSrcweir     mbHasSelection = true;
768*cdf0e10cSrcweir 
769*cdf0e10cSrcweir     DBG_ASSERT( ! mbUpdatingControls, "Multiple Control Updates" );
770*cdf0e10cSrcweir     mbUpdatingControls = true;
771*cdf0e10cSrcweir 
772*cdf0e10cSrcweir     // get model data for first page
773*cdf0e10cSrcweir     SdPage * pFirstPage = pSelectedPages->front();
774*cdf0e10cSrcweir     DBG_ASSERT( pFirstPage, "Invalid Page" );
775*cdf0e10cSrcweir 
776*cdf0e10cSrcweir     impl::TransitionEffect aEffect( *pFirstPage );
777*cdf0e10cSrcweir 
778*cdf0e10cSrcweir     // merge with other pages
779*cdf0e10cSrcweir     ::sd::slidesorter::SlideSorterViewShell::PageSelection::const_iterator aIt(
780*cdf0e10cSrcweir         pSelectedPages->begin());
781*cdf0e10cSrcweir     ::sd::slidesorter::SlideSorterViewShell::PageSelection::const_iterator aEndIt(
782*cdf0e10cSrcweir         pSelectedPages->end());
783*cdf0e10cSrcweir 
784*cdf0e10cSrcweir     // start with second page (note aIt != aEndIt, because ! aSelectedPages.empty())
785*cdf0e10cSrcweir     for( ++aIt ;aIt != aEndIt; ++aIt )
786*cdf0e10cSrcweir     {
787*cdf0e10cSrcweir         if( *aIt )
788*cdf0e10cSrcweir             aEffect.compareWith( *(*aIt) );
789*cdf0e10cSrcweir     }
790*cdf0e10cSrcweir 
791*cdf0e10cSrcweir     // detect current slide effect
792*cdf0e10cSrcweir     if( aEffect.mbEffectAmbiguous )
793*cdf0e10cSrcweir         maLB_SLIDE_TRANSITIONS.SetNoSelection();
794*cdf0e10cSrcweir     else
795*cdf0e10cSrcweir     {
796*cdf0e10cSrcweir         // ToDo: That 0 is "no transition" is documented nowhere except in the
797*cdf0e10cSrcweir         // CTOR of sdpage
798*cdf0e10cSrcweir         if( aEffect.mnType == 0 )
799*cdf0e10cSrcweir             maLB_SLIDE_TRANSITIONS.SelectEntryPos( 0 );
800*cdf0e10cSrcweir         else
801*cdf0e10cSrcweir         {
802*cdf0e10cSrcweir             sal_uInt16 nEntry = lcl_getTransitionEffectIndex( mpDrawDoc, aEffect );
803*cdf0e10cSrcweir             if( nEntry == LISTBOX_ENTRY_NOTFOUND )
804*cdf0e10cSrcweir                 maLB_SLIDE_TRANSITIONS.SetNoSelection();
805*cdf0e10cSrcweir             else
806*cdf0e10cSrcweir             {
807*cdf0e10cSrcweir                 // first entry in list is "none", so add 1 after translation
808*cdf0e10cSrcweir                 if( m_aPresetIndexes.find( nEntry ) != m_aPresetIndexes.end())
809*cdf0e10cSrcweir                     maLB_SLIDE_TRANSITIONS.SelectEntryPos( m_aPresetIndexes[ nEntry ] + 1 );
810*cdf0e10cSrcweir                 else
811*cdf0e10cSrcweir                     maLB_SLIDE_TRANSITIONS.SetNoSelection();
812*cdf0e10cSrcweir             }
813*cdf0e10cSrcweir         }
814*cdf0e10cSrcweir     }
815*cdf0e10cSrcweir 
816*cdf0e10cSrcweir     if( aEffect.mbDurationAmbiguous )
817*cdf0e10cSrcweir         maLB_SPEED.SetNoSelection();
818*cdf0e10cSrcweir     else
819*cdf0e10cSrcweir         maLB_SPEED.SelectEntryPos(
820*cdf0e10cSrcweir             (aEffect.mfDuration > 2.0 )
821*cdf0e10cSrcweir             ? 0 : (aEffect.mfDuration < 2.0)
822*cdf0e10cSrcweir             ? 2 : 1 );       // else FADE_SPEED_FAST
823*cdf0e10cSrcweir 
824*cdf0e10cSrcweir     if( aEffect.mbSoundAmbiguous )
825*cdf0e10cSrcweir     {
826*cdf0e10cSrcweir         maLB_SOUND.SetNoSelection();
827*cdf0e10cSrcweir         maCurrentSoundFile.Erase();
828*cdf0e10cSrcweir     }
829*cdf0e10cSrcweir     else
830*cdf0e10cSrcweir     {
831*cdf0e10cSrcweir 		maCurrentSoundFile.Erase();
832*cdf0e10cSrcweir 		if( aEffect.mbStopSound )
833*cdf0e10cSrcweir 		{
834*cdf0e10cSrcweir 			maLB_SOUND.SelectEntryPos( 1 );
835*cdf0e10cSrcweir 		}
836*cdf0e10cSrcweir 		else if( aEffect.mbSoundOn && aEffect.maSound.Len() > 0 )
837*cdf0e10cSrcweir         {
838*cdf0e10cSrcweir             tSoundListType::size_type nPos = 0;
839*cdf0e10cSrcweir             if( lcl_findSoundInList( maSoundList, aEffect.maSound, nPos ))
840*cdf0e10cSrcweir             {
841*cdf0e10cSrcweir                 // skip first three entries
842*cdf0e10cSrcweir                 maLB_SOUND.SelectEntryPos( (sal_uInt16)nPos + 3 );
843*cdf0e10cSrcweir                 maCurrentSoundFile = aEffect.maSound;
844*cdf0e10cSrcweir             }
845*cdf0e10cSrcweir         }
846*cdf0e10cSrcweir         else
847*cdf0e10cSrcweir         {
848*cdf0e10cSrcweir             maLB_SOUND.SelectEntryPos( 0 );
849*cdf0e10cSrcweir         }
850*cdf0e10cSrcweir     }
851*cdf0e10cSrcweir 
852*cdf0e10cSrcweir 	if( aEffect.mbLoopSoundAmbiguous )
853*cdf0e10cSrcweir 	{
854*cdf0e10cSrcweir 		maCB_LOOP_SOUND.SetState( STATE_DONTKNOW );
855*cdf0e10cSrcweir 	}
856*cdf0e10cSrcweir 	else
857*cdf0e10cSrcweir 	{
858*cdf0e10cSrcweir 		maCB_LOOP_SOUND.Check( aEffect.mbLoopSound );
859*cdf0e10cSrcweir 	}
860*cdf0e10cSrcweir 
861*cdf0e10cSrcweir     if( aEffect.mbPresChangeAmbiguous )
862*cdf0e10cSrcweir     {
863*cdf0e10cSrcweir         maRB_ADVANCE_ON_MOUSE.Check( sal_False );
864*cdf0e10cSrcweir         maRB_ADVANCE_AUTO.Check( sal_False );
865*cdf0e10cSrcweir     }
866*cdf0e10cSrcweir     else
867*cdf0e10cSrcweir     {
868*cdf0e10cSrcweir         maRB_ADVANCE_ON_MOUSE.Check( aEffect.mePresChange == PRESCHANGE_MANUAL );
869*cdf0e10cSrcweir         maRB_ADVANCE_AUTO.Check( aEffect.mePresChange == PRESCHANGE_AUTO );
870*cdf0e10cSrcweir         maMF_ADVANCE_AUTO_AFTER.SetValue( aEffect.mnTime );
871*cdf0e10cSrcweir     }
872*cdf0e10cSrcweir 
873*cdf0e10cSrcweir 	SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
874*cdf0e10cSrcweir 	maCB_AUTO_PREVIEW.Check( pOptions->IsPreviewTransitions() == sal_True );
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir     mbUpdatingControls = false;
877*cdf0e10cSrcweir 
878*cdf0e10cSrcweir     updateControlState();
879*cdf0e10cSrcweir }
880*cdf0e10cSrcweir 
881*cdf0e10cSrcweir void SlideTransitionPane::updateControlState()
882*cdf0e10cSrcweir {
883*cdf0e10cSrcweir     maLB_SLIDE_TRANSITIONS.Enable( mbHasSelection );
884*cdf0e10cSrcweir     maLB_SPEED.Enable( mbHasSelection );
885*cdf0e10cSrcweir     maLB_SOUND.Enable( mbHasSelection );
886*cdf0e10cSrcweir     maCB_LOOP_SOUND.Enable( mbHasSelection && (maLB_SOUND.GetSelectEntryPos() > 2));
887*cdf0e10cSrcweir     maRB_ADVANCE_ON_MOUSE.Enable( mbHasSelection );
888*cdf0e10cSrcweir     maRB_ADVANCE_AUTO.Enable( mbHasSelection );
889*cdf0e10cSrcweir     maMF_ADVANCE_AUTO_AFTER.Enable( mbHasSelection && maRB_ADVANCE_AUTO.IsChecked());
890*cdf0e10cSrcweir 
891*cdf0e10cSrcweir     maPB_APPLY_TO_ALL.Enable( mbHasSelection );
892*cdf0e10cSrcweir     maPB_PLAY.Enable( mbHasSelection );
893*cdf0e10cSrcweir //     maPB_SLIDE_SHOW.Enable( sal_True );
894*cdf0e10cSrcweir     maCB_AUTO_PREVIEW.Enable( mbHasSelection );
895*cdf0e10cSrcweir }
896*cdf0e10cSrcweir 
897*cdf0e10cSrcweir void SlideTransitionPane::updateSoundList()
898*cdf0e10cSrcweir {
899*cdf0e10cSrcweir     List aSoundList;
900*cdf0e10cSrcweir 
901*cdf0e10cSrcweir     GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, aSoundList );
902*cdf0e10cSrcweir     GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, aSoundList );
903*cdf0e10cSrcweir 
904*cdf0e10cSrcweir     sal_uInt32 nCount = aSoundList.Count();
905*cdf0e10cSrcweir     maSoundList.clear();
906*cdf0e10cSrcweir     maSoundList.reserve( nCount );
907*cdf0e10cSrcweir     for( sal_uInt32 i=0; i<nCount; ++i )
908*cdf0e10cSrcweir     {
909*cdf0e10cSrcweir         String * pEntry = reinterpret_cast< String * >( aSoundList.GetObject( i ));
910*cdf0e10cSrcweir         if( pEntry )
911*cdf0e10cSrcweir         {
912*cdf0e10cSrcweir             // store copy of string in member list
913*cdf0e10cSrcweir             maSoundList.push_back( *pEntry );
914*cdf0e10cSrcweir             // delete pointer in temporary List
915*cdf0e10cSrcweir             delete pEntry;
916*cdf0e10cSrcweir         }
917*cdf0e10cSrcweir     }
918*cdf0e10cSrcweir 
919*cdf0e10cSrcweir     lcl_FillSoundListBox( maSoundList, maLB_SOUND );
920*cdf0e10cSrcweir }
921*cdf0e10cSrcweir 
922*cdf0e10cSrcweir void SlideTransitionPane::openSoundFileDialog()
923*cdf0e10cSrcweir {
924*cdf0e10cSrcweir     if( ! maLB_SOUND.IsEnabled())
925*cdf0e10cSrcweir         return;
926*cdf0e10cSrcweir 
927*cdf0e10cSrcweir     SdOpenSoundFileDialog aFileDialog;
928*cdf0e10cSrcweir 
929*cdf0e10cSrcweir 	String aFile;
930*cdf0e10cSrcweir     DBG_ASSERT( maLB_SOUND.GetSelectEntryPos() == 2,
931*cdf0e10cSrcweir                 "Dialog should only open when \"Other sound\" is selected" );
932*cdf0e10cSrcweir     aFile = SvtPathOptions().GetGraphicPath();
933*cdf0e10cSrcweir 
934*cdf0e10cSrcweir 	aFileDialog.SetPath( aFile );
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir 	bool bValidSoundFile( false );
937*cdf0e10cSrcweir 	bool bQuitLoop( false );
938*cdf0e10cSrcweir 
939*cdf0e10cSrcweir 	while( ! bQuitLoop &&
940*cdf0e10cSrcweir 		   aFileDialog.Execute() == ERRCODE_NONE )
941*cdf0e10cSrcweir 	{
942*cdf0e10cSrcweir 		aFile = aFileDialog.GetPath();
943*cdf0e10cSrcweir         tSoundListType::size_type nPos = 0;
944*cdf0e10cSrcweir         bValidSoundFile = lcl_findSoundInList( maSoundList, aFile, nPos );
945*cdf0e10cSrcweir 
946*cdf0e10cSrcweir         if( bValidSoundFile )
947*cdf0e10cSrcweir 		{
948*cdf0e10cSrcweir 			bQuitLoop = true;
949*cdf0e10cSrcweir 		}
950*cdf0e10cSrcweir 		else // not in sound list
951*cdf0e10cSrcweir 		{
952*cdf0e10cSrcweir 			// try to insert into gallery
953*cdf0e10cSrcweir 			if( GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aFile, SGA_FORMAT_SOUND ) )
954*cdf0e10cSrcweir 			{
955*cdf0e10cSrcweir                 updateSoundList();
956*cdf0e10cSrcweir                 bValidSoundFile = lcl_findSoundInList( maSoundList, aFile, nPos );
957*cdf0e10cSrcweir 				DBG_ASSERT( bValidSoundFile, "Adding sound to gallery failed" );
958*cdf0e10cSrcweir 
959*cdf0e10cSrcweir 				bQuitLoop = true;
960*cdf0e10cSrcweir 			}
961*cdf0e10cSrcweir 			else
962*cdf0e10cSrcweir 			{
963*cdf0e10cSrcweir 				String aStrWarning(SdResId(STR_WARNING_NOSOUNDFILE));
964*cdf0e10cSrcweir 				String aStr( sal_Unicode( '%' ));
965*cdf0e10cSrcweir 				aStrWarning.SearchAndReplace( aStr , aFile );
966*cdf0e10cSrcweir 				WarningBox aWarningBox( NULL, WB_3DLOOK | WB_RETRY_CANCEL, aStrWarning );
967*cdf0e10cSrcweir 				aWarningBox.SetModalInputMode (sal_True);
968*cdf0e10cSrcweir 				bQuitLoop = (aWarningBox.Execute() != RET_RETRY);
969*cdf0e10cSrcweir 
970*cdf0e10cSrcweir 				bValidSoundFile = false;
971*cdf0e10cSrcweir 			}
972*cdf0e10cSrcweir 		}
973*cdf0e10cSrcweir 
974*cdf0e10cSrcweir 		if( bValidSoundFile )
975*cdf0e10cSrcweir             // skip first three entries in list
976*cdf0e10cSrcweir             maLB_SOUND.SelectEntryPos( (sal_uInt16)nPos + 3 );
977*cdf0e10cSrcweir 	}
978*cdf0e10cSrcweir 
979*cdf0e10cSrcweir     if( ! bValidSoundFile )
980*cdf0e10cSrcweir     {
981*cdf0e10cSrcweir         if( maCurrentSoundFile.Len() > 0 )
982*cdf0e10cSrcweir         {
983*cdf0e10cSrcweir             tSoundListType::size_type nPos = 0;
984*cdf0e10cSrcweir             if( lcl_findSoundInList( maSoundList, maCurrentSoundFile, nPos ))
985*cdf0e10cSrcweir                 maLB_SOUND.SelectEntryPos( (sal_uInt16)nPos + 3 );
986*cdf0e10cSrcweir 	        else
987*cdf0e10cSrcweir 		        maLB_SOUND.SelectEntryPos( 0 );  // NONE
988*cdf0e10cSrcweir         }
989*cdf0e10cSrcweir         else
990*cdf0e10cSrcweir             maLB_SOUND.SelectEntryPos( 0 );  // NONE
991*cdf0e10cSrcweir     }
992*cdf0e10cSrcweir }
993*cdf0e10cSrcweir 
994*cdf0e10cSrcweir impl::TransitionEffect SlideTransitionPane::getTransitionEffectFromControls() const
995*cdf0e10cSrcweir {
996*cdf0e10cSrcweir     impl::TransitionEffect aResult;
997*cdf0e10cSrcweir     aResult.setAllAmbiguous();
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir     // check first (aResult might be overwritten)
1000*cdf0e10cSrcweir     if( maLB_SLIDE_TRANSITIONS.IsEnabled() &&
1001*cdf0e10cSrcweir         maLB_SLIDE_TRANSITIONS.GetSelectEntryCount() > 0 )
1002*cdf0e10cSrcweir     {
1003*cdf0e10cSrcweir         TransitionPresetPtr pPreset = lcl_getTransitionPresetByUIName(
1004*cdf0e10cSrcweir             mpDrawDoc, OUString( maLB_SLIDE_TRANSITIONS.GetSelectEntry()));
1005*cdf0e10cSrcweir 
1006*cdf0e10cSrcweir         if( pPreset.get())
1007*cdf0e10cSrcweir         {
1008*cdf0e10cSrcweir             aResult = impl::TransitionEffect( *pPreset );
1009*cdf0e10cSrcweir 		    aResult.setAllAmbiguous();
1010*cdf0e10cSrcweir         }
1011*cdf0e10cSrcweir         else
1012*cdf0e10cSrcweir         {
1013*cdf0e10cSrcweir             aResult.mnType = 0;
1014*cdf0e10cSrcweir         }
1015*cdf0e10cSrcweir         aResult.mbEffectAmbiguous = false;
1016*cdf0e10cSrcweir     }
1017*cdf0e10cSrcweir 
1018*cdf0e10cSrcweir     // speed
1019*cdf0e10cSrcweir     if( maLB_SPEED.IsEnabled() &&
1020*cdf0e10cSrcweir         maLB_SPEED.GetSelectEntryCount() > 0 )
1021*cdf0e10cSrcweir     {
1022*cdf0e10cSrcweir         sal_uInt16 nPos = maLB_SPEED.GetSelectEntryPos();
1023*cdf0e10cSrcweir         aResult.mfDuration = (nPos == 0)
1024*cdf0e10cSrcweir             ? 3.0
1025*cdf0e10cSrcweir             : (nPos == 1)
1026*cdf0e10cSrcweir             ? 2.0
1027*cdf0e10cSrcweir             : 1.0;   // nPos == 2
1028*cdf0e10cSrcweir         DBG_ASSERT( aResult.mfDuration != 1.0 || nPos == 2, "Invalid Listbox Entry" );
1029*cdf0e10cSrcweir 
1030*cdf0e10cSrcweir         aResult.mbDurationAmbiguous = false;
1031*cdf0e10cSrcweir     }
1032*cdf0e10cSrcweir 
1033*cdf0e10cSrcweir     // slide-advance mode
1034*cdf0e10cSrcweir     if( maRB_ADVANCE_ON_MOUSE.IsEnabled() && maRB_ADVANCE_AUTO.IsEnabled() &&
1035*cdf0e10cSrcweir         (maRB_ADVANCE_ON_MOUSE.IsChecked() || maRB_ADVANCE_AUTO.IsChecked()))
1036*cdf0e10cSrcweir     {
1037*cdf0e10cSrcweir         if( maRB_ADVANCE_ON_MOUSE.IsChecked())
1038*cdf0e10cSrcweir             aResult.mePresChange = PRESCHANGE_MANUAL;
1039*cdf0e10cSrcweir         else
1040*cdf0e10cSrcweir         {
1041*cdf0e10cSrcweir             aResult.mePresChange = PRESCHANGE_AUTO;
1042*cdf0e10cSrcweir             if( maMF_ADVANCE_AUTO_AFTER.IsEnabled())
1043*cdf0e10cSrcweir             {
1044*cdf0e10cSrcweir //                 sal_uInt16 nDigits = maMF_ADVANCE_AUTO_AFTER.GetDecimalDigits();
1045*cdf0e10cSrcweir                 aResult.mnTime = static_cast<long>(maMF_ADVANCE_AUTO_AFTER.GetValue());
1046*cdf0e10cSrcweir                 // / static_cast< sal_uInt16 >( pow( 10.0, static_cast< double >( nDigits )));
1047*cdf0e10cSrcweir                 aResult.mbTimeAmbiguous = false;
1048*cdf0e10cSrcweir             }
1049*cdf0e10cSrcweir         }
1050*cdf0e10cSrcweir 
1051*cdf0e10cSrcweir         aResult.mbPresChangeAmbiguous = false;
1052*cdf0e10cSrcweir     }
1053*cdf0e10cSrcweir 
1054*cdf0e10cSrcweir     // sound
1055*cdf0e10cSrcweir     if( maLB_SOUND.IsEnabled())
1056*cdf0e10cSrcweir     {
1057*cdf0e10cSrcweir 		maCurrentSoundFile.Erase();
1058*cdf0e10cSrcweir 		if( maLB_SOUND.GetSelectEntryCount() > 0 )
1059*cdf0e10cSrcweir         {
1060*cdf0e10cSrcweir 			sal_uInt16 nPos = maLB_SOUND.GetSelectEntryPos();
1061*cdf0e10cSrcweir 			aResult.mbStopSound = nPos == 1;
1062*cdf0e10cSrcweir 			aResult.mbSoundOn = nPos > 1;
1063*cdf0e10cSrcweir 			if( aResult.mbStopSound )
1064*cdf0e10cSrcweir 			{
1065*cdf0e10cSrcweir 				aResult.maSound = OUString();
1066*cdf0e10cSrcweir 				aResult.mbSoundAmbiguous = false;
1067*cdf0e10cSrcweir 			}
1068*cdf0e10cSrcweir 			else
1069*cdf0e10cSrcweir 			{
1070*cdf0e10cSrcweir 				aResult.maSound = lcl_getSoundFileURL( maSoundList, maLB_SOUND );
1071*cdf0e10cSrcweir 				aResult.mbSoundAmbiguous = false;
1072*cdf0e10cSrcweir 				maCurrentSoundFile = aResult.maSound;
1073*cdf0e10cSrcweir 			}
1074*cdf0e10cSrcweir         }
1075*cdf0e10cSrcweir     }
1076*cdf0e10cSrcweir 
1077*cdf0e10cSrcweir 	// sound loop
1078*cdf0e10cSrcweir 	if( maCB_LOOP_SOUND.IsEnabled() )
1079*cdf0e10cSrcweir 	{
1080*cdf0e10cSrcweir 		aResult.mbLoopSound = maCB_LOOP_SOUND.IsChecked();
1081*cdf0e10cSrcweir 		aResult.mbLoopSoundAmbiguous = false;
1082*cdf0e10cSrcweir 	}
1083*cdf0e10cSrcweir 
1084*cdf0e10cSrcweir     return aResult;
1085*cdf0e10cSrcweir }
1086*cdf0e10cSrcweir 
1087*cdf0e10cSrcweir void SlideTransitionPane::applyToSelectedPages()
1088*cdf0e10cSrcweir {
1089*cdf0e10cSrcweir     if( ! mbUpdatingControls )
1090*cdf0e10cSrcweir     {
1091*cdf0e10cSrcweir         ::sd::slidesorter::SharedPageSelection pSelectedPages( getSelectedPages());
1092*cdf0e10cSrcweir         if( ! pSelectedPages->empty())
1093*cdf0e10cSrcweir         {
1094*cdf0e10cSrcweir 			lcl_CreateUndoForPages( pSelectedPages, mrBase );
1095*cdf0e10cSrcweir             lcl_ApplyToPages( pSelectedPages, getTransitionEffectFromControls() );
1096*cdf0e10cSrcweir 			mrBase.GetDocShell()->SetModified();
1097*cdf0e10cSrcweir         }
1098*cdf0e10cSrcweir         if( maCB_AUTO_PREVIEW.IsEnabled() &&
1099*cdf0e10cSrcweir             maCB_AUTO_PREVIEW.IsChecked())
1100*cdf0e10cSrcweir         {
1101*cdf0e10cSrcweir             playCurrentEffect();
1102*cdf0e10cSrcweir         }
1103*cdf0e10cSrcweir     }
1104*cdf0e10cSrcweir }
1105*cdf0e10cSrcweir 
1106*cdf0e10cSrcweir void SlideTransitionPane::playCurrentEffect()
1107*cdf0e10cSrcweir {
1108*cdf0e10cSrcweir 	if( mxView.is() )
1109*cdf0e10cSrcweir 	{
1110*cdf0e10cSrcweir 
1111*cdf0e10cSrcweir 		Reference< ::com::sun::star::animations::XAnimationNode > xNode;
1112*cdf0e10cSrcweir 		SlideShow::StartPreview( mrBase, mxView->getCurrentPage(), xNode );
1113*cdf0e10cSrcweir 	}
1114*cdf0e10cSrcweir }
1115*cdf0e10cSrcweir 
1116*cdf0e10cSrcweir void SlideTransitionPane::addListener()
1117*cdf0e10cSrcweir {
1118*cdf0e10cSrcweir 	Link aLink( LINK(this,SlideTransitionPane,EventMultiplexerListener) );
1119*cdf0e10cSrcweir     mrBase.GetEventMultiplexer()->AddEventListener (
1120*cdf0e10cSrcweir         aLink,
1121*cdf0e10cSrcweir         tools::EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION
1122*cdf0e10cSrcweir         | tools::EventMultiplexerEvent::EID_SLIDE_SORTER_SELECTION
1123*cdf0e10cSrcweir         | tools::EventMultiplexerEvent::EID_CURRENT_PAGE
1124*cdf0e10cSrcweir         | tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED
1125*cdf0e10cSrcweir         | tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED
1126*cdf0e10cSrcweir         | tools::EventMultiplexerEvent::EID_CONFIGURATION_UPDATED);
1127*cdf0e10cSrcweir }
1128*cdf0e10cSrcweir 
1129*cdf0e10cSrcweir void SlideTransitionPane::removeListener()
1130*cdf0e10cSrcweir {
1131*cdf0e10cSrcweir 	Link aLink( LINK(this,SlideTransitionPane,EventMultiplexerListener) );
1132*cdf0e10cSrcweir     mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
1133*cdf0e10cSrcweir }
1134*cdf0e10cSrcweir 
1135*cdf0e10cSrcweir IMPL_LINK(SlideTransitionPane,EventMultiplexerListener,
1136*cdf0e10cSrcweir     tools::EventMultiplexerEvent*,pEvent)
1137*cdf0e10cSrcweir {
1138*cdf0e10cSrcweir     switch (pEvent->meEventId)
1139*cdf0e10cSrcweir     {
1140*cdf0e10cSrcweir         case tools::EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION:
1141*cdf0e10cSrcweir             onSelectionChanged();
1142*cdf0e10cSrcweir             break;
1143*cdf0e10cSrcweir 
1144*cdf0e10cSrcweir         case tools::EventMultiplexerEvent::EID_CURRENT_PAGE:
1145*cdf0e10cSrcweir         case tools::EventMultiplexerEvent::EID_SLIDE_SORTER_SELECTION:
1146*cdf0e10cSrcweir             onChangeCurrentPage();
1147*cdf0e10cSrcweir             break;
1148*cdf0e10cSrcweir 
1149*cdf0e10cSrcweir         case tools::EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED:
1150*cdf0e10cSrcweir             mxView = Reference<drawing::XDrawView>();
1151*cdf0e10cSrcweir             onSelectionChanged();
1152*cdf0e10cSrcweir             onChangeCurrentPage();
1153*cdf0e10cSrcweir             break;
1154*cdf0e10cSrcweir 
1155*cdf0e10cSrcweir         case tools::EventMultiplexerEvent::EID_MAIN_VIEW_ADDED:
1156*cdf0e10cSrcweir             mbIsMainViewChangePending = true;
1157*cdf0e10cSrcweir             break;
1158*cdf0e10cSrcweir 
1159*cdf0e10cSrcweir         case tools::EventMultiplexerEvent::EID_CONFIGURATION_UPDATED:
1160*cdf0e10cSrcweir             if (mbIsMainViewChangePending)
1161*cdf0e10cSrcweir             {
1162*cdf0e10cSrcweir                 mbIsMainViewChangePending = false;
1163*cdf0e10cSrcweir 
1164*cdf0e10cSrcweir                 // At this moment the controller may not yet been set at
1165*cdf0e10cSrcweir                 // model or ViewShellBase.  Take it from the view shell
1166*cdf0e10cSrcweir                 // passed with the event.
1167*cdf0e10cSrcweir                 if (mrBase.GetMainViewShell() != NULL)
1168*cdf0e10cSrcweir                 {
1169*cdf0e10cSrcweir                     mxView = Reference<drawing::XDrawView>::query(mrBase.GetController());
1170*cdf0e10cSrcweir                     onSelectionChanged();
1171*cdf0e10cSrcweir                     onChangeCurrentPage();
1172*cdf0e10cSrcweir                 }
1173*cdf0e10cSrcweir             }
1174*cdf0e10cSrcweir             break;
1175*cdf0e10cSrcweir 
1176*cdf0e10cSrcweir         default:
1177*cdf0e10cSrcweir             break;
1178*cdf0e10cSrcweir     }
1179*cdf0e10cSrcweir     return 0;
1180*cdf0e10cSrcweir }
1181*cdf0e10cSrcweir 
1182*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, ApplyToAllButtonClicked, void *, EMPTYARG )
1183*cdf0e10cSrcweir {
1184*cdf0e10cSrcweir     DBG_ASSERT( mpDrawDoc, "Invalid Draw Document!" );
1185*cdf0e10cSrcweir     if( !mpDrawDoc )
1186*cdf0e10cSrcweir         return 0;
1187*cdf0e10cSrcweir 
1188*cdf0e10cSrcweir     ::sd::slidesorter::SharedPageSelection pPages (
1189*cdf0e10cSrcweir         new ::sd::slidesorter::SlideSorterViewShell::PageSelection());
1190*cdf0e10cSrcweir 
1191*cdf0e10cSrcweir     sal_uInt16 nPageCount = mpDrawDoc->GetSdPageCount( PK_STANDARD );
1192*cdf0e10cSrcweir     pPages->reserve( nPageCount );
1193*cdf0e10cSrcweir     for( sal_uInt16 i=0; i<nPageCount; ++i )
1194*cdf0e10cSrcweir     {
1195*cdf0e10cSrcweir         SdPage * pPage = mpDrawDoc->GetSdPage( i, PK_STANDARD );
1196*cdf0e10cSrcweir         if( pPage )
1197*cdf0e10cSrcweir             pPages->push_back( pPage );
1198*cdf0e10cSrcweir     }
1199*cdf0e10cSrcweir 
1200*cdf0e10cSrcweir     if( ! pPages->empty())
1201*cdf0e10cSrcweir 	{
1202*cdf0e10cSrcweir 		lcl_CreateUndoForPages( pPages, mrBase );
1203*cdf0e10cSrcweir         lcl_ApplyToPages( pPages, getTransitionEffectFromControls() );
1204*cdf0e10cSrcweir 	}
1205*cdf0e10cSrcweir 
1206*cdf0e10cSrcweir     return 0;
1207*cdf0e10cSrcweir }
1208*cdf0e10cSrcweir 
1209*cdf0e10cSrcweir 
1210*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, PlayButtonClicked, void *, EMPTYARG )
1211*cdf0e10cSrcweir {
1212*cdf0e10cSrcweir     playCurrentEffect();
1213*cdf0e10cSrcweir     return 0;
1214*cdf0e10cSrcweir }
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, SlideShowButtonClicked, void *, EMPTYARG )
1217*cdf0e10cSrcweir {
1218*cdf0e10cSrcweir 	mrBase.StartPresentation();
1219*cdf0e10cSrcweir     return 0;
1220*cdf0e10cSrcweir }
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, TransitionSelected, void *, EMPTYARG )
1223*cdf0e10cSrcweir {
1224*cdf0e10cSrcweir     applyToSelectedPages();
1225*cdf0e10cSrcweir     return 0;
1226*cdf0e10cSrcweir }
1227*cdf0e10cSrcweir 
1228*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, AdvanceSlideRadioButtonToggled, void *, EMPTYARG )
1229*cdf0e10cSrcweir {
1230*cdf0e10cSrcweir     updateControlState();
1231*cdf0e10cSrcweir     applyToSelectedPages();
1232*cdf0e10cSrcweir     return 0;
1233*cdf0e10cSrcweir }
1234*cdf0e10cSrcweir 
1235*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, AdvanceTimeModified, void *, EMPTYARG )
1236*cdf0e10cSrcweir {
1237*cdf0e10cSrcweir     applyToSelectedPages();
1238*cdf0e10cSrcweir     return 0;
1239*cdf0e10cSrcweir }
1240*cdf0e10cSrcweir 
1241*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, SpeedListBoxSelected, void *, EMPTYARG )
1242*cdf0e10cSrcweir {
1243*cdf0e10cSrcweir     applyToSelectedPages();
1244*cdf0e10cSrcweir     return 0;
1245*cdf0e10cSrcweir }
1246*cdf0e10cSrcweir 
1247*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, SoundListBoxSelected, void *, EMPTYARG )
1248*cdf0e10cSrcweir {
1249*cdf0e10cSrcweir     if( maLB_SOUND.GetSelectEntryCount() )
1250*cdf0e10cSrcweir     {
1251*cdf0e10cSrcweir         sal_uInt16 nPos = maLB_SOUND.GetSelectEntryPos();
1252*cdf0e10cSrcweir         if( nPos == 2 )
1253*cdf0e10cSrcweir         {
1254*cdf0e10cSrcweir             // other sound ...
1255*cdf0e10cSrcweir             openSoundFileDialog();
1256*cdf0e10cSrcweir         }
1257*cdf0e10cSrcweir     }
1258*cdf0e10cSrcweir     updateControlState();
1259*cdf0e10cSrcweir     applyToSelectedPages();
1260*cdf0e10cSrcweir     return 0;
1261*cdf0e10cSrcweir }
1262*cdf0e10cSrcweir 
1263*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, LoopSoundBoxChecked, void *, EMPTYARG )
1264*cdf0e10cSrcweir {
1265*cdf0e10cSrcweir     applyToSelectedPages();
1266*cdf0e10cSrcweir     return 0;
1267*cdf0e10cSrcweir }
1268*cdf0e10cSrcweir 
1269*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, AutoPreviewClicked, void *, EMPTYARG )
1270*cdf0e10cSrcweir {
1271*cdf0e10cSrcweir 	SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
1272*cdf0e10cSrcweir 	pOptions->SetPreviewTransitions( maCB_AUTO_PREVIEW.IsChecked() ? sal_True : sal_False );
1273*cdf0e10cSrcweir     return 0;
1274*cdf0e10cSrcweir }
1275*cdf0e10cSrcweir 
1276*cdf0e10cSrcweir IMPL_LINK( SlideTransitionPane, LateInitCallback, Timer*, EMPTYARG )
1277*cdf0e10cSrcweir {
1278*cdf0e10cSrcweir 	const TransitionPresetList& rPresetList = TransitionPreset::getTransitionPresetList();
1279*cdf0e10cSrcweir 	TransitionPresetList::const_iterator aIter( rPresetList.begin() );
1280*cdf0e10cSrcweir 	const TransitionPresetList::const_iterator aEnd( rPresetList.end() );
1281*cdf0e10cSrcweir     sal_uInt16 nIndex = 0;
1282*cdf0e10cSrcweir     ::std::size_t nUIIndex = 0;
1283*cdf0e10cSrcweir 	while( aIter != aEnd )
1284*cdf0e10cSrcweir 	{
1285*cdf0e10cSrcweir 		TransitionPresetPtr pPreset = (*aIter++);
1286*cdf0e10cSrcweir 		const OUString aUIName( pPreset->getUIName() );
1287*cdf0e10cSrcweir  		if( aUIName.getLength() )
1288*cdf0e10cSrcweir         {
1289*cdf0e10cSrcweir             maLB_SLIDE_TRANSITIONS.InsertEntry( aUIName );
1290*cdf0e10cSrcweir             m_aPresetIndexes[ nIndex ] = (sal_uInt16)nUIIndex;
1291*cdf0e10cSrcweir             ++nUIIndex;
1292*cdf0e10cSrcweir         }
1293*cdf0e10cSrcweir         ++nIndex;
1294*cdf0e10cSrcweir 	}
1295*cdf0e10cSrcweir 
1296*cdf0e10cSrcweir     updateSoundList();
1297*cdf0e10cSrcweir     updateControls();
1298*cdf0e10cSrcweir 
1299*cdf0e10cSrcweir     return 0;
1300*cdf0e10cSrcweir }
1301*cdf0e10cSrcweir 
1302*cdf0e10cSrcweir ::Window * createSlideTransitionPanel( ::Window* pParent, ViewShellBase& rBase )
1303*cdf0e10cSrcweir {
1304*cdf0e10cSrcweir 	DialogListBox* pWindow = 0;
1305*cdf0e10cSrcweir 
1306*cdf0e10cSrcweir 	DrawDocShell* pDocSh = rBase.GetDocShell();
1307*cdf0e10cSrcweir     if( pDocSh )
1308*cdf0e10cSrcweir     {
1309*cdf0e10cSrcweir         pWindow = new DialogListBox( pParent, WB_CLIPCHILDREN|WB_TABSTOP|WB_AUTOHSCROLL );
1310*cdf0e10cSrcweir 
1311*cdf0e10cSrcweir 		Size aMinSize( pWindow->LogicToPixel( Size( 72, 216 ), MAP_APPFONT ) );
1312*cdf0e10cSrcweir 		::Window* pPaneWindow = new SlideTransitionPane( pWindow, rBase, aMinSize, pDocSh->GetDoc() );
1313*cdf0e10cSrcweir 		pWindow->SetChildWindow( pPaneWindow, aMinSize );
1314*cdf0e10cSrcweir 		pWindow->SetText( pPaneWindow->GetText() );
1315*cdf0e10cSrcweir     }
1316*cdf0e10cSrcweir 
1317*cdf0e10cSrcweir 	return pWindow;
1318*cdf0e10cSrcweir }
1319*cdf0e10cSrcweir 
1320*cdf0e10cSrcweir 
1321*cdf0e10cSrcweir } //  namespace sd
1322