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