15b190011SAndrew Rist /**************************************************************
2*89ddef74Smseidel *
35b190011SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist * or more contributor license agreements. See the NOTICE file
55b190011SAndrew Rist * distributed with this work for additional information
65b190011SAndrew Rist * regarding copyright ownership. The ASF licenses this file
75b190011SAndrew Rist * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist * "License"); you may not use this file except in compliance
95b190011SAndrew Rist * with the License. You may obtain a copy of the License at
10*89ddef74Smseidel *
115b190011SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*89ddef74Smseidel *
135b190011SAndrew Rist * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist * software distributed under the License is distributed on an
155b190011SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist * KIND, either express or implied. See the License for the
175b190011SAndrew Rist * specific language governing permissions and limitations
185b190011SAndrew Rist * under the License.
19*89ddef74Smseidel *
205b190011SAndrew Rist *************************************************************/
215b190011SAndrew Rist
225b190011SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir #include <tools/debug.hxx>
27cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx>
28cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
29cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp>
30cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
31cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
32cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ListboxControlActions.hpp>
33cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
34cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
35cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
36cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePickerListener.hpp>
37cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePickerNotifier.hpp>
38cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
39cdf0e10cSrcweir #include <vcl/msgbox.hxx>
40cdf0e10cSrcweir #include <sal/types.h>
41cdf0e10cSrcweir #include <tools/urlobj.hxx>
42cdf0e10cSrcweir #include <vos/thread.hxx>
43cdf0e10cSrcweir #include <vos/mutex.hxx>
44cdf0e10cSrcweir #include <vcl/svapp.hxx>
45cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx>
46cdf0e10cSrcweir #include <avmedia/mediawindow.hxx>
47cdf0e10cSrcweir #include "filedlg.hxx"
48cdf0e10cSrcweir #include "sdresid.hxx"
49cdf0e10cSrcweir #include "strings.hrc"
50cdf0e10cSrcweir #include <svtools/filter.hxx>
51cdf0e10cSrcweir
52cdf0e10cSrcweir
53cdf0e10cSrcweir //-----------------------------------------------------------------------------
54cdf0e10cSrcweir
55cdf0e10cSrcweir namespace css = ::com::sun::star;
56cdf0e10cSrcweir
57cdf0e10cSrcweir
58cdf0e10cSrcweir // --------------------------------------------------------------------
59cdf0e10cSrcweir // ----------- SdFileDialog_Imp ---------------------------
60cdf0e10cSrcweir // --------------------------------------------------------------------
61cdf0e10cSrcweir class SdFileDialog_Imp : public sfx2::FileDialogHelper
62cdf0e10cSrcweir {
63cdf0e10cSrcweir private:
64cdf0e10cSrcweir #if defined __SUNPRO_CC
65*89ddef74Smseidel using sfx2::FileDialogHelper::Execute;
66cdf0e10cSrcweir #endif
67cdf0e10cSrcweir
68cdf0e10cSrcweir friend class SdOpenSoundFileDialog;
69cdf0e10cSrcweir
70cdf0e10cSrcweir css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess;
71cdf0e10cSrcweir
72cdf0e10cSrcweir css::uno::Reference< css::media::XPlayer > mxPlayer;
73*89ddef74Smseidel sal_uLong mnPlaySoundEvent;
74cdf0e10cSrcweir sal_Bool mbUsableSelection;
75cdf0e10cSrcweir sal_Bool mbLabelPlaying;
76cdf0e10cSrcweir
77cdf0e10cSrcweir void CheckSelectionState();
78*89ddef74Smseidel
79cdf0e10cSrcweir DECL_LINK( PlayMusicHdl, void * );
80cdf0e10cSrcweir
81cdf0e10cSrcweir Timer maUpdateTimer;
82cdf0e10cSrcweir
83cdf0e10cSrcweir DECL_LINK( IsMusicStoppedHdl, void * );
84*89ddef74Smseidel
85cdf0e10cSrcweir public:
86cdf0e10cSrcweir SdFileDialog_Imp( const short nDialogType, sal_Bool bUsableSelection );
87cdf0e10cSrcweir ~SdFileDialog_Imp();
88cdf0e10cSrcweir
89cdf0e10cSrcweir ErrCode Execute();
90cdf0e10cSrcweir
91cdf0e10cSrcweir // overwritten from FileDialogHelper, to receive user feedback
92cdf0e10cSrcweir virtual void SAL_CALL ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent );
93cdf0e10cSrcweir };
94cdf0e10cSrcweir
95cdf0e10cSrcweir // ------------------------------------------------------------------------
ControlStateChanged(const css::ui::dialogs::FilePickerEvent & aEvent)96cdf0e10cSrcweir void SAL_CALL SdFileDialog_Imp::ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir ::vos::OGuard aGuard( Application::GetSolarMutex() );
99cdf0e10cSrcweir
100*89ddef74Smseidel switch( aEvent.ElementId )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir case css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER:
103cdf0e10cSrcweir CheckSelectionState();
104cdf0e10cSrcweir break;
105cdf0e10cSrcweir
106cdf0e10cSrcweir case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
107cdf0e10cSrcweir if( mxControlAccess.is() )
108cdf0e10cSrcweir {
109*89ddef74Smseidel if( mnPlaySoundEvent )
110cdf0e10cSrcweir Application::RemoveUserEvent( mnPlaySoundEvent );
111cdf0e10cSrcweir
112cdf0e10cSrcweir mnPlaySoundEvent = Application::PostUserEvent( LINK( this, SdFileDialog_Imp, PlayMusicHdl ) );
113cdf0e10cSrcweir }
114cdf0e10cSrcweir break;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
118cdf0e10cSrcweir // ------------------------------------------------------------------------
IMPL_LINK(SdFileDialog_Imp,PlayMusicHdl,void *,EMPTYARG)119cdf0e10cSrcweir IMPL_LINK( SdFileDialog_Imp, PlayMusicHdl, void *, EMPTYARG )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir maUpdateTimer.Stop();
122cdf0e10cSrcweir mnPlaySoundEvent = 0;
123cdf0e10cSrcweir
124cdf0e10cSrcweir if (mxPlayer.is())
125*89ddef74Smseidel {
126cdf0e10cSrcweir if (mxPlayer->isPlaying())
127cdf0e10cSrcweir mxPlayer->stop();
128cdf0e10cSrcweir mxPlayer.clear();
129cdf0e10cSrcweir }
130cdf0e10cSrcweir
131cdf0e10cSrcweir if( mbLabelPlaying )
132cdf0e10cSrcweir {
133cdf0e10cSrcweir try
134cdf0e10cSrcweir {
135*89ddef74Smseidel mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
136cdf0e10cSrcweir String( SdResId( STR_PLAY ) ) );
137*89ddef74Smseidel
138cdf0e10cSrcweir mbLabelPlaying = sal_False;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir catch( css::lang::IllegalArgumentException )
141cdf0e10cSrcweir {
142cdf0e10cSrcweir #ifdef DBG_UTIL
143cdf0e10cSrcweir DBG_ERROR( "Cannot access play button" );
144cdf0e10cSrcweir #endif
145cdf0e10cSrcweir }
146cdf0e10cSrcweir }
147cdf0e10cSrcweir else
148cdf0e10cSrcweir {
149cdf0e10cSrcweir rtl::OUString aUrl( GetPath() );
150cdf0e10cSrcweir if ( aUrl.getLength() )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir try
153cdf0e10cSrcweir {
154cdf0e10cSrcweir mxPlayer.set( avmedia::MediaWindow::createPlayer( aUrl ), css::uno::UNO_QUERY_THROW );
155cdf0e10cSrcweir mxPlayer->start();
156cdf0e10cSrcweir maUpdateTimer.SetTimeout( 100 );
157cdf0e10cSrcweir maUpdateTimer.Start();
158cdf0e10cSrcweir }
159cdf0e10cSrcweir catch( css::uno::Exception& e )
160cdf0e10cSrcweir {
161cdf0e10cSrcweir (void)e;
162cdf0e10cSrcweir mxPlayer.clear();
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
165cdf0e10cSrcweir if (mxPlayer.is())
166cdf0e10cSrcweir {
167cdf0e10cSrcweir try
168cdf0e10cSrcweir {
169*89ddef74Smseidel mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
170cdf0e10cSrcweir String( SdResId( STR_STOP ) ) );
171*89ddef74Smseidel
172cdf0e10cSrcweir mbLabelPlaying = sal_True;
173cdf0e10cSrcweir }
174cdf0e10cSrcweir catch( css::lang::IllegalArgumentException )
175cdf0e10cSrcweir {
176cdf0e10cSrcweir #ifdef DBG_UTIL
177cdf0e10cSrcweir DBG_ERROR( "Cannot access play button" );
178cdf0e10cSrcweir #endif
179cdf0e10cSrcweir }
180cdf0e10cSrcweir }
181cdf0e10cSrcweir }
182cdf0e10cSrcweir }
183cdf0e10cSrcweir
184cdf0e10cSrcweir return 0;
185cdf0e10cSrcweir }
186cdf0e10cSrcweir
187cdf0e10cSrcweir // ------------------------------------------------------------------------
IMPL_LINK(SdFileDialog_Imp,IsMusicStoppedHdl,void *,EMPTYARG)188cdf0e10cSrcweir IMPL_LINK( SdFileDialog_Imp, IsMusicStoppedHdl, void *, EMPTYARG )
189cdf0e10cSrcweir {
190cdf0e10cSrcweir ::vos::OGuard aGuard( Application::GetSolarMutex() );
191cdf0e10cSrcweir
192cdf0e10cSrcweir if (
193*89ddef74Smseidel mxPlayer.is() && mxPlayer->isPlaying() &&
194cdf0e10cSrcweir mxPlayer->getMediaTime() < mxPlayer->getDuration()
195cdf0e10cSrcweir )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir maUpdateTimer.Start();
198cdf0e10cSrcweir return 0L;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
201cdf0e10cSrcweir
202cdf0e10cSrcweir if( mxControlAccess.is() )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir try
205cdf0e10cSrcweir {
206*89ddef74Smseidel mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
207cdf0e10cSrcweir String( SdResId( STR_PLAY ) ) );
208cdf0e10cSrcweir mbLabelPlaying = sal_False;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir catch( css::lang::IllegalArgumentException )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir #ifdef DBG_UTIL
213cdf0e10cSrcweir DBG_ERROR( "Cannot access play button" );
214cdf0e10cSrcweir #endif
215cdf0e10cSrcweir }
216cdf0e10cSrcweir }
217cdf0e10cSrcweir
218cdf0e10cSrcweir return( 0L );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir
221cdf0e10cSrcweir // check whether to disable the "selection" checkbox
CheckSelectionState()222cdf0e10cSrcweir void SdFileDialog_Imp::CheckSelectionState()
223cdf0e10cSrcweir {
224cdf0e10cSrcweir if( mbUsableSelection && mxControlAccess.is() )
225cdf0e10cSrcweir {
226cdf0e10cSrcweir String aCurrFilter( GetCurrentFilter() );
227cdf0e10cSrcweir
228cdf0e10cSrcweir try
229cdf0e10cSrcweir {
230cdf0e10cSrcweir if( !aCurrFilter.Len() || ( aCurrFilter == String( SdResId( STR_EXPORT_HTML_NAME ) ) ) )
231cdf0e10cSrcweir mxControlAccess->enableControl( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION, sal_False );
232cdf0e10cSrcweir else
233cdf0e10cSrcweir mxControlAccess->enableControl( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION, sal_True );
234cdf0e10cSrcweir }
235cdf0e10cSrcweir catch( css::lang::IllegalArgumentException )
236cdf0e10cSrcweir {
237cdf0e10cSrcweir #ifdef DBG_UTIL
238cdf0e10cSrcweir DBG_ERROR( "Cannot access \"selection\" checkbox" );
239cdf0e10cSrcweir #endif
240cdf0e10cSrcweir }
241cdf0e10cSrcweir }
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
244cdf0e10cSrcweir //-----------------------------------------------------------------------------
SdFileDialog_Imp(const short nDialogType,sal_Bool bUsableSelection)245cdf0e10cSrcweir SdFileDialog_Imp::SdFileDialog_Imp( const short nDialogType,
246*89ddef74Smseidel sal_Bool bUsableSelection ) :
247cdf0e10cSrcweir FileDialogHelper( nDialogType, 0 ),
248cdf0e10cSrcweir mnPlaySoundEvent( 0 ),
249cdf0e10cSrcweir mbUsableSelection( bUsableSelection ),
250cdf0e10cSrcweir mbLabelPlaying(sal_False)
251cdf0e10cSrcweir {
252cdf0e10cSrcweir maUpdateTimer.SetTimeoutHdl(LINK(this, SdFileDialog_Imp, IsMusicStoppedHdl));
253cdf0e10cSrcweir
254cdf0e10cSrcweir css::uno::Reference < ::com::sun::star::ui::dialogs::XFilePicker > xFileDlg = GetFilePicker();
255cdf0e10cSrcweir
256cdf0e10cSrcweir // get the control access
257cdf0e10cSrcweir mxControlAccess = css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > ( xFileDlg, css::uno::UNO_QUERY );
258cdf0e10cSrcweir
259cdf0e10cSrcweir if( mxControlAccess.is() )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir if( nDialogType ==
262cdf0e10cSrcweir css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY )
263cdf0e10cSrcweir {
264cdf0e10cSrcweir try
265cdf0e10cSrcweir {
266*89ddef74Smseidel mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
267cdf0e10cSrcweir String( SdResId( STR_PLAY ) ) );
268cdf0e10cSrcweir }
269cdf0e10cSrcweir catch( css::lang::IllegalArgumentException )
270cdf0e10cSrcweir {
271cdf0e10cSrcweir #ifdef DBG_UTIL
272cdf0e10cSrcweir DBG_ERROR( "Cannot set play button label" );
273cdf0e10cSrcweir #endif
274cdf0e10cSrcweir }
275cdf0e10cSrcweir }
276cdf0e10cSrcweir else if( mbUsableSelection != sal_True )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir try
279cdf0e10cSrcweir {
280cdf0e10cSrcweir mxControlAccess->enableControl( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_SELECTION, sal_False );
281cdf0e10cSrcweir }
282cdf0e10cSrcweir catch( css::lang::IllegalArgumentException )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir #ifdef DBG_UTIL
285cdf0e10cSrcweir DBG_ERROR( "Cannot disable selection checkbox" );
286cdf0e10cSrcweir #endif
287cdf0e10cSrcweir }
288cdf0e10cSrcweir }
289cdf0e10cSrcweir }
290cdf0e10cSrcweir }
291cdf0e10cSrcweir
292cdf0e10cSrcweir
293cdf0e10cSrcweir // ------------------------------------------------------------------------
~SdFileDialog_Imp()294cdf0e10cSrcweir SdFileDialog_Imp::~SdFileDialog_Imp()
295cdf0e10cSrcweir {
296*89ddef74Smseidel if( mnPlaySoundEvent )
297cdf0e10cSrcweir Application::RemoveUserEvent( mnPlaySoundEvent );
298cdf0e10cSrcweir }
299cdf0e10cSrcweir
300cdf0e10cSrcweir // ------------------------------------------------------------------------
Execute()301cdf0e10cSrcweir ErrCode SdFileDialog_Imp::Execute()
302cdf0e10cSrcweir {
303*89ddef74Smseidel // make sure selection checkbox is disabled if
304cdf0e10cSrcweir // HTML is current filter!
305cdf0e10cSrcweir CheckSelectionState();
306cdf0e10cSrcweir return FileDialogHelper::Execute();
307cdf0e10cSrcweir }
308cdf0e10cSrcweir
309cdf0e10cSrcweir // --------------------------------------------------------------------
310cdf0e10cSrcweir // ----------- SdOpenSoundFileDialog -----------------------
311cdf0e10cSrcweir // --------------------------------------------------------------------
312cdf0e10cSrcweir
313cdf0e10cSrcweir // these are simple forwarders
SdOpenSoundFileDialog()314cdf0e10cSrcweir SdOpenSoundFileDialog::SdOpenSoundFileDialog() :
315cdf0e10cSrcweir mpImpl(
316cdf0e10cSrcweir new SdFileDialog_Imp(
317cdf0e10cSrcweir css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY, sal_False ) )
318cdf0e10cSrcweir {
319cdf0e10cSrcweir String aDescr;
320cdf0e10cSrcweir aDescr = String(SdResId(STR_ALL_FILES));
321cdf0e10cSrcweir mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.*" ) ) );
322cdf0e10cSrcweir
323cdf0e10cSrcweir // setup filter
324cdf0e10cSrcweir #if defined UNX
325cdf0e10cSrcweir aDescr = String(SdResId(STR_AU_FILE));
326cdf0e10cSrcweir mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.au;*.snd" ) ) );
327cdf0e10cSrcweir aDescr = String(SdResId(STR_VOC_FILE));
328cdf0e10cSrcweir mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.voc" ) ) );
329cdf0e10cSrcweir aDescr = String(SdResId(STR_WAV_FILE));
330cdf0e10cSrcweir mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.wav" ) ) );
331cdf0e10cSrcweir aDescr = String(SdResId(STR_AIFF_FILE));
332cdf0e10cSrcweir mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.aiff" ) ) );
333cdf0e10cSrcweir aDescr = String(SdResId(STR_SVX_FILE));
334cdf0e10cSrcweir mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.svx" ) ) );
335cdf0e10cSrcweir #else
336cdf0e10cSrcweir aDescr = String(SdResId(STR_WAV_FILE));
337*89ddef74Smseidel mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.wav;*.mp3;*.m4a;*.ogg" ) ) );
338cdf0e10cSrcweir aDescr = String(SdResId(STR_MIDI_FILE));
339cdf0e10cSrcweir mpImpl->AddFilter( aDescr, UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "*.mid" ) ) );
340cdf0e10cSrcweir #endif
341cdf0e10cSrcweir }
342cdf0e10cSrcweir
343cdf0e10cSrcweir // ------------------------------------------------------------------------
~SdOpenSoundFileDialog()344cdf0e10cSrcweir SdOpenSoundFileDialog::~SdOpenSoundFileDialog()
345cdf0e10cSrcweir {
346cdf0e10cSrcweir }
347cdf0e10cSrcweir
348cdf0e10cSrcweir // ------------------------------------------------------------------------
Execute()349cdf0e10cSrcweir ErrCode SdOpenSoundFileDialog::Execute()
350cdf0e10cSrcweir {
351cdf0e10cSrcweir return mpImpl->Execute();
352cdf0e10cSrcweir }
353cdf0e10cSrcweir
354cdf0e10cSrcweir // ------------------------------------------------------------------------
GetPath() const355cdf0e10cSrcweir String SdOpenSoundFileDialog::GetPath() const
356cdf0e10cSrcweir {
357cdf0e10cSrcweir return mpImpl->GetPath();
358cdf0e10cSrcweir }
359cdf0e10cSrcweir
360cdf0e10cSrcweir // ------------------------------------------------------------------------
SetPath(const String & rPath)361cdf0e10cSrcweir void SdOpenSoundFileDialog::SetPath( const String& rPath )
362cdf0e10cSrcweir {
363cdf0e10cSrcweir mpImpl->SetDisplayDirectory( rPath );
364cdf0e10cSrcweir }
365