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