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