LibreOffice Module fpicker (master) 1
VistaFilePicker.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 <sal/config.h>
21
22#include "VistaFilePicker.hxx"
23
24#include "WinImplHelper.hxx"
25#include "shared.hxx"
26
27#include <com/sun/star/awt/XWindow.hpp>
28#include <com/sun/star/lang/DisposedException.hpp>
29#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
30#include <com/sun/star/ui/dialogs/XFilePickerNotifier.hpp>
31#include <com/sun/star/ui/dialogs/XFilePickerListener.hpp>
32#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
33
37#include <osl/file.hxx>
38#include <officecfg/Office/Common.hxx>
39
40#include <shlobj.h>
41
42namespace fpicker{
43namespace win32{
44namespace vista{
45
48 , m_bInitialized (false )
49 , m_bFolderPicker (bFolderPicker )
50{
51}
52
54{
55}
56
57void SAL_CALL VistaFilePicker::addFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener)
58{
59 Request rRequest;
61 rRequest.setArgument(PROP_PICKER_LISTENER, xListener);
62
63 m_rDialog.doRequest(rRequest);
64}
65
66void SAL_CALL VistaFilePicker::removeFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener )
67{
68 Request rRequest;
70 rRequest.setArgument(PROP_PICKER_LISTENER, xListener);
71
72 m_rDialog.doRequest(rRequest);
73}
74
75void VistaFilePicker::disposing(const css::lang::EventObject& /*aEvent*/)
76{
77}
78
80{
81 ensureInit();
82
83 Request rRequest;
86
87 m_rDialog.doRequest(rRequest);
88}
89
90void SAL_CALL VistaFilePicker::setTitle(const OUString& sTitle)
91{
92 ensureInit();
93
94 Request rRequest;
96 rRequest.setArgument(PROP_TITLE, sTitle);
97
98 m_rDialog.doRequest(rRequest);
99}
100
101void SAL_CALL VistaFilePicker::appendFilter(const OUString& sTitle ,
102 const OUString& sFilter)
103{
104 Request rRequest;
106 rRequest.setArgument(PROP_FILTER_TITLE, sTitle );
107 rRequest.setArgument(PROP_FILTER_VALUE, sFilter);
108
109 m_rDialog.doRequest(rRequest);
110}
111
112void SAL_CALL VistaFilePicker::setCurrentFilter(const OUString& sTitle)
113{
114 Request rRequest;
116 rRequest.setArgument(PROP_FILTER_TITLE, sTitle);
117
118 m_rDialog.doRequest(rRequest);
119}
120
122{
123 Request rRequest;
125
126 m_rDialog.doRequest(rRequest);
127
128 const OUString sTitle = rRequest.getArgumentOrDefault(PROP_FILTER_TITLE, OUString());
129 return sTitle;
130}
131
132void SAL_CALL VistaFilePicker::appendFilterGroup(const OUString& /*sGroupTitle*/,
133 const css::uno::Sequence< css::beans::StringPair >& rFilters )
134{
135 Request rRequest;
137 rRequest.setArgument(PROP_FILTER_GROUP, rFilters);
138
139 m_rDialog.doRequest(rRequest);
140}
141
142void SAL_CALL VistaFilePicker::setDefaultName(const OUString& sName )
143{
144 ensureInit();
145
146 Request rRequest;
149
150 m_rDialog.doRequest(rRequest);
151}
152
153void SAL_CALL VistaFilePicker::setDisplayDirectory(const OUString& sDirectory)
154{
155 ensureInit();
156
157 Request rRequest;
159 rRequest.setArgument(PROP_DIRECTORY, sDirectory);
160
161 m_rDialog.doRequest(rRequest);
162}
163
165{
166 ensureInit();
167
168 Request rRequest;
170 m_rDialog.doRequest(rRequest);
171 const OUString sDirectory = rRequest.getArgumentOrDefault(PROP_DIRECTORY, OUString());
172
173 return sDirectory;
174}
175
176// @deprecated can't be supported any longer ... see IDL description for further details
177css::uno::Sequence< OUString > SAL_CALL VistaFilePicker::getFiles()
178{
179 css::uno::Sequence< OUString > lFiles = getSelectedFiles();
180 // multiselection doesn't really work
181 // so just retrieve the first url
182 if (lFiles.getLength() > 1)
183 lFiles.realloc(1);
184 m_lLastFiles = lFiles;
185 return lFiles;
186}
187
188css::uno::Sequence< OUString > SAL_CALL VistaFilePicker::getSelectedFiles()
189{
190 Request rRequest;
192
193 m_rDialog.doRequest(rRequest);
194
195 const css::uno::Sequence< OUString > lFiles = rRequest.getArgumentOrDefault(PROP_SELECTED_FILES, css::uno::Sequence< OUString >());
196 m_lLastFiles = lFiles;
197 return lFiles;
198}
199
201{
202 if ( !m_bInitialized )
203 {
204 if (m_bFolderPicker)
205 {
206 Request rRequest;
208 m_rDialog.doRequest(rRequest);
209 m_bInitialized = true;
210 }
211 else
212 {
213 initialize( { css::uno::Any(css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE) });
214 }
215 }
216}
217
218::sal_Int16 SAL_CALL VistaFilePicker::execute()
219{
220 ensureInit();
221
222 Request rRequest;
224
225 // show a modal window
226 m_rDialog.doRequest(rRequest);
227
228 const bool bOK = rRequest.getArgumentOrDefault(PROP_DIALOG_SHOW_RESULT, false );
229 m_lLastFiles = rRequest.getArgumentOrDefault(PROP_SELECTED_FILES , css::uno::Sequence< OUString >());
230
231 ::sal_Int16 nResult = css::ui::dialogs::ExecutableDialogResults::CANCEL;
232 if (bOK)
233 nResult = css::ui::dialogs::ExecutableDialogResults::OK;
234 return nResult;
235}
236
237// XFilePicker
238
239void SAL_CALL VistaFilePicker::setValue( ::sal_Int16 nControlId ,
240 ::sal_Int16 nControlAction,
241 const css::uno::Any& aValue )
242{
243 Request rRequest;
246 rRequest.setArgument(PROP_CONTROL_ACTION, nControlAction);
247 rRequest.setArgument(PROP_CONTROL_VALUE , aValue );
248
249 m_rDialog.doRequest(rRequest);
250}
251
252css::uno::Any SAL_CALL VistaFilePicker::getValue(::sal_Int16 nControlId ,
253 ::sal_Int16 nControlAction)
254{
255 Request rRequest;
258 rRequest.setArgument(PROP_CONTROL_ACTION, nControlAction);
259
260 m_rDialog.doRequest(rRequest);
261 return rRequest.getValue(PROP_CONTROL_VALUE);
262}
263
265 sal_Bool bEnable )
266{
267 Request rRequest;
270 rRequest.setArgument(PROP_CONTROL_ENABLE, bEnable );
271
272 m_rDialog.doRequest(rRequest);
273}
274
275void SAL_CALL VistaFilePicker::setLabel( ::sal_Int16 nControlId,
276 const OUString& sLabel )
277{
278 Request rRequest;
281 rRequest.setArgument(PROP_CONTROL_LABEL, sLabel );
282
283 m_rDialog.doRequest(rRequest);
284}
285
286OUString SAL_CALL VistaFilePicker::getLabel(::sal_Int16 nControlId)
287{
288 Request rRequest;
291
292 m_rDialog.doRequest(rRequest);
293 const OUString sLabel = rRequest.getArgumentOrDefault(PROP_CONTROL_LABEL, OUString());
294 return sLabel;
295}
296
297css::uno::Sequence< ::sal_Int16 > SAL_CALL VistaFilePicker::getSupportedImageFormats()
298{
299 return css::uno::Sequence< sal_Int16 >();
300}
301
303{
304 return 0;
305}
306
308{
309 return 0;
310}
311
313{
314 return 0;
315}
316
317void SAL_CALL VistaFilePicker::setImage( sal_Int16 /*nImageFormat*/,
318 const css::uno::Any& /*aImage */)
319{
320}
321
323{
324 return false;
325}
326
328{
329 return false;
330}
331
332void SAL_CALL VistaFilePicker::initialize(const css::uno::Sequence< css::uno::Any >& lArguments)
333{
334 if (lArguments.getLength() < 1)
335 throw css::lang::IllegalArgumentException(
336 "XInitialization::initialize() called without arguments.",
337 static_cast< css::ui::dialogs::XFilePicker2* >( this ),
338 1);
339
340 sal_Int32 nTemplate = -1;
341 lArguments[0] >>= nTemplate;
342
343 bool bFileOpenDialog = true;
344 ::sal_Int32 nFeatures = 0;
345
346 switch(nTemplate)
347 {
348 case css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE :
349 {
350 bFileOpenDialog = true;
351 }
352 break;
353
354 case css::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE :
355 {
356 bFileOpenDialog = false;
357 }
358 break;
359
360 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD :
361 {
362 bFileOpenDialog = false;
363 nFeatures |= FEATURE_AUTOEXTENSION;
364 nFeatures |= FEATURE_PASSWORD;
365 nFeatures |= FEATURE_GPGPASSWORD;
366 }
367 break;
368
369 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS :
370 {
371 bFileOpenDialog = false;
372 nFeatures |= FEATURE_AUTOEXTENSION;
373 nFeatures |= FEATURE_PASSWORD;
374 nFeatures |= FEATURE_FILTEROPTIONS;
375 nFeatures |= FEATURE_GPGPASSWORD;
376 }
377 break;
378
379 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_SELECTION :
380 {
381 bFileOpenDialog = false;
382 nFeatures |= FEATURE_AUTOEXTENSION;
383 nFeatures |= FEATURE_SELECTION;
384 }
385 break;
386
387 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE :
388 {
389 bFileOpenDialog = false;
390 nFeatures |= FEATURE_AUTOEXTENSION;
391 nFeatures |= FEATURE_TEMPLATE;
392 }
393 break;
394
395 case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE :
396 {
397 bFileOpenDialog = true;
398 nFeatures |= FEATURE_LINK;
399 nFeatures |= FEATURE_PREVIEW;
400 nFeatures |= FEATURE_IMAGETEMPLATE;
401 }
402 break;
403
404 case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW_IMAGE_ANCHOR :
405 {
406 bFileOpenDialog = true;
407 nFeatures |= FEATURE_LINK;
408 nFeatures |= FEATURE_PREVIEW;
409 nFeatures |= FEATURE_IMAGEANCHOR;
410 }
411 break;
412
413 case css::ui::dialogs::TemplateDescription::FILEOPEN_PLAY :
414 {
415 bFileOpenDialog = true;
416 nFeatures |= FEATURE_PLAY;
417 }
418 break;
419
420 case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PLAY :
421 {
422 bFileOpenDialog = true;
423 nFeatures |= FEATURE_LINK;
424 nFeatures |= FEATURE_PLAY;
425 }
426 break;
427
428 case css::ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION :
429 {
430 bFileOpenDialog = true;
431 nFeatures |= FEATURE_READONLY;
432 nFeatures |= FEATURE_VERSION;
433 }
434 break;
435
436 case css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW :
437 {
438 bFileOpenDialog = true;
439 nFeatures |= FEATURE_LINK;
440 nFeatures |= FEATURE_PREVIEW;
441 }
442 break;
443
444 case css::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION :
445 {
446 bFileOpenDialog = false;
447 nFeatures |= FEATURE_AUTOEXTENSION;
448 }
449 break;
450
451 case css::ui::dialogs::TemplateDescription::FILEOPEN_PREVIEW :
452 {
453 bFileOpenDialog = true;
454 nFeatures |= FEATURE_PREVIEW;
455 }
456 break;
457 }
458 css::uno::Reference<css::awt::XWindow> xParentWindow;
459 if(lArguments.getLength() > 1)
460 {
461 lArguments[1] >>= xParentWindow;
462 }
463 Request rRequest;
464 if (bFileOpenDialog)
465 {
466 if (!m_bFolderPicker)
468 else
470 }
471 else
473 rRequest.setArgument(PROP_FEATURES, nFeatures);
474 rRequest.setArgument(PROP_TEMPLATE_DESCR, nTemplate);
475 if(xParentWindow.is())
476 rRequest.setArgument(PROP_PARENT_WINDOW, xParentWindow);
477 m_rDialog.doRequest(rRequest);
478
479 m_bInitialized = true;
480}
481
483{
484}
485
487{
488 ensureInit();
489 css::uno::Sequence< OUString > aFileSeq = getSelectedFiles();
490 assert(aFileSeq.getLength() <= 1);
491 return aFileSeq.getLength() ? aFileSeq[0] : OUString();
492}
493
494void SAL_CALL VistaFilePicker::setDescription( const OUString& aDescription )
495{
496 setTitle(aDescription);
497}
498
499// XServiceInfo
500
502{
503 if (m_bFolderPicker)
504 return "com.sun.star.ui.dialogs.Win32FolderPicker";
505 else
506 return "com.sun.star.ui.dialogs.Win32FilePicker";
507}
508
509sal_Bool SAL_CALL VistaFilePicker::supportsService(const OUString& sServiceName)
510{
512}
513
514css::uno::Sequence< OUString > SAL_CALL VistaFilePicker::getSupportedServiceNames()
515{
516 return {
517 "com.sun.star.ui.dialogs.FilePicker",
518 "com.sun.star.ui.dialogs.SystemFilePicker",
519 "com.sun.star.ui.dialogs.SystemFolderPicker" };
520}
521
522} // namespace vista
523} // namespace win32
524} // namespace fpicker
525
526extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
528 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any> const&)
529{
530 return cppu::acquire(new ::fpicker::win32::vista::VistaFilePicker(false));
531}
532
533extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
535 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any> const&)
536{
537 return cppu::acquire(new ::fpicker::win32::vista::VistaFilePicker(true));
538}
539
540
541/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
sal_Int16 nControlId
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * fpicker_win32_FolderPicker_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * fpicker_win32_FilePicker_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
constexpr OUStringLiteral sServiceName
void setArgument(const OUString &sName, const TArgumentType &aValue)
Definition: requests.hxx:52
void setRequest(::sal_Int32 nRequest)
Definition: requests.hxx:45
css::uno::Any getValue(OUString const &key) const
Definition: requests.hxx:63
TArgumentType getArgumentOrDefault(const OUString &sName, const TArgumentType &aDefault)
Definition: requests.hxx:58
virtual void SAL_CALL setValue(sal_Int16 nControlId, sal_Int16 nControlAction, const css::uno::Any &aValue) override
css::uno::Sequence< OUString > m_lLastFiles
virtual void SAL_CALL setMultiSelectionMode(sal_Bool bMode) override
virtual void SAL_CALL removeFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener > &xListener) override
virtual css::uno::Sequence< OUString > SAL_CALL getFiles() override
virtual void SAL_CALL appendFilter(const OUString &sTitle, const OUString &sFilter) override
virtual OUString SAL_CALL getDirectory() override
virtual sal_Int16 SAL_CALL execute() override
virtual sal_Bool SAL_CALL getShowState() override
virtual void SAL_CALL cancel() override
virtual sal_Int32 SAL_CALL getAvailableWidth() override
virtual sal_Bool SAL_CALL setShowState(sal_Bool bShowState) override
virtual sal_Int32 SAL_CALL getAvailableHeight() override
virtual void disposing(const css::lang::EventObject &aEvent)
virtual void SAL_CALL setDefaultName(const OUString &sName) override
virtual void SAL_CALL setDisplayDirectory(const OUString &sDirectory) override
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &lArguments) override
virtual OUString SAL_CALL getImplementationName() override
virtual void SAL_CALL setDescription(const OUString &aDescription) override
virtual void SAL_CALL enableControl(sal_Int16 nControlId, sal_Bool bEnable) override
virtual void SAL_CALL setImage(sal_Int16 nImageFormat, const css::uno::Any &aImage) override
virtual OUString SAL_CALL getCurrentFilter() override
virtual void SAL_CALL setTitle(const OUString &sTitle) override
virtual void SAL_CALL setCurrentFilter(const OUString &sTitle) override
virtual void SAL_CALL addFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener > &xListener) override
virtual sal_Int32 SAL_CALL getTargetColorDepth() override
virtual void SAL_CALL setLabel(sal_Int16 nControlId, const OUString &sLabel) override
virtual void SAL_CALL appendFilterGroup(const OUString &sGroupTitle, const css::uno::Sequence< css::beans::StringPair > &lFilters) override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual OUString SAL_CALL getLabel(sal_Int16 nControlId) override
virtual css::uno::Sequence< sal_Int16 > SAL_CALL getSupportedImageFormats() override
virtual OUString SAL_CALL getDisplayDirectory() override
virtual css::uno::Sequence< OUString > SAL_CALL getSelectedFiles() override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual css::uno::Any SAL_CALL getValue(sal_Int16 nControlId, sal_Int16 nControlAction) override
OUString sName
std::mutex m_aMutex
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
::cppu::WeakComponentImplHelper< css::ui::dialogs::XFilePicker3, css::ui::dialogs::XFilePickerControlAccess, css::ui::dialogs::XFilePreview, css::ui::dialogs::XFolderPicker2, css::lang::XInitialization, css::lang::XServiceInfo > TVistaFilePickerBase
const OUStringLiteral PROP_PICKER_LISTENER
const ::sal_Int32 FEATURE_READONLY
constexpr OUStringLiteral PROP_FILTER_GROUP(u"filter-group")
const ::sal_Int32 FEATURE_PREVIEW
constexpr OUStringLiteral PROP_CONTROL_VALUE(u"control_value")
constexpr OUStringLiteral PROP_FILTER_TITLE(u"filter_title")
const ::sal_Int32 FEATURE_VERSION
constexpr OUStringLiteral PROP_FILTER_VALUE(u"filter_value")
const ::sal_Int32 FEATURE_SELECTION
const ::sal_Int32 FEATURE_TEMPLATE
constexpr OUStringLiteral PROP_FEATURES(u"features")
constexpr OUStringLiteral PROP_TITLE(u"title")
const ::sal_Int32 FEATURE_FILTEROPTIONS
constexpr OUStringLiteral PROP_CONTROL_LABEL(u"control_label")
const ::sal_Int32 FEATURE_PLAY
constexpr OUStringLiteral PROP_PARENT_WINDOW(u"ParentWindow")
const ::sal_Int32 FEATURE_LINK
constexpr OUStringLiteral PROP_SELECTED_FILES(u"selected_files")
constexpr OUStringLiteral PROP_FILENAME(u"filename")
const ::sal_Int32 FEATURE_IMAGETEMPLATE
const ::sal_Int32 FEATURE_AUTOEXTENSION
constexpr OUStringLiteral PROP_TEMPLATE_DESCR(u"templatedescription")
constexpr OUStringLiteral PROP_DIALOG_SHOW_RESULT(u"dialog_show_result")
const ::sal_Int32 FEATURE_PASSWORD
const ::sal_Int32 FEATURE_IMAGEANCHOR
constexpr OUStringLiteral PROP_CONTROL_ACTION(u"control_action")
const OUStringLiteral PROP_CONTROL_ID
constexpr OUStringLiteral PROP_MULTISELECTION_MODE(u"multiselection_mode")
const ::sal_Int32 FEATURE_GPGPASSWORD
constexpr OUStringLiteral PROP_DIRECTORY(u"directory")
constexpr OUStringLiteral PROP_CONTROL_ENABLE(u"control_enable")
unsigned char sal_Bool