LibreOffice Module sd (master) 1
filedlg.cxx
Go to the documentation of this file.
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 <config_features.h>
21
22#include <com/sun/star/media/XPlayer.hpp>
23#include <com/sun/star/lang/IllegalArgumentException.hpp>
24#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
25#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
26#include <com/sun/star/ui/dialogs/XFilePicker3.hpp>
27#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
28#include <com/sun/star/ui/dialogs/FilePickerEvent.hpp>
29#include <vcl/idle.hxx>
30#include <osl/diagnose.h>
31#include <vcl/svapp.hxx>
34#include <filedlg.hxx>
35#include <sdresid.hxx>
36#include <strings.hrc>
37
38// ----------- SdFileDialog_Imp ---------------------------
39
41{
42private:
44
45 css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess;
46
47 css::uno::Reference< css::media::XPlayer > mxPlayer;
51
52 DECL_LINK( PlayMusicHdl, void *, void );
53 DECL_LINK( IsMusicStoppedHdl, Timer *, void );
54
55public:
56 explicit SdFileDialog_Imp(weld::Window *pParent);
57 virtual ~SdFileDialog_Imp() override;
58
59 // overwritten from FileDialogHelper, to receive user feedback
60 virtual void ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent ) override;
61};
62
63void SdFileDialog_Imp::ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent )
64{
65 SolarMutexGuard aGuard;
66
67 switch( aEvent.ElementId )
68 {
69 case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
70 if( mxControlAccess.is() )
71 {
74
76 }
77 break;
78 }
79}
80
81IMPL_LINK_NOARG(SdFileDialog_Imp, PlayMusicHdl, void*, void)
82{
83 maUpdateIdle.Stop();
84 mnPlaySoundEvent = nullptr;
85
86 if (mxPlayer.is())
87 {
88 if (mxPlayer->isPlaying())
89 mxPlayer->stop();
90 mxPlayer.clear();
91 }
92
93#if HAVE_FEATURE_AVMEDIA
94 if( mbLabelPlaying )
95 {
96 try
97 {
98 mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
99 SdResId( STR_PLAY ) );
100 mbLabelPlaying = false;
101 }
102 catch(const css::lang::IllegalArgumentException&)
103 {
104#ifdef DBG_UTIL
105 OSL_FAIL( "Cannot access play button" );
106#endif
107 }
108 }
109 else
110 {
111 OUString aUrl( GetPath() );
112 if ( !aUrl.isEmpty() )
113 {
114 try
115 {
116 mxPlayer.set( avmedia::MediaWindow::createPlayer( aUrl, "" ), css::uno::UNO_SET_THROW );
117 mxPlayer->start();
118 maUpdateIdle.Start();
119 }
120 catch (const css::uno::Exception&)
121 {
122 mxPlayer.clear();
123 }
124
125 if (mxPlayer.is())
126 {
127 try
128 {
129 mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
130 SdResId( STR_STOP ) );
131 mbLabelPlaying = true;
132 }
133 catch (const css::lang::IllegalArgumentException&)
134 {
135#ifdef DBG_UTIL
136 OSL_FAIL( "Cannot access play button" );
137#endif
138 }
139 }
140 }
141 }
142#endif
143}
144
145IMPL_LINK_NOARG(SdFileDialog_Imp, IsMusicStoppedHdl, Timer *, void)
146{
147 SolarMutexGuard aGuard;
148
149 if (mxPlayer.is() && mxPlayer->isPlaying() &&
150 mxPlayer->getMediaTime() < mxPlayer->getDuration())
151 {
152 maUpdateIdle.Start();
153 return;
154 }
155
156 if( !mxControlAccess.is() )
157 return;
158
159 try
160 {
161 mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
162 SdResId( STR_PLAY ) );
163 mbLabelPlaying = false;
164 }
165 catch (const css::lang::IllegalArgumentException&)
166 {
167#ifdef DBG_UTIL
168 OSL_FAIL( "Cannot access play button" );
169#endif
170 }
171}
172
174 : FileDialogHelper(css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PLAY, FileDialogFlags::NONE, pParent)
175 , mnPlaySoundEvent(nullptr)
176 , mbLabelPlaying(false)
177 , maUpdateIdle( "SdFileDialog_Imp maUpdateIdle" )
178{
179 maUpdateIdle.SetInvokeHandler(LINK(this, SdFileDialog_Imp, IsMusicStoppedHdl));
180
181 css::uno::Reference < css::ui::dialogs::XFilePicker3 > xFileDlg = GetFilePicker();
182
183 // get the control access
184 mxControlAccess.set( xFileDlg, css::uno::UNO_QUERY );
185
186 if( !mxControlAccess.is() )
187 return;
188
189 try
190 {
191 mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
192 SdResId( STR_PLAY ) );
193 }
194 catch (const css::lang::IllegalArgumentException&)
195 {
196#ifdef DBG_UTIL
197 OSL_FAIL( "Cannot set play button label" );
198#endif
199 }
200}
201
203{
204 if( mnPlaySoundEvent )
206}
207
208// ----------- SdOpenSoundFileDialog -----------------------
209
210// these are simple forwarders
212 : mpImpl(new SdFileDialog_Imp(pParent))
213{
214 OUString aDescr = SdResId(STR_ALL_FILES);
215 mpImpl->AddFilter( aDescr, "*.*");
217
218 // setup filter
219#if defined UNX
220 aDescr = SdResId(STR_AU_FILE);
221 mpImpl->AddFilter( aDescr, "*.au;*.snd");
222 aDescr = SdResId(STR_VOC_FILE);
223 mpImpl->AddFilter( aDescr, "*.voc");
224 aDescr = SdResId(STR_WAV_FILE);
225 mpImpl->AddFilter( aDescr, "*.wav");
226 aDescr = SdResId(STR_AIFF_FILE);
227 mpImpl->AddFilter( aDescr, "*.aiff");
228 aDescr = SdResId(STR_SVX_FILE);
229 mpImpl->AddFilter( aDescr, "*.svx");
230#else
231 aDescr = SdResId(STR_WAV_FILE);
232 mpImpl->AddFilter( aDescr, "*.wav;*.mp3;*.ogg" );
233 aDescr = SdResId(STR_MIDI_FILE);
234 mpImpl->AddFilter( aDescr, "*.mid" );
235#endif
236}
237
239{
240}
241
243{
244 return mpImpl->Execute();
245}
246
248{
249 return mpImpl->GetPath();
250}
251
252void SdOpenSoundFileDialog::SetPath( const OUString& rPath )
253{
254 mpImpl->SetDisplayDirectory( rPath );
255}
256
257// WIP, please don't remove, dear Clang plugins
259{
260 bool bInsertAsLinkSelected = false;
261 css::uno::Reference<css::ui::dialogs::XFilePicker3> const xFilePicker(mpImpl->GetFilePicker());
262 css::uno::Reference<css::ui::dialogs::XFilePickerControlAccess> const xControlAccess(xFilePicker, css::uno::UNO_QUERY_THROW);
263 xControlAccess->getValue(css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0) >>= bInsertAsLinkSelected;
264 return bInsertAsLinkSelected;
265}
266
267/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
AnyEventRef aEvent
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
static void RemoveUserEvent(ImplSVEvent *nUserEvent)
ImplSVEvent * mnPlaySoundEvent
Definition: filedlg.cxx:48
DECL_LINK(PlayMusicHdl, void *, void)
css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess
Definition: filedlg.cxx:45
css::uno::Reference< css::media::XPlayer > mxPlayer
Definition: filedlg.cxx:47
DECL_LINK(IsMusicStoppedHdl, Timer *, void)
bool mbLabelPlaying
Definition: filedlg.cxx:49
virtual void ControlStateChanged(const css::ui::dialogs::FilePickerEvent &aEvent) override
Definition: filedlg.cxx:63
SdFileDialog_Imp(weld::Window *pParent)
Definition: filedlg.cxx:173
virtual ~SdFileDialog_Imp() override
Definition: filedlg.cxx:202
The class SdOpenSoundFileDialog wraps the FileDialogHelper, displaying the FILEOPEN_PLAY dialog templ...
Definition: filedlg.hxx:40
const std::unique_ptr< SdFileDialog_Imp > mpImpl
Definition: filedlg.hxx:41
void SetPath(const OUString &rPath)
Definition: filedlg.cxx:252
bool IsInsertAsLinkSelected() const
Definition: filedlg.cxx:258
OUString GetPath() const
Definition: filedlg.cxx:247
SdOpenSoundFileDialog(const SdOpenSoundFileDialog &)=delete
void SetInvokeHandler(const Link< Timer *, void > &rLink)
static css::uno::Reference< css::media::XPlayer > createPlayer(const OUString &rURL, const OUString &rReferer, const OUString *pMimeType=nullptr)
const css::uno::Reference< css::ui::dialogs::XFilePicker3 > & GetFilePicker() const
IMPL_LINK_NOARG(SdFileDialog_Imp, PlayMusicHdl, void *, void)
Definition: filedlg.cxx:81
FileDialogFlags
NONE
OUString SdResId(TranslateId aId)
Definition: sdmod.cxx:83