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