summaryrefslogtreecommitdiff
path: root/fpicker/source/aqua/SalAquaFilePicker.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'fpicker/source/aqua/SalAquaFilePicker.cxx')
-rw-r--r--fpicker/source/aqua/SalAquaFilePicker.cxx812
1 files changed, 812 insertions, 0 deletions
diff --git a/fpicker/source/aqua/SalAquaFilePicker.cxx b/fpicker/source/aqua/SalAquaFilePicker.cxx
new file mode 100644
index 000000000000..699997bd2dbe
--- /dev/null
+++ b/fpicker/source/aqua/SalAquaFilePicker.cxx
@@ -0,0 +1,812 @@
+/*************************************************************************
+ *
+ * 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
+#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
+#include <cppuhelper/interfacecontainer.h>
+#include <osl/diagnose.h>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include <com/sun/star/ui/dialogs/ControlActions.hpp>
+#include <com/sun/star/uno/Any.hxx>
+#include <FPServiceInfo.hxx>
+#include <vos/mutex.hxx>
+#include <vcl/svapp.hxx>
+
+#ifndef _TOOLS_URLOBJ_HXX
+#include <tools/urlobj.hxx>
+#endif
+#include "resourceprovider.hxx"
+
+#ifndef _SV_RC_H
+#include <tools/rc.hxx>
+#endif
+#include <osl/file.hxx>
+#include "CFStringUtilities.hxx"
+#include "NSString_OOoAdditions.hxx"
+#include "NSURL_OOoAdditions.hxx"
+
+#include <iostream>
+
+#include "SalAquaFilePicker.hxx"
+
+
+#pragma mark DEFINES
+
+#define LABEL_TOGGLE( elem ) \
+case elem : \
+aLabel = aResProvider.getResString( CHECKBOX_##elem ); \
+ setLabel( CHECKBOX_##elem, aLabel ); \
+ break
+
+#define CLASS_NAME "SalAquaFilePicker"
+
+//------------------------------------------------------------------------
+// namespace directives
+//------------------------------------------------------------------------
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
+using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds;
+using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+namespace
+{
+ // controling event notifications
+ const bool STARTUP_SUSPENDED = true;
+ const bool STARTUP_ALIVE = false;
+
+ uno::Sequence<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames()
+ {
+ uno::Sequence<rtl::OUString> aRet(3);
+ aRet[0] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.FilePicker" );
+ aRet[1] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.SystemFilePicker" );
+ aRet[2] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.AquaFilePicker" );
+ return aRet;
+ }
+}
+
+#pragma mark Constructor
+//-----------------------------------------------------------------------------------------
+// constructor
+//-----------------------------------------------------------------------------------------
+
+SalAquaFilePicker::SalAquaFilePicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr ) :
+cppu::WeakComponentImplHelper8<XFilterManager, XFilterGroupManager, XFilePickerControlAccess, XFilePickerNotifier,
+ lang::XInitialization, util::XCancellable, lang::XEventListener, lang::XServiceInfo>( m_rbHelperMtx )
+, m_xServiceMgr( xServiceMgr )
+, m_pFilterHelper( NULL )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ m_pDelegate = [[AquaFilePickerDelegate alloc] initWithFilePicker:this];
+ m_pControlHelper->setFilePickerDelegate(m_pDelegate);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+SalAquaFilePicker::~SalAquaFilePicker()
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ if (NULL != m_pFilterHelper)
+ delete m_pFilterHelper;
+
+ [m_pDelegate release];
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+
+#pragma mark XFilePickerNotifier
+//------------------------------------------------------------------------------------
+// XFilePickerNotifier
+//------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::addFilePickerListener( const uno::Reference<XFilePickerListener>& xListener )
+ throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+ m_xListener = xListener;
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SAL_CALL SalAquaFilePicker::removeFilePickerListener( const uno::Reference<XFilePickerListener>& )
+ throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+ m_xListener.clear();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+#pragma mark XAsynchronousExecutableDialog
+//-----------------------------------------------------------------------------------------
+// XExecutableDialog functions
+//-----------------------------------------------------------------------------------------
+void SAL_CALL SalAquaFilePicker::setTitle( const rtl::OUString& aTitle ) throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "title", aTitle);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+ implsetTitle(aTitle);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+sal_Int16 SAL_CALL SalAquaFilePicker::execute() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ sal_Int16 retVal = 0;
+
+ implInitialize();
+
+ // if m_pDialog is nil after initialization, something must have gone wrong before
+ // or there was no initialization (see issue http://www.openoffice.org/issues/show_bug.cgi?id=100214)
+ if (m_pDialog == nil) {
+ //throw uno::RuntimeException(rtl::OUString::createFromAscii("The dialog was not properly initialized!"), static_cast< XFilePicker* >( this ));
+ m_nDialogType = NAVIGATIONSERVICES_OPEN;
+ }
+
+ if (m_pFilterHelper) {
+ m_pFilterHelper->SetFilters();
+ }
+
+ if (m_nDialogType == NAVIGATIONSERVICES_SAVE) {
+ if (m_sSaveFileName.getLength() == 0) {
+ //if no filename is set, NavigationServices will set the name to "untitled". We don't want this!
+ //So let's try to get the window title to get the real untitled name
+ NSWindow *frontWindow = [NSApp keyWindow];
+ if (NULL != frontWindow) {
+ NSString *windowTitle = [frontWindow title];
+ if (windowTitle != nil) {
+ rtl::OUString ouName = [windowTitle OUString];
+ //a window title will typically be something like "Untitled1 - OpenOffice.org Writer"
+ //but we only want the "Untitled1" part of it
+ sal_Int32 indexOfDash = ouName.indexOf(rtl::OUString::createFromAscii(" - "));
+ if (indexOfDash > -1) {
+ m_sSaveFileName = ouName.copy(0,indexOfDash);
+ if (m_sSaveFileName.getLength() > 0) {
+ setDefaultName(m_sSaveFileName);
+ }
+ } else {
+ OSL_TRACE("no dash present in window title");
+ }
+ } else {
+ OSL_TRACE("couldn't get window title");
+ }
+ } else {
+ OSL_TRACE("no front window found");
+ }
+ }
+ }
+
+ //Set the delegate to be notified of certain events
+ [m_pDialog setDelegate:m_pDelegate];
+
+ int nStatus = runandwaitforresult();
+
+ [m_pDialog setDelegate:nil];
+
+ switch( nStatus )
+ {
+ case NSOKButton:
+ OSL_TRACE("The dialog returned OK");
+ retVal = ExecutableDialogResults::OK;
+ break;
+
+ case NSCancelButton:
+ OSL_TRACE("The dialog was cancelled by the user!");
+ retVal = ExecutableDialogResults::CANCEL;
+ break;
+
+ default:
+ throw uno::RuntimeException(rtl::OUString::createFromAscii("The dialog returned with an unknown result!"), static_cast< XFilePicker* >( this ));
+ break;
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal);
+
+ return retVal;
+}
+
+
+#pragma mark XFilePicker
+//-----------------------------------------------------------------------------------------
+// XFilePicker functions
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::setMultiSelectionMode( sal_Bool bMode ) throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "multiSelectable?", bMode);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ if (m_nDialogType == NAVIGATIONSERVICES_OPEN) {
+ [(NSOpenPanel*)m_pDialog setAllowsMultipleSelection:YES];
+ OSL_TRACE("dialog allows multi-selection? %d", [(NSOpenPanel*)m_pDialog allowsMultipleSelection]);
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SAL_CALL SalAquaFilePicker::setDefaultName( const rtl::OUString& aName )
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "name", aName);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ m_sSaveFileName = aName;
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SAL_CALL SalAquaFilePicker::setDisplayDirectory( const rtl::OUString& rDirectory )
+throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "directory", rDirectory);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ implsetDisplayDirectory(rDirectory);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+rtl::OUString SAL_CALL SalAquaFilePicker::getDisplayDirectory() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ rtl::OUString retVal = implgetDisplayDirectory();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal);
+ return retVal;
+}
+
+uno::Sequence<rtl::OUString> SAL_CALL SalAquaFilePicker::getFiles() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ // OSL_TRACE("starting work");
+ /*
+ * If more than one file is selected in an OpenDialog, then the first result
+ * is the directory and the remaining results contain just the files' names
+ * without the basedir path.
+ */
+ NSArray *files = nil;
+ if (m_nDialogType == NAVIGATIONSERVICES_OPEN) {
+ files = [(NSOpenPanel*)m_pDialog URLs];
+ }
+ else if (m_nDialogType == NAVIGATIONSERVICES_SAVE) {
+ files = [NSArray arrayWithObjects:[m_pDialog URL], nil];
+ }
+
+ long nFiles = [files count];
+ OSL_TRACE("# of items: %d", nFiles);
+
+ uno::Sequence< rtl::OUString > aSelectedFiles(nFiles > 1 ? nFiles + 1 : nFiles);
+
+ for(int nIndex = 0; nIndex < nFiles; nIndex += 1)
+ {
+ NSURL *url = [files objectAtIndex:nIndex];
+ OSL_TRACE("handling %s", [[url description] UTF8String]);
+ InfoType info = FULLPATH;
+ if (nFiles > 1) {
+ //just get the file's name (only in OpenDialog)
+ info = FILENAME;
+ }
+ OUString sFileOrDirURL = [url OUStringForInfo:info];
+
+ //get the directory information, only on the first file processed
+ if (nIndex == 0) {
+ OUString sDirectoryURL = [url OUStringForInfo:PATHWITHOUTLASTCOMPONENT];
+
+ if (nFiles > 1) {
+ aSelectedFiles[0] = OUString(sDirectoryURL);
+ }
+ }
+
+ short nSequenceIndex = nFiles > 1 ? nIndex + 1 : nIndex;
+ aSelectedFiles[nSequenceIndex] = sFileOrDirURL;
+
+ OSL_TRACE("Returned file in getFiles: \"%s\".", OUStringToOString(sFileOrDirURL, RTL_TEXTENCODING_UTF8).getStr());
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+ return aSelectedFiles;
+}
+
+#pragma mark XFilterManager
+//-----------------------------------------------------------------------------------------
+// XFilterManager functions
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::appendFilter( const rtl::OUString& aTitle, const rtl::OUString& aFilter )
+throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ ensureFilterHelper();
+ m_pFilterHelper->appendFilter( aTitle, aFilter );
+ m_pControlHelper->setFilterControlNeeded(YES);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SAL_CALL SalAquaFilePicker::setCurrentFilter( const rtl::OUString& aTitle )
+throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+ OSL_TRACE( "Setting current filter to %s",
+ OUStringToOString( aTitle, RTL_TEXTENCODING_UTF8 ).getStr() );
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ ensureFilterHelper();
+ m_pFilterHelper->setCurrentFilter(aTitle);
+ updateFilterUI();
+
+ updateSaveFileNameExtension();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+rtl::OUString SAL_CALL SalAquaFilePicker::getCurrentFilter() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ ensureFilterHelper();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+ return m_pFilterHelper->getCurrentFilter();
+}
+
+#pragma mark XFilterGroupManager
+//-----------------------------------------------------------------------------------------
+// XFilterGroupManager functions
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::appendFilterGroup( const rtl::OUString& sGroupTitle, const uno::Sequence<beans::StringPair>& aFilters )
+throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ ensureFilterHelper();
+ m_pFilterHelper->appendFilterGroup(sGroupTitle, aFilters);
+ m_pControlHelper->setFilterControlNeeded(YES);
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+#pragma mark XFilePickerControlAccess
+//------------------------------------------------------------------------------------
+// XFilePickerControlAccess functions
+//------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any& rValue )
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ m_pControlHelper->setValue(nControlId, nControlAction, rValue);
+
+ if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION && m_nDialogType == NAVIGATIONSERVICES_SAVE) {
+ updateSaveFileNameExtension();
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+uno::Any SAL_CALL SalAquaFilePicker::getValue( sal_Int16 nControlId, sal_Int16 nControlAction )
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ uno::Any aValue = m_pControlHelper->getValue(nControlId, nControlAction);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+ return aValue;
+}
+
+void SAL_CALL SalAquaFilePicker::enableControl( sal_Int16 nControlId, sal_Bool bEnable )
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ m_pControlHelper->enableControl(nControlId, bEnable);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SAL_CALL SalAquaFilePicker::setLabel( sal_Int16 nControlId, const ::rtl::OUString& aLabel )
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ NSString* sLabel = [NSString stringWithOUString:aLabel];
+ m_pControlHelper->setLabel( nControlId, sLabel ) ;
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+rtl::OUString SAL_CALL SalAquaFilePicker::getLabel( sal_Int16 nControlId )
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+
+ return m_pControlHelper->getLabel(nControlId);
+}
+
+#pragma mark XInitialization
+//------------------------------------------------------------------------------------
+// XInitialization
+//------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::initialize( const uno::Sequence<uno::Any>& aArguments )
+throw( uno::Exception, uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "arguments size", aArguments.getLength());
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ // parameter checking
+ uno::Any aAny;
+ if( 0 == aArguments.getLength() )
+ throw lang::IllegalArgumentException(rtl::OUString::createFromAscii( "no arguments" ),
+ static_cast<XFilePicker*>( this ), 1 );
+
+ aAny = aArguments[0];
+
+ if( ( aAny.getValueType() != ::getCppuType( ( sal_Int16* )0 ) ) &&
+ (aAny.getValueType() != ::getCppuType( ( sal_Int8* )0 ) ) )
+ throw lang::IllegalArgumentException(rtl::OUString::createFromAscii( "invalid argument type" ),
+ static_cast<XFilePicker*>( this ), 1 );
+
+ sal_Int16 templateId = -1;
+ aAny >>= templateId;
+
+ switch( templateId )
+ {
+ case FILEOPEN_SIMPLE:
+ m_nDialogType = NAVIGATIONSERVICES_OPEN;
+ OSL_TRACE( "Template: FILEOPEN_SIMPLE" );
+ break;
+ case FILESAVE_SIMPLE:
+ m_nDialogType = NAVIGATIONSERVICES_SAVE;
+ OSL_TRACE( "Template: FILESAVE_SIMPLE" );
+ break;
+ case FILESAVE_AUTOEXTENSION_PASSWORD:
+ m_nDialogType = NAVIGATIONSERVICES_SAVE;
+ OSL_TRACE( "Template: FILESAVE_AUTOEXTENSION_PASSWORD" );
+ break;
+ case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
+ m_nDialogType = NAVIGATIONSERVICES_SAVE;
+ OSL_TRACE( "Template: FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS" );
+ break;
+ case FILESAVE_AUTOEXTENSION_SELECTION:
+ m_nDialogType = NAVIGATIONSERVICES_SAVE;
+ OSL_TRACE( "Template: FILESAVE_AUTOEXTENSION_SELECTION" );
+ break;
+ case FILESAVE_AUTOEXTENSION_TEMPLATE:
+ m_nDialogType = NAVIGATIONSERVICES_SAVE;
+ OSL_TRACE( "Template: FILESAVE_AUTOEXTENSION_TEMPLATE" );
+ break;
+ case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
+ m_nDialogType = NAVIGATIONSERVICES_OPEN;
+ OSL_TRACE( "Template: FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE" );
+ break;
+ case FILEOPEN_PLAY:
+ m_nDialogType = NAVIGATIONSERVICES_OPEN;
+ OSL_TRACE( "Template: FILEOPEN_PLAY" );
+ break;
+ case FILEOPEN_READONLY_VERSION:
+ m_nDialogType = NAVIGATIONSERVICES_OPEN;
+ OSL_TRACE( "Template: FILEOPEN_READONLY_VERSION" );
+ break;
+ case FILEOPEN_LINK_PREVIEW:
+ m_nDialogType = NAVIGATIONSERVICES_OPEN;
+ OSL_TRACE( "Template: FILEOPEN_LINK_PREVIEW" );
+ break;
+ case FILESAVE_AUTOEXTENSION:
+ m_nDialogType = NAVIGATIONSERVICES_SAVE;
+ OSL_TRACE( "Template: FILESAVE_AUTOEXTENSION" );
+ break;
+ default:
+ throw lang::IllegalArgumentException(rtl::OUString::createFromAscii( "Unknown template" ),
+ static_cast< XFilePicker* >( this ),
+ 1 );
+ }
+
+ m_pControlHelper->initialize(templateId);
+
+ implInitialize();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+#pragma mark XCancellable
+//------------------------------------------------------------------------------------
+// XCancellable
+//------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::cancel() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ if (m_pDialog != nil) {
+ [m_pDialog cancel:nil];
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+#pragma mark XEventListener
+//------------------------------------------------
+// XEventListener
+//------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::disposing( const lang::EventObject& aEvent ) throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ uno::Reference<XFilePickerListener> xFilePickerListener( aEvent.Source, ::com::sun::star::uno::UNO_QUERY );
+
+ if( xFilePickerListener.is() )
+ removeFilePickerListener( xFilePickerListener );
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+#pragma mark XServiceInfo
+// -------------------------------------------------
+// XServiceInfo
+// -------------------------------------------------
+
+rtl::OUString SAL_CALL SalAquaFilePicker::getImplementationName()
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ rtl::OUString retVal = rtl::OUString::createFromAscii( FILE_PICKER_IMPL_NAME );
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal);
+
+ return retVal;
+}
+
+sal_Bool SAL_CALL SalAquaFilePicker::supportsService( const rtl::OUString& sServiceName )
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "service name", sServiceName);
+
+ sal_Bool retVal = sal_False;
+
+ uno::Sequence <rtl::OUString> supportedServicesNames = FilePicker_getSupportedServiceNames();
+
+ for( sal_Int32 n = supportedServicesNames.getLength(); n--; ) {
+ if( supportedServicesNames[n].compareTo( sServiceName ) == 0) {
+ retVal = sal_True;
+ break;
+ }
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+
+ return retVal;
+}
+
+uno::Sequence<rtl::OUString> SAL_CALL SalAquaFilePicker::getSupportedServiceNames()
+throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+
+ return FilePicker_getSupportedServiceNames();
+}
+
+#pragma mark Misc/Private
+//-----------------------------------------------------------------------------------------
+// FilePicker Event functions
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFilePicker::fileSelectionChanged( FilePickerEvent aEvent )
+{
+ OSL_TRACE( "file selection changed");
+ if (m_xListener.is())
+ m_xListener->fileSelectionChanged( aEvent );
+}
+
+void SAL_CALL SalAquaFilePicker::directoryChanged( FilePickerEvent aEvent )
+{
+ OSL_TRACE("directory changed");
+ if (m_xListener.is())
+ m_xListener->directoryChanged( aEvent );
+}
+
+void SAL_CALL SalAquaFilePicker::controlStateChanged( FilePickerEvent aEvent )
+{
+ OSL_TRACE("control state changed");
+ if (m_xListener.is())
+ m_xListener->controlStateChanged( aEvent );
+}
+
+void SAL_CALL SalAquaFilePicker::dialogSizeChanged()
+{
+ OSL_TRACE("dialog size changed");
+ if (m_xListener.is())
+ m_xListener->dialogSizeChanged();
+}
+
+//------------------------------------------------------------------------------------
+
+#define MAP_TOGGLE( elem ) \
+case ExtendedFilePickerElementIds::CHECKBOX_##elem: \
+ pWidget = m_pToggles[elem]; \
+ break
+
+#define MAP_BUTTON( elem ) \
+case ExtendedFilePickerElementIds::PUSHBUTTON_##elem: \
+ pWidget = m_pButtons[elem]; \
+ break
+#undef MAP_LIST
+#define MAP_LIST( elem ) \
+case ExtendedFilePickerElementIds::LISTBOX_##elem: \
+ pWidget = m_pListControls[elem]; if (isAList != NULL) *isAList = sal_True; \
+ break
+
+#define MAP_LIST_LABEL( elem ) \
+case ExtendedFilePickerElementIds::LISTBOX_##elem##_LABEL: \
+ pWidget = m_pListControls[elem]; \
+ break
+
+//--------------------------------------------------
+// Misc
+//-------------------------------------------------
+void SalAquaFilePicker::ensureFilterHelper() {
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ if (NULL == m_pFilterHelper) {
+ m_pFilterHelper = new FilterHelper;
+ m_pControlHelper->setFilterHelper(m_pFilterHelper);
+ [m_pDelegate setFilterHelper:m_pFilterHelper];
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SalAquaFilePicker::implInitialize()
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ //call super
+ SalAquaPicker::implInitialize();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SalAquaFilePicker::updateFilterUI() {
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ m_pControlHelper->updateFilterUI();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SalAquaFilePicker::updateSaveFileNameExtension() {
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ if (m_nDialogType != NAVIGATIONSERVICES_SAVE) {
+ return;
+ }
+
+ // we need to set this here again because initial setting does
+ //[m_pDialog setExtensionHidden:YES];
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ if (m_pControlHelper->isAutoExtensionEnabled() == false) {
+ OSL_TRACE("allowing other file types");
+ [m_pDialog setAllowedFileTypes:nil];
+ [m_pDialog setAllowsOtherFileTypes:YES];
+ } else {
+ ensureFilterHelper();
+
+ OUStringList aStringList = m_pFilterHelper->getCurrentFilterSuffixList();
+ if( aStringList.empty()) // #i9328#
+ return;
+
+ rtl::OUString suffix = (*(aStringList.begin())).copy(1);
+ NSString *requiredFileType = [NSString stringWithOUString:suffix];
+
+ [m_pDialog setRequiredFileType:requiredFileType];
+
+ OSL_TRACE("disallowing other file types");
+ [m_pDialog setAllowsOtherFileTypes:NO];
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+void SalAquaFilePicker::filterControlChanged() {
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ if (m_pDialog == nil) {
+ return;
+ }
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ updateSaveFileNameExtension();
+
+ [m_pDialog validateVisibleColumns];
+
+ FilePickerEvent evt;
+ evt.ElementId = LISTBOX_FILTER;
+ controlStateChanged( evt );
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+