20#include <config_features.h>
25#include <com/sun/star/lang/DisposedException.hpp>
26#include <com/sun/star/lang/XMultiServiceFactory.hpp>
27#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
28#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
29#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
32#include <osl/diagnose.h>
33#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
34#include <com/sun/star/ui/dialogs/ControlActions.hpp>
35#include <com/sun/star/uno/Any.hxx>
36#include <osl/mutex.hxx>
41#include <osl/file.hxx>
49#include <objc/objc-runtime.h>
55using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
56using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds;
57using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds;
66 return {
"com.sun.star.ui.dialogs.FilePicker",
67 "com.sun.star.ui.dialogs.SystemFilePicker",
68 "com.sun.star.ui.dialogs.AquaFilePicker" };
72#pragma mark Constructor
76 , m_pFilterHelper( nullptr )
91#pragma mark XFilePickerNotifier
105#pragma mark XAsynchronousExecutableDialog
117 sal_Int16 retVal = 0;
135 NSWindow *frontWindow = [NSApp keyWindow];
136 if (
nullptr != frontWindow) {
137 NSString *windowTitle = [frontWindow title];
138 if (windowTitle != nil) {
139 OUString ouName = [windowTitle OUString];
142 sal_Int32 indexOfDash = ouName.indexOf(
" - ");
143 if (indexOfDash > -1) {
164 case NSModalResponseOK:
165 retVal = ExecutableDialogResults::OK;
168 case NSModalResponseCancel:
169 retVal = ExecutableDialogResults::CANCEL;
173 throw uno::RuntimeException(
174 "The dialog returned with an unknown result!",
175 static_cast<XFilePicker*
>(
static_cast<XFilePicker3*
>(
this ) ));
183#pragma mark XFilePicker
190 [
static_cast<NSOpenPanel*
>(
m_pDialog) setAllowsMultipleSelection:
YES];
220 if (aSelectedFiles.getLength() > 1)
221 aSelectedFiles.realloc(1);
223 return aSelectedFiles;
230#if HAVE_FEATURE_MACOSX_SANDBOX
231 static NSUserDefaults *userDefaults;
232 static bool triedUserDefaults =
false;
234 if (!triedUserDefaults)
236 userDefaults = [NSUserDefaults standardUserDefaults];
237 triedUserDefaults =
true;
241 NSArray *files = nil;
243 files = [
static_cast<NSOpenPanel*
>(
m_pDialog) URLs];
246 files = [NSArray arrayWithObjects:[
m_pDialog URL], nil];
249 NSUInteger nFiles = [files
count];
250 SAL_INFO(
"fpicker.aqua",
"# of items: " << nFiles);
252 uno::Sequence< OUString > aSelectedFiles(nFiles);
253 OUString* pSelectedFiles = aSelectedFiles.getArray();
257 NSURL *url = [files objectAtIndex:
nIndex];
259#if HAVE_FEATURE_MACOSX_SANDBOX
260 if (userDefaults !=
NULL &&
261 [url respondsToSelector:
@selector(bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error:)])
269 NSData *data = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
270 includingResourceValuesForKeys:nil
275 [userDefaults setObject:data
276 forKey:[
@"bookmarkFor:" stringByAppendingString:[url absoluteString]]];
281 OUString sFileOrDirURL = [url OUString];
283 pSelectedFiles[
nIndex] = sFileOrDirURL;
286 return aSelectedFiles;
289#pragma mark XFilterManager
320#pragma mark XFilterGroupManager
331#pragma mark XFilePickerControlAccess
360 NSString* sLabel = [NSString stringWithOUString:
aLabel];
369#pragma mark XInitialization
378 throw lang::IllegalArgumentException(
"no arguments",
379 static_cast<XFilePicker*
>(
static_cast<XFilePicker3*
>(
this) ), 1 );
385 throw lang::IllegalArgumentException(
"invalid argument type",
386 static_cast<XFilePicker*
>(
static_cast<XFilePicker3*
>(
this) ), 1 );
388 sal_Int16 templateId = -1;
393 case FILEOPEN_SIMPLE:
396 case FILESAVE_SIMPLE:
399 case FILESAVE_AUTOEXTENSION_PASSWORD:
402 case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
405 case FILESAVE_AUTOEXTENSION_SELECTION:
408 case FILESAVE_AUTOEXTENSION_TEMPLATE:
411 case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
414 case FILEOPEN_LINK_PREVIEW_IMAGE_ANCHOR:
420 case FILEOPEN_LINK_PLAY:
423 case FILEOPEN_READONLY_VERSION:
426 case FILEOPEN_LINK_PREVIEW:
429 case FILESAVE_AUTOEXTENSION:
432 case FILEOPEN_PREVIEW:
436 throw lang::IllegalArgumentException(
"Unknown template",
437 static_cast<XFilePicker*
>(
static_cast<XFilePicker3*
>(
this) ),
446#pragma mark XCancellable
457#pragma mark XEventListener
463 uno::Reference<XFilePickerListener> xFilePickerListener(
aEvent.Source, css::uno::UNO_QUERY );
465 if( xFilePickerListener.is() )
469#pragma mark XServiceInfo
473 return "com.sun.star.ui.dialogs.SalAquaFilePicker";
486#pragma mark Misc/Private
554 OUString suffix = (*(
aStringList.begin())).copy(1);
555 NSString *requiredFileType = [NSString stringWithOUString:suffix];
558 [
m_pDialog setAllowedFileTypes:[NSArray arrayWithObjects:requiredFileType, nil]];
578 evt.ElementId = LISTBOX_FILTER;
582extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
584 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
::std::list< OUString > OUStringList
::cppu::WeakComponentImplHelper< css::ui::dialogs::XFilePicker3, css::ui::dialogs::XFilePickerControlAccess, css::lang::XInitialization, css::lang::XServiceInfo > SalAquaFilePicker_Base
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * fpicker_SalAquaFilePicker_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
constexpr OUStringLiteral sServiceName
uno::Any getValue(sal_Int16 nControlId, sal_Int16 nControlAction) const
void setFilterControlNeeded(bool bNeeded)
void setFilePickerDelegate(AquaFilePickerDelegate *pDelegate)
void initialize(sal_Int16 templateId)
void setLabel(sal_Int16 nControlId, NSString *aLabel)
void setFilterHelper(FilterHelper *pFilterHelper)
OUString getLabel(sal_Int16 nControlId)
void enableControl(sal_Int16 nControlId, bool bEnable) const
bool isAutoExtensionEnabled()
void setValue(sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any &rValue)
OUString getCurrentFilter()
void appendFilter(const OUString &aTitle, std::u16string_view aFilter)
void appendFilterGroup(const css::uno::Sequence< css::beans::StringPair > &aFilters)
OUStringList getCurrentFilterSuffixList()
void setCurrentFilter(const OUString &aTitle)
virtual void SAL_CALL appendFilter(const OUString &aTitle, const OUString &aFilter) override
AquaFilePickerDelegate * m_pDelegate
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
virtual OUString SAL_CALL getDisplayDirectory() override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual void SAL_CALL addFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener > &xListener) override
virtual void disposing(const css::lang::EventObject &aEvent)
virtual void SAL_CALL setDefaultName(const OUString &aName) override
virtual void SAL_CALL removeFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener > &xListener) override
void updateSaveFileNameExtension()
virtual sal_Int16 SAL_CALL execute() override
virtual void SAL_CALL setMultiSelectionMode(sal_Bool bMode) override
virtual void SAL_CALL setValue(sal_Int16 nControlId, sal_Int16 nControlAction, const css::uno::Any &aValue) override
virtual css::uno::Sequence< OUString > SAL_CALL getFiles() override
virtual OUString SAL_CALL getCurrentFilter() override
void directoryChanged(css::ui::dialogs::FilePickerEvent aEvent)
virtual void SAL_CALL appendFilterGroup(const OUString &sGroupTitle, const css::uno::Sequence< css::beans::StringPair > &aFilters) override
virtual void SAL_CALL setLabel(sal_Int16 nControlId, const OUString &aLabel) override
virtual css::uno::Any SAL_CALL getValue(sal_Int16 aControlId, sal_Int16 aControlAction) override
virtual void SAL_CALL setDisplayDirectory(const OUString &aDirectory) override
virtual void SAL_CALL cancel() override
virtual OUString SAL_CALL getLabel(sal_Int16 nControlId) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
FilterHelper * m_pFilterHelper
css::uno::Reference< css::ui::dialogs::XFilePickerListener > m_xListener
void controlStateChanged(css::ui::dialogs::FilePickerEvent aEvent)
void filterControlChanged()
virtual void SAL_CALL enableControl(sal_Int16 nControlId, sal_Bool bEnable) override
virtual OUString SAL_CALL getImplementationName() override
virtual void SAL_CALL setTitle(const OUString &aTitle) override
virtual void SAL_CALL setCurrentFilter(const OUString &aTitle) override
void fileSelectionChanged(css::ui::dialogs::FilePickerEvent aEvent)
virtual css::uno::Sequence< OUString > SAL_CALL getSelectedFiles() override
virtual ~SalAquaFilePicker() override
virtual void ensureFilterHelper()
OUString const & implgetDisplayDirectory()
@ NAVIGATIONSERVICES_SAVE
@ NAVIGATIONSERVICES_OPEN
int runandwaitforresult()
void implsetTitle(const OUString &aTitle)
ControlHelper * m_pControlHelper
NavigationServices_DialogType m_nDialogType
void implsetDisplayDirectory(const OUString &rDirectory)
Sequence< OUString > FilePicker_getSupportedServiceNames()
Sequence< PropertyValue > aArguments
#define SAL_INFO(area, stream)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
#define SAL_WNODEPRECATED_DECLARATIONS_POP
#define SAL_WNODEPRECATED_DECLARATIONS_PUSH
const std::u16string_view aStringList[]