/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sd.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "filedlg.hxx" #include "sdresid.hxx" #include "strings.hrc" #include //----------------------------------------------------------------------------- namespace css = ::com::sun::star; // -------------------------------------------------------------------- // ----------- SdFileDialog_Imp --------------------------- // -------------------------------------------------------------------- class SdFileDialog_Imp : public sfx2::FileDialogHelper { private: #if defined __SUNPRO_CC using sfx2::FileDialogHelper::Execute; #endif friend class SdOpenSoundFileDialog; css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess; css::uno::Reference< css::media::XPlayer > mxPlayer; ULONG mnPlaySoundEvent; BOOL mbUsableSelection; BOOL mbLabelPlaying; void CheckSelectionState(); DECL_LINK( PlayMusicHdl, void * ); Timer maUpdateTimer; DECL_LINK( IsMusicStoppedHdl, void * ); public: SdFileDialog_Imp( const short nDialogType, sal_Bool bUsableSelection ); ~SdFileDialog_Imp(); ErrCode Execute(); // overwritten from FileDialogHelper, to receive user feedback virtual void SAL_CALL ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent ); }; // ------------------------------------------------------------------------ void SAL_CALL SdFileDialog_Imp::ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent ) { SolarMutexGuard aGuard; switch( aEvent.ElementId ) { case css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER: CheckSelectionState(); break; case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY: if( mxControlAccess.is() ) { if( mnPlaySoundEvent ) Application::RemoveUserEvent( mnPlaySoundEvent ); mnPlaySoundEvent = Application::PostUserEvent( LINK( this, SdFileDialog_Imp, PlayMusicHdl ) ); } break; } } // ------------------------------------------------------------------------ IMPL_LINK( SdFileDialog_Imp, PlayMusicHdl, void *, EMPTYARG ) { maUpdateTimer.Stop(); mnPlaySoundEvent = 0; if (mxPlayer.is()) { if (mxPlayer->isPlaying()) mxPlayer->stop(); mxPlayer.clear(); } if( mbLabelPlaying ) { try { mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, String( SdResId( STR_PLAY ) ) ); mbLabelPlaying = FALSE; } catch( css::lang::IllegalArgumentException ) { #ifdef DBG_UTIL OSL_FAIL( "Cannot access play button" ); #endif } } else { rtl::OUString aUrl( GetPath() ); if ( aUrl.getLength() ) { try { mxPlayer.set( avmedia::MediaWindow::createPlayer( aUrl ), css::uno::UNO_QUERY_THROW ); mxPlayer->start(); maUpdateTimer.SetTimeout( 100 ); maUpdateTimer.Start(); } catch( css::uno::Exception& e ) { (void)e; mxPlayer.clear(); } if (mxPlayer.is()) { try { mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, String( SdResId( STR_STOP ) ) ); mbLabelPlaying = TRUE; } catch( css::lang::IllegalArgumentException ) { #ifdef DBG_UTIL OSL_FAIL( "Cannot access play button" ); #endif } } } } return 0; } // ------------------------------------------------------------------------ IMPL_LINK( SdFileDialog_Imp, IsMusicStoppedHdl, void *, EMPTYARG ) { SolarMutexGuard aGuard; if ( mxPlayer.is() && mxPlayer->isPlaying() && mxPlayer->getMediaTime() < mxPlayer->getDuration() ) { maUpdateTimer.Start(); return 0L; } if( mxControlAccess.is() ) { try { mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, String( SdResId( STR_PLAY ) ) ); mbLabelPlaying = FALSE; } catch( css::lang::IllegalArgumentException ) { #ifdef DBG_UTIL OSL_FAIL( "Cannot access play button" ); #endif } } return( 0L ); } // check whether to disable the "selection" checkbox void SdFileDialog_Imp::CheckSelectionState() { if( mbUsableSelection && mxControlAccess.is() ) { String aCurrFilter( GetCurrentFilter() ); try { if( !aCurrFilter.Len() || ( aCurrFilter == String( SdResId( STR_EXPORT_HTML_NAME ) ) ) ) mxControlAccess->enableControl( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION, FALSE ); else mxControlAccess->enableControl( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION, TRUE ); } catch( css::lang::IllegalArgumentException ) { #ifdef DBG_UTIL DBG_ERROR( "Cannot access \"selection\" checkbox" ); #endif } } } //----------------------------------------------------------------------------- SdFileDialog_Imp::SdFileDialog_Imp( const short nDialogType, sal_Bool bUsableSelection ) : FileDialogHelper( nDialogType, 0 ), mnPlaySoundEvent( 0 ), mbUsableSelection( bUsableSelection ), mbLabelPlaying(FALSE) { maUpdateTimer.SetTimeoutHdl(LINK(this, SdFileDialog_Imp, IsMusicStoppedHdl)); css::uno::Reference < ::com::sun::star::ui::dialogs::XFilePicker > xFileDlg = GetFilePicker(); // get the control access mxControlAccess = css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > ( xFileDlg, css::uno::UNO_QUERY ); if( mxControlAccess.is() ) { if( nDialogType == css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY ) { try { mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, String( SdResId( STR_PLAY ) ) ); } catch( css::lang::IllegalArgumentException ) { #ifdef DBG_UTIL OSL_FAIL( "Cannot set play button label" ); #endif } } else if( mbUsableSelection != sal_True ) { try { mxControlAccess->enableControl( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION, FALSE ); } catch( css::lang::IllegalArgumentException ) { #ifdef DBG_UTIL OSL_FAIL( "Cannot disable selection checkbox" ); #endif } } } } // ------------------------------------------------------------------------ SdFileDialog_Imp::~SdFileDialog_Imp() { if( mnPlaySoundEvent ) Application::RemoveUserEvent( mnPlaySoundEvent ); } // ------------------------------------------------------------------------ ErrCode SdFileDialog_Imp::Execute() { // make sure selection checkbox is disabled if // HTML is current filter! CheckSelectionState(); return FileDialogHelper::Execute(); } // -------------------------------------------------------------------- // ----------- SdOpenSoundFileDialog ----------------------- // -------------------------------------------------------------------- // these are simple forwarders SdOpenSoundFileDialog::SdOpenSoundFileDialog() : mpImpl( new SdFileDialog_Imp( css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY, sal_False ) ) { String aDescr; aDescr = String(SdResId(STR_ALL_FILES)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.*" ) ) ); // setup filter #if defined UNX aDescr = String(SdResId(STR_AU_FILE)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.au;*.snd" ) ) ); aDescr = String(SdResId(STR_VOC_FILE)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.voc" ) ) ); aDescr = String(SdResId(STR_WAV_FILE)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.wav" ) ) ); aDescr = String(SdResId(STR_AIFF_FILE)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.aiff" ) ) ); aDescr = String(SdResId(STR_SVX_FILE)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.svx" ) ) ); #else aDescr = String(SdResId(STR_WAV_FILE)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.wav;*.mp3;*.ogg" ) ) ); aDescr = String(SdResId(STR_MIDI_FILE)); mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.mid" ) ) ); #endif } // ------------------------------------------------------------------------ SdOpenSoundFileDialog::~SdOpenSoundFileDialog() { } // ------------------------------------------------------------------------ ErrCode SdOpenSoundFileDialog::Execute() { return mpImpl->Execute(); } // ------------------------------------------------------------------------ String SdOpenSoundFileDialog::GetPath() const { return mpImpl->GetPath(); } // ------------------------------------------------------------------------ void SdOpenSoundFileDialog::SetPath( const String& rPath ) { mpImpl->SetDisplayDirectory( rPath ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */